Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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