Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 200 - (hide annotations) (download)
Sun Jan 3 14:59:52 2010 UTC (14 years, 3 months ago) by masaki
File size: 12120 byte(s)
[Mod] XspfMMainWindowControllerがシングルトンである必要がなくなっていたので関連コードを削除。
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 199 #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 82 [[self window] setContentBorderThickness:38 forEdge:NSMinYEdge];
65    
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 77 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     NSMutableArray *sortDescs = [[controller sortDescriptors] mutableCopy];
130     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     [self doesNotRecognizeSelector:_cmd];
195     }
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     } else if(action == @selector(sortByLabel:)) {
260     enabled = NO;
261     }
262    
263     return enabled;
264     }
265    
266 masaki 25 #pragma mark#### Other methods ####
267 masaki 199 - (void)removeSelectedItem
268     {
269     XSPFMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
270    
271     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [self window],
272     self, @selector(didEndAskDelete:::), Nil, obj,
273     NSLocalizedString(@"Do you really delete item \"%@\" from list?", @"Do you really delete item \"%@\" from list?"),
274     obj.title);
275     }
276     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
277     {
278     if(returnCode == NSCancelButton) return;
279    
280     [appDelegate removeObject:contextInfo];
281     }
282    
283 masaki 189 - (void)recalculateKeyViewLoop
284     {
285     [searchField setNextKeyView:[libraryViewController firstKeyView]];
286     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
287     [listViewController setNextKeyView:[detailViewController firstKeyView]];
288     [detailViewController setNextKeyView:searchField];
289     }
290 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
291     {
292     if(currentListViewType == viewType) return;
293     currentListViewType = viewType;
294    
295     NSString *className = nil;
296     switch(currentListViewType) {
297     case typeCollectionView:
298     className = @"XspfMCollectionViewController";
299     break;
300     case typeTableView:
301     className = @"XspfMListViewController";
302     break;
303     }
304     if(!className) return;
305    
306 masaki 189 XspfMViewController *targetContorller = [viewControllers objectForKey:className];
307 masaki 25 if(!targetContorller) {
308     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
309     if(!targetContorller) return;
310 masaki 192
311     id selectionIndexes = [controller selectionIndexes];
312 masaki 25 [viewControllers setObject:targetContorller forKey:className];
313 masaki 180 [targetContorller view];
314 masaki 30 [targetContorller setRepresentedObject:controller];
315 masaki 189 [targetContorller recalculateKeyViewLoop];
316 masaki 192 [controller setSelectionIndexes:selectionIndexes];
317 masaki 25 }
318 masaki 109
319 masaki 25 [[listViewController view] removeFromSuperview];
320     listViewController = targetContorller;
321     [listView addSubview:[listViewController view]];
322     [[listViewController view] setFrame:[listView bounds]];
323 masaki 189 // [[self window] recalculateKeyViewLoop];
324     [self recalculateKeyViewLoop];
325 masaki 25 }
326 masaki 2
327 masaki 5
328 masaki 43 - (void)setupXspfLists
329 masaki 36 {
330 masaki 47 if(libraryViewController) return;
331    
332 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
333 masaki 37 [libraryViewController setRepresentedObject:listController];
334     [libraryView addSubview:[libraryViewController view]];
335 masaki 193 NSRect rect = [libraryView bounds];
336     rect.size.width += 2;
337     rect.origin.x -= 1;
338     [[libraryViewController view] setFrame:rect];
339 masaki 189 [libraryViewController recalculateKeyViewLoop];
340 masaki 36 }
341 masaki 47 - (void)setupDetailView
342 masaki 6 {
343 masaki 47 if(detailViewController) return;
344 masaki 6
345 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
346     [detailViewController setRepresentedObject:controller];
347     [detailView addSubview:[detailViewController view]];
348     [[detailViewController view] setFrame:[detailView bounds]];
349 masaki 189 [detailViewController recalculateKeyViewLoop];
350 masaki 6 }
351 masaki 82 - (void)setupAccessorylView
352     {
353     if(accessoryViewController) return;
354    
355     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
356     [accessoryViewController setRepresentedObject:[appDelegate channel]];
357     [accessoryView addSubview:[accessoryViewController view]];
358     [[accessoryViewController view] setFrame:[accessoryView bounds]];
359 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
360 masaki 82 }
361 masaki 8 #pragma mark#### NSWidnow Delegate ####
362     /**
363     Returns the NSUndoManager for the application. In this case, the manager
364     returned is that of the managed object context for the application.
365     */
366 masaki 6
367 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
368     return [[appDelegate managedObjectContext] undoManager];
369     }
370    
371 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
372     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
373     {
374 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
375 masaki 9 }
376    
377 masaki 193 #pragma mark#### XspfMDragControl Delegate ####
378     - (void)dragControl:(XspfMDragControl *)control dragDelta:(NSSize)delta
379     {
380     HMLog(HMLogLevelDebug, @"Enter %@", NSStringFromSelector(_cmd));
381     CGFloat libWidth = [libraryView frame].size.width;
382     [splitView setPosition:libWidth + delta.width ofDividerAtIndex:0];
383     }
384    
385 masaki 185 #pragma mark#### XspfManager Notifications ####
386     - (void)managerDidAddObjects:(NSNotification *)notification
387     {
388     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
389     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
390    
391     [controller performSelector:@selector(setSelectedObjects:)
392     withObject:addedObjects
393     afterDelay:0.01];
394     }
395    
396 masaki 184 #pragma mark#### Test ####
397     - (IBAction)test01:(id)sender
398     {
399 masaki 187 HMLog(HMLogLevelDebug, @"HMLogLevelDebug");
400     HMLog(HMLogLevelNotice, @"HMLogLevelNotice");
401     HMLog(HMLogLevelCaution, @"HMLogLevelCaution");
402     HMLog(HMLogLevelAlert, @"HMLogLevelAlert");
403     HMLog(HMLogLevelError, @"HMLogLevelError");
404 masaki 184
405 masaki 187 HMLog(HMLogLevelDebug, @"HMLogLevelDebug -> %@", @"DEBUG");
406 masaki 184 }
407     - (IBAction)test02:(id)sender
408     {
409     NSResponder *responder = [[self window] firstResponder];
410     while(responder) {
411 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
412 masaki 184 responder = [responder nextResponder];
413     }
414     }
415     - (IBAction)test03:(id)sender
416     {
417     id keyView = [[self window] firstResponder];
418     NSView *firstKeyView = keyView;
419     while(keyView) {
420 masaki 188 HMLog(HMLogLevelDebug, @"Keyview -> %@", keyView);
421 masaki 184 keyView = [keyView nextKeyView];
422     if(keyView == firstKeyView) break;
423     }
424    
425 masaki 188 HMLog(HMLogLevelDebug, @"Valid next view -> %@", [firstKeyView nextValidKeyView]);
426 masaki 184 }
427     @end

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