This is Controller.m in view mode; [Download] [Up]
#import <math.h> #import <appkit/appkit.h> #import "Fiend.h" #import "FiendWraps.h" #import "Controller.h" #import "ProgressView.h" #import "Dock.h" #import "DockMgrView.h" #import "ShelfView.h" #import "IconView.h" #import "Thinker.h" @implementation Controller + initialize { static NXDefaultsVector defaults = { {GRID_ENABLE, "YES"}, {SGRID_VALUE, DEFAULT_SGRID_STRING}, {DGRID_VALUE, DEFAULT_DGRID_STRING}, {IMAGE_NAME, DEFAULT_IMAGE_NAME}, {USE_SOUND, "YES"}, {SHOW_DOCK, "YES"}, {TILE_IMAGE, "NO"}, {CUR_DOCK, "1"}, {SIZE_FONT, "YES"}, {HIDE_ICONS, "YES"}, {SHOW_SELPNL, "YES"}, {SHOW_PROG, "YES"}, {NULL} }; NXRegisterDefaults([NXApp appName], defaults); return self; } - init { infoPanel = nil; prefPanel = nil; return self; } - appDidInit:sender { id shelfWindow; id dockWindow; int screenCount; NXRect contentRect; NXScreen *screens; NXRect iconRect = {{400.0, 400.0}, {64.0, 64.0}}; id workspace = [Application workspace]; float dgridValue = atof(NXGetDefaultValue([NXApp appName], DGRID_VALUE)); BOOL autoLaunch = !strcmp(NXGetDefaultValue([NXApp appName], "NXAutoLaunch"), "YES"); BOOL showProgress = !strcmp(NXGetDefaultValue([NXApp appName], SHOW_PROG), "YES"); [NXApp getScreens:&screens count:&screenCount]; if (showProgress) { [[progressField setStringValue:PROG_BSPACE] display]; [progressPanel center]; [progressPanel makeKeyAndOrderFront:self]; [progressPanel setFloatingPanel:YES]; } [[NXApp delegate] setProgressViewRatio:0.0]; [NXApp loadNibSection:"BackSpace.nib" owner:self withNames:NO]; [thinker appDidInit:sender]; [self setProgressViewRatio:1.0]; shelfWindow = [[Window allocFromZone:[self zone]] initContent:&screens[0].screenBounds style:NX_TOKENSTYLE backing:NX_BUFFERED buttonMask:0 defer:NO]; if (showProgress) { [[progressField setStringValue:PROG_SHELF] display]; [self setProgressViewRatio:0.0]; } [IconView resetProcessTable]; [[shelfWindow contentView] getFrame:&contentRect]; shelfView = [[ShelfView allocFromZone:[shelfWindow zone]] initFrame:&contentRect]; [[shelfWindow setContentView:shelfView] free]; [shelfWindow setAvoidsActivation:YES]; if (dgridValue) iconRect.size.width = iconRect.size.height = dgridValue; dockWindow = [[Window allocFromZone:[self zone]] initContent:&iconRect style:NX_TOKENSTYLE backing:NX_BUFFERED buttonMask:0 defer:NO]; [dockWindow setAvoidsActivation:YES]; if (dgridValue) [dockWindow sizeWindow:dgridValue :dgridValue]; [dockWindow setFrameUsingName:"DockWindow"]; [[dockWindow contentView] getFrame:&contentRect]; PSsetwindowlevel(-2147483647, [shelfWindow windowNum]); [shelfWindow display]; [shelfWindow orderBack:self]; [self setProgressViewRatio:1.0]; if (showProgress) { [[progressField setStringValue:PROG_DOCK] display]; [self setProgressViewRatio:0.0]; } dockMgrView = [[DockMgrView allocFromZone:[dockWindow zone]] initFrame:&contentRect withWindow:dockWindow]; PSsetwindowlevel(NX_DOCKLEVEL+1, [dockWindow windowNum]); [dockWindow display]; [dockWindow orderFront:self]; [workspace beginListeningForApplicationStatusChanges]; if (showProgress) [progressPanel orderOut:self]; [NXApp preventWindowOrdering]; if (autoLaunch) [NXApp hide:self]; else [NXApp activateSelf:NO]; return self; } - setProgressViewRatio:(float)aValue { [[progressView setRatio:aValue] display]; return self; } - appDidHide:sender { return [thinker appDidHide:sender]; } - appDidUnhide:sender { return [thinker appDidUnhide:sender]; } - app:theApp applicationDidTerminate:(const char *)appName { [dockMgrView app:theApp applicationDidTerminate:appName]; return self; } - app:theApp applicationDidLaunch:(const char *)appName { [dockMgrView app:theApp applicationDidLaunch:appName]; return self; } - app:theApp applicationWillLaunch:(const char *)appName { [dockMgrView app:theApp applicationWillLaunch:appName]; return self; } - appWillTerminate:sender { char string[10]; sprintf(string, "%d", [dockMgrView currentDockIndex]+1); [[dockMgrView window] saveFrameUsingName:"DockWindow"]; NXWriteDefault([NXApp appName], CUR_DOCK, string); [thinker normalMode]; [shelfView writeShelf]; [dockMgrView writeDocks]; NXWriteDefault([NXApp appName], SHOW_DOCK, ([dockMgrView showDock])?"YES":"NO"); return self; } - applicationDefined:(NXEvent *)e { return [thinker applicationDefined:e]; } - doPanel:(id *)panel named:(const char *) name { char path[MAXPATHLEN]; id bundle = [NXBundle mainBundle]; if (!*panel && [bundle getPath:path forResource:name ofType:"nib"]) [NXApp loadNibFile:path owner:self withNames:NO fromZone:[self zone]]; [*panel makeKeyAndOrderFront:self]; return self; } - doInfo:sender { return [self doPanel:&infoPanel named:"Info"]; } - showBackSpaceSettings:sender { [thinker showSettingsPanel:self]; return self; } - doBackSpaceScreenSaver:sender { [thinker showFakeScreenSaver:self]; return self; } - whirl:sender { NXRect shelfFrame; [shelfView getFrame:&shelfFrame]; PSWSetDockOnTop(YES); PSWWhirl(NX_MIDX(&shelfFrame), NX_MIDY(&shelfFrame)); PSWSetDockOnTop(NO); return self; } - doPreferences:sender { BOOL useSound = !strcmp(NXGetDefaultValue([NXApp appName], USE_SOUND), "YES"); [self doPanel:&prefPanel named:"Preferences"]; [tileSwitch setState:[shelfView tileImage]]; [imageFileField setStringValue:[shelfView getImageFileName]]; [shelfSizeField setIntValue:[shelfView gridValue]]; if ([shelfView gridEnabled]) [shelfGridSwitch setState:YES]; [useSoundSwitch setState:useSound]; [[dockSizeField setIntValue:[dockMgrView iconSize]] selectText:self]; return self; } - clearLevel:sender { [dockMgrView clearDockLevel]; return self; } - rotateLevel:sender { [dockMgrView rotateOffsets]; [dockMgrView display]; return self; } - toggleDock:sender { [dockMgrView setShowDock:![dockMgrView showDock]]; return self; } - nextLevel:sender { [dockMgrView nextLevel]; return self; } - previousLevel:sender { [dockMgrView previousLevel]; return self; } - gotoLevel:sender { [gotoField setIntValue:[dockMgrView currentDockIndex]+1]; [gotoField selectText:self]; [NXApp runModalFor:gotoPanel]; [dockMgrView gotoDockLevel:[gotoField intValue]-1]; [dockMgrView display]; return self; } - moveLevel:sender { [moveField setIntValue:[dockMgrView currentDockIndex]+1]; [moveField selectText:self]; [NXApp runModalFor:movePanel]; [dockMgrView moveLevelTo:[moveField intValue]-1]; [dockMgrView display]; return self; } - findString:sender { [findStringField selectText:self]; [NXApp runModalFor:findPanel]; [dockMgrView findLevelContaining:[findStringField stringValue]]; [dockMgrView display]; return self; } - addLevel:sender { [dockMgrView addLevel]; [dockMgrView display]; return self; } - deleteLevel:sender { [dockMgrView deleteLevel]; [dockMgrView display]; return self; } - modalDone:sender { [[sender window] orderOut:self]; [NXApp stopModal]; return self; } /* * Find out if a window just closed. If it was the info panel or the pref * panel, forget about its identity, since it will free itself on close. */ - windowWillClose:sender { return self; } - setDoTile:sender { [shelfView setTileImage:[sender state]]; [shelfView setImageFileName:[imageFileField stringValue]]; return self; } - setShelfImage:sender { id openPanel = [OpenPanel new]; const char * const *types = [NXImage imageFileTypes]; if (sender == imageFileField) [shelfView setImageFileName:[sender stringValue]]; else { if (![openPanel runModalForDirectory:"." file:"" types:types]) return nil; if ([shelfView setImageFileName:[openPanel filename]]) [imageFileField setStringValue:[openPanel filename]]; } [imageFileField selectText:self]; return self; } - snapShelfToGrid:sender { [shelfView alignSubviews]; return self; } - enableGrid:sender { unsigned int newValue = [shelfSizeField intValue]; if (newValue < 32 || newValue > 200) { NXRunAlertPanel([NXApp appName], "Size must be between 32 and 200...please reenter", NULL, NULL, NULL); [[shelfSizeField setIntValue:[shelfView gridValue]] selectText:self]; return self; } [shelfView setGridValue:newValue]; if ([shelfView gridValue] != newValue) [shelfSizeField setIntValue:[shelfView gridValue]]; [shelfView setGridEnabled:[shelfGridSwitch state]]; if (sender == shelfSizeField) [shelfSizeField selectText:self]; return self; } - selectShelf:sender { NXRect frame; [shelfView getFrame:&frame]; NXInsetRect(&frame, -1000.0, -1000.0); [shelfView selectViewsInRect:&frame deselect:YES]; return self; } - selectDock:sender { [[dockMgrView currentDock] select:YES all:self]; return self; } - setDockIconSize:sender { int newValue = [sender intValue]; char defString[10]; if (newValue < 32 || newValue > 200) { NXRunAlertPanel([NXApp appName], "Size must be between 32 and 200...please reenter", NULL, NULL, NULL); [[sender setIntValue:[dockMgrView iconSize]] selectText:self]; return self; } sprintf(defString, "%d", newValue); NXWriteDefault([NXApp appName], DGRID_VALUE, defString); [dockMgrView setIconSize:newValue]; [dockMgrView display]; [sender selectText:self]; return self; } - deselectShelf { [shelfView deselectAll:self]; return self; } - deselectDock { [[dockMgrView currentDock] select:NO all:self]; return self; } - setUseSounds:sender { NXWriteDefault([NXApp appName], USE_SOUND, ([sender state])?"YES":"NO"); return self; } - copy:sender { if ([shelfView hasSelectedCells]) [shelfView copy:self andCut:NO]; else [dockMgrView copy:self andCut:NO]; return self; } - cut:sender { if ([shelfView hasSelectedCells]) [shelfView copy:self andCut:YES]; else [dockMgrView copy:self andCut:YES]; return self; } - pasteToShelf:sender { int status; char *showSelPanel = (char *)NXGetDefaultValue([NXApp appName], SHOW_SELPNL); if (!strcmp(showSelPanel, "YES")) { status = NXRunAlertPanel([NXApp appName], "Click mouse to choose paste site...", "Ok", "Ok Forever", NULL); if (status == NX_ALERTALTERNATE) NXWriteDefault([NXApp appName], SHOW_SELPNL, "NO"); } [shelfView deselectAll:self]; [[dockMgrView currentDock] select:NO all:self]; [shelfView paste:self]; return self; } - pasteToDock:sender { [shelfView deselectAll:self]; [[dockMgrView currentDock] select:NO all:self]; [dockMgrView paste:self]; return self; } - (const char *)appDirectory { return [thinker appDirectory]; } - commonImageInspector { return [thinker commonImageInspector]; } - (struct mach_header *) headerForModule:(const char *)name { return [thinker headerForModule:name]; } - (const char *)moduleDirectory:(const char *)name { return [thinker moduleDirectory:name]; } @end @implementation Object(BriansPathMethods) - (void) perform:(SEL) sel withPaths:(const char *) paths { const char *scan = paths; char *copy; char aPath[MAXPATHLEN]; if (!paths || !*paths) return; do { copy = aPath; while (*scan && *scan != '\t') *copy++ = *scan++; *copy = '\0'; if (*scan == '\t') scan++; [self perform:sel with:(id) aPath]; } while (*scan); } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.