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.