This is JumpBackControl.m in view mode; [Download] [Up]
//====================================================================== // // Portions written by FreemanSoft Inc. // // FreemanSoft disclaims any warranty of any kind, expressed or implied, // as to this source code's fitness for any particular use. // // For more information, use the following electronic mail addresses: // // info@FreemanSoft.com general questions // support@FreemanSoft.com technical questions // //====================================================================== /* Written by * Joe Freeman jfreeman@next.com * JumpBackControl * * This code has no warranty. * It is provided so that the consumer may maintain and modify it * at their own risk. Use this code at your own risk. */ #import "JumpBackControl.h" #import "RdistControl.h" #import "CDROMIndexControl.h" #import "TarControl.h" #import "PreferencesPanel.h" #import "common.h" #import "pathutil.h" #import <sys/vnode.h> /* AAACHH! unix dweebie stuff !! */ @implementation JumpBackControl /*================================================================ * *================================================================*/ /*================================================================ * *================================================================*/ - init { [super init]; dragBackList = [[List alloc] init]; scriptBackList = [[List alloc] init]; return self; } - free { [dragBackList free]; [scriptBackList free]; return self; } - appDidInit:sender { /* YOW! even the default keys and values are localized */ const NXDefaultsVector JumpBackDefaults = { {info_default, yes_str}, {show_drag, yes_str}, {path_default, rdist_relative}, {dup_default, dup_update}, {find_no_write, yes_str}, {debug, "0"}, {NULL} }; char buf[MAXPATHLEN+1]; NXRegisterDefaults([NXApp appName], JumpBackDefaults); /* make our custom lib dir first -- so other modules don't have to worry */ /* ignore return because we don't care if the dir is already there */ strcpy(buf, NXHomeDirectory()); strcat(buf,"/"); strcat(buf,lib_dir); mkdir(buf, VREAD | VWRITE | VEXEC ); /* build our predefined rdist's menu */ [self loadPredefined:self]; prefPanel = [PreferencesPanel new]; /* load the info panel if novice user */ if (!strcmp(NXGetDefaultValue([NXApp appName],info_default), yes_str)) [self showInfoPanel:self]; /* show a drag style (standard) JumpBack window if user wants it */ if (!strcmp(NXGetDefaultValue([NXApp appName], show_drag), yes_str)) [self newDragController:self]; return self; } - appWillTerminate:sender { int i; int lastDragBack ; for ( i = 0 ; i < [dragBackList count]; i++) { if ([[dragBackList objectAt:i] state] != NOTHING_RUNNING) { if ( NXRunAlertPanel([NXApp appName], something_running, dont_close, close_anyway,NULL) == NX_ALERTDEFAULT ) return nil; else break; } } lastDragBack= [dragBackList count]-1; for ( i = lastDragBack ; i >= 0 ; i--) { /* no way to detect window wasn't closed */ [[dragBackList objectAt:i] abortProcess:self]; [[[dragBackList objectAt:i] window] performClose:self]; } return self; } /*================================================================ * *================================================================*/ - loadPredefined:sender { NXStream * stream; char * lineStart; /* start of current line in data */ char * tab1; /* tab that is end of menu */ char * tab2; /* tab that is end of src */ char * data; /* stream buffer */ int length; int maxLength; int i; MenuCell * newCell; /* while we are building the menu */ stream = [self mapResource:pre_def_file]; /* get the buffer , and count the number of lines */ NXGetMemoryBuffer(stream, &data, &length, &maxLength); if (length == 0){ NXClose(stream); return nil; } /* figure out how many lines there are */ pairNum = 0; lineStart = data; tab1 = tab2 = NULL; /* see if the first line is a comment line */ for ( i = 0 ; i <= length; i++){ if (pairNum >= JBC_MAX_PAIR) break; if ((i < length) && data[i] == '\t') { if (!tab1 ) tab1 = &data[i]; else if (!tab2 ) tab2 = &data[i]; else { if (debug_level >= debug_file_parse) fprintf(stderr,"Found extra tab char\n"); } } else if (data[i] == '\n' || ( (i == length) && (data[i-1] != '\n') && (data[i-1] != '\0') ) ) { /* if new line or on last line which had no \n, then at EOL*/ if (debug_level >= debug_file_parse) fprintf(stderr,"Found end of line, char=#%d char=%c\n", i,*lineStart); /* this is a limited check for bogus lines */ if ( (*lineStart != '#') && tab1 && tab2 && *tab1 && *tab2 ) { pairMenu[pairNum] = lineStart; /* setup src side of pair and replace tab char */ if (tab1 < &data[i]) { *tab1 = '\0'; pairSrc[pairNum] = &tab1[1]; } /* setup dst side of pair and replace tab char */ if (tab2 < &data[i]) { *tab2 = '\0'; pairDest[pairNum] = &tab2[1]; } /* wipe out the end of line */ if (data[i] == '\n') data[i] = '\0'; if (debug_level >= debug_file_parse) fprintf(stderr, "Found line " "\tMenu= %s" "\tSrc= %s" "\tDest= %s\n\n", pairMenu[pairNum], pairSrc[pairNum], pairDest[pairNum] ); pairNum++; } else { /* some problem, probably not enough columns */ if (debug_level >= debug_file_parse) fprintf(stderr,"Not enough columns.\n"); } /* yes, could go past end, but we drop out before problem */ lineStart = &data[i+1]; tab1 = tab2 = NULL; } else { /* some normal old character */ } } if (debug_level >= debug_file_parse) fprintf(stderr,"Found %d lines.\n", pairNum); /* map the buffer to the menu */ for ( i = 0 ; i < pairNum; i++){ newCell = [[pairingsMenu target] addItem:pairMenu[i] action:@selector(selectPredefined:) keyEquivalent:0]; [newCell setTarget:self]; [newCell setTag:i]; } /* could have been torn off when app quit ... */ if ([[pairingsMenu target] isVisible]) [[pairingsMenu target] display]; /* and close it - keeping the buffer */ /// NXClose(stream); NXCloseMemory(stream, NX_SAVEBUFFER); return self; } - selectPredefined:sender { [dragBackList addObject: [[RdistControl alloc] initSourcePath:pairSrc[[sender selectedTag]] destinationPath:pairDest[[sender selectedTag]] ] ]; return self; } /*================================================================ * *================================================================*/ - newDragController:sender { [dragBackList addObject: [[RdistControl alloc] init]]; return self; } /* catch all */ - newUnrelatedTool:sender { if ([sender selectedTag] == 0) { [dragBackList addObject: [[CDROMIndexControl alloc] init]]; } else if ([sender selectedTag] == 1) { [dragBackList addObject: [[TarControl alloc] init]]; } return self; } /*================================================================ * *================================================================*/ - preferencesChanged:sender { int i; for ( i = 0 ; i < [dragBackList count]; i++){ [[dragBackList objectAt:i] updateTextFields:self]; } for ( i = 0 ; i < [scriptBackList count]; i++){ [[scriptBackList objectAt:i] updateTextFields:self]; } return self; } - dropDragJumpBackController:aController { [dragBackList removeObject:aController]; return self; } - (NXStream *)mapResource:(const char *)resourceName { NXStream * aStream; id bundle; char buf[MAXPATHLEN]; /* see if the user has a Patterns file */ strcpy(buf, NXHomeDirectory()); strcat(buf,"/"); strcat(buf,lib_dir); strcat(buf,"/"); strcat(buf, resourceName); aStream = NXMapFile(buf, NX_READONLY); /* if not then use the default one we have in the app wrapper */ if (!aStream){ bundle = [NXBundle bundleForClass:[self class]]; [bundle getPath:buf forResource:resourceName ofType:template]; aStream = NXMapFile(buf, NX_READONLY); /* since no file was in our Library, lets put it there */ NXSaveToFile(aStream, buf); NXSeek(aStream, 0 , NX_FROMSTART); } return aStream; } /*================================================================ * *================================================================*/ - showInfoPanel:sender { if (!infoPanel) { [NXApp loadNibSection:"InfoPanel.nib" owner:self]; [versionField setStringValue: __DATE__ ]; [infoPanel setFrameUsingName:info_frame]; [infoPanel setFrameAutosaveName:info_frame]; } [infoPanel makeKeyAndOrderFront:self]; return self; } - showPrefPanel:sender { [prefPanel makeKeyAndOrderFront:sender]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.