-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUKPrefsPanel.m
333 lines (259 loc) · 11.4 KB
/
UKPrefsPanel.m
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
/* =============================================================================
FILE: UKPrefsPanel.h
AUTHORS: M. Uli Kusterer (UK), (c) Copyright 2003, all rights reserved.
DIRECTIONS:
UKPrefsPanel is ridiculously easy to use: Create a tabless NSTabView,
where the name of each tab is the name for the toolbar item, and the
identifier of each tab is the identifier to be used for the toolbar
item to represent it. Then create image files with the identifier as
their names to be used as icons in the toolbar.
Finally, drag UKPrefsPanel.h into the NIB with the NSTabView,
instantiate a UKPrefsPanel and connect its tabView outlet to your
NSTabView. When you open the window, the UKPrefsPanel will
automatically add a toolbar to the window with all tabs represented by
a toolbar item, and clicking an item will switch between the tab view's
items.
REVISIONS:
2003-08-13 UK Added auto-save, fixed bug with empty window titles.
2003-07-22 UK Added Panther stuff, documented.
2003-06-30 UK Created.
========================================================================== */
/* -----------------------------------------------------------------------------
Headers:
-------------------------------------------------------------------------- */
#import "UKPrefsPanel.h"
@implementation UKPrefsPanel
/* -----------------------------------------------------------------------------
Constructor:
-------------------------------------------------------------------------- */
-(id) init
{
if( self = [super init] )
{
tabView = nil;
itemsList = [[NSMutableDictionary alloc] init];
baseWindowName = [@"" retain];
}
return self;
}
/* -----------------------------------------------------------------------------
Destructor:
-------------------------------------------------------------------------- */
-(void) dealloc
{
[itemsList release];
[baseWindowName release];
[super dealloc];
}
/* -----------------------------------------------------------------------------
awakeFromNib:
This object and all others in the NIB have been created and hooked up.
Fetch the window name so we can modify it to indicate the current
page, and add our toolbar to the window.
This method is the great obstacle to making UKPrefsPanel an NSTabView
subclass. When the tab view's awakeFromNib method is called, the
individual tabs aren't set up yet, meaning mapTabsToToolbar gives us an
empty toolbar. ... bummer.
If anybody knows how to fix this, you're welcome to tell me.
-------------------------------------------------------------------------- */
-(void) awakeFromNib
{
NSString* wndTitle = nil;
// Generate a string containing the window's title so we can display the original window title plus the selected pane:
wndTitle = [[tabView window] title];
if( [wndTitle length] > 0 )
{
[baseWindowName release];
baseWindowName = [[NSString stringWithFormat: @"%@ : ", wndTitle] retain];
}
[tabView selectTabViewItemAtIndex: 0];
// Actually hook up our toolbar and the tabs:
[self mapTabsToToolbar];
[[tabView window] setFrame:NSMakeRect([[tabView window] frame].origin.x,
[[tabView window] frame].origin.y,
[[tabView window] frame].size.width,
[[tabView window] frame].size.height)
display:YES
animate:YES];
id box = [[[[tabView tabViewItemAtIndex:[tabView indexOfTabViewItem:[tabView selectedTabViewItem]]] view] subviews] objectAtIndex:0];
// We want to obtain our current contentView height and compare it to box
if ([box isKindOfClass:[NSBox class]])
{
[self resizeToFit:box];
}
}
/* -----------------------------------------------------------------------------
mapTabsToToolbar:
Create a toolbar based on our tab control.
Tab title - Name for toolbar item.
Tab identifier - Image file name and toolbar item identifier.
-------------------------------------------------------------------------- */
-(void) mapTabsToToolbar
{
// Create a new toolbar instance, and attach it to our document window
NSToolbar *toolbar =[[tabView window] toolbar];
int itemCount = 0,
x = 0;
NSTabViewItem *currPage = nil;
if( toolbar == nil ) // No toolbar yet? Create one!
toolbar = [[[NSToolbar alloc] initWithIdentifier:@"net.sf.Jumpcut.prefsToolbar"] autorelease];
// Set up toolbar properties: Allow customization, give a default display mode, and remember state in user defaults
[toolbar setAllowsUserCustomization: YES];
[toolbar setAutosavesConfiguration: NO];
[toolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel];
// Set up item list based on Tab View:
itemCount = [tabView numberOfTabViewItems];
[itemsList removeAllObjects]; // In case we already had a toolbar.
for( x = 0; x < itemCount; x++ )
{
NSTabViewItem* theItem = [tabView tabViewItemAtIndex:x];
NSString* theIdentifier = [theItem identifier];
NSString* theLabel = [theItem label];
[itemsList setObject:theLabel forKey:theIdentifier];
}
// We are the delegate
[toolbar setDelegate: self];
// Attach the toolbar to the document window
[[tabView window] setToolbar: toolbar];
// Set up window title:
currPage = [tabView selectedTabViewItem];
if( currPage == nil )
currPage = [tabView tabViewItemAtIndex:0];
// [[tabView window] setTitle: [baseWindowName stringByAppendingString: [currPage label]]];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
if( [toolbar respondsToSelector: @selector(setSelectedItemIdentifier:)] )
[toolbar setSelectedItemIdentifier: [currPage identifier]];
#endif
// Jam in a flexible space to seperate out our acknowledgements tab
// sbc
int foo = [[toolbar items] count] - 1;
[toolbar insertItemWithItemIdentifier:NSToolbarFlexibleSpaceItemIdentifier atIndex:foo];
}
/* -----------------------------------------------------------------------------
orderFrontPrefsPanel:
IBAction to assign to "Preferences..." menu item.
-------------------------------------------------------------------------- */
-(IBAction) orderFrontPrefsPanel: (id)sender
{
[[tabView window] makeKeyAndOrderFront:sender];
}
/* -----------------------------------------------------------------------------
setTabView:
Accessor for specifying the tab view to query.
-------------------------------------------------------------------------- */
-(void) setTabView: (NSTabView*)tv
{
tabView = tv;
}
-(NSTabView*) tabView
{
return tabView;
}
/* -----------------------------------------------------------------------------
toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar:
Create an item with the proper image and name based on our list
of tabs for the specified identifier.
-------------------------------------------------------------------------- */
-(NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier: (NSString *) itemIdent willBeInsertedIntoToolbar:(BOOL) willBeInserted
{
// Required delegate method: Given an item identifier, this method returns an item
// The toolbar will use this method to obtain toolbar items that can be displayed in the customization sheet, or in the toolbar itself
NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease];
NSString* itemLabel;
if( (itemLabel = [itemsList objectForKey:itemIdent]) != nil )
{
// Set the text label to be displayed in the toolbar and customization palette
[toolbarItem setLabel: itemLabel];
[toolbarItem setPaletteLabel: itemLabel];
[toolbarItem setTag:[tabView indexOfTabViewItemWithIdentifier:itemIdent]];
// Set up a reasonable tooltip, and image Note, these aren't localized, but you will likely want to localize many of the item's properties
[toolbarItem setToolTip: itemLabel];
[toolbarItem setImage: [NSImage imageNamed:itemIdent]];
// Tell the item what message to send when it is clicked
[toolbarItem setTarget: self];
[toolbarItem setAction: @selector(changePanes:)];
}
else
{
// itemIdent refered to a toolbar item that is not provide or supported by us or cocoa
// Returning nil will inform the toolbar this kind of item is not supported
toolbarItem = nil;
}
return toolbarItem;
}
/* -----------------------------------------------------------------------------
toolbarSelectableItemIdentifiers:
Make sure all our custom items can be selected. NSToolbar will
automagically select the appropriate item when it is clicked.
-------------------------------------------------------------------------- */
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
-(NSArray*) toolbarSelectableItemIdentifiers: (NSToolbar*)toolbar
{
return [itemsList allKeys];
}
#endif
/* -----------------------------------------------------------------------------
changePanes:
Action for our custom toolbar items that causes the window title to
reflect the current pane and the proper pane to be shown in response to
a click.
-------------------------------------------------------------------------- */
-(IBAction) changePanes: (id)sender
{
[tabView selectTabViewItemAtIndex: [sender tag]];
// [[tabView window] setTitle: [baseWindowName stringByAppendingString: [sender label]]];
id box = [[[[tabView tabViewItemAtIndex:[sender tag]] view] subviews] objectAtIndex:0];
// We want to obtain our current contentView height and compare it to box
if ([box isKindOfClass:[NSBox class]])
{
[tabView selectTabViewItemAtIndex: [sender tag]];
[self resizeToFit:box];
}
}
-(void) resizeToFit:(NSBox *)box
{
float sizeDifference = [box frame].size.height - [[[tabView window] contentView] frame].size.height;
[[tabView window] setFrame:NSMakeRect([[tabView window] frame].origin.x,
[[tabView window] frame].origin.y - sizeDifference,
[[tabView window] frame].size.width,
[[tabView window] frame].size.height + sizeDifference)
display:YES
animate:YES];
[box setFrameOrigin:NSMakePoint([box frame].origin.x, 0)];
[tabView setNeedsDisplay:YES];
}
/* -----------------------------------------------------------------------------
toolbarDefaultItemIdentifiers:
Return the identifiers for all toolbar items that will be shown by
default.
This is simply a list of all tab view items in order.
-------------------------------------------------------------------------- */
-(NSArray*) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar
{
int itemCount = [tabView numberOfTabViewItems],
x;
NSTabViewItem* theItem = [tabView tabViewItemAtIndex:0];
//NSMutableArray* defaultItems = [NSMutableArray arrayWithObjects: [theItem identifier], NSToolbarSeparatorItemIdentifier, nil];
NSMutableArray* defaultItems = [NSMutableArray array];
for( x = 0; x < itemCount; x++ )
{
theItem = [tabView tabViewItemAtIndex:x];
[defaultItems addObject: [theItem identifier]];
}
return defaultItems;
}
/* -----------------------------------------------------------------------------
toolbarAllowedItemIdentifiers:
Return the identifiers for all toolbar items that *can* be put in this
toolbar. We allow a couple more items (flexible space, separator lines
etc.) in addition to our custom items.
-------------------------------------------------------------------------- */
-(NSArray*) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar
{
NSMutableArray* allowedItems = [[[itemsList allKeys] mutableCopy] autorelease];
[allowedItems addObjectsFromArray: [NSArray arrayWithObjects: NSToolbarSeparatorItemIdentifier,
NSToolbarSpaceItemIdentifier, NSToolbarFlexibleSpaceItemIdentifier,
NSToolbarCustomizeToolbarItemIdentifier, nil] ];
return allowedItems;
}
@end