This is ManOpenApp.m in view mode; [Download] [Up]
// // ManOpenApp Class // // Harald Schlangmann, 19.7.93 // #import "ManOpenApp.h" #import "ManPageWindow.h" #import <defaults/defaults.h> @implementation ManOpenApp - printManPage:sender { if( [[NXApp mainWindow] respondsTo:@selector(printManPage:)] ) [[NXApp mainWindow] printManPage:sender]; else NXBeep(); return self; } - info:sender { static id infoPanel = nil; if( !infoPanel ) infoPanel = [NXApp loadNibSection:"InfoPanel.nib" owner:NXApp withNames:NO]; [infoPanel makeKeyAndOrderFront:sender]; return self; } + new { ManOpenApp *theApp = [super new]; theApp->manPageList = [[List alloc] init]; return theApp; } - (const char *)nroffCmd { return [nroffCmd stringValue]; } - appDidInit:sender { NXDefaultsVector ManOpenDefaults = { {"QuitWhenLastClosed","NO"}, {"NroffCmd","/usr/bin/nroff -man %s"}, {NULL,NULL} }; NXRegisterDefaults("ManOpen",ManOpenDefaults); [quitWhenLastClosed setState: strcmp(NXGetDefaultValue("ManOpen","QuitWhenLastClosed"), "YES")==0]; [nroffCmd setStringValue:NXGetDefaultValue("ManOpen","NroffCmd")]; [[self appListener] setServicesDelegate:self]; return self; } - open:(const char *)filename { int count = [manPageList count]; while( --count>=0 ) { if( strcmp([[manPageList objectAt:count] getFile], filename)==0 ) { [[manPageList objectAt:count] makeKeyAndOrderFront:self]; break; } } if( count<0 ) { // Not yet opened id aManPage = [NXApp loadNibSection:"ManPage.nib" owner:NXApp withNames:NO]; [aManPage loadManPage:filename]; [manPageList addObject:aManPage]; } return self; } - (BOOL)appAcceptsAnotherFile:sender { return YES; } - (int)app:sender openFile:(const char *)filename type:(const char *)aType { [self open:filename]; return YES; } // Open in ManOpen service - openService:(id)pasteboard userData:(const char*)userData error:(char**)msg { const NXAtom *t; fprintf(stderr,"openService called...\n"); t = [pasteboard types]; while( t&&*t ) { if( *t==NXFilenamePboardType ) break; t++; } if( *t==NXFilenamePboardType ) { char *data; char filename[FILENAME_MAX]; int length; if( [pasteboard readType:NXFilenamePboardType data:&data length:&length] ) { int scanIndex = 0; // Allow multi-file open: while( scanIndex<length ) { char *write = filename; while( data[scanIndex]!='\t' &&scanIndex<length ) *write++ = data[scanIndex++]; // Skip TAB? if( scanIndex<length ) scanIndex++; *write = '\0'; [self open:filename]; } [pasteboard deallocatePasteboardData:data length:length]; } else NXBeep(); } return self; } - openMan:sender { id openPanel; const char *const *files; openPanel = [[OpenPanel new] allowMultipleFiles:YES]; if( [openPanel runModal] ) { files = [openPanel filenames]; if( files&&*files ) { // At least one file was selected while( *files ) { char tmpFileName[FILENAME_MAX]; sprintf(tmpFileName,"%s/%s", [openPanel directory], *files); [self open:tmpFileName]; files++; } } } return self; } - manPageClosed:sender { // Remove sender from List [manPageList removeObject:sender]; if( [quitWhenLastClosed state]&&[manPageList count]==0 ) [self terminate:self]; return self; } - terminate:sender { NXWriteDefault("ManOpen","QuitWhenLastClosed", [quitWhenLastClosed state]?"YES":"NO"); NXWriteDefault("ManOpen","NroffCmd",[nroffCmd stringValue]); return [super terminate:sender]; } // Find Panel implementation - firstResponderValidFind { id obj = [[NXApp mainWindow] firstResponder]; return (obj&&[obj respondsTo: @selector(findText:ignoreCase:backwards:wrap:)])? obj:nil; } - search:sender backwards:(BOOL)flag { id obj = [self firstResponderValidFind]; if( !obj ) NXBeep(); else if( !*[findText stringValue] ) NXBeep(); else if( ![obj findText:[findText stringValue] ignoreCase:[ignoreCase state] backwards:flag wrap:YES] ) NXBeep(); return self; } - searchNext:sender { return [self search:sender backwards:NO]; } - searchPrevious:sender { return [self search:sender backwards:YES]; } - firstResponderValidSelection { id obj = [[NXApp mainWindow] firstResponder]; return (obj&&[obj respondsTo:@selector(getSel::)]&& [obj respondsTo:@selector(getSubstring:start:length:)])? obj:nil; } - enterSelection:sender { id obj = [self firstResponderValidSelection]; if( !obj ) NXBeep(); else { char *str; NXSelPt from, to; int bufLen; [obj getSel:&from :&to]; bufLen = to.cp-from.cp; str = alloca(bufLen+1); [obj getSubstring:str start:from.cp length:bufLen]; str[bufLen] = '\0'; [findText setStringValue:str]; } return self; } - searchLibrarianLike:sender { id obj = [self firstResponderValidSelection]; if( !obj ) NXBeep(); else { char *str; NXSelPt from, to; int bufLen; [obj getSel:&from :&to]; bufLen = to.cp-from.cp; if( bufLen!=0 ) { str = alloca(bufLen+1); [obj getSubstring:str start:from.cp length:bufLen]; str[bufLen] = '\0'; [findText setStringValue:str]; } [self searchNext:sender]; } return self; } - findPanelComeUp:sender { [findPanel makeKeyAndOrderFront:sender]; [findText selectText:sender]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.