Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 315 - (hide annotations) (download)
Sat Feb 6 14:05:37 2010 UTC (14 years, 2 months ago) by masaki
File size: 18457 byte(s)
[Mod] NSArrayControllerとNSManagedObjectContextとのBindをXibではなくコード上で(少し遅らせて)行うようにした。
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 281 #import "XspfMCoverFlowViewController.h"
19 masaki 2
20 masaki 281
21 masaki 193 #import "XspfMDragControl.h"
22    
23 masaki 69
24 masaki 182 @interface XspfMMainWindowController(HMPrivate)
25 masaki 43 - (void)setupXspfLists;
26 masaki 47 - (void)setupDetailView;
27 masaki 82 - (void)setupAccessorylView;
28 masaki 25 - (void)changeViewType:(XspfMViewType)newType;
29     - (void)setCurrentListViewType:(XspfMViewType)newType;
30 masaki 189 - (void)recalculateKeyViewLoop;
31 masaki 199
32     - (void)removeSelectedItem;
33 masaki 16 @end
34    
35 masaki 300 @interface NSObject(XspfMPreviewPanelSupport)
36     - (NSPanel *)sharedPreviewPanel;
37     @end
38     @interface NSPanel(XspfMPreviewPanelSupport)
39 masaki 305 - (void)setURLs:(NSArray *)URLs;
40 masaki 300 - (void)setURLs:(NSArray *)URLs currentIndex:(NSUInteger)index preservingDisplayState:(BOOL)flag;
41     - (void)makeKeyAndOrderFrontWithEffect:(NSInteger)mode;
42     - (void)setCurrentPreviewItemIndex:(NSUInteger)index;
43 masaki 304 - (NSUInteger)currentPreviewItemIndex;
44 masaki 300 @end
45    
46    
47 masaki 297 static NSInteger osVersion = 0;
48     static id previewPanel = nil;
49 masaki 184
50 masaki 182 @implementation XspfMMainWindowController
51 masaki 297 + (void)initialize
52     {
53 masaki 300 static BOOL isFirst = YES;
54     if(isFirst) {
55     isFirst = NO;
56     if([[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/QuickLookUI.framework"] load]) {
57     NSLog(@"Quick Look for 10.5 loaded!");
58     osVersion = 105;
59     }
60     if([[NSBundle bundleWithPath:@"/System/Library/Frameworks/Quartz.framework/Frameworks/QuickLookUI.framework"] load]) {
61     NSLog(@"Quick Look for 10.6 loaded!");
62     osVersion = 106;
63     }
64 masaki 297 }
65     }
66 masaki 36
67 masaki 8 - (id)init
68     {
69 masaki 200 self = [super initWithWindowNibName:@"MainWindow"];
70     if(self) {
71     viewControllers = [[NSMutableDictionary alloc] init];
72     }
73 masaki 50
74 masaki 8 return self;
75 masaki 2 }
76 masaki 8 - (void)awakeFromNib
77     {
78 masaki 47 static BOOL didSetupOnMainMenu = NO;
79    
80     if(appDelegate && !didSetupOnMainMenu) {
81     didSetupOnMainMenu = YES;
82 masaki 98
83 masaki 185 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
84     [nc addObserver:self
85     selector:@selector(managerDidAddObjects:)
86     name:XspfManagerDidAddXspfObjectsNotification
87     object:appDelegate];
88 masaki 304
89 masaki 49 [self window];
90 masaki 99
91 masaki 47 }
92 masaki 8 }
93 masaki 49 - (void)windowDidLoad
94     {
95 masaki 231 [[self window] setContentBorderThickness:32 forEdge:NSMinYEdge];
96 masaki 82
97 masaki 294 [splitView setDelegate:self];
98 masaki 49 [self setupXspfLists];
99     [self setupDetailView];
100 masaki 82 [self setupAccessorylView];
101 masaki 50 if(currentListViewType == typeNotSelected) {
102 masaki 180 [self setCurrentListViewType:typeTableView];
103 masaki 50 }
104 masaki 49
105 masaki 315
106     [listController bind:NSManagedObjectContextBinding
107     toObject:appDelegate
108     withKeyPath:@"managedObjectContext"
109     options:nil];
110    
111     [allXspfController bind:NSManagedObjectContextBinding
112     toObject:appDelegate
113     withKeyPath:@"managedObjectContext"
114     options:nil];
115    
116 masaki 304 [controller addObserver:self forKeyPath:@"selectionIndex" options:0 context:NULL];
117    
118 masaki 50 [self showWindow:nil];
119 masaki 189 [self recalculateKeyViewLoop];
120 masaki 49 }
121 masaki 25 #pragma mark#### KVC ####
122 masaki 2
123 masaki 25 - (XspfMViewType)currentListViewType
124     {
125     return currentListViewType;
126     }
127     - (void)setCurrentListViewType:(XspfMViewType)newType
128     {
129     if(currentListViewType == newType) return;
130    
131     [self changeViewType:newType];
132     }
133 masaki 16
134 masaki 304 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
135     {
136     if([keyPath isEqualToString:@"selectionIndex"]) {
137 masaki 305 if(osVersion == 105) {
138     id qlPanel = [NSClassFromString(@"QLPreviewPanel") sharedPreviewPanel];
139     [qlPanel setURLs:[[controller selectedObjects] mutableArrayValueForKey:@"url"]];
140     } else {
141     [previewPanel reloadData];
142     }
143    
144 masaki 304 return;
145     }
146     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
147     }
148    
149 masaki 13 #pragma mark#### Actions ####
150 masaki 10 - (IBAction)openXspf:(id)sender
151     {
152 masaki 115 BOOL isSelected = [[controller valueForKeyPath:@"selectedObjects.@count"] boolValue];
153     if(!isSelected) return;
154    
155 masaki 238 XspfMXspfObject *rep = [controller valueForKeyPath:@"selection.self"];
156 masaki 277 BOOL didOpen = [[NSWorkspace sharedWorkspace] openFile:rep.filePath withApplication:@"XspfQT"];
157     if(didOpen) {
158     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
159 masaki 101 return;
160     }
161 masaki 277
162     NSInteger result = NSRunCriticalAlertPanel(NSLocalizedString(@"Xspf is not found", @"Xspf is not found"),
163     NSLocalizedString(@"\"%@\" is not found.", @"\"%@\" is not found."),
164     nil, nil/*@"Search Original"*/, nil, rep.title);
165     if(result == NSAlertDefaultReturn) {
166     return;
167     } else if(result == NSAlertAlternateReturn) {
168     //
169     #warning shuld implement.
170     }
171    
172 masaki 10 }
173 masaki 190 - (IBAction)switchListView:(id)sender
174     {
175     [self setCurrentListViewType:typeTableView];
176     }
177     - (IBAction)switchRegularIconView:(id)sender
178     {
179     [self setCurrentListViewType:typeCollectionView];
180     [(XspfMCollectionViewController *)listViewController collectionViewItemViewRegular:sender];
181     }
182     - (IBAction)switchSmallIconView:(id)sender
183     {
184     [self setCurrentListViewType:typeCollectionView];
185     [(XspfMCollectionViewController *)listViewController collectionViewItemViewSmall:sender];
186     }
187 masaki 281 - (IBAction)switchCoverFlowView:(id)sender
188     {
189     [self setCurrentListViewType:typeCoverFlowView];
190     }
191    
192 masaki 191 - (void)sortByKey:(NSString *)key
193 masaki 190 {
194 masaki 216 NSMutableArray *sortDescs = [[[controller sortDescriptors] mutableCopy] autorelease];
195 masaki 190 NSSortDescriptor *sortDesc = nil;
196    
197     // key is descs first key.
198     if([sortDescs count] > 1) {
199     NSSortDescriptor *firstDesc = [sortDescs objectAtIndex:0];
200     if([key isEqualToString:[firstDesc key]]) {
201     sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:![firstDesc ascending]] autorelease];
202     [sortDescs removeObject:firstDesc];
203     }
204     }
205     // remove same key.
206     if(!sortDesc) {
207 masaki 191 BOOL newAscending = NO;
208 masaki 190 NSSortDescriptor *foundDesc = nil;
209     for(id desc in sortDescs) {
210     if([key isEqualToString:[desc key]]) {
211     foundDesc = desc;
212     break;
213     }
214     }
215     if(foundDesc) {
216 masaki 191 newAscending = [foundDesc ascending];
217 masaki 190 [sortDescs removeObject:foundDesc];
218     }
219    
220 masaki 191 sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:newAscending] autorelease];
221 masaki 190 }
222    
223     [sortDescs insertObject:sortDesc atIndex:0];
224    
225     NSArray *selectedObjects = [controller selectedObjects];
226     [controller setSortDescriptors:sortDescs];
227     [controller setSelectedObjects:selectedObjects];
228     }
229     - (IBAction)sortByTitle:(id)sender
230     {
231 masaki 191 [self sortByKey:@"title"];
232 masaki 190 }
233     - (IBAction)sortByLastPlayDate:(id)sender
234     {
235 masaki 191 [self sortByKey:@"lastPlayDate"];
236 masaki 190 }
237     - (IBAction)sortByModificationDate:(id)sender
238     {
239 masaki 191 [self sortByKey:@"modificationDate"];
240 masaki 190 }
241     - (IBAction)sortByCreationDate:(id)sender
242     {
243 masaki 191 [self sortByKey:@"creationDate"];
244 masaki 190 }
245     - (IBAction)sortByRegisterDate:(id)sender
246     {
247 masaki 191 [self sortByKey:@"registerDate"];
248 masaki 190 }
249     - (IBAction)sortByRate:(id)sender
250     {
251 masaki 191 [self sortByKey:@"rating"];
252 masaki 190 }
253     - (IBAction)sortByMovieNumber:(id)sender
254     {
255 masaki 191 [self sortByKey:@"movieNum"];
256 masaki 190 }
257     - (IBAction)sortByLabel:(id)sender
258     {
259 masaki 224 [self sortByKey:@"label"];
260 masaki 190 }
261    
262 masaki 2 - (IBAction)add:(id)sender
263     {
264     NSOpenPanel *panel = [NSOpenPanel openPanel];
265    
266     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
267     [panel setAllowsMultipleSelection:YES];
268 masaki 9 [panel setDelegate:self];
269 masaki 2
270     [panel beginSheetForDirectory:nil
271     file:nil
272     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
273 masaki 8 modalForWindow:[self window]
274 masaki 2 modalDelegate:self
275     didEndSelector:@selector(endOpenPanel:::)
276     contextInfo:NULL];
277     }
278 masaki 106 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
279     {
280     [panel orderOut:nil];
281 masaki 2
282 masaki 106 if(returnCode == NSCancelButton) return;
283    
284     NSArray *URLs = [panel URLs];
285     if([URLs count] == 0) return;
286    
287 masaki 184 [appDelegate registerURLs:URLs];
288 masaki 106 }
289 masaki 190 - (IBAction)remove:(id)sender
290     {
291 masaki 199 [self removeSelectedItem];
292 masaki 190 }
293 masaki 182
294 masaki 194 - (IBAction)newPredicate:(id)sender
295     {
296     [libraryViewController newPredicate:sender];
297     }
298    
299 masaki 190 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
300     {
301     BOOL enabled = YES;
302     SEL action = [menuItem action];
303    
304     if(action == @selector(switchListView:)) {
305     if(currentListViewType == typeTableView) {
306     [menuItem setState:NSOnState];
307     } else {
308     [menuItem setState:NSOffState];
309     }
310     } else if(action == @selector(switchRegularIconView:)) {
311     if(currentListViewType == typeCollectionView
312     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXspfMRegularItem) {
313     [menuItem setState:NSOnState];
314     } else {
315     [menuItem setState:NSOffState];
316     }
317     } else if(action == @selector(switchSmallIconView:)) {
318     if(currentListViewType == typeCollectionView
319     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXSpfMSmallItem) {
320     [menuItem setState:NSOnState];
321     } else {
322     [menuItem setState:NSOffState];
323     }
324 masaki 281 } else if(action == @selector(switchCoverFlowView:)) {
325     if(currentListViewType == typeCoverFlowView) {
326     [menuItem setState:NSOnState];
327     } else {
328     [menuItem setState:NSOffState];
329     }
330 masaki 190 }
331    
332     return enabled;
333     }
334    
335 masaki 25 #pragma mark#### Other methods ####
336 masaki 199 - (void)removeSelectedItem
337     {
338 masaki 238 XspfMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
339 masaki 199
340     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [self window],
341     self, @selector(didEndAskDelete:::), Nil, obj,
342     NSLocalizedString(@"Do you really delete item \"%@\" from list?", @"Do you really delete item \"%@\" from list?"),
343     obj.title);
344     }
345     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
346     {
347     if(returnCode == NSCancelButton) return;
348    
349     [appDelegate removeObject:contextInfo];
350     }
351    
352 masaki 189 - (void)recalculateKeyViewLoop
353     {
354     [searchField setNextKeyView:[libraryViewController firstKeyView]];
355     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
356     [listViewController setNextKeyView:[detailViewController firstKeyView]];
357     [detailViewController setNextKeyView:searchField];
358     }
359 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
360     {
361     if(currentListViewType == viewType) return;
362     currentListViewType = viewType;
363    
364     NSString *className = nil;
365     switch(currentListViewType) {
366     case typeCollectionView:
367     className = @"XspfMCollectionViewController";
368     break;
369     case typeTableView:
370     className = @"XspfMListViewController";
371     break;
372 masaki 281 case typeCoverFlowView:
373     className = @"XspfMCoverFlowViewController";
374     break;
375 masaki 25 }
376     if(!className) return;
377    
378 masaki 189 XspfMViewController *targetContorller = [viewControllers objectForKey:className];
379 masaki 25 if(!targetContorller) {
380     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
381     if(!targetContorller) return;
382 masaki 192
383     id selectionIndexes = [controller selectionIndexes];
384 masaki 25 [viewControllers setObject:targetContorller forKey:className];
385 masaki 180 [targetContorller view];
386 masaki 30 [targetContorller setRepresentedObject:controller];
387 masaki 189 [targetContorller recalculateKeyViewLoop];
388 masaki 192 [controller setSelectionIndexes:selectionIndexes];
389 masaki 25 }
390 masaki 109
391 masaki 25 [[listViewController view] removeFromSuperview];
392     listViewController = targetContorller;
393     [listView addSubview:[listViewController view]];
394     [[listViewController view] setFrame:[listView bounds]];
395 masaki 189 // [[self window] recalculateKeyViewLoop];
396     [self recalculateKeyViewLoop];
397 masaki 25 }
398 masaki 2
399 masaki 5
400 masaki 43 - (void)setupXspfLists
401 masaki 36 {
402 masaki 47 if(libraryViewController) return;
403    
404 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
405 masaki 37 [libraryViewController setRepresentedObject:listController];
406     [libraryView addSubview:[libraryViewController view]];
407 masaki 193 NSRect rect = [libraryView bounds];
408     rect.size.width += 2;
409     rect.origin.x -= 1;
410     [[libraryViewController view] setFrame:rect];
411 masaki 189 [libraryViewController recalculateKeyViewLoop];
412 masaki 233 [[libraryViewController dragControl] setDelegate:self];
413 masaki 36 }
414 masaki 47 - (void)setupDetailView
415 masaki 6 {
416 masaki 47 if(detailViewController) return;
417 masaki 6
418 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
419     [detailViewController setRepresentedObject:controller];
420     [detailView addSubview:[detailViewController view]];
421     [[detailViewController view] setFrame:[detailView bounds]];
422 masaki 189 [detailViewController recalculateKeyViewLoop];
423 masaki 6 }
424 masaki 82 - (void)setupAccessorylView
425     {
426     if(accessoryViewController) return;
427    
428     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
429     [accessoryViewController setRepresentedObject:[appDelegate channel]];
430     [accessoryView addSubview:[accessoryViewController view]];
431     [[accessoryViewController view] setFrame:[accessoryView bounds]];
432 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
433 masaki 82 }
434 masaki 8 #pragma mark#### NSWidnow Delegate ####
435     /**
436     Returns the NSUndoManager for the application. In this case, the manager
437     returned is that of the managed object context for the application.
438     */
439 masaki 6
440 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
441     return [[appDelegate managedObjectContext] undoManager];
442     }
443    
444 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
445     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
446     {
447 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
448 masaki 9 }
449 masaki 294 #pragma mark#### NSSplitView Delegate ####
450     - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex
451     {
452     return 130;
453     }
454 masaki 295 - (void)splitView:(NSSplitView *)aSplitView resizeSubviewsWithOldSize:(NSSize)oldSize
455     {
456     NSView *rightView = [[splitView subviews] objectAtIndex:1];
457     NSRect newFrame = [splitView frame];
458     NSRect libFrame = [libraryView frame];
459     NSRect listFrame = [rightView frame];
460     CGFloat dividerThickness = [splitView dividerThickness];
461    
462     libFrame.size.height = newFrame.size.height;
463     listFrame.size.height = newFrame.size.height;
464    
465     listFrame.size.width = newFrame.size.width - libFrame.size.width - dividerThickness;
466    
467     if(listFrame.size.width < 0) listFrame.size.width = 0;
468    
469     [libraryView setFrame:libFrame];
470     [rightView setFrame:listFrame];
471     }
472 masaki 193 #pragma mark#### XspfMDragControl Delegate ####
473     - (void)dragControl:(XspfMDragControl *)control dragDelta:(NSSize)delta
474     {
475     HMLog(HMLogLevelDebug, @"Enter %@", NSStringFromSelector(_cmd));
476     CGFloat libWidth = [libraryView frame].size.width;
477     [splitView setPosition:libWidth + delta.width ofDividerAtIndex:0];
478     }
479    
480 masaki 185 #pragma mark#### XspfManager Notifications ####
481     - (void)managerDidAddObjects:(NSNotification *)notification
482     {
483     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
484     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
485    
486     [controller performSelector:@selector(setSelectedObjects:)
487     withObject:addedObjects
488     afterDelay:0.01];
489     }
490    
491 masaki 297 #pragma mark#### PreviewPanel Support ####
492     - (IBAction)togglePreviewPanel:(id)panel
493     {
494     Class aClass = NSClassFromString(@"QLPreviewPanel");
495     if(!aClass) {
496     NSBeep();
497     return;
498     }
499     id qlPanel = [aClass sharedPreviewPanel];
500     if(osVersion == 105) {
501 masaki 305 [qlPanel setDelegate:self];
502     [qlPanel setURLs:[[controller selectedObjects] mutableArrayValueForKey:@"url"]];
503 masaki 298 [qlPanel makeKeyAndOrderFrontWithEffect:2];
504 masaki 297 } else if(osVersion <= 106) {
505     [qlPanel makeKeyAndOrderFront:nil];
506     }
507     }
508    
509     #pragma mark---- QLPreviewPanelController ----
510     - (BOOL)acceptsPreviewPanelControl:(id /*QLPreviewPanel* */)panel
511     {
512     return YES;
513     }
514     - (void)beginPreviewPanelControl:(id /*QLPreviewPanel* */)panel
515     {
516     // This document is now responsible of the preview panel
517     // It is allowed to set the delegate, data source and refresh panel.
518     previewPanel = [panel retain];
519     [panel setDelegate:self];
520     [panel setDataSource:self];
521     [previewPanel setCurrentPreviewItemIndex:[controller selectionIndex]];
522     }
523     - (void)endPreviewPanelControl:(id /*QLPreviewPanel* */)panel
524     {
525     // This document loses its responsisibility on the preview panel
526     // Until the next call to -beginPreviewPanelControl: it must not
527     // change the panel's delegate, data source or refresh it.
528     [previewPanel release];
529     previewPanel = nil;
530     }
531    
532     #pragma mark---- QLPreviewPanelDataSource ----
533     - (NSInteger)numberOfPreviewItemsInPreviewPanel:(id /*QLPreviewPanel* */)panel
534     {
535 masaki 304 return [[controller selectedObjects] count];
536 masaki 297 }
537     - (id /*<QLPreviewItem>*/)previewPanel:(id)panel previewItemAtIndex:(NSInteger)index
538     {
539 masaki 304 return [[controller selectedObjects] objectAtIndex:index];
540 masaki 297 }
541    
542     #pragma mark---- QLPreviewPanelDelegate ----
543     - (BOOL)previewPanel:(id /*QLPreviewPanel* */)panel handleEvent:(NSEvent *)event
544     {
545     // redirect all key down events to the table view
546     if ([event type] == NSKeyDown) {
547     NSResponder *target = nil;
548     target = [listViewController initialFirstResponder];
549     if(!target) {
550     target = [listViewController firstKeyView];
551     }
552     if(!target) {
553     target = [listViewController view];
554     }
555     if(!target) return NO;
556    
557     [target keyDown:event];
558     return YES;
559     }
560     return NO;
561     }
562     - (NSRect)previewPanel:(id /*QLPreviewPanel* */)panel sourceFrameOnScreenForPreviewItem:(id /*<QLPreviewItem>*/)item
563     {
564 masaki 304 return [listViewController selectionItemRect];
565 masaki 297 }
566    
567     // This delegate method provides a transition image between the table view and the preview panel
568     - (id)previewPanel:(id /*QLPreviewPanel* */)panel transitionImageForPreviewItem:(id /*<QLPreviewItem>*/)item contentRect:(NSRect *)contentRect
569     {
570     XspfMXspfObject *obj = item;
571     return obj.thumbnail;
572     }
573 masaki 304
574 masaki 305 // for Leopard
575     - (BOOL)previewPanel:(id)panel shouldHandleEvent:(NSEvent *)theEvent
576     {
577     return ![self previewPanel:panel handleEvent:theEvent];
578     }
579     - (NSRect)previewPanel:(id)panel frameForURL:(NSURL *)url
580     {
581     return [self previewPanel:panel sourceFrameOnScreenForPreviewItem:url];
582     }
583 masaki 304
584 masaki 184 #pragma mark#### Test ####
585     - (IBAction)test01:(id)sender
586     {
587 masaki 238 XspfMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
588 masaki 204 srandom([[NSDate date] timeIntervalSince1970]);
589     obj.label = [NSNumber numberWithInteger:random() % 8];
590 masaki 203 HMLog(HMLogLevelDebug, @"HMLogLevelDebug -> %@", obj);
591 masaki 231
592     NSButtonCell *cell = [sender cell];
593     HMLog(HMLogLevelDebug, @"boardered -> %@\nbezeled -> %@\ngradientType -> %d\n bezelStyle -> %d",
594     [cell isBordered] ? @"YES" : @"NO", [cell isBezeled] ? @"YES" : @"NO",
595     [cell gradientType], [cell bezelStyle]);
596 masaki 184 }
597     - (IBAction)test02:(id)sender
598     {
599     NSResponder *responder = [[self window] firstResponder];
600     while(responder) {
601 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
602 masaki 184 responder = [responder nextResponder];
603     }
604     }
605     - (IBAction)test03:(id)sender
606     {
607     id keyView = [[self window] firstResponder];
608     NSView *firstKeyView = keyView;
609     while(keyView) {
610 masaki 188 HMLog(HMLogLevelDebug, @"Keyview -> %@", keyView);
611 masaki 184 keyView = [keyView nextKeyView];
612     if(keyView == firstKeyView) break;
613     }
614    
615 masaki 188 HMLog(HMLogLevelDebug, @"Valid next view -> %@", [firstKeyView nextValidKeyView]);
616 masaki 184 }
617     @end
618 masaki 297
619     @implementation XspfMXspfObject (XspfMPreviewPanelSupport)
620     - (NSString *)previewItemTitle
621     {
622     return self.title;
623     }
624     - (NSURL *)previewItemURL
625     {
626     return self.url;
627     }
628     @end

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