This is TSApplicationTrayShelfItem.m in view mode; [Download] [Up]
/* TSApplicationTrayShelfItem.m created by tsengel on Fri 15-Aug-1997 */ #import "TSApplicationTrayShelfItem.h" #import "File.h" #import "TSWorkspace.h" @implementation TSApplicationTrayShelfItem /* This class is a hack and will go away in the future...its dependancy on another bundle is a hacky solution to get this done fast.. */ - (id)initWithContentsOfFile:(NSString *)aString { id aPath; id ourBundle; id fileClass; self = [super initWithContentsOfFile:aString]; if( !self) return nil; // <<HACK>> evil...we depend on the other bundle .. the IconBundle !! aPath = [[NSBundle mainBundle] pathForResource:@"IconViewShelf" ofType:@"bundle"]; ourBundle = [NSBundle bundleWithPath:aPath]; [NSBundle loadNibNamed:@"ApplicationTrayShelf" owner:self]; // Lets set a somewhat useful shelf title... [self setTitle:@"Processes"]; // <<HACK>> ???? Hmm.... somehow this code does not work as expected ??? fileClass = [ourBundle classNamed:@"File"]; if( !fileClass ) fileClass = [File class]; [view addListener:fileClass]; [view setClassToHold:@"File"]; [view setTarget:self]; [view setAction:@selector(selectShelfEntry:)]; [view setDoubleAction:@selector(openShelfEntry:)]; // We will add ourself as a listener so that we find out whne things change on the shelf. [view addListener:self]; // And some notificatons please... ok..the revert: part is a hack...but then...who cares. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(revert:) name:@"ProcessesListChanged" object:nil]; return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [super dealloc]; } - (void)revert:(id)sender { [super revert:sender]; [self updateShelfContent]; } - (void)updateShelfContent /*" Takes the set path and tries to put the content into the shelf matrix...which is our view "*/ { int columns, rows; id itemEnum = [[[TSWorkspace sharedWorkspace] runningApplications] objectEnumerator]; id nextFilePath; id aFile; id aCell; for( rows = 0; rows<[view numberOfRows]; rows++ ) { for( columns = 0; columns<[view numberOfColumns]; columns++ ) { nextFilePath = [itemEnum nextObject]; aFile = nil; if( nextFilePath ) aFile = [File fileForPath:nextFilePath]; aCell = [view cellAtRow:rows column:columns]; [aCell setReallyLocked:YES]; [aCell setDelegate:aFile]; // [aCell setDraggable:NO]; // [aCell setEditable:NO]; } } // The content did change..so lets rememrb that so that we can save it... // but since there is currently nothing to save... lets not worry right now.. // [self setContentDidChange:YES]; } - (unsigned int)shelf:sender willDrag:objectToPaste from:(id <NSDraggingInfo>) source; { // Just be sure we don't handle it as another click..it really is a drag operation ! // NSLog( @"Markd the mouse drag op..." ); _mouseDraggedAfterClick = YES; return NSDragOperationAll; } - (void)shelf:sender dragWillComplete:(id <NSDraggingInfo>) source; { // Just be sure we don't handle it as another click ! // NOTE.. this should never happen in this shelf !! // NSLog( @"Shelf content did change due to drag.." ); } - (void)selectShelfEntry:(id)sender { // Ok..this return here is evil...but single-doubleclick needs to be handled properly with a delayed perform // so right now this is disabled. _pendingClickEvent = [[NSApp currentEvent] eventNumber]; [self performSelector:@selector(reallySelectCell:) withObject:[view selectedCell] afterDelay:0.8]; } - (void)reallySelectCell:aCell { // Let's check if this click is still wanted..perhaps we already // performed the double click or dragged some object after the first mouseDown. id aPath; if( _pendingClickEvent == -1 ) return; if( _mouseDraggedAfterClick ) { _mouseDraggedAfterClick = NO; return; } aPath = [[aCell delegate] path]; if( [[NSUserDefaults standardUserDefaults] boolForKey:@"UseWorkspaceThreads"] ) [NSThread detachNewThreadSelector:@selector(_detachedAppActivation:) toTarget:self withObject:aPath]; else [self performSelector:@selector(_detachedAppActivation:) withObject:aPath afterDelay:0.5]; } - (void)_detachedFileSelect:(id)thePath { id threadPool = [NSAutoreleasePool new]; // <<HACK>> This is "bad!!!" since this "/" causes the workspace to open yet // another browser window. But the @"" does not work and causes an exception on 4.2...bad.. [[NSWorkspace sharedWorkspace] selectFile:thePath inFileViewerRootedAtPath:@"/"]; [threadPool release]; } - (void)openShelfEntry:(id)sender { id cell; id aPath; // Sicne this event is handled now..reset the marker. _pendingClickEvent = -1; cell = [view selectedCell]; aPath = [[cell delegate] path]; if( [[aPath pathExtension] isEqual:@"app"] ) { if( [[NSUserDefaults standardUserDefaults] boolForKey:@"UseWorkspaceThreads"] ) [NSThread detachNewThreadSelector:@selector(_detachedAppFullActivation:) toTarget:self withObject:aPath]; else [self performSelector:@selector(_detachedAppFullActivation:) withObject:aPath afterDelay:0.5]; } else { // Ok..here this should never ever happen.. no non APP files allowed.. if( [[NSUserDefaults standardUserDefaults] boolForKey:@"UseWorkspaceThreads"] ) [NSThread detachNewThreadSelector:@selector(_detachedFileOpen:) toTarget:self withObject:aPath]; else [self performSelector:@selector(_detachedFileOpen:) withObject:aPath afterDelay:0.5]; } } - (void)_detachedAppActivation:(id)thePath { // The subpool is needed if we are a new thread... id threadPool = [NSAutoreleasePool new]; [NSApp deactivate]; [[NSWorkspace sharedWorkspace] launchApplication:thePath]; // Using the launchApplication:thePath showIcon:YES autolaunch:NO method does not work properly ??? [threadPool release]; } - (void)_detachedAppFullActivation:(id)thePath { // The subpool is needed if we are a new thread... id threadPool = [NSAutoreleasePool new]; [[NSWorkspace sharedWorkspace] hideOtherApplications]; [NSApp deactivate]; [[NSWorkspace sharedWorkspace] launchApplication:thePath]; // Using the launchApplication:thePath showIcon:YES autolaunch:NO method does not work properly ??? [threadPool release]; } - (void)_detachedFileOpen:(id)thePath { // The subpool is needed if we are a new thread... id threadPool = [NSAutoreleasePool new]; [NSApp deactivate]; [[NSWorkspace sharedWorkspace] openFile:thePath]; [threadPool release]; } - (void)save { id basePath = [self path]; id ourFileDict = [NSMutableDictionary new]; [super save]; basePath = [basePath stringByAppendingPathComponent:@"Info.plist"]; [ourFileDict setObject:@"ApplicationTrayShelf" forKey:@"ShelfType"]; [ourFileDict writeToFile:basePath atomically:YES]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.