Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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