This is Dock.m in view mode; [Download] [Up]
#import "Fiend.h" #import "IconDragView.h" #import "Dock.h" @implementation Dock - initMgrView:theDockMgrView { dockMgrView = theDockMgrView; [[dockMgrView window] getFrame:&frame]; dockWindowList = [[List alloc] init]; fileNameStore = [[Storage alloc] initCount:0 elementSize:sizeof(NXAtom) description:"%"]; launchFlagStore = [[Storage alloc] initCount:0 elementSize:sizeof(BOOL) description:"s"]; filePositionStore = [[Storage alloc] initCount:0 elementSize:sizeof(NXPoint) description:"{ff}"]; nameWinHash = [[HashTable alloc] initKeyDesc:"%" valueDesc:"@"]; return self; } - free { [fileNameStore free]; [launchFlagStore free]; [filePositionStore free]; [[dockWindowList freeObjects] free]; [nameWinHash free]; return [super free]; } - getOffset:(NXPoint *)theOffset fromFrame:(NXRect *)theFrame { NXRect mainFrame = frame; theOffset->x = (NX_X(theFrame) - NX_X(&mainFrame))/NX_WIDTH(&frame); theOffset->y = (NX_Y(theFrame) - NX_Y(&mainFrame))/NX_HEIGHT(&frame); return self; } - createWindowWithFrame:(NXRect *)theFrame { id newWin; newWin = [[Window allocFromZone:[self zone]] initContent:theFrame style:NX_TOKENSTYLE backing:NX_BUFFERED buttonMask:0 defer:NO]; PSsetwindowlevel(NX_DOCKLEVEL+1, [newWin windowNum]); return newWin; } - (BOOL)containsPath:(NXAtom)aPath { int i; int count = [fileNameStore count]; for(i = 0; i < count; i++) { if (strstr(*(NXAtom *)[fileNameStore elementAt:i], aPath)) return YES; } return NO; } - createIconViewForPath:(const char *)path withFrame:(NXRect *)iconFrame { id iconView; id newImage; newImage = [IconView getImageForPath:path fileIcon:NO]; iconView = [[IconDragView allocFromZone:[self zone]] initFrame:iconFrame image:newImage data:path andLength:strlen(path) useSize:YES onDock:YES]; if (dockMgrView != nil) [iconView setDockMgrView:dockMgrView]; [[iconView setAutodisplay:NO] display]; return iconView; } - createWindowsFromStores { id newWin; id iconView; int i; int count; BOOL autoLaunch; NXAtom path; NXPoint *theOffset; BOOL hideIcons = !strcmp(NXGetDefaultValue([NXApp appName], HIDE_ICONS), "YES"); [nameWinHash empty]; count = [filePositionStore count]; for(i = 0; i < count; i++) { autoLaunch = *(BOOL *)[launchFlagStore elementAt:i]; path = *(NXAtom *)[fileNameStore elementAt:i]; theOffset = (NXPoint *)[filePositionStore elementAt:i]; newWin = [self createWindowWithFrame:&frame]; [newWin moveTo:-1000.0 :-1000.0]; iconView = [self createIconViewForPath:path withFrame:&frame]; [iconView setAutoLaunch:autoLaunch]; if (autoLaunch && ![iconView isLaunched]) { [[Application workspace] launchApplication:path showTile:!hideIcons autolaunch:YES]; [iconView setLaunched:YES]; } [nameWinHash insertKey:path value:newWin]; [[newWin setContentView:iconView] free]; [newWin setAvoidsActivation:YES]; [newWin display]; [newWin orderFront:self]; [dockWindowList addObject:newWin]; } return self; } - updateWindows:(NXPoint *)p usePlace:(BOOL)usePlace { id *win; int i; int count; NXPoint *offset; NXRect winRect; int width = NX_WIDTH(&frame); int height = NX_HEIGHT(&frame); id *winListPtr = NX_ADDRESS(dockWindowList); count = [filePositionStore count]; for(i = 0, win = winListPtr; i < count; i++, win++) { offset = (NXPoint *)[filePositionStore elementAt:i]; if (usePlace) { NXSetRect(&winRect, p->x + offset->x * width, p->y + offset->y * height, NX_WIDTH(&frame), NX_HEIGHT(&frame)); [*win placeWindowAndDisplay:&winRect]; } else [*win moveTo:p->x + offset->x * width :p->y + offset->y * height]; [filePositionStore replaceElementAt:i with:(void *)offset]; } return self; } - setDockMgrView:theMgrView { int i; int count = [dockWindowList count]; dockMgrView = theMgrView; for(i = 0; i < count; i++) [[[dockWindowList objectAt:i] contentView] setDockMgrView:dockMgrView]; return self; } - viewAtPosition:(NXRect *)checkRect besides:testView { id *win; int i; int count; NXRect winFrame; id *winListPtr = NX_ADDRESS(dockWindowList); count = [dockWindowList count]; for(i = 0, win = winListPtr; i < count; i++, win++) { if (testView && testView == [*win contentView]) continue; [*win getFrame:&winFrame]; if (NXIntersectsRect(checkRect, &winFrame)) return [*win contentView]; } return nil; } - select:(BOOL)flag all:sender { id theView; int i; int count = [dockWindowList count]; for(i = 0; i < count; i++) { theView = [[dockWindowList objectAt:i] contentView]; [theView setState:flag]; [theView display]; } return self; } - getNextFrame:(NXRect *)theFrame { *theFrame = frame; do { if (NX_X(theFrame) >= NX_WIDTH(theFrame) && ((NX_X(&frame) - NX_X(theFrame)) <= NX_WIDTH(&frame)*5.0)) { NX_X(theFrame) -= NX_WIDTH(theFrame); } else { NX_X(theFrame) = NX_X(&frame); if (NX_Y(theFrame) >= NX_HEIGHT(theFrame) && NX_Y(theFrame) <= NX_Y(&frame)) NX_Y(theFrame) -= NX_HEIGHT(&frame); else if (NX_Y(theFrame) >= NX_HEIGHT(&frame)) NX_Y(theFrame) += NX_HEIGHT(&frame); else NX_Y(theFrame) = NX_MAXY(&frame); } } while([self viewAtPosition:theFrame besides:nil] != nil); return self; } - createWindowForPath:(const char *)thePath newFrame:(NXRect *)newFrame { id newWin; id iconView; if (!thePath) return nil; [self getNextFrame:newFrame]; newWin = [self createWindowWithFrame:newFrame]; iconView = [self createIconViewForPath:thePath withFrame:newFrame]; [nameWinHash insertKey:NXUniqueString(thePath) value:newWin]; [[newWin setContentView:iconView] free]; [newWin setAvoidsActivation:YES]; [dockWindowList addObject:newWin]; [newWin display]; [newWin orderFront:self]; return self; } - orderWindowsFront:(BOOL)flag { int i; int count = [dockWindowList count]; for(i = 0; i < count; i++) { if (flag) [[dockWindowList objectAt:i] orderFront:self]; else [[dockWindowList objectAt:i] orderOut:self]; } return self; } - addWindowForPath:(NXAtom)pathAtom { NXRect newFrame; NXPoint newOffset; [self createWindowForPath:pathAtom newFrame:&newFrame]; [fileNameStore addElement:(void *)&pathAtom]; [self getOffset:&newOffset fromFrame:&newFrame]; [filePositionStore addElement:(void *)&newOffset]; return self; } - deleteView:aView { NXAtom pathAtom; id win = [aView window]; int index = [dockWindowList indexOf:win]; if (index != NX_NOT_IN_LIST) { pathAtom = *(NXAtom *)[fileNameStore elementAt:index]; [nameWinHash removeKey:pathAtom]; [fileNameStore removeElementAt:index]; [filePositionStore removeElementAt:index]; [win orderOut:self]; [win perform:@selector(free) with:nil afterDelay:1000.0 cancelPrevious:YES]; [dockWindowList removeObject:win]; } return self; } - dockWindowList { return dockWindowList; } - copy:sender andCut:(BOOL)cutFlag { id win; id view; int i; int junk; char *viewPath; char cutString[10000]; int count = [dockWindowList count]; id pb = [Pasteboard newName:NXGeneralPboard]; id cutList = [[List alloc] init]; BOOL useSound = !strcmp(NXGetDefaultValue([NXApp appName], USE_SOUND), "YES"); const char *types[] = {NXFilenamePboardType, NXAsciiPboardType}; *cutString = '\0'; for(i = 0; i < count; i++) { win = [dockWindowList objectAt:i]; view = [win contentView]; if ([view state]) { [view getData:(void **)&viewPath andLength:&junk]; strcat(cutString, viewPath); strcat(cutString, "\t"); [cutList addObject:view]; } } cutString[strlen(cutString)-1] = '\0'; [pb declareTypes:types num:2 owner:nil]; [pb writeType:NXFilenamePboardType data:cutString length:strlen(cutString)]; for(i = 0; i < strlen(cutString); i++) { if (cutString[i] == '\t') cutString[i] = '\n'; } strcat(cutString, "\n"); [pb writeType:NXAsciiPboardType data:cutString length:strlen(cutString)]; if (cutFlag) { count = [cutList count]; if (count && useSound) [[Sound findSoundFor:"Destroy"] play:self]; for(i = 0; i < count; i++) [self deleteView:[cutList objectAt:i]]; } [cutList free]; return self; } - paste:sender { int len; char *path; char *dragString; NXAtom pathAtom; id pb = [Pasteboard newName:NXGeneralPboard]; BOOL useSound = !strcmp(NXGetDefaultValue([NXApp appName], USE_SOUND), "YES"); [self select:NO all:self]; [pb readType:NXFilenamePboardType data:&dragString length:&len]; if (!len) return self; path = strtok(dragString, "\t"); while(path && strlen(path)) { pathAtom = NXUniqueString(path); if (![nameWinHash isKey:pathAtom]) [self addWindowForPath:pathAtom]; path = strtok(NULL, "\t"); } [pb deallocatePasteboardData:dragString length:len]; if (useSound) [[Sound findSoundFor:"Fiend"] play:self]; return self; } - filePositionStore { return filePositionStore; } - fileNameStore { return fileNameStore; } - launchFlagStore { return launchFlagStore; } - nameWinHash { return nameWinHash; } - setFrame:(const NXRect *)aFrame { frame = *aFrame; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.