This is StateManager.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import <appkit/appkit.h>
#import <libc.h>
#import <objc/HashTable.h>
#import <objc/List.h>
#import "StateManager.h"
#import "Filter.h"
#import "Script.h"
#import "FilterInspector.h"
#import "ScriptInspector.h"
#import "HelpManager.h"
#import "support.h"
@implementation StateManager
const char *APPNAME = "SystemWorks";
- enableCellList: aCellList
{
[aCellList makeObjectsPerform: @selector(setEnabled:) with: YES];
}
- disableCellList: aCellList
{
[aCellList makeObjectsPerform: @selector(setEnabled:) with: NO];
}
- appDidInit: sender // I'm not sure whether Distributor gets `new' message or not.
{
static NXDefaultsVector myDefaults = {
{"Autosize", "1"},
{"NoviceUser", "0"},
{"PATH",
"/usr/local/bin:/usr/ucb:/bin:/usr/bin:~/Apps:/LocalApps:/NextApps:/NextDeveloper/Demos"},
{"FilterOpenPath", "~/lib/filt"},
{"ScriptOpenPath", "~/lib/works"},
{"SettingOpenPath", "~/lib/set"},
{"IconOpenPath", "~/lib/icon"},
{NULL}
};
const char *s;
NXRegisterDefaults(APPNAME, myDefaults);
s = NXGetDefaultValue(APPNAME, "Autosize");
[autosizeToggle selectCellWithTag: *s - '0'];
s = NXGetDefaultValue(APPNAME, "NoviceUser");
[noviceUserToggle selectCellWithTag: *s - '0'];
[pathForm setStringValue: NXGetDefaultValue(APPNAME, "PATH") at: 0];
[dataDirectory setStringValue: NXGetDefaultValue(APPNAME, "FilterOpenPath") at: 0];
[dataDirectory setStringValue: NXGetDefaultValue(APPNAME, "ScriptOpenPath") at: 1];
[dataDirectory setStringValue: NXGetDefaultValue(APPNAME, "SettingOpenPath") at: 2];
[dataDirectory setStringValue: NXGetDefaultValue(APPNAME, "IconOpenPath") at: 3];
scriptTable = [[HashTable alloc] initKeyDesc: "i" valueDesc: "@"];
processTable = [[HashTable alloc] initKeyDesc: "i" valueDesc: "@"];
setNotifyTarget(self);
[self disableCellList: nilFilterList];
[self disableCellList: nilScriptList];
[helpManager appDidInit: self];
[filterInspector appDidInit: self];
[scriptInspector appDidInit: self];
[self setup];
return self;
}
- createFilter: sender
{
id newFilter;
newFilter = [[Filter alloc] init];
[newFilter setStateManager: self];
[[activeScript addFilter: newFilter] update];
[scriptInspector modified];
return newFilter;
}
- removeFilter: sender
{
activeFilter = nil;
[self disableCellList: nilFilterList];
[activeScript removeFilter];
[activeScript update];
[scriptInspector modified];
return self;
}
- saveFilter: sender
{
NXTypedStream *ts;
if ([activeFilter pathname] == NULL) {
[self saveFilterAs: self];
} else {
ts = NXOpenTypedStreamForFile([activeFilter pathname], NX_WRITEONLY);
if (ts == NULL)
return nil;
// [activeFilter write: ts];
NXWriteObject(ts, activeFilter);
NXCloseTypedStream(ts);
}
}
- saveFilterAs: sender
{
NXTypedStream *ts;
static id savePanel = nil;
int status;
if (!savePanel) {
savePanel = [SavePanel new];
}
[[[savePanel contentView] findViewWithTag: NX_OPTITLEFIELD]
setStringValue: "Save Filter"];
[savePanel setRequiredFileType: "filt"];
[savePanel setDirectory: NXGetDefaultValue(APPNAME, "FilterOpenPath")];
if ([activeFilter pathname] == NULL) {
status = [savePanel runModalForDirectory: [savePanel directory] file: "Untitled"];
} else {
status = [savePanel runModal];
}
if (status) {
ts = NXOpenTypedStreamForFile([savePanel filename], NX_WRITEONLY);
if (ts == NULL)
return nil;
[activeFilter setPathname: [savePanel filename]];
// [activeFilter write: ts];
NXWriteObject(ts, activeFilter);
NXCloseTypedStream(ts);
}
}
- readFilterFromFile: (const char *) filename
{
NXTypedStream *ts;
id newFilter;
NX_DURING
ts = NXOpenTypedStreamForFile(filename, NX_READONLY);
if (ts == NULL)
NX_VALRETURN(nil);
//
newFilter = NXReadObject(ts);
[[activeScript addFilter: newFilter] update];
[newFilter update];
NX_HANDLER
printf("readFilterFromFile@stateManager: stream error\n");
NXCloseTypedStream(ts);
return nil;
NX_ENDHANDLER
NXCloseTypedStream(ts);
return self;
}
- openFilter: sender
{
static id openPanel = nil;
static char *fileType[] = { "filt", NULL};
if (!openPanel) {
openPanel = [OpenPanel new];
[openPanel orderFront: self];
}
[[[openPanel contentView] findViewWithTag: NX_OPTITLEFIELD]
setStringValue: "Open Filter"];
[openPanel setDirectory: NXGetDefaultValue(APPNAME, "FilterOpenPath")];
if ([openPanel runModalForTypes: fileType ]) {
return [self readFilterFromFile: [openPanel filename]];
}
return self;
}
- addScript: newScript
{
unsigned int wn;
wn = [newScript globalWindowNum];
[scriptTable insertKey: (const void *) wn value: (void *) newScript];
return newScript;
}
- miniaturized: aScript
{
unsigned int wn;
[scriptTable removeKey: (const void *) [aScript globalWindowNum]];
wn = [aScript globalMiniwindowNum];
[scriptTable insertKey: (const void *) wn value: (void *) aScript];
return self;
}
- deminiaturized: aScript
{
unsigned int wn;
[scriptTable removeKey: (const void *) [aScript globalMiniwindowNum]];
wn = [aScript globalWindowNum];
[scriptTable insertKey: (const void *) wn value: (void *) aScript];
return self;
}
- createScript: sender
{
id newScript;
newScript = [[Script alloc] init];
[newScript setStateManager: self];
[[newScript createWindow] update];
[self addScript: newScript];
[[newScript window] makeKeyAndOrderFront: self];
}
- removeScript: aScript
{
[scriptTable removeKey: (const void *) [aScript globalWindowNum]];
[scriptTable removeKey: (const void *) [aScript globalMiniwindowNum]];
if ([scriptTable count] == 0) {
activeScript = activeFilter = nil;
[self disableCellList: nilFilterList];
[self disableCellList: nilScriptList];
}
}
- saveScript: sender
{
NXTypedStream *ts;
if ([activeScript pathname] == NULL) {
[self saveScriptAs: self];
} else {
ts = NXOpenTypedStreamForFile([activeScript pathname], NX_WRITEONLY);
if (ts == NULL)
return nil;
//
// [activeScript write: ts];
NXWriteObject(ts, activeScript);
NXCloseTypedStream(ts);
[scriptInspector saved];
}
}
- saveScriptAs: sender
{
NXTypedStream *ts;
static id savePanel = nil;
int status;
if (!savePanel) {
savePanel = [SavePanel new];
}
[[[savePanel contentView] findViewWithTag: NX_OPTITLEFIELD]
setStringValue: "Save Script"];
[savePanel setRequiredFileType: "works"];
[savePanel setDirectory: NXGetDefaultValue(APPNAME, "ScriptOpenPath")];
if ([activeScript pathname] == NULL) {
status = [savePanel runModalForDirectory: [savePanel directory] file: "Untitled"];
} else {
status = [savePanel runModal];
}
if (status) {
ts = NXOpenTypedStreamForFile([savePanel filename], NX_WRITEONLY);
if (ts == NULL)
return nil;
//
[activeScript setPathname: [savePanel filename]];
// [activeScript write: ts];
NXWriteObject(ts, activeScript);
NXCloseTypedStream(ts);
}
[scriptInspector saved];
}
- readScriptFromFile: (const char *) filename
{
NXTypedStream *ts;
id newScript;
NX_DURING
ts = NXOpenTypedStreamForFile(filename, NX_READONLY);
if (ts == NULL)
NX_VALRETURN(nil);
//
newScript = NXReadObject(ts);
[newScript setStateManager: self];
[[[newScript createWindow] addFilters] update];
[self addScript: newScript];
[newScript setPathname: filename];
[[newScript window] makeKeyAndOrderFront: self];
NX_HANDLER
printf("readScriptFromFile@stateManager: stream error\n");
NXCloseTypedStream(ts);
return nil;
NX_ENDHANDLER
NXCloseTypedStream(ts);
return self;
}
- openScript: sender
{
static id openPanel = nil;
static char *fileType[] = { "works", NULL};
if (!openPanel) {
openPanel = [OpenPanel new];
[openPanel orderFront: self];
}
[[[openPanel contentView] findViewWithTag: NX_OPTITLEFIELD]
setStringValue: "Open Script"];
[openPanel setDirectory: NXGetDefaultValue(APPNAME, "ScriptOpenPath")];
if ([openPanel runModalForTypes: fileType]) {
return [self readScriptFromFile: [openPanel filename]];
}
return nil;
}
- (int)openFile:(const char *)fullPath ok:(int *)flag
{
char *suffix;
*flag = NO;
suffix = strrchr(fullPath, '.');
if (strcmp(suffix, ".works") == 0) {
if ([self readScriptFromFile: fullPath])
*flag = YES;
}else if (strcmp(suffix, ".filt") == 0) {
if (activeScript && [self readFilterFromFile: fullPath])
*flag = YES;
}
return 0;
}
- saveScriptsToFile: (char *) filename
{
NXTypedStream *ts;
unsigned int wn;
id script;
NXRect aFrame;
NXHashState state = [scriptTable initState];
ts = NXOpenTypedStreamForFile(filename, NX_WRITEONLY);
if (ts == NULL) {
NXRunAlertPanel(NULL, "Cannot write file: %s", "OK", NULL, NULL, filename);
return nil;
}
while ([scriptTable nextState: &state key: (void **) &wn value: (void **) &script]) {
[[script window] getFrame: &aFrame];
NXWriteRect(ts, &aFrame);
// [script write: ts];
NXWriteObject(ts, script);
}
NXCloseTypedStream(ts);
return self;
}
- saveSetting: sender
{
char filename[256];
strcpy(filename, NXHomeDirectory());
strcat(filename, "/.systemWorks");
[self saveScriptsToFile: filename];
return self;
}
- saveSettingAs: sender
{
static id savePanel = nil;
int status;
if (!savePanel) {
savePanel = [SavePanel new];
}
[[[savePanel contentView] findViewWithTag: NX_OPTITLEFIELD]
setStringValue: "Save Setting"];
[savePanel setRequiredFileType: "set"];
[savePanel setDirectory: NXGetDefaultValue(APPNAME, "SettingOpenPath")];
status = [savePanel runModalForDirectory: [savePanel directory] file: "Untitled"];
if (status) {
[self saveScriptsToFile: [savePanel filename]];
}
return self;
}
- readSettingFromFile: (char *) filename
{
NXTypedStream *ts;
id newScript;
NXRect aFrame;
NX_DURING
ts = NXOpenTypedStreamForFile(filename, NX_READONLY);
if (ts == NULL)
NX_VALRETURN(nil);
while (!NXEndOfTypedStream(ts)) {
NXReadRect(ts, &aFrame);
newScript = NXReadObject(ts);
[newScript setStateManager: self];
[[[newScript createWindow] addFilters] update];
[self addScript: newScript];
[[newScript window] placeWindow: &aFrame];
[[[newScript update] window] orderFront: self];
}
NX_HANDLER
printf("readSettingFromFile@stateManager: stream error\n");
NXCloseTypedStream(ts);
return self;
NX_ENDHANDLER
NXCloseTypedStream(ts);
return self;
}
- openSetting: sender
{
static id openPanel = nil;
static char *fileType[] = { "set", NULL};
if (!openPanel) {
openPanel = [OpenPanel new];
[openPanel orderFront: self];
}
[[[openPanel contentView] findViewWithTag: NX_OPTITLEFIELD]
setStringValue: "Open Setting"];
[openPanel setDirectory: NXGetDefaultValue(APPNAME, "SettingOpenPath")];
if ([openPanel runModalForTypes: fileType]) {
return [self readSettingFromFile: [openPanel filename]];
}
return nil;
}
- setup
{
char filename[256];
strcpy(filename, NXHomeDirectory());
strcat(filename, "/.systemWorks");
[self readSettingFromFile: filename];
return self;
}
- openIconDirectory: sender
{
NXTypedStream *ts;
static id openPanel = nil;
char iconDir[256], *filename;
strcpy(iconDir, NXGetDefaultValue(APPNAME, "IconOpenPath"));
tilde_expand(iconDir);
if (!openPanel) {
openPanel = [OpenPanel new];
[openPanel orderFront: self];
}
[[[openPanel contentView] findViewWithTag: NX_OPTITLEFIELD]
setStringValue: "Open Icon"];
[openPanel setDirectory: iconDir];
if ([openPanel runModal]) {
filename = [openPanel filename];
if (strncmp(iconDir, filename, strlen(iconDir)) == 0)
[resultIconPathForm setStringValue: filename + strlen(iconDir)+1 at: 0];
else
[resultIconPathForm setStringValue: filename at: 0];
}
return self;
}
static int cellcmp(const void *first, const void *second)
{
const char *s1 = [*((id *)first) title];
const char *s2 = [*((id *)second) title];
return (s1 && s2) ? strcmp(s1, s2) : 0;
}
- addToActivate: sender
{
id cells;
cells = [[activateMenu itemList] cellList];
[[activateMenu addItem: [sender scriptName] action:@selector(activate:) keyEquivalent:0]
setTarget: sender];
if (cells) {
qsort(NX_ADDRESS(cells), [cells count], sizeof(id *), cellcmp);
[activateMenu sizeToFit];
}
return self;
}
- removeFromActivate: sender
{
int i, count;
const char *s;
char *name;
id matrix, cells;
matrix = [activateMenu itemList];
cells = [matrix cellList];
count = [cells count];
name = [sender scriptName];
for (i = 0; i < count; i++) {
s = [[cells objectAt:i] title];
if (s && !strcmp(s, name)) {
[matrix removeRowAt:i andFree:YES];
break;
}
}
if (i != count) {
qsort(NX_ADDRESS(cells), [cells count], sizeof(id *), cellcmp);
[activateMenu sizeToFit];
}
return self;
}
- registerProcess: anObject id: (int) pid
{
[processTable insertKey: (const void *) pid value: (void *) anObject];
return self;
}
- processTerminated: (int) pid status: (union wait *) status
{
id anObject;
anObject = (id) [processTable valueForKey: (void *) pid];
[processTable removeKey: (void *) pid];
[anObject childTerminated: pid status: status];
}
- backgroundRead: (int) pid status: (union wait *) status
{
id anObject;
anObject = (id) [processTable valueForKey: (void *) pid];
[anObject childTerminated: pid status: status];
}
- setActiveFilter: aFilter
{
activeFilter = aFilter;
if (!activeFilter) {
[self disableCellList: nilFilterList];
} else {
[self enableCellList: nilFilterList];
[filterInspector activeChanged];
}
return self;
}
- setActiveScript: aScript
{
activeScript = aScript;
[self enableCellList: nilScriptList];
[scriptInspector activeChanged];
[helpManager activeChanged];
}
- filterInspector
{
return filterInspector;
}
- scriptInspector
{
return scriptInspector;
}
- activeFilter
{
return activeFilter;
}
- activeScript
{
return activeScript;
}
- (int) autosize
{
return [[autosizeToggle selectedCell] tag];
}
- (int) novice
{
return [[noviceUserToggle selectedCell] tag];
}
- preferenceOK: sender
{
static char s[2] = "1";
*s = [[autosizeToggle selectedCell] tag] + '0';
NXWriteDefault(APPNAME, "Autosize", s);
*s = [[noviceUserToggle selectedCell] tag] + '0';
NXWriteDefault(APPNAME, "NoviceUser", s);
NXWriteDefault(APPNAME, "PATH", [pathForm stringValueAt: 0]);
// export $PATH
NXWriteDefault(APPNAME, "FilterOpenPath", [dataDirectory stringValueAt: 0]);
NXWriteDefault(APPNAME, "ScriptOpenPath", [dataDirectory stringValueAt: 1]);
NXWriteDefault(APPNAME, "SettingOpenPath", [dataDirectory stringValueAt: 2]);
NXWriteDefault(APPNAME, "IconOpenPath", [dataDirectory stringValueAt: 3]);
}
- (int)iconEntered:(int)windowNum at:(double)x :(double)y
iconWindow:(int)iconWindowNum
iconX:(double)iconX iconY:(double)iconY
iconWidth:(double)iconWidth
iconHeight:(double)iconHeight
pathList:(char *)pathList
{
id target;
int r;
target = (id)[scriptTable valueForKey: (void *) windowNum];
currentTarget = target;
r = [currentTarget iconEntered: windowNum at: x : y
iconWindow: iconWindowNum
iconX: iconX iconY: iconY
iconWidth: iconWidth
iconHeight: iconHeight
pathList: pathList];
return r;
}
- (int)iconReleasedAt:(double)x :(double)y ok:(int *)flag
{
int r;
r = [currentTarget iconReleasedAt: x : y ok: flag];
return r;
}
// glues
- setFilterInspector: anObject {filterInspector = anObject; }
- setScriptInspector: anObject {scriptInspector = anObject; }
- setHelpManager: anObject {helpManager = anObject; }
// script inspector
- setResultIconPathForm: anObject {resultIconPathForm = anObject; }
// preference
- setAutosizeToggle: anObject {autosizeToggle = anObject; }
- setNoviceUserToggle: anObject; {noviceUserToggle = anObject; }
- setPathForm: anObject; {pathForm = anObject; }
- setDataDirectory: anObject {dataDirectory = anObject; }
- setActivateMenuCell: aMenuCell
{
activateMenu = [aMenuCell target];
}
- addToNoviceList: anObject
{
if (!noviceList)
noviceList = [[List alloc] init];
[noviceList addObject: anObject];
}
- addToNilScriptList: anObject
{
if (!nilScriptList)
nilScriptList = [[List alloc] init];
[nilScriptList addObject: anObject];
}
- addToNilFilterList: anObject
{
if (!nilFilterList)
nilFilterList = [[List alloc] init];
[nilFilterList addObject: anObject];
}
- setScriptNewMenuCell: anObject
{ [self addToNoviceList: anObject]; }
- setScriptInspectorMenuCell: anObject
{ [self addToNoviceList: anObject]; }
- setScriptSaveMenuCell: anObject
{ [self addToNilScriptList: anObject]; }
- setScriptSaveAsMenuCell: anObject
{ [self addToNilScriptList: anObject]; }
- setScriptHelpMenuCell: anObject
{ [self addToNilScriptList: anObject]; }
- setFilterCloseMenuCell: anObject
{ [self addToNoviceList: anObject]; [self addToNilFilterList: anObject]; }
- setFilterOpenMenuCell: anObject
{ [self addToNoviceList: anObject]; [self addToNilScriptList: anObject]; }
- setFilterNewMenuCell: anObject
{ [self addToNoviceList: anObject]; [self addToNilScriptList: anObject]; }
- setFilterSaveMenuCell: anObject
{ [self addToNoviceList: anObject]; [self addToNilFilterList: anObject]; }
- setFilterSaveAsMenuCell: anObject
{ [self addToNoviceList: anObject]; [self addToNilFilterList: anObject]; }
- setFilterInspectorMenuCell: anObject
{ [self addToNoviceList: anObject]; }
- setFilterOKButton: anObject
{ [self addToNilFilterList: anObject]; }
- setScriptOKButton: anObject
{ [self addToNilScriptList: anObject]; }
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.