Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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