summaryrefslogtreecommitdiff
path: root/frontends/cocoa/LocalHistoryController.m
blob: 1a60783cb0a875f744639ad3f898bf669a328e58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
 * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
 *
 * This file is part of NetSurf, http://www.netsurf-browser.org/
 *
 * NetSurf is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * NetSurf is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#import "cocoa/LocalHistoryController.h"

#import "cocoa/BrowserView.h"
#import "cocoa/HistoryView.h"
#import "cocoa/ArrowWindow.h"

@implementation LocalHistoryController

- (instancetype)initWithBrowser:(BrowserView *)bw
{
    if ((self = [super initWithWindowNibName:@"LocalHistoryPanel"]) == nil)
        return nil;

    _browser = bw;

    return self;
}

- (void)attachToView:(NSView *)view
{
    NSDisableScreenUpdates();

    ArrowWindow *box = (ArrowWindow *)[self window];

    [self.history updateHistory];
    box.contentSize = self.history.size;
    [box setArrowPosition:50];
    [box attachToView:view];

    NSRect frame = [box frame];
    NSRect screenFrame = [[box screen] visibleFrame];

    const CGFloat arrowSize = [box arrowSize];
    frame.origin.x += arrowSize;
    frame.origin.y += arrowSize;
    frame.size.width -= 2 * arrowSize;
    frame.size.height -= 2 * arrowSize;

    if (NSMinY(frame) < NSMinY(screenFrame)) {
        const CGFloat delta = NSMinY(screenFrame) - NSMinY(frame);
        frame.size.height -= delta;
        frame.origin.y += delta;
    }

    CGFloat arrowPositionChange = 50;
    if (NSMaxX(frame) > NSMaxX(screenFrame)) {
        const CGFloat delta = NSMaxX(frame) - NSMaxX(screenFrame);
        arrowPositionChange += delta;
        frame.origin.x -= delta;
    }

    if (NSMinX(frame) < NSMinX(screenFrame)) {
        const CGFloat delta = NSMinX(screenFrame) - NSMinX(frame);
        arrowPositionChange -= delta;
        frame.origin.x += delta;
        frame.size.width -= delta;
    }

    frame.origin.x -= arrowSize;
    frame.origin.y -= arrowSize;
    frame.size.width += 2 * arrowSize;
    frame.size.height += 2 * arrowSize;

    [box setArrowPosition:arrowPositionChange];
    [box setFrame:frame display:YES];

    NSEnableScreenUpdates();
}

- (void)detach
{
    [(ArrowWindow *)[self window] detach];
}

- (void)windowDidLoad
{
    [super windowDidLoad];

    self.history.browser = self.browser;
}

- (void)redraw
{
    [self.history setNeedsDisplay:YES];
}

- (void)keyDown:(NSEvent *)theEvent
{
    unichar key = [[theEvent characters] characterAtIndex:0];
    switch (key) {
    case 27:
        [self.browser setHistoryVisible:NO];
        break;

    default:
        NSBeep();
        break;
    };
}

@end