diff options
Diffstat (limited to 'frontends/cocoa/LocalHistoryController.m')
-rw-r--r-- | frontends/cocoa/LocalHistoryController.m | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/frontends/cocoa/LocalHistoryController.m b/frontends/cocoa/LocalHistoryController.m new file mode 100644 index 000000000..1a60783cb --- /dev/null +++ b/frontends/cocoa/LocalHistoryController.m @@ -0,0 +1,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 |