Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 238 - (hide annotations) (download)
Sun Jan 10 13:19:26 2010 UTC (14 years, 3 months ago) by masaki
File size: 12312 byte(s)
[Refactoring] クラス名変更。XSPFMXspfObject -> XpsfMXspfObject
1 masaki 2 //
2     // XspfManager.m
3     // XspfManager
4     //
5     // Created by Hori,Masaki on 09/11/01.
6     // Copyright 2009 masakih. All rights reserved.
7     //
8    
9 masaki 182 #import "XspfMMainWindowController.h"
10 masaki 2
11 masaki 238 #import "XspfMXspfObject.h"
12 masaki 2
13 masaki 189 #import "XspfMViewController.h"
14 masaki 41 #import "XspfMLibraryViewController.h"
15 masaki 16 #import "XspfMCollectionViewController.h"
16 masaki 25 #import "XspfMListViewController.h"
17 masaki 47 #import "XspfMDetailViewController.h"
18 masaki 2
19 masaki 193 #import "XspfMDragControl.h"
20    
21 masaki 69
22 masaki 182 @interface XspfMMainWindowController(HMPrivate)
23 masaki 43 - (void)setupXspfLists;
24 masaki 47 - (void)setupDetailView;
25 masaki 82 - (void)setupAccessorylView;
26 masaki 25 - (void)changeViewType:(XspfMViewType)newType;
27     - (void)setCurrentListViewType:(XspfMViewType)newType;
28 masaki 189 - (void)recalculateKeyViewLoop;
29 masaki 199
30     - (void)removeSelectedItem;
31 masaki 16 @end
32    
33 masaki 184
34 masaki 182 @implementation XspfMMainWindowController
35 masaki 36
36 masaki 8 - (id)init
37     {
38 masaki 200 self = [super initWithWindowNibName:@"MainWindow"];
39     if(self) {
40     viewControllers = [[NSMutableDictionary alloc] init];
41     }
42 masaki 50
43 masaki 8 return self;
44 masaki 2 }
45 masaki 8 - (void)awakeFromNib
46     {
47 masaki 47 static BOOL didSetupOnMainMenu = NO;
48    
49     if(appDelegate && !didSetupOnMainMenu) {
50     didSetupOnMainMenu = YES;
51 masaki 98
52 masaki 185 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
53     [nc addObserver:self
54     selector:@selector(managerDidAddObjects:)
55     name:XspfManagerDidAddXspfObjectsNotification
56     object:appDelegate];
57 masaki 98
58 masaki 49 [self window];
59 masaki 99
60 masaki 47 }
61 masaki 8 }
62 masaki 49 - (void)windowDidLoad
63     {
64 masaki 231 [[self window] setContentBorderThickness:32 forEdge:NSMinYEdge];
65 masaki 82
66 masaki 49 [self setupXspfLists];
67     [self setupDetailView];
68 masaki 82 [self setupAccessorylView];
69 masaki 50 if(currentListViewType == typeNotSelected) {
70 masaki 180 [self setCurrentListViewType:typeTableView];
71 masaki 50 }
72 masaki 49
73 masaki 50 [self showWindow:nil];
74 masaki 189 [self recalculateKeyViewLoop];
75 masaki 49 }
76 masaki 25 #pragma mark#### KVC ####
77 masaki 200 - (NSManagedObjectContext *)managedObjectContext
78     {
79     return [appDelegate managedObjectContext];
80     }
81 masaki 16 - (NSArrayController *)arrayController
82     {
83     return controller;
84     }
85 masaki 2
86 masaki 25 - (XspfMViewType)currentListViewType
87     {
88     return currentListViewType;
89     }
90     - (void)setCurrentListViewType:(XspfMViewType)newType
91     {
92     if(currentListViewType == newType) return;
93    
94     [self changeViewType:newType];
95     }
96 masaki 16
97 masaki 13 #pragma mark#### Actions ####
98 masaki 10 - (IBAction)openXspf:(id)sender
99     {
100 masaki 115 BOOL isSelected = [[controller valueForKeyPath:@"selectedObjects.@count"] boolValue];
101     if(!isSelected) return;
102    
103 masaki 238 XspfMXspfObject *rep = [controller valueForKeyPath:@"selection.self"];
104 masaki 101 if(rep.deleted) {
105     NSRunCriticalAlertPanel( NSLocalizedString(@"Xspf is Deleted", @"Xspf is Deleted"),
106     NSLocalizedString(@"\"%@\" is deleted", @"\"%@\" is deleted"),
107     nil, nil, nil, rep.title);
108     return;
109     }
110 masaki 77 [[NSWorkspace sharedWorkspace] openFile:rep.filePath withApplication:@"XspfQT"];
111     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
112 masaki 10 }
113 masaki 190 - (IBAction)switchListView:(id)sender
114     {
115     [self setCurrentListViewType:typeTableView];
116     }
117     - (IBAction)switchRegularIconView:(id)sender
118     {
119     [self setCurrentListViewType:typeCollectionView];
120     [(XspfMCollectionViewController *)listViewController collectionViewItemViewRegular:sender];
121     }
122     - (IBAction)switchSmallIconView:(id)sender
123     {
124     [self setCurrentListViewType:typeCollectionView];
125     [(XspfMCollectionViewController *)listViewController collectionViewItemViewSmall:sender];
126     }
127 masaki 191 - (void)sortByKey:(NSString *)key
128 masaki 190 {
129 masaki 216 NSMutableArray *sortDescs = [[[controller sortDescriptors] mutableCopy] autorelease];
130 masaki 190 NSSortDescriptor *sortDesc = nil;
131    
132     // key is descs first key.
133     if([sortDescs count] > 1) {
134     NSSortDescriptor *firstDesc = [sortDescs objectAtIndex:0];
135     if([key isEqualToString:[firstDesc key]]) {
136     sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:![firstDesc ascending]] autorelease];
137     [sortDescs removeObject:firstDesc];
138     }
139     }
140     // remove same key.
141     if(!sortDesc) {
142 masaki 191 BOOL newAscending = NO;
143 masaki 190 NSSortDescriptor *foundDesc = nil;
144     for(id desc in sortDescs) {
145     if([key isEqualToString:[desc key]]) {
146     foundDesc = desc;
147     break;
148     }
149     }
150     if(foundDesc) {
151 masaki 191 newAscending = [foundDesc ascending];
152 masaki 190 [sortDescs removeObject:foundDesc];
153     }
154    
155 masaki 191 sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:newAscending] autorelease];
156 masaki 190 }
157    
158     [sortDescs insertObject:sortDesc atIndex:0];
159    
160     NSArray *selectedObjects = [controller selectedObjects];
161     [controller setSortDescriptors:sortDescs];
162     [controller setSelectedObjects:selectedObjects];
163     }
164     - (IBAction)sortByTitle:(id)sender
165     {
166 masaki 191 [self sortByKey:@"title"];
167 masaki 190 }
168     - (IBAction)sortByLastPlayDate:(id)sender
169     {
170 masaki 191 [self sortByKey:@"lastPlayDate"];
171 masaki 190 }
172     - (IBAction)sortByModificationDate:(id)sender
173     {
174 masaki 191 [self sortByKey:@"modificationDate"];
175 masaki 190 }
176     - (IBAction)sortByCreationDate:(id)sender
177     {
178 masaki 191 [self sortByKey:@"creationDate"];
179 masaki 190 }
180     - (IBAction)sortByRegisterDate:(id)sender
181     {
182 masaki 191 [self sortByKey:@"registerDate"];
183 masaki 190 }
184     - (IBAction)sortByRate:(id)sender
185     {
186 masaki 191 [self sortByKey:@"rating"];
187 masaki 190 }
188     - (IBAction)sortByMovieNumber:(id)sender
189     {
190 masaki 191 [self sortByKey:@"movieNum"];
191 masaki 190 }
192     - (IBAction)sortByLabel:(id)sender
193     {
194 masaki 224 [self sortByKey:@"label"];
195 masaki 190 }
196    
197 masaki 2 - (IBAction)add:(id)sender
198     {
199     NSOpenPanel *panel = [NSOpenPanel openPanel];
200    
201     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
202     [panel setAllowsMultipleSelection:YES];
203 masaki 9 [panel setDelegate:self];
204 masaki 2
205     [panel beginSheetForDirectory:nil
206     file:nil
207     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
208 masaki 8 modalForWindow:[self window]
209 masaki 2 modalDelegate:self
210     didEndSelector:@selector(endOpenPanel:::)
211     contextInfo:NULL];
212     }
213 masaki 106 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
214     {
215     [panel orderOut:nil];
216 masaki 2
217 masaki 106 if(returnCode == NSCancelButton) return;
218    
219     NSArray *URLs = [panel URLs];
220     if([URLs count] == 0) return;
221    
222 masaki 184 [appDelegate registerURLs:URLs];
223 masaki 106 }
224 masaki 190 - (IBAction)remove:(id)sender
225     {
226 masaki 199 [self removeSelectedItem];
227 masaki 190 }
228 masaki 182
229 masaki 194 - (IBAction)newPredicate:(id)sender
230     {
231     [libraryViewController newPredicate:sender];
232     }
233    
234 masaki 190 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
235     {
236     BOOL enabled = YES;
237     SEL action = [menuItem action];
238    
239     if(action == @selector(switchListView:)) {
240     if(currentListViewType == typeTableView) {
241     [menuItem setState:NSOnState];
242     } else {
243     [menuItem setState:NSOffState];
244     }
245     } else if(action == @selector(switchRegularIconView:)) {
246     if(currentListViewType == typeCollectionView
247     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXspfMRegularItem) {
248     [menuItem setState:NSOnState];
249     } else {
250     [menuItem setState:NSOffState];
251     }
252     } else if(action == @selector(switchSmallIconView:)) {
253     if(currentListViewType == typeCollectionView
254     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXSpfMSmallItem) {
255     [menuItem setState:NSOnState];
256     } else {
257     [menuItem setState:NSOffState];
258     }
259     }
260    
261     return enabled;
262     }
263    
264 masaki 25 #pragma mark#### Other methods ####
265 masaki 199 - (void)removeSelectedItem
266     {
267 masaki 238 XspfMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
268 masaki 199
269     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [self window],
270     self, @selector(didEndAskDelete:::), Nil, obj,
271     NSLocalizedString(@"Do you really delete item \"%@\" from list?", @"Do you really delete item \"%@\" from list?"),
272     obj.title);
273     }
274     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
275     {
276     if(returnCode == NSCancelButton) return;
277    
278     [appDelegate removeObject:contextInfo];
279     }
280    
281 masaki 189 - (void)recalculateKeyViewLoop
282     {
283     [searchField setNextKeyView:[libraryViewController firstKeyView]];
284     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
285     [listViewController setNextKeyView:[detailViewController firstKeyView]];
286     [detailViewController setNextKeyView:searchField];
287     }
288 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
289     {
290     if(currentListViewType == viewType) return;
291     currentListViewType = viewType;
292    
293     NSString *className = nil;
294     switch(currentListViewType) {
295     case typeCollectionView:
296     className = @"XspfMCollectionViewController";
297     break;
298     case typeTableView:
299     className = @"XspfMListViewController";
300     break;
301     }
302     if(!className) return;
303    
304 masaki 189 XspfMViewController *targetContorller = [viewControllers objectForKey:className];
305 masaki 25 if(!targetContorller) {
306     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
307     if(!targetContorller) return;
308 masaki 192
309     id selectionIndexes = [controller selectionIndexes];
310 masaki 25 [viewControllers setObject:targetContorller forKey:className];
311 masaki 180 [targetContorller view];
312 masaki 30 [targetContorller setRepresentedObject:controller];
313 masaki 189 [targetContorller recalculateKeyViewLoop];
314 masaki 192 [controller setSelectionIndexes:selectionIndexes];
315 masaki 25 }
316 masaki 109
317 masaki 25 [[listViewController view] removeFromSuperview];
318     listViewController = targetContorller;
319     [listView addSubview:[listViewController view]];
320     [[listViewController view] setFrame:[listView bounds]];
321 masaki 189 // [[self window] recalculateKeyViewLoop];
322     [self recalculateKeyViewLoop];
323 masaki 25 }
324 masaki 2
325 masaki 5
326 masaki 43 - (void)setupXspfLists
327 masaki 36 {
328 masaki 47 if(libraryViewController) return;
329    
330 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
331 masaki 37 [libraryViewController setRepresentedObject:listController];
332     [libraryView addSubview:[libraryViewController view]];
333 masaki 193 NSRect rect = [libraryView bounds];
334     rect.size.width += 2;
335     rect.origin.x -= 1;
336     [[libraryViewController view] setFrame:rect];
337 masaki 189 [libraryViewController recalculateKeyViewLoop];
338 masaki 233 [[libraryViewController dragControl] setDelegate:self];
339 masaki 36 }
340 masaki 47 - (void)setupDetailView
341 masaki 6 {
342 masaki 47 if(detailViewController) return;
343 masaki 6
344 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
345     [detailViewController setRepresentedObject:controller];
346     [detailView addSubview:[detailViewController view]];
347     [[detailViewController view] setFrame:[detailView bounds]];
348 masaki 189 [detailViewController recalculateKeyViewLoop];
349 masaki 6 }
350 masaki 82 - (void)setupAccessorylView
351     {
352     if(accessoryViewController) return;
353    
354     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
355     [accessoryViewController setRepresentedObject:[appDelegate channel]];
356     [accessoryView addSubview:[accessoryViewController view]];
357     [[accessoryViewController view] setFrame:[accessoryView bounds]];
358 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
359 masaki 82 }
360 masaki 8 #pragma mark#### NSWidnow Delegate ####
361     /**
362     Returns the NSUndoManager for the application. In this case, the manager
363     returned is that of the managed object context for the application.
364     */
365 masaki 6
366 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
367     return [[appDelegate managedObjectContext] undoManager];
368     }
369    
370 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
371     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
372     {
373 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
374 masaki 9 }
375    
376 masaki 193 #pragma mark#### XspfMDragControl Delegate ####
377     - (void)dragControl:(XspfMDragControl *)control dragDelta:(NSSize)delta
378     {
379     HMLog(HMLogLevelDebug, @"Enter %@", NSStringFromSelector(_cmd));
380     CGFloat libWidth = [libraryView frame].size.width;
381     [splitView setPosition:libWidth + delta.width ofDividerAtIndex:0];
382     }
383    
384 masaki 185 #pragma mark#### XspfManager Notifications ####
385     - (void)managerDidAddObjects:(NSNotification *)notification
386     {
387     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
388     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
389    
390     [controller performSelector:@selector(setSelectedObjects:)
391     withObject:addedObjects
392     afterDelay:0.01];
393     }
394    
395 masaki 184 #pragma mark#### Test ####
396     - (IBAction)test01:(id)sender
397     {
398 masaki 238 XspfMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
399 masaki 204 srandom([[NSDate date] timeIntervalSince1970]);
400     obj.label = [NSNumber numberWithInteger:random() % 8];
401 masaki 203 HMLog(HMLogLevelDebug, @"HMLogLevelDebug -> %@", obj);
402 masaki 231
403     NSButtonCell *cell = [sender cell];
404     HMLog(HMLogLevelDebug, @"boardered -> %@\nbezeled -> %@\ngradientType -> %d\n bezelStyle -> %d",
405     [cell isBordered] ? @"YES" : @"NO", [cell isBezeled] ? @"YES" : @"NO",
406     [cell gradientType], [cell bezelStyle]);
407 masaki 184 }
408     - (IBAction)test02:(id)sender
409     {
410     NSResponder *responder = [[self window] firstResponder];
411     while(responder) {
412 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
413 masaki 184 responder = [responder nextResponder];
414     }
415     }
416     - (IBAction)test03:(id)sender
417     {
418     id keyView = [[self window] firstResponder];
419     NSView *firstKeyView = keyView;
420     while(keyView) {
421 masaki 188 HMLog(HMLogLevelDebug, @"Keyview -> %@", keyView);
422 masaki 184 keyView = [keyView nextKeyView];
423     if(keyView == firstKeyView) break;
424     }
425    
426 masaki 188 HMLog(HMLogLevelDebug, @"Valid next view -> %@", [firstKeyView nextValidKeyView]);
427 masaki 184 }
428     @end

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26