This is eTFileLinkUI.m in view mode; [Download] [Up]
/////////////////////////////////////////////////////////////////////////////// // FILENAME: eTFileLinkUI.m // SUMMARY: Implementation of the FileLink UI // SUPERCLASS: Object // INTERFACE: None // PROTOCOLS: <Inspectable> // AUTHOR: Rohit Khare // COPYRIGHT: (c) 1994 California Institure of Technology, eText Project /////////////////////////////////////////////////////////////////////////////// // IMPLEMENTATION COMMENTS // Read-only display of the filename and the link state. // Normally disabled exec string field (not editable, grayed-out, stringValue= // "open \"%s\""). When execSwitch fires, we setExec string, make the string // editable (and first responder). If execSwitch goes off, we run an alert // iff stringValue != default. /////////////////////////////////////////////////////////////////////////////// // HISTORY // 08/06/94: Added symbolic linking support. // 07/03/94: Created. Mimics RTFD file inclusions. /////////////////////////////////////////////////////////////////////////////// #import "eTFileLink.h" #define _defaultExecString "open \"%s\"" @implementation eTFileLinkUI // id execField; // id execSwitch; // id filenameField; // id filenameSwitch; // id linkPanel; // id linkView; // id theLink; // id symlinkSwitch; - setAnnotation:newLink { if (newLink == theLink) return self; [super setAnnotation:newLink]; // this is an awkward naming of the "chain" theLink = newLink; [filenameField setStringValue:[theLink componentName]]; [filenameSwitch setState:[theLink isLinked]]; [symlinkSwitch setEnabled:[theLink isLinked]]; [symlinkSwitch setState:[theLink useSymlink]]; if ([theLink isExecEnabled]) { // reset to reflect theLink's state [execSwitch setState:1]; [execField setStringValue:[theLink execString]]; [execField setEditable:YES]; [execField setBackgroundGray:NX_WHITE]; } else { // NULL exec string // reset to baseline [execSwitch setState:0]; [execField setStringValue:_defaultExecString]; [execField setEditable:NO]; [execField setBackgroundGray:NX_LTGRAY]; } return self; } - enableExec:sender { if ([sender state]) { // up-transition // enable the field; prepare theLink [execField setEditable:YES]; [execField setBackgroundGray:NX_WHITE]; [theLink setExecString:_defaultExecString]; } else { // down-transition [theLink setExecEnabled:NO]; [execField setEditable:NO]; [execField setBackgroundGray:NX_LTGRAY]; } return self; } - setExec:sender { [theLink setExecString:[sender stringValue]]; [[theLink etDoc] touch]; return self; } - forceSymlink:sender { [theLink setSymlink:[sender state]]; [[theLink etDoc] touch]; return self; } /////////////////////////////////// + new { static eTFileLinkUI *ui = nil; if (!ui) { ui = [[eTFileLinkUI alloc] init]; } return ui; } - init { char buf[MAXPATHLEN]; NXBundle *bundle; [super init]; bundle = [NXBundle bundleForClass:[self class]]; if ( [bundle getPath:buf forResource:"eTFileLinkUI" ofType:"nib"] ) { [NXApp loadNibFile:buf owner:self withNames:NO]; } else { NXLogError("NIB not found: eTFileLinkUI"); } linkView = [linkPanel contentView]; return self; } - free {return self;} /////////////////////////////////// #define PROP "File Properties" - (const NXAtom *) types { static NXAtom *types = NULL; if (!types) { int i; const NXAtom *superTypes = [super types]; for(i=0;superTypes[i];i++); i++; // make room for terminating NULL i++; // make room for our type types = malloc(i * sizeof(NXAtom)); types[0] = NXUniqueString(PROP); for(i=0;superTypes[i];i++) types[i+1] = superTypes[i]; types[i+1] = NULL; } return types; } - (const char *) inspectorTitle { return NXUniqueString("File"); } - resignInspector: (View *) oldInspector ofType: (const char *) type { if (oldInspector != linkView) [super resignInspector:oldInspector ofType:type]; return self; } - activateInspector: (View *) newInspector ofType: (const char *) type { if (newInspector != linkView) [super activateInspector:newInspector ofType:type]; return self; } - inspectorForType:(const char *) type { if(!strcmp(type,NXUniqueString(PROP))) return linkView; return [super inspectorForType:type]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.