-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMLPreferencesPanelController.m
More file actions
139 lines (102 loc) · 3.41 KB
/
MLPreferencesPanelController.m
File metadata and controls
139 lines (102 loc) · 3.41 KB
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#import "MLPreferencesPanelController.h"
#import "MLPreferenceViewController.h"
@implementation MLPreferencesPanelController
- (id)init
{
self = [super initWithWindowNibName:@"PreferencesPanel"];
itemsMap = [[NSMutableDictionary alloc] init];
itemsKeys = [[NSMutableArray alloc] init];
return self;
}
- (void)dealloc
{
[itemsMap release];
[itemsKeys release];
[super dealloc];
}
- (void)addViewController:(MLPreferenceViewController *)viewController
{
[itemsMap setObject:viewController forKey:[viewController identifier]];
[itemsKeys addObject:[viewController identifier]];
}
- (void)awakeFromNib
{
toolbar = [[NSToolbar alloc] initWithIdentifier:@"PreferencesPanelToolbar"];
[toolbar setDelegate:(id)self]; // cast to id to prevent warning about not implementing NSToolbarDelegate on 10.6
[toolbar setAllowsUserCustomization:NO];
[toolbar setAutosavesConfiguration:NO];
[toolbar setDisplayMode:NSToolbarDisplayModeIconAndLabel];
[[self window] setToolbar:toolbar];
[[self window] center];
[[self window] setShowsResizeIndicator:NO];
[self activateViewWithIdentifier:[itemsKeys objectAtIndex:0]];
}
- (void)highlightToolbarItemWithIdentifier:(NSString *)ident
{
[toolbar setSelectedItemIdentifier:ident];
}
- (BOOL)activateViewWithIdentifier:(NSString *)viewName
{
MLPreferenceViewController *viewController = [itemsMap objectForKey:viewName];
if (! viewController)
return NO;
[viewController setPreferencesPanelWindow:[self window]];
NSView *newView = [viewController view];
if (currentView) {
if (currentView == newView)
return YES;
[currentView removeFromSuperview];
}
NSView *parentView = [[self window] contentView];
NSRect desiredBounds = [newView bounds];
NSRect frameSize = [[self window] frameRectForContentRect:desiredBounds];
NSRect currentFrame = [[self window] frame];
NSRect frameRect = frameSize;
frameRect.origin.x = currentFrame.origin.x;
frameRect.origin.y = currentFrame.origin.y + currentFrame.size.height - frameSize.size.height;
[[self window] setShowsResizeIndicator:[viewController isResizable]];
[[self window] setFrame:frameRect display:YES animate:[[self window] isVisible]];
[parentView addSubview:newView];
[parentView setNextKeyView:newView];
[newView setFrame:[parentView bounds]];
currentView = newView;
[viewController activated];
[[self window] recalculateKeyViewLoop];
[self highlightToolbarItemWithIdentifier:viewName];
return YES;
}
- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar
{
return itemsKeys;
}
- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar
{
return itemsKeys;
}
- (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar
{
return itemsKeys;
}
- (BOOL)validateToolbarItem:(NSToolbarItem*)toolbarItem
{
return YES;
}
- (IBAction)toolbarButtonClicked:(id)sender
{
NSToolbarItem *toolbarItem = sender;
[self activateViewWithIdentifier:[toolbarItem itemIdentifier]];
}
- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
{
MLPreferenceViewController *viewController = [itemsMap objectForKey:itemIdentifier];
if (! viewController)
return nil;
NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier];
[item autorelease];
[item setLabel:[viewController title]];
[item setTarget:self];
[item setAction:@selector(toolbarButtonClicked:)];
[item setImage:[viewController image]];
return item;
}
@end