summaryrefslogtreecommitdiff
path: root/frontends/cocoa/LocalHistoryController.m
blob: b3992b6148627b5bfce58adae56eb038dd994436 (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

@synthesize browser;
@synthesize history;

- 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];

	[box setContentSize: [history size]];
	[box setArrowPosition: 50];
	[history updateHistory];
	[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;
{
	[history setBrowser: browser];
}

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

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

@end