Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 386 - (hide annotations) (download)
Sun Jun 6 13:11:59 2010 UTC (13 years, 10 months ago) by masakih
File size: 18732 byte(s)
詳細表示ビューを開いた状態で起動すると詳細表示ビューの表示/非表示ボタンのアイコンが逆向きになっているのを修正。(#22109)
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 masakih 386 [self validateControl:detailViewButton];
135 masakih 370
136 masakih 374 [self setCurrentListViewType:pref.viewType];
137 masaki 315
138     [listController bind:NSManagedObjectContextBinding
139     toObject:appDelegate
140     withKeyPath:@"managedObjectContext"
141     options:nil];
142    
143     [allXspfController bind:NSManagedObjectContextBinding
144     toObject:appDelegate
145     withKeyPath:@"managedObjectContext"
146     options:nil];
147 masakih 370
148 masaki 189 [self recalculateKeyViewLoop];
149 masakih 373
150 masakih 380 [self performSelector:@selector(delayExcute:) withObject:self afterDelay:0.1];
151 masaki 49 }
152 masakih 380 - (void)delayExcute:(id)dummy
153     {
154     [self showWindow:self];
155    
156 masakih 382 // load時にこれを行うと循環的にRearrangeが実行されてしまう。
157 masakih 380 [listController setAutomaticallyRearrangesObjects:YES];
158     }
159 masaki 25 #pragma mark#### KVC ####
160 masaki 2
161 masaki 25 - (XspfMViewType)currentListViewType
162     {
163     return currentListViewType;
164     }
165     - (void)setCurrentListViewType:(XspfMViewType)newType
166     {
167     if(currentListViewType == newType) return;
168    
169 masakih 374 [XspfMPreferences sharedPreference].viewType = newType;
170 masaki 316
171 masaki 25 [self changeViewType:newType];
172     }
173 masaki 16
174 masaki 13 #pragma mark#### Actions ####
175 masaki 10 - (IBAction)openXspf:(id)sender
176     {
177 masaki 115 BOOL isSelected = [[controller valueForKeyPath:@"selectedObjects.@count"] boolValue];
178     if(!isSelected) return;
179    
180 masaki 238 XspfMXspfObject *rep = [controller valueForKeyPath:@"selection.self"];
181 masakih 382 BOOL didOpen = [[NSWorkspace sharedWorkspace] openFile:rep.filePath
182     withApplication:[XspfMPreferences sharedPreference].playerName];
183 masaki 277 if(didOpen) {
184     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
185 masaki 101 return;
186     }
187 masaki 277
188     NSInteger result = NSRunCriticalAlertPanel(NSLocalizedString(@"Xspf is not found", @"Xspf is not found"),
189     NSLocalizedString(@"\"%@\" is not found.", @"\"%@\" is not found."),
190     nil, nil/*@"Search Original"*/, nil, rep.title);
191     if(result == NSAlertDefaultReturn) {
192     return;
193     } else if(result == NSAlertAlternateReturn) {
194     //
195 masakih 345 #warning should implement.
196 masaki 277 }
197    
198 masaki 10 }
199 masaki 190 - (IBAction)switchListView:(id)sender
200     {
201     [self setCurrentListViewType:typeTableView];
202     }
203     - (IBAction)switchRegularIconView:(id)sender
204     {
205     [self setCurrentListViewType:typeCollectionView];
206     [(XspfMCollectionViewController *)listViewController collectionViewItemViewRegular:sender];
207     }
208     - (IBAction)switchSmallIconView:(id)sender
209     {
210     [self setCurrentListViewType:typeCollectionView];
211     [(XspfMCollectionViewController *)listViewController collectionViewItemViewSmall:sender];
212     }
213 masaki 281 - (IBAction)switchCoverFlowView:(id)sender
214     {
215     [self setCurrentListViewType:typeCoverFlowView];
216     }
217    
218 masaki 191 - (void)sortByKey:(NSString *)key
219 masaki 190 {
220 masaki 216 NSMutableArray *sortDescs = [[[controller sortDescriptors] mutableCopy] autorelease];
221 masaki 190 NSSortDescriptor *sortDesc = nil;
222    
223     // key is descs first key.
224     if([sortDescs count] > 1) {
225     NSSortDescriptor *firstDesc = [sortDescs objectAtIndex:0];
226     if([key isEqualToString:[firstDesc key]]) {
227     sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:![firstDesc ascending]] autorelease];
228     [sortDescs removeObject:firstDesc];
229     }
230     }
231     // remove same key.
232     if(!sortDesc) {
233 masaki 191 BOOL newAscending = NO;
234 masaki 190 NSSortDescriptor *foundDesc = nil;
235     for(id desc in sortDescs) {
236     if([key isEqualToString:[desc key]]) {
237     foundDesc = desc;
238     break;
239     }
240     }
241     if(foundDesc) {
242 masaki 191 newAscending = [foundDesc ascending];
243 masaki 190 [sortDescs removeObject:foundDesc];
244     }
245    
246 masaki 191 sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:newAscending] autorelease];
247 masaki 190 }
248    
249     [sortDescs insertObject:sortDesc atIndex:0];
250    
251     NSArray *selectedObjects = [controller selectedObjects];
252     [controller setSortDescriptors:sortDescs];
253     [controller setSelectedObjects:selectedObjects];
254     }
255     - (IBAction)sortByTitle:(id)sender
256     {
257 masaki 191 [self sortByKey:@"title"];
258 masaki 190 }
259     - (IBAction)sortByLastPlayDate:(id)sender
260     {
261 masaki 191 [self sortByKey:@"lastPlayDate"];
262 masaki 190 }
263     - (IBAction)sortByModificationDate:(id)sender
264     {
265 masaki 191 [self sortByKey:@"modificationDate"];
266 masaki 190 }
267     - (IBAction)sortByCreationDate:(id)sender
268     {
269 masaki 191 [self sortByKey:@"creationDate"];
270 masaki 190 }
271     - (IBAction)sortByRegisterDate:(id)sender
272     {
273 masaki 191 [self sortByKey:@"registerDate"];
274 masaki 190 }
275     - (IBAction)sortByRate:(id)sender
276     {
277 masaki 191 [self sortByKey:@"rating"];
278 masaki 190 }
279     - (IBAction)sortByMovieNumber:(id)sender
280     {
281 masaki 191 [self sortByKey:@"movieNum"];
282 masaki 190 }
283     - (IBAction)sortByLabel:(id)sender
284     {
285 masaki 224 [self sortByKey:@"label"];
286 masaki 190 }
287    
288 masaki 2 - (IBAction)add:(id)sender
289     {
290     NSOpenPanel *panel = [NSOpenPanel openPanel];
291    
292     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
293     [panel setAllowsMultipleSelection:YES];
294 masaki 9 [panel setDelegate:self];
295 masaki 2
296     [panel beginSheetForDirectory:nil
297     file:nil
298     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
299 masaki 8 modalForWindow:[self window]
300 masaki 2 modalDelegate:self
301     didEndSelector:@selector(endOpenPanel:::)
302     contextInfo:NULL];
303     }
304 masaki 106 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
305     {
306     [panel orderOut:nil];
307 masaki 2
308 masaki 106 if(returnCode == NSCancelButton) return;
309    
310     NSArray *URLs = [panel URLs];
311     if([URLs count] == 0) return;
312    
313 masaki 184 [appDelegate registerURLs:URLs];
314 masaki 106 }
315 masaki 190 - (IBAction)remove:(id)sender
316     {
317 masaki 199 [self removeSelectedItem];
318 masaki 190 }
319 masaki 182
320 masaki 194 - (IBAction)newPredicate:(id)sender
321     {
322     [libraryViewController newPredicate:sender];
323     }
324    
325 masakih 370 - (BOOL)isOpenDetailView
326     {
327 masakih 386 NSView *view = [detailViewController view];
328     NSRect visRect = [view visibleRect];
329     return !(NSEqualRects(visRect, NSZeroRect));
330 masakih 370 }
331 masakih 358 - (IBAction)showHideDetail:(id)sender
332     {
333 masakih 370 XspfMPreferences *pref = [XspfMPreferences sharedPreference];
334 masakih 358
335     NSPoint origin = [detailView frame].origin;
336     NSSize size = NSZeroSize;
337    
338     CGFloat detailWidth = [detailView frame].size.width;
339 masakih 386 if(![self isOpenDetailView]){ // show
340 masakih 358 origin.x -= detailWidth;
341     size = [splitView frame].size;
342     size.width -= detailWidth;
343 masakih 370
344     pref.openDetailView = YES;
345 masakih 358 } else { // hide
346     origin.x += detailWidth;
347     size = [splitView frame].size;
348     size.width += detailWidth;
349 masakih 370
350     pref.openDetailView = NO;
351 masakih 358 }
352     [[detailView animator] setFrameOrigin:origin];
353     [[splitView animator] setFrameSize:size];
354 masakih 373
355 masakih 386 // アニメーションが終わってから確認する。
356     id context = [NSAnimationContext currentContext];
357     NSTimeInterval duration = [context duration];
358     [self performSelector:@selector(validateControl:) withObject:detailViewButton afterDelay:duration + 0.1];
359 masakih 358 }
360    
361 masaki 190 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
362     {
363     BOOL enabled = YES;
364     SEL action = [menuItem action];
365    
366     if(action == @selector(switchListView:)) {
367     if(currentListViewType == typeTableView) {
368     [menuItem setState:NSOnState];
369     } else {
370     [menuItem setState:NSOffState];
371     }
372     } else if(action == @selector(switchRegularIconView:)) {
373     if(currentListViewType == typeCollectionView
374     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXspfMRegularItem) {
375     [menuItem setState:NSOnState];
376     } else {
377     [menuItem setState:NSOffState];
378     }
379     } else if(action == @selector(switchSmallIconView:)) {
380     if(currentListViewType == typeCollectionView
381     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXSpfMSmallItem) {
382     [menuItem setState:NSOnState];
383     } else {
384     [menuItem setState:NSOffState];
385     }
386 masaki 281 } else if(action == @selector(switchCoverFlowView:)) {
387     if(currentListViewType == typeCoverFlowView) {
388     [menuItem setState:NSOnState];
389     } else {
390     [menuItem setState:NSOffState];
391     }
392 masaki 190 }
393    
394     return enabled;
395     }
396 masakih 373 - (BOOL)validateControl:(id)anItem
397     {
398     if([detailViewButton isEqual:anItem]) {
399     if([self isOpenDetailView]) {
400     [detailViewButton setImage:[NSImage imageNamed:@"NSRightFacingTriangleTemplate"]];
401     } else {
402     [detailViewButton setImage:[NSImage imageNamed:@"NSLeftFacingTriangleTemplate"]];
403     }
404     }
405     return YES;
406     }
407 masaki 25 #pragma mark#### Other methods ####
408 masaki 199 - (void)removeSelectedItem
409     {
410 masaki 238 XspfMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
411 masaki 199
412     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [self window],
413     self, @selector(didEndAskDelete:::), Nil, obj,
414     NSLocalizedString(@"Do you really delete item \"%@\" from list?", @"Do you really delete item \"%@\" from list?"),
415     obj.title);
416     }
417     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
418     {
419     if(returnCode == NSCancelButton) return;
420    
421     [appDelegate removeObject:contextInfo];
422     }
423    
424 masaki 189 - (void)recalculateKeyViewLoop
425     {
426     [searchField setNextKeyView:[libraryViewController firstKeyView]];
427     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
428     [listViewController setNextKeyView:[detailViewController firstKeyView]];
429     [detailViewController setNextKeyView:searchField];
430     }
431 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
432     {
433     if(currentListViewType == viewType) return;
434     currentListViewType = viewType;
435    
436     NSString *className = nil;
437     switch(currentListViewType) {
438     case typeCollectionView:
439     className = @"XspfMCollectionViewController";
440     break;
441     case typeTableView:
442     className = @"XspfMListViewController";
443     break;
444 masaki 281 case typeCoverFlowView:
445     className = @"XspfMCoverFlowViewController";
446     break;
447 masaki 25 }
448     if(!className) return;
449    
450 masaki 189 XspfMViewController *targetContorller = [viewControllers objectForKey:className];
451 masaki 25 if(!targetContorller) {
452     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
453     if(!targetContorller) return;
454 masaki 192
455     id selectionIndexes = [controller selectionIndexes];
456 masaki 25 [viewControllers setObject:targetContorller forKey:className];
457 masaki 180 [targetContorller view];
458 masaki 30 [targetContorller setRepresentedObject:controller];
459 masaki 189 [targetContorller recalculateKeyViewLoop];
460 masaki 192 [controller setSelectionIndexes:selectionIndexes];
461 masaki 25 }
462 masaki 109
463 masaki 25 [[listViewController view] removeFromSuperview];
464     listViewController = targetContorller;
465     [listView addSubview:[listViewController view]];
466 masakih 358 NSRect rect = [listView bounds];
467     rect.size.height += 1;
468     rect.origin.y -= 1;
469     [[listViewController view] setFrame:rect];
470 masaki 189 // [[self window] recalculateKeyViewLoop];
471     [self recalculateKeyViewLoop];
472 masaki 25 }
473 masaki 2
474 masaki 5
475 masaki 43 - (void)setupXspfLists
476 masaki 36 {
477 masaki 47 if(libraryViewController) return;
478    
479 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
480 masaki 37 [libraryViewController setRepresentedObject:listController];
481     [libraryView addSubview:[libraryViewController view]];
482 masaki 193 NSRect rect = [libraryView bounds];
483     rect.size.width += 2;
484     rect.origin.x -= 1;
485 masakih 358 rect.size.height += 1;
486     rect.origin.y -= 1;
487 masaki 193 [[libraryViewController view] setFrame:rect];
488 masaki 189 [libraryViewController recalculateKeyViewLoop];
489 masaki 36 }
490 masaki 47 - (void)setupDetailView
491 masaki 6 {
492 masaki 47 if(detailViewController) return;
493 masaki 6
494 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
495     [detailViewController setRepresentedObject:controller];
496     [detailView addSubview:[detailViewController view]];
497     [[detailViewController view] setFrame:[detailView bounds]];
498 masaki 189 [detailViewController recalculateKeyViewLoop];
499 masaki 6 }
500 masaki 82 - (void)setupAccessorylView
501     {
502     if(accessoryViewController) return;
503    
504     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
505     [accessoryViewController setRepresentedObject:[appDelegate channel]];
506     [accessoryView addSubview:[accessoryViewController view]];
507     [[accessoryViewController view] setFrame:[accessoryView bounds]];
508 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
509 masaki 82 }
510 masaki 8 #pragma mark#### NSWidnow Delegate ####
511     /**
512     Returns the NSUndoManager for the application. In this case, the manager
513     returned is that of the managed object context for the application.
514     */
515 masaki 6
516 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
517     return [[appDelegate managedObjectContext] undoManager];
518     }
519    
520 masakih 370 - (void)windowWillClose:(NSNotification *)notification
521     {
522     XspfMPreferences *pref = [XspfMPreferences sharedPreference];
523     pref.splitViewLeftWidth = [libraryView frame].size.width;
524     }
525    
526 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
527     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
528     {
529 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
530 masaki 9 }
531 masaki 294 #pragma mark#### NSSplitView Delegate ####
532     - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex
533     {
534     return 130;
535     }
536 masaki 295 - (void)splitView:(NSSplitView *)aSplitView resizeSubviewsWithOldSize:(NSSize)oldSize
537     {
538     NSView *rightView = [[splitView subviews] objectAtIndex:1];
539     NSRect newFrame = [splitView frame];
540     NSRect libFrame = [libraryView frame];
541     NSRect listFrame = [rightView frame];
542     CGFloat dividerThickness = [splitView dividerThickness];
543    
544     libFrame.size.height = newFrame.size.height;
545     listFrame.size.height = newFrame.size.height;
546    
547     listFrame.size.width = newFrame.size.width - libFrame.size.width - dividerThickness;
548    
549     if(listFrame.size.width < 0) listFrame.size.width = 0;
550    
551     [libraryView setFrame:libFrame];
552     [rightView setFrame:listFrame];
553     }
554 masaki 193
555 masaki 185 #pragma mark#### XspfManager Notifications ####
556     - (void)managerDidAddObjects:(NSNotification *)notification
557     {
558     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
559     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
560    
561     [controller performSelector:@selector(setSelectedObjects:)
562     withObject:addedObjects
563     afterDelay:0.01];
564     }
565    
566 masaki 184 #pragma mark#### Test ####
567     - (IBAction)test01:(id)sender
568     {
569 masakih 358 NSPoint origin = [detailView frame].origin;
570     origin.x = [[detailView window] frame].size.width;
571     [detailView setFrameOrigin:origin];
572 masaki 184 }
573     - (IBAction)test02:(id)sender
574     {
575     NSResponder *responder = [[self window] firstResponder];
576     while(responder) {
577 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
578 masaki 184 responder = [responder nextResponder];
579     }
580     }
581     - (IBAction)test03:(id)sender
582     {
583 masakih 380 [listController setAutomaticallyRearrangesObjects:YES];
584    
585 masaki 184 }
586     @end
587 masaki 297

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