Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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