Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 382 - (hide annotations) (download)
Sun Jun 6 11:34:12 2010 UTC (13 years, 10 months ago) by masakih
File size: 18615 byte(s)
 起動するプレーヤをユーザーデフォルトで設定出来るようにした。
1 masaki 2 //
2     // XspfManager.m
3     // XspfManager
4     //
5     // Created by Hori,Masaki on 09/11/01.
6     //
7    
8 masakih 350 /*
9 masakih 365 This source code is release under the New BSD License.
10 masakih 350 Copyright (c) 2009-2010, masakih
11     All rights reserved.
12    
13 masakih 365 ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に
14     限り、再頒布および使用が許可されます。
15    
16     1, ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含
17     めること。
18     2, バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表
19     示、本条件一覧、および下記免責条項を含めること。
20     3, 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、
21     コントリビューターの名前を使用してはならない。
22     本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、
23     明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証
24     も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューター
25     も、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか
26     厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する
27     可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用
28     サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定
29     されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害につい
30     て、一切責任を負わないものとします。
31 masakih 350 -------------------------------------------------------------------
32     Copyright (c) 2009-2010, masakih
33     All rights reserved.
34    
35 masakih 365 Redistribution and use in source and binary forms, with or without
36     modification, are permitted provided that the following conditions
37     are met:
38 masakih 350
39 masakih 365 1, Redistributions of source code must retain the above copyright
40     notice, this list of conditions and the following disclaimer.
41     2, Redistributions in binary form must reproduce the above copyright
42     notice, this list of conditions and the following disclaimer in
43     the documentation and/or other materials provided with the
44     distribution.
45     3, The names of its contributors may be used to endorse or promote
46     products derived from this software without specific prior
47     written permission.
48     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
51     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
52     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
53     INCIDENTAL, SPECIAL,EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
54     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
55     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
56     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
58     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
59     POSSIBILITY OF SUCH DAMAGE.
60 masakih 350 */
61    
62 masaki 182 #import "XspfMMainWindowController.h"
63 masaki 2
64 masaki 238 #import "XspfMXspfObject.h"
65 masaki 2
66 masaki 189 #import "XspfMViewController.h"
67 masaki 41 #import "XspfMLibraryViewController.h"
68 masaki 16 #import "XspfMCollectionViewController.h"
69 masaki 25 #import "XspfMListViewController.h"
70 masaki 47 #import "XspfMDetailViewController.h"
71 masaki 281 #import "XspfMCoverFlowViewController.h"
72 masaki 2
73 masakih 370 #import "XspfMPreferences.h"
74 masaki 193
75 masaki 69
76 masaki 182 @interface XspfMMainWindowController(HMPrivate)
77 masaki 43 - (void)setupXspfLists;
78 masaki 47 - (void)setupDetailView;
79 masaki 82 - (void)setupAccessorylView;
80 masaki 25 - (void)changeViewType:(XspfMViewType)newType;
81     - (void)setCurrentListViewType:(XspfMViewType)newType;
82 masaki 189 - (void)recalculateKeyViewLoop;
83 masaki 199
84     - (void)removeSelectedItem;
85 masakih 370
86     - (BOOL)isOpenDetailView;
87 masakih 373 - (BOOL)validateControl:(id)anItem;
88 masaki 16 @end
89    
90 masaki 317
91 masaki 182 @implementation XspfMMainWindowController
92 masaki 8 - (id)init
93     {
94 masaki 200 self = [super initWithWindowNibName:@"MainWindow"];
95     if(self) {
96     viewControllers = [[NSMutableDictionary alloc] init];
97     }
98 masaki 50
99 masaki 8 return self;
100 masaki 2 }
101 masaki 8 - (void)awakeFromNib
102     {
103 masaki 47 static BOOL didSetupOnMainMenu = NO;
104    
105     if(appDelegate && !didSetupOnMainMenu) {
106     didSetupOnMainMenu = YES;
107 masaki 98
108 masaki 185 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
109     [nc addObserver:self
110     selector:@selector(managerDidAddObjects:)
111     name:XspfManagerDidAddXspfObjectsNotification
112     object:appDelegate];
113 masaki 304
114 masaki 49 [self window];
115 masaki 99
116 masaki 47 }
117 masaki 8 }
118 masaki 49 - (void)windowDidLoad
119     {
120 masakih 358 [[self window] setContentBorderThickness:27 forEdge:NSMinYEdge];
121 masaki 82
122 masaki 294 [splitView setDelegate:self];
123 masaki 49 [self setupXspfLists];
124     [self setupDetailView];
125 masaki 82 [self setupAccessorylView];
126 masaki 49
127 masakih 370 XspfMPreferences *pref = [XspfMPreferences sharedPreference];
128     if(!pref.isOpenDetailView) {
129     [self showHideDetail:self];
130     if(pref.splitViewLeftWidth != 0) {
131     [splitView setPosition:pref.splitViewLeftWidth ofDividerAtIndex:0];
132     }
133     }
134    
135 masakih 374 [self setCurrentListViewType:pref.viewType];
136 masaki 315
137 masakih 373 [self validateControl:detailViewButton];
138 masaki 316
139 masakih 373
140 masaki 315 [listController bind:NSManagedObjectContextBinding
141     toObject:appDelegate
142     withKeyPath:@"managedObjectContext"
143     options:nil];
144    
145     [allXspfController bind:NSManagedObjectContextBinding
146     toObject:appDelegate
147     withKeyPath:@"managedObjectContext"
148     options:nil];
149 masakih 370
150 masaki 189 [self recalculateKeyViewLoop];
151 masakih 373
152 masakih 380 // [self performSelector:@selector(showWindow:) withObject:self afterDelay:0.1];
153     [self performSelector:@selector(delayExcute:) withObject:self afterDelay:0.1];
154 masaki 49 }
155 masakih 380 - (void)delayExcute:(id)dummy
156     {
157     [self showWindow:self];
158    
159    
160 masakih 382 // load時にこれを行うと循環的にRearrangeが実行されてしまう。
161 masakih 380 [listController setAutomaticallyRearrangesObjects:YES];
162     }
163 masaki 25 #pragma mark#### KVC ####
164 masaki 2
165 masaki 25 - (XspfMViewType)currentListViewType
166     {
167     return currentListViewType;
168     }
169     - (void)setCurrentListViewType:(XspfMViewType)newType
170     {
171     if(currentListViewType == newType) return;
172    
173 masakih 374 [XspfMPreferences sharedPreference].viewType = newType;
174 masaki 316
175 masaki 25 [self changeViewType:newType];
176     }
177 masaki 16
178 masaki 13 #pragma mark#### Actions ####
179 masaki 10 - (IBAction)openXspf:(id)sender
180     {
181 masaki 115 BOOL isSelected = [[controller valueForKeyPath:@"selectedObjects.@count"] boolValue];
182     if(!isSelected) return;
183    
184 masaki 238 XspfMXspfObject *rep = [controller valueForKeyPath:@"selection.self"];
185 masakih 382 BOOL didOpen = [[NSWorkspace sharedWorkspace] openFile:rep.filePath
186     withApplication:[XspfMPreferences sharedPreference].playerName];
187 masaki 277 if(didOpen) {
188     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
189 masaki 101 return;
190     }
191 masaki 277
192     NSInteger result = NSRunCriticalAlertPanel(NSLocalizedString(@"Xspf is not found", @"Xspf is not found"),
193     NSLocalizedString(@"\"%@\" is not found.", @"\"%@\" is not found."),
194     nil, nil/*@"Search Original"*/, nil, rep.title);
195     if(result == NSAlertDefaultReturn) {
196     return;
197     } else if(result == NSAlertAlternateReturn) {
198     //
199 masakih 345 #warning should implement.
200 masaki 277 }
201    
202 masaki 10 }
203 masaki 190 - (IBAction)switchListView:(id)sender
204     {
205     [self setCurrentListViewType:typeTableView];
206     }
207     - (IBAction)switchRegularIconView:(id)sender
208     {
209     [self setCurrentListViewType:typeCollectionView];
210     [(XspfMCollectionViewController *)listViewController collectionViewItemViewRegular:sender];
211     }
212     - (IBAction)switchSmallIconView:(id)sender
213     {
214     [self setCurrentListViewType:typeCollectionView];
215     [(XspfMCollectionViewController *)listViewController collectionViewItemViewSmall:sender];
216     }
217 masaki 281 - (IBAction)switchCoverFlowView:(id)sender
218     {
219     [self setCurrentListViewType:typeCoverFlowView];
220     }
221    
222 masaki 191 - (void)sortByKey:(NSString *)key
223 masaki 190 {
224 masaki 216 NSMutableArray *sortDescs = [[[controller sortDescriptors] mutableCopy] autorelease];
225 masaki 190 NSSortDescriptor *sortDesc = nil;
226    
227     // key is descs first key.
228     if([sortDescs count] > 1) {
229     NSSortDescriptor *firstDesc = [sortDescs objectAtIndex:0];
230     if([key isEqualToString:[firstDesc key]]) {
231     sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:![firstDesc ascending]] autorelease];
232     [sortDescs removeObject:firstDesc];
233     }
234     }
235     // remove same key.
236     if(!sortDesc) {
237 masaki 191 BOOL newAscending = NO;
238 masaki 190 NSSortDescriptor *foundDesc = nil;
239     for(id desc in sortDescs) {
240     if([key isEqualToString:[desc key]]) {
241     foundDesc = desc;
242     break;
243     }
244     }
245     if(foundDesc) {
246 masaki 191 newAscending = [foundDesc ascending];
247 masaki 190 [sortDescs removeObject:foundDesc];
248     }
249    
250 masaki 191 sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:newAscending] autorelease];
251 masaki 190 }
252    
253     [sortDescs insertObject:sortDesc atIndex:0];
254    
255     NSArray *selectedObjects = [controller selectedObjects];
256     [controller setSortDescriptors:sortDescs];
257     [controller setSelectedObjects:selectedObjects];
258     }
259     - (IBAction)sortByTitle:(id)sender
260     {
261 masaki 191 [self sortByKey:@"title"];
262 masaki 190 }
263     - (IBAction)sortByLastPlayDate:(id)sender
264     {
265 masaki 191 [self sortByKey:@"lastPlayDate"];
266 masaki 190 }
267     - (IBAction)sortByModificationDate:(id)sender
268     {
269 masaki 191 [self sortByKey:@"modificationDate"];
270 masaki 190 }
271     - (IBAction)sortByCreationDate:(id)sender
272     {
273 masaki 191 [self sortByKey:@"creationDate"];
274 masaki 190 }
275     - (IBAction)sortByRegisterDate:(id)sender
276     {
277 masaki 191 [self sortByKey:@"registerDate"];
278 masaki 190 }
279     - (IBAction)sortByRate:(id)sender
280     {
281 masaki 191 [self sortByKey:@"rating"];
282 masaki 190 }
283     - (IBAction)sortByMovieNumber:(id)sender
284     {
285 masaki 191 [self sortByKey:@"movieNum"];
286 masaki 190 }
287     - (IBAction)sortByLabel:(id)sender
288     {
289 masaki 224 [self sortByKey:@"label"];
290 masaki 190 }
291    
292 masaki 2 - (IBAction)add:(id)sender
293     {
294     NSOpenPanel *panel = [NSOpenPanel openPanel];
295    
296     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
297     [panel setAllowsMultipleSelection:YES];
298 masaki 9 [panel setDelegate:self];
299 masaki 2
300     [panel beginSheetForDirectory:nil
301     file:nil
302     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
303 masaki 8 modalForWindow:[self window]
304 masaki 2 modalDelegate:self
305     didEndSelector:@selector(endOpenPanel:::)
306     contextInfo:NULL];
307     }
308 masaki 106 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
309     {
310     [panel orderOut:nil];
311 masaki 2
312 masaki 106 if(returnCode == NSCancelButton) return;
313    
314     NSArray *URLs = [panel URLs];
315     if([URLs count] == 0) return;
316    
317 masaki 184 [appDelegate registerURLs:URLs];
318 masaki 106 }
319 masaki 190 - (IBAction)remove:(id)sender
320     {
321 masaki 199 [self removeSelectedItem];
322 masaki 190 }
323 masaki 182
324 masaki 194 - (IBAction)newPredicate:(id)sender
325     {
326     [libraryViewController newPredicate:sender];
327     }
328    
329 masakih 370 - (BOOL)isOpenDetailView
330     {
331     NSPoint origin = [detailView frame].origin;
332     CGFloat windowRightEdge = [[detailView window] frame].size.width;
333     return (origin.x == windowRightEdge);
334     }
335 masakih 358 - (IBAction)showHideDetail:(id)sender
336     {
337 masakih 370 XspfMPreferences *pref = [XspfMPreferences sharedPreference];
338 masakih 358
339     NSPoint origin = [detailView frame].origin;
340     NSSize size = NSZeroSize;
341    
342     CGFloat detailWidth = [detailView frame].size.width;
343 masakih 370 if([self isOpenDetailView]){ // show
344 masakih 358 origin.x -= detailWidth;
345     size = [splitView frame].size;
346     size.width -= detailWidth;
347 masakih 370
348     pref.openDetailView = YES;
349 masakih 358 } else { // hide
350     origin.x += detailWidth;
351     size = [splitView frame].size;
352     size.width += detailWidth;
353 masakih 370
354     pref.openDetailView = NO;
355 masakih 358 }
356     [[detailView animator] setFrameOrigin:origin];
357     [[splitView animator] setFrameSize:size];
358 masakih 373
359     [self validateControl:detailViewButton];
360 masakih 358 }
361    
362 masaki 190 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
363     {
364     BOOL enabled = YES;
365     SEL action = [menuItem action];
366    
367     if(action == @selector(switchListView:)) {
368     if(currentListViewType == typeTableView) {
369     [menuItem setState:NSOnState];
370     } else {
371     [menuItem setState:NSOffState];
372     }
373     } else if(action == @selector(switchRegularIconView:)) {
374     if(currentListViewType == typeCollectionView
375     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXspfMRegularItem) {
376     [menuItem setState:NSOnState];
377     } else {
378     [menuItem setState:NSOffState];
379     }
380     } else if(action == @selector(switchSmallIconView:)) {
381     if(currentListViewType == typeCollectionView
382     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXSpfMSmallItem) {
383     [menuItem setState:NSOnState];
384     } else {
385     [menuItem setState:NSOffState];
386     }
387 masaki 281 } else if(action == @selector(switchCoverFlowView:)) {
388     if(currentListViewType == typeCoverFlowView) {
389     [menuItem setState:NSOnState];
390     } else {
391     [menuItem setState:NSOffState];
392     }
393 masaki 190 }
394    
395     return enabled;
396     }
397 masakih 373 - (BOOL)validateControl:(id)anItem
398     {
399     if([detailViewButton isEqual:anItem]) {
400     if([self isOpenDetailView]) {
401     [detailViewButton setImage:[NSImage imageNamed:@"NSRightFacingTriangleTemplate"]];
402     } else {
403     [detailViewButton setImage:[NSImage imageNamed:@"NSLeftFacingTriangleTemplate"]];
404     }
405     }
406     return YES;
407     }
408 masaki 25 #pragma mark#### Other methods ####
409 masaki 199 - (void)removeSelectedItem
410     {
411 masaki 238 XspfMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
412 masaki 199
413     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [self window],
414     self, @selector(didEndAskDelete:::), Nil, obj,
415     NSLocalizedString(@"Do you really delete item \"%@\" from list?", @"Do you really delete item \"%@\" from list?"),
416     obj.title);
417     }
418     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
419     {
420     if(returnCode == NSCancelButton) return;
421    
422     [appDelegate removeObject:contextInfo];
423     }
424    
425 masaki 189 - (void)recalculateKeyViewLoop
426     {
427     [searchField setNextKeyView:[libraryViewController firstKeyView]];
428     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
429     [listViewController setNextKeyView:[detailViewController firstKeyView]];
430     [detailViewController setNextKeyView:searchField];
431     }
432 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
433     {
434     if(currentListViewType == viewType) return;
435     currentListViewType = viewType;
436    
437     NSString *className = nil;
438     switch(currentListViewType) {
439     case typeCollectionView:
440     className = @"XspfMCollectionViewController";
441     break;
442     case typeTableView:
443     className = @"XspfMListViewController";
444     break;
445 masaki 281 case typeCoverFlowView:
446     className = @"XspfMCoverFlowViewController";
447     break;
448 masaki 25 }
449     if(!className) return;
450    
451 masaki 189 XspfMViewController *targetContorller = [viewControllers objectForKey:className];
452 masaki 25 if(!targetContorller) {
453     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
454     if(!targetContorller) return;
455 masaki 192
456     id selectionIndexes = [controller selectionIndexes];
457 masaki 25 [viewControllers setObject:targetContorller forKey:className];
458 masaki 180 [targetContorller view];
459 masaki 30 [targetContorller setRepresentedObject:controller];
460 masaki 189 [targetContorller recalculateKeyViewLoop];
461 masaki 192 [controller setSelectionIndexes:selectionIndexes];
462 masaki 25 }
463 masaki 109
464 masaki 25 [[listViewController view] removeFromSuperview];
465     listViewController = targetContorller;
466     [listView addSubview:[listViewController view]];
467 masakih 358 NSRect rect = [listView bounds];
468     rect.size.height += 1;
469     rect.origin.y -= 1;
470     [[listViewController view] setFrame:rect];
471 masaki 189 // [[self window] recalculateKeyViewLoop];
472     [self recalculateKeyViewLoop];
473 masaki 25 }
474 masaki 2
475 masaki 5
476 masaki 43 - (void)setupXspfLists
477 masaki 36 {
478 masaki 47 if(libraryViewController) return;
479    
480 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
481 masaki 37 [libraryViewController setRepresentedObject:listController];
482     [libraryView addSubview:[libraryViewController view]];
483 masaki 193 NSRect rect = [libraryView bounds];
484     rect.size.width += 2;
485     rect.origin.x -= 1;
486 masakih 358 rect.size.height += 1;
487     rect.origin.y -= 1;
488 masaki 193 [[libraryViewController view] setFrame:rect];
489 masaki 189 [libraryViewController recalculateKeyViewLoop];
490 masaki 36 }
491 masaki 47 - (void)setupDetailView
492 masaki 6 {
493 masaki 47 if(detailViewController) return;
494 masaki 6
495 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
496     [detailViewController setRepresentedObject:controller];
497     [detailView addSubview:[detailViewController view]];
498     [[detailViewController view] setFrame:[detailView bounds]];
499 masaki 189 [detailViewController recalculateKeyViewLoop];
500 masaki 6 }
501 masaki 82 - (void)setupAccessorylView
502     {
503     if(accessoryViewController) return;
504    
505     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
506     [accessoryViewController setRepresentedObject:[appDelegate channel]];
507     [accessoryView addSubview:[accessoryViewController view]];
508     [[accessoryViewController view] setFrame:[accessoryView bounds]];
509 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
510 masaki 82 }
511 masaki 8 #pragma mark#### NSWidnow Delegate ####
512     /**
513     Returns the NSUndoManager for the application. In this case, the manager
514     returned is that of the managed object context for the application.
515     */
516 masaki 6
517 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
518     return [[appDelegate managedObjectContext] undoManager];
519     }
520    
521 masakih 370 - (void)windowWillClose:(NSNotification *)notification
522     {
523     XspfMPreferences *pref = [XspfMPreferences sharedPreference];
524     pref.splitViewLeftWidth = [libraryView frame].size.width;
525     }
526    
527 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
528     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
529     {
530 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
531 masaki 9 }
532 masaki 294 #pragma mark#### NSSplitView Delegate ####
533     - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex
534     {
535     return 130;
536     }
537 masaki 295 - (void)splitView:(NSSplitView *)aSplitView resizeSubviewsWithOldSize:(NSSize)oldSize
538     {
539     NSView *rightView = [[splitView subviews] objectAtIndex:1];
540     NSRect newFrame = [splitView frame];
541     NSRect libFrame = [libraryView frame];
542     NSRect listFrame = [rightView frame];
543     CGFloat dividerThickness = [splitView dividerThickness];
544    
545     libFrame.size.height = newFrame.size.height;
546     listFrame.size.height = newFrame.size.height;
547    
548     listFrame.size.width = newFrame.size.width - libFrame.size.width - dividerThickness;
549    
550     if(listFrame.size.width < 0) listFrame.size.width = 0;
551    
552     [libraryView setFrame:libFrame];
553     [rightView setFrame:listFrame];
554     }
555 masaki 193
556 masaki 185 #pragma mark#### XspfManager Notifications ####
557     - (void)managerDidAddObjects:(NSNotification *)notification
558     {
559     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
560     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
561    
562     [controller performSelector:@selector(setSelectedObjects:)
563     withObject:addedObjects
564     afterDelay:0.01];
565     }
566    
567 masaki 184 #pragma mark#### Test ####
568     - (IBAction)test01:(id)sender
569     {
570 masakih 358 NSPoint origin = [detailView frame].origin;
571     origin.x = [[detailView window] frame].size.width;
572     [detailView setFrameOrigin:origin];
573 masaki 184 }
574     - (IBAction)test02:(id)sender
575     {
576     NSResponder *responder = [[self window] firstResponder];
577     while(responder) {
578 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
579 masaki 184 responder = [responder nextResponder];
580     }
581     }
582     - (IBAction)test03:(id)sender
583     {
584 masakih 380 [listController setAutomaticallyRearrangesObjects:YES];
585    
586 masaki 184 }
587     @end
588 masaki 297

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