This is PrefAgent.m in view mode; [Download] [Up]
/* Copyright 1991 Gustavus Adolphus College. All rights reserved.
*
* Schematik was developed by Gustavus Adolphus College (GAC) with
* support from NeXT Computer, Inc. Permission to copy this software,
* to redistribute it, and to use it for any purpose is granted,
* subject to the following restrictions and understandings.
*
* 1. Any copy made of this software must include this copyright
* notice in full.
*
* 2. Users of this software agree to make their best efforts (a) to
* return to the GAC Mathematics and Computer Science Department any
* improvements or extensions that they make, so that these may be
* included in future releases; and (b) to inform GAC of noteworthy
* uses of this software.
*
* 3. All materials developed as a consequence of the use of this
* software shall duly acknowledge such use, in accordance with the
* usual standards of acknowledging credit in academic research.
*
* 4. GAC makes no express or implied warranty or representation of
* any kind with respect to this software, including any warranty
* that the operation of this software will be error-free. ANY
* IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
* PURPOSE IS HEREBY DISCLAIMED. GAC is under no obligation to
* provide any services, by way of maintenance, update, or otherwise.
*
* 5. In conjunction with products arising from the use of this
* material, there shall be no use of the name of Gustavus Adolphus
* College nor of any adaptation thereof in any advertising,
* promotional, or sales literature without prior written consent
* from GAC in each case.
*/
#import "PrefAgent.h"
#import "../defines.h"
#import Main_h
#import <appkit/ButtonCell.h>
#import <appkit/Form.h>
#import <appkit/NXBrowser.h>
#import <appkit/NXBrowserCell.h>
#import <appkit/NXImage.h>
#import <appkit/Text.h>
#import <appkit/defaults.h>
#import <objc/List.h>
#import <objc/NXStringTable.h>
#import <sys/fcntl.h>
#import <libc.h>
#import <mach.h>
#define GetBOOLValue(x) (NXOrderStrings((unsigned char *)defaults[x].value, (unsigned char *)"YES", YES, -1, NULL)?NO:YES)
#define NIBFILE "Preferences.nib"
#define BUTTONTIFF "Pref"
#define BUTTONTIFFH "PrefH"
#define TIFFWIDTH 64
#define PREFZONENAME "PrefAgnt"
#define NATIVE_LANGUAGE "English"
#define LANGUAGEDIR "%s/%s.lproj/%s"
#define LANGUAGESTRINGS "%s/%s.lproj/%s.strings"
#define LANGUAGETIFFS "%s/%s.lproj/%s.tiff"
#define NUMBOXWINDOWS 4
#define REVERTBUTTON 0
#define CLOSEBUTTON 1
#define OKBUTTON 2
#define PREFABEXEC "%s/kernel/scheme"
#define PREFABPARAMS "-emacs -library %s/kernel/library %s %s"
#define SICPBAND "-band sicp.com"
#define MITCOMPILER "-compiler"
#define FORMTBL "{begin,0}{call-with-input-file,1}{call-with-output-file,1}{case,1}{define,1}{define-integrable,1}{define-macro,1}{define-structure,1}{define-syntax,1}{delay,0}{do,2}{fluid-let,1}{in-package,1}{lambda,1}{let,1}{let*,1}{letrec,1}{let-syntax,1}{list-search-negative,1}{list-search-positive,1}{list-transform-negative,1}{list-transform-positive,1}{local-declare,1}{macro,1}{make-environment,0}{named-lambda,1}{pathname-components,1}{sequence,0}{syntax-table-define,2}{using-syntax,1}{with-input-from-file,1}{with-input-from-string,1}{with-output-to-file,1}{with-output-to-port,1}{with-output-to-string,0}{with-values,1}"
#define DEFLTS {{"App_ConfirmOnClose","YES"}, {"App_ConfirmOnQuit","YES"}, {"App_ErrorAbort","1"}, {"Document_Offset","{20.0,-20.0}"}, {"Document_Pos","{280.0,70.0}"}, {"Interaction_Autoscroll","YES"}, {"Interaction_CommentOutput","NO"}, {"Interaction_EvaluateAll","NO"}, {"Interaction_Font","Ohlfs"}, {"Interaction_FontSize","11.0"}, {"Interaction_InsertErrors","YES"}, {"Interaction_Frame","{{240.0,400.0},{560.0,400.0}}"}, {"Scheme_Dialect","0"}, {"Scheme_Executable","/usr/local/bin/scheme"}, {"Scheme_Parameters","-emacs"}, {"Scheme_SICPParameters"," "}, {"Scheme_MITParameters"," "}, {"Scheme_SpecialForms", FORMTBL}, {"Text_Autoindent","YES"}, {"Text_DoubleClickMatch","YES"}, {"Text_FormatAfterPaste","YES"}, {"Text_MatchParenthesis","YES"}, {"Interaction_Transcript","NO"}, {"Text_ReverseVideo","NO"}, {"App_UseSpecialCursors","NO"}, {"Graphics_Size","{400.0,300.0}"}, {"Graphics_SizeTolerance","{112.0,90.0}"}, {"App_KeepBackupCopy","YES"}, {NULL,NULL}}
#define CONFIRMONCLOSE 0
#define CONFIRMONQUIT 1
#define ERRORABORT 2
#define DOCOFFSET 3
#define DOCPOS 4
#define AUTOSCROLL 5
#define COMMENTOUTPUT 6
#define EVALUATEALL 7
#define INTERFONT 8
#define INTERFONTSIZE 9
#define INSERTERRORS 10
#define INTERFRAME 11
#define SCHEMEDIALECT 12
#define EXECUTABLE 13
#define PARAMETERS 14
#define SICPPARAMETERS 15
#define MITPARAMETERS 16
#define SPECIALFORMS 17
#define AUTOINDENT 18
#define DBLCLICKMATCH 19
#define FRMTAFTRPASTE 20
#define MATCHPARENS 21
#define TRANSCRIPT 22
#define REVERSEVIDEO 23
#define SPECIALCURSORS 24
#define GRAPHICSSIZE 25
#define SIZETOLERANCE 26
#define KEEPBACKUPCOPY 27
#define NUMDEFAULTS 28
@interface PrefAgent (Private)
- _revertDefaults;
- _setDefaults;
- _setDialectOpts:(int)dialect;
- _specialFormOpts:(int)buttontag;
- _copyKeywordList;
@end
static Window *win[NUMBOXWINDOWS];
static NXImage *tiff=NULL;
static NXImage *tiffH=NULL;
static struct _NXDefault defaults[NUMDEFAULTS+1];
static const char *const *languages;
static NXStringTable *stringTable=nil;
static List *keywordList=nil,*oldKeywordList=nil;
static int keywordListVersion=0;
static id theAgent=nil;
@implementation PrefAgent
+ new
{
DEBUG_FUNC1(DEBUGLEVEL);
if (theAgent==nil)
{
NXZone *tempZone;
extern char *appDirectory;
const char *appName=[NXApp appName];
struct _NXDefault defaultdefaults[]=DEFLTS;
char *temp,*tempdef;
int i;
DEBUG_ASSERT((appName!=NULL)&&(*appName))
tempZone = NXCreateZone(vm_page_size, vm_page_size, YES);
DEBUG_ASSERT(tempZone!=NULL)
theAgent = self = [super allocFromZone:tempZone];
agentZone = tempZone;
NXNameZone(agentZone, PREFZONENAME);
#ifdef DEBUG
DEBUG_ASSERT(NXRegisterDefaults(appName, defaultdefaults))
#else
NXRegisterDefaults(appName, defaultdefaults);
#endif
for(i=0; i<NUMDEFAULTS; i++)
{
defaults[i].name = NXCopyStringBufferFromZone(defaultdefaults[i].name, agentZone);
DEBUG_ASSERT((defaults[i].name!=NULL)&&(*defaults[i].name))
DEBUG_ASSERT(NXGetDefaultValue(appName, defaultdefaults[i].name))
defaults[i].value = NXCopyStringBufferFromZone(NXGetDefaultValue(appName, defaultdefaults[i].name), agentZone);
DEBUG_ASSERT((defaults[i].value!=NULL)&&(*defaults[i].value))
}
defaults[NUMDEFAULTS].name = NULL;
defaults[NUMDEFAULTS].value = NULL;
stringTable = [[NXStringTable allocFromZone:agentZone] init];
DEBUG_ASSERT(stringTable!=nil)
languages = [NXApp systemLanguages];
if (languages)
for(i=0; *(languages+i); i++)
{
char path[strlen(LANGUAGESTRINGS)+2*strlen(*(languages+i))+strlen(appDirectory)];
if (!NXOrderStrings((unsigned char *)*languages, (unsigned char *)NATIVE_LANGUAGE, YES, -1, NULL)) break;
sprintf(path, LANGUAGESTRINGS, appDirectory, *(languages+i), *(languages+i));
if (!access(path, R_OK))
{
#ifdef DEBUG
DEBUG_ASSERT([stringTable readFromFile:path])
#else
[stringTable readFromFile:path];
#endif
break;
}
}
keywordList = [[List allocFromZone:agentZone] init];
DEBUG_ASSERT(keywordList!=nil)
tempdef = NXCopyStringBuffer(defaults[SPECIALFORMS].value);
DEBUG_ASSERT((tempdef!=NULL)&&(*tempdef))
temp = strtok(tempdef,"{}");
for(i=0; ((temp!=NULL)&&(*temp)); i++)
{
char tempkeyword[128];
int tempde;
sscanf(temp, "%[^,],%i", tempkeyword, &tempde);
DEBUG_ASSERT((tempkeyword!=NULL)&&(*tempkeyword))
[keywordList addObject:[[Keyword allocFromZone:agentZone] initTo:tempkeyword with:tempde]];
temp = strtok(NULL,"{}");
}
oldKeywordList = [self _copyKeywordList];
if (tempdef!=NULL) free(tempdef);
}
return theAgent;
}
- activateAgent:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
if (!prefPanel)
{
NXRect r={{0,0},{TIFFWIDTH,TIFFWIDTH}};
int i;
prefPanel = LoadNIB(NIBFILE, theAgent, agentZone);
DEBUG_ASSERT(prefPanel!=nil)
[prefPanel useOptimizedDrawing:YES];
win[CLIENT0] = win0;
win[CLIENT1] = win1;
win[CLIENT2] = win2;
win[CLIENT3] = win3;
for(i=0; i<NUMBOXWINDOWS; i++)
{
DEBUG_ASSERT(win[i]!=nil)
[win[i] useOptimizedDrawing:YES];
}
[theBox setContentView:[win[CLIENT0] contentView]];
DEBUG_ASSERT([theBox contentView]!=nil)
tiff = [[NXApp prefAgent] localImage:BUTTONTIFF fromZone:agentZone];
DEBUG_ASSERT(tiff!=nil)
tiffH = [[NXApp prefAgent] localImage:BUTTONTIFFH fromZone:agentZone];
DEBUG_ASSERT(tiffH!=nil)
for(i=0; i<NUMBOXWINDOWS; i++)
{
r.origin.x = i*TIFFWIDTH;
DEBUG_ASSERT([buttonMatrix cellAt:0 :i]!=nil)
[[buttonMatrix cellAt:0 :i] setImage:[[NXImage allocFromZone:agentZone] initFromImage:tiff rect:&r]];
DEBUG_ASSERT([[buttonMatrix cellAt:0 :i] image]!=nil)
[[buttonMatrix cellAt:0 :i] setAltImage:[[NXImage allocFromZone:agentZone] initFromImage:tiffH rect:&r]];
DEBUG_ASSERT([[buttonMatrix cellAt:0 :i] altImage]!=nil)
}
}
[self _revertDefaults];
[prefPanel makeKeyAndOrderFront:self];
return self;
}
- buttonClicked:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
switch ([[sender selectedCell] tag])
{
case REVERTBUTTON: return [self _revertDefaults];
case CLOSEBUTTON : return [prefPanel performClose:self];
case OKBUTTON : return [self _setDefaults];
}
DEBUG_ASSERT(NO /* should not get here*/)
return self;
}
- selectPrefs:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
[theBox setContentView:[win[[[sender selectedCell] tag]] contentView]];
DEBUG_ASSERT([theBox contentView]!=nil)
return [theBox display];
}
@end
@implementation PrefAgent (Delegate)
- windowWillClose:sender
{
int i;
DEBUG_FUNC1(DEBUGLEVEL);
for(i=0; i<NUMBOXWINDOWS; i++)
{
win[i] = [win[i] close];
DEBUG_ASSERT(win[i]==nil)
}
[theBox setContentView:nil];
for(i=0; i<NUMBOXWINDOWS; i++)
{
[[[buttonMatrix cellAt:0 :i] image] free];
[[[buttonMatrix cellAt:0 :i] altImage] free];
}
[tiff free];
[tiffH free];
prefPanel = nil;
return self;
}
@end
@implementation PrefAgent (Localization)
- loadLocalNib:(const char *)nibFile owner:(id)owner fromZone:(NXZone *)zone
{
extern char *appDirectory;
id retval=nil;
int i;
DEBUG_FUNC1(DEBUGLEVEL);
if (languages)
{
for(i=0; *(languages+i); i++)
{
char path[strlen(LANGUAGEDIR)+strlen(*languages)+strlen(appDirectory)+strlen(nibFile)];
if (!NXOrderStrings((unsigned char *)*languages, (unsigned char *)NATIVE_LANGUAGE, YES, -1, NULL)) break;
sprintf(path, LANGUAGEDIR, appDirectory, *(languages+i), nibFile);
if (!access(path, R_OK))
{
retval = [NXApp loadNibFile:path owner:owner withNames:NO fromZone:zone];
DEBUG_ASSERT(retval!=nil)
break;
}
}
}
return (retval?:[NXApp loadNibSection:nibFile owner:owner withNames:NO fromZone:zone]);
}
- loadLocalMainMenu:(const char *)nibFile
{
extern char *appDirectory;
char bpath[strlen(LANGUAGEDIR)+strlen(NATIVE_LANGUAGE)+strlen(appDirectory)+strlen(nibFile)];
int i;
DEBUG_FUNC1(DEBUGLEVEL);
if (languages)
for(i=0; *(languages+i); i++)
{
char path[strlen(LANGUAGEDIR)+strlen(*(languages+i))+strlen(appDirectory)+strlen(nibFile)];
sprintf(path, LANGUAGEDIR, appDirectory, *(languages+i), nibFile);
if (!access(path, R_OK))
return [NXApp loadNibFile:path owner:NXApp withNames:NO fromZone:[NXApp zone]];
}
sprintf(bpath, LANGUAGEDIR, appDirectory, NATIVE_LANGUAGE, nibFile);
return [NXApp loadNibFile:bpath owner:NXApp withNames:NO fromZone:[NXApp zone]];
}
- localImage:(const char *)imageFile fromZone:(NXZone *)zone
{
extern char *appDirectory;
id retval=nil;
int i;
DEBUG_FUNC1(DEBUGLEVEL);
if (languages)
{
for(i=0; *(languages+i); i++)
{
char path[strlen(LANGUAGEDIR)+strlen(*languages)+strlen(appDirectory)+strlen(imageFile)];
if (!NXOrderStrings((unsigned char *)*languages, (unsigned char *)NATIVE_LANGUAGE, YES, -1, NULL)) break;
sprintf(path, LANGUAGETIFFS, appDirectory, *(languages+i), imageFile);
if (!access(path, R_OK))
{
retval = [[NXImage allocFromZone:zone] initFromFile:path];
DEBUG_ASSERT(retval!=nil)
break;
}
}
}
return (retval?:[[NXImage allocFromZone:zone] initFromSection:imageFile]);
}
const char *doLocalString(const char *key, const char *value)
{
return ([stringTable valueForStringKey:key]?:(value?:key));
}
@end
@implementation PrefAgent (Client0)
- (BOOL)evaluateAll
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(EVALUATEALL);
}
- (BOOL)commentOutput
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(COMMENTOUTPUT);
}
- (BOOL)insertErrors
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(INSERTERRORS);
}
- (BOOL)transcriptMode
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(TRANSCRIPT);
}
- (BOOL)autoScroll
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(AUTOSCROLL);
}
- (BOOL)confirmOnClose
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(CONFIRMONCLOSE);
}
- setConfirmOnClose:(BOOL)aBool
{
NXSetDefault([NXApp appName], defaults[CONFIRMONCLOSE].name, (aBool?"YES":"NO"));
return self;
}
- (BOOL)confirmOnQuit
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(CONFIRMONQUIT);
}
- (BOOL)keepBackupCopy
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(KEEPBACKUPCOPY);
}
- (int)errorAbort
{
DEBUG_FUNC1(DEBUGLEVEL);
return atoi(defaults[ERRORABORT].value);
}
@end
@implementation PrefAgent (Client1)
- (BOOL)dblClickMatch
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(DBLCLICKMATCH);
}
- (BOOL)autoindent
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(AUTOINDENT);
}
- (BOOL)matchParens
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(MATCHPARENS);
}
- (BOOL)formatAfterPaste
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(FRMTAFTRPASTE);
}
@end
@implementation PrefAgent (Client2)
- formsButtonClicked:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [self _specialFormOpts:[[sender selectedCell] tag]];
}
- formsBrowserClick:sender
{
int row=[[formsBrowser matrixInColumn:BROWSERCOLUMN] selectedRow];
DEBUG_FUNC1(DEBUGLEVEL);
[[formsField setStringValue:[[keywordList objectAt:row] keyword] at:0] selectTextAt:0];
[deField setIntValue:[[keywordList objectAt:row] distinguishedElems]];
return self;
}
- (BOOL)isSpecialForm:(const char *)aString
{
int i;
DEBUG_FUNC1(DEBUGLEVEL);
for(i=0; i<[keywordList count]; i++)
if (!NXOrderStrings((unsigned char *)aString, (unsigned char *)[[keywordList objectAt:i] keyword], NO, -1, NULL))
return YES;
return NO;
}
- (int)deForSpecialForm:(const char *)aString
{
int i;
DEBUG_FUNC1(DEBUGLEVEL);
for(i=0; i<[keywordList count]; i++)
if (!NXOrderStrings((unsigned char *)aString, (unsigned char *)[[keywordList objectAt:i] keyword], NO, -1, NULL))
return [[keywordList objectAt:i] distinguishedElems];
return -1;
}
- (int)keywordListVersion
{
DEBUG_FUNC1(DEBUGLEVEL);
return keywordListVersion;
}
@end
@implementation PrefAgent (Client3)
- dialectChosen:sender
{
DEBUG_FUNC1(DEBUGLEVEL);
return [self _setDialectOpts:[[sender selectedCell] tag]];
}
- (int)schemeDialect
{
DEBUG_FUNC1(DEBUGLEVEL);
return atoi(defaults[SCHEMEDIALECT].value);
}
- (char *)executable
{
extern char *appDirectory;
DEBUG_FUNC1(DEBUGLEVEL);
switch ([self schemeDialect])
{
case SICPDIALECT :
case MITDIALECT :
case MITDIALECTCOMP: {
char *executable=(char *)malloc(strlen(PREFABEXEC)+strlen(appDirectory));
DEBUG_ASSERT(executable!=NULL)
sprintf(executable, PREFABEXEC, appDirectory);
return executable;
}
case OTHERDIALECT: {
char *executable;
executable = NXCopyStringBuffer(defaults[EXECUTABLE].value);
DEBUG_ASSERT(executable!=NULL)
return executable;
}
}
DEBUG_ASSERT(NO /* should not get here */)
return NULL;
}
- (char *)parameters
{
extern char *appDirectory;
DEBUG_FUNC1(DEBUGLEVEL);
switch ([self schemeDialect])
{
case SICPDIALECT : {
char *parameters=(char *)malloc(strlen(PREFABPARAMS)+strlen(appDirectory)+
strlen(SICPBAND)+strlen(defaults[SICPPARAMETERS].value));
DEBUG_ASSERT(parameters!=NULL)
sprintf(parameters, PREFABPARAMS, appDirectory, SICPBAND, defaults[SICPPARAMETERS].value);
return parameters;
}
case MITDIALECT : {
char *parameters=(char *)malloc(strlen(PREFABPARAMS)+strlen(appDirectory)+
strlen(defaults[MITPARAMETERS].value));
DEBUG_ASSERT(parameters!=NULL)
sprintf(parameters, PREFABPARAMS, appDirectory, "", defaults[MITPARAMETERS].value);
return parameters;
}
case MITDIALECTCOMP: {
char *parameters=(char *)malloc(strlen(PREFABPARAMS)+strlen(appDirectory)+
strlen(MITCOMPILER)+strlen(defaults[MITPARAMETERS].value));
DEBUG_ASSERT(parameters!=NULL)
sprintf(parameters, PREFABPARAMS, appDirectory, MITCOMPILER, defaults[MITPARAMETERS].value);
return parameters;
}
case OTHERDIALECT: {
char *parameters;
parameters = NXCopyStringBuffer(defaults[PARAMETERS].value);
DEBUG_ASSERT(parameters!=NULL)
return parameters;
}
}
DEBUG_ASSERT(NO /* should not get here */)
return NULL;
}
@end
@implementation PrefAgent (NoClient)
- setInterFrame:(const NXRect *)r
{
char buffer[64];
DEBUG_FUNC1(DEBUGLEVEL);
sprintf(buffer, "{{%f,%f},{%f,%f}}", r->origin.x, r->origin.y, r->size.width, r->size.height);
NXZoneFree(agentZone, defaults[INTERFRAME].value);
defaults[INTERFRAME].value = NXCopyStringBufferFromZone(buffer, agentZone);
DEBUG_ASSERT(defaults[INTERFRAME].value!=NULL)
NXWriteDefaults([NXApp appName], defaults);
return self;
}
- getInterFrame:(NXRect *)r
{
DEBUG_FUNC1(DEBUGLEVEL);
sscanf(defaults[INTERFRAME].value, "{{%f,%f},{%f,%f}}", &r->origin.x, &r->origin.y, &r->size.width, &r->size.height);
return self;
}
- setInterFont:(id)aFont
{
char buffer[16];
DEBUG_FUNC1(DEBUGLEVEL);
NXZoneFree(agentZone, defaults[INTERFONT].value);
NXZoneFree(agentZone, defaults[INTERFONTSIZE].value);
defaults[INTERFONT].value = NXCopyStringBufferFromZone([aFont name], agentZone);
DEBUG_ASSERT(defaults[INTERFONT].value!=NULL)
sprintf(buffer, "%f", [aFont pointSize]);
defaults[INTERFONTSIZE].value = NXCopyStringBufferFromZone(buffer, agentZone);
DEBUG_ASSERT(defaults[INTERFONTSIZE].value!=NULL)
NXWriteDefaults([NXApp appName], defaults);
return self;
}
- (char *)interFont
{
DEBUG_FUNC1(DEBUGLEVEL);
return defaults[INTERFONT].value;
}
- (float)interFontSize
{
DEBUG_FUNC1(DEBUGLEVEL);
return atof(defaults[INTERFONTSIZE].value);
}
- getDocOrigin:(NXPoint *)p
{
DEBUG_FUNC1(DEBUGLEVEL);
sscanf(defaults[DOCPOS].value, "{%f,%f}", &p->x, &p->y);
return self;
}
- getDocOffset:(NXPoint *)p
{
DEBUG_FUNC1(DEBUGLEVEL);
sscanf(defaults[DOCOFFSET].value, "{%f,%f}", &p->x, &p->y);
return self;
}
- (BOOL)reverseVideo
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(REVERSEVIDEO);
}
- (BOOL)useSpecialCursors
{
DEBUG_FUNC1(DEBUGLEVEL);
return GetBOOLValue(SPECIALCURSORS);
}
- getGraphicsSize:(NXSize *)s
{
DEBUG_FUNC1(DEBUGLEVEL);
sscanf(defaults[GRAPHICSSIZE].value, "{%f,%f}", &s->width, &s->height);
return self;
}
- getGraphicsTolerance:(NXSize *)s
{
DEBUG_FUNC1(DEBUGLEVEL);
sscanf(defaults[SIZETOLERANCE].value, "{%f,%f}", &s->width, &s->height);
return self;
}
@end
@implementation PrefAgent (Private)
- _revertDefaults
{
DEBUG_FUNC1(DEBUGLEVEL);
[options1Matrix setState:[self evaluateAll] at:EVALALLAT :0];
[options1Matrix setState:[self commentOutput] at:COMMMENTOUTAT :0];
[options1Matrix setState:[self insertErrors] at:INSERTERRSAT :0];
[options1Matrix setState:[self transcriptMode] at:TRANSCRIPTAT :0];
[options1Matrix setState:[self autoScroll] at:AUTOSCROLLAT :0];
[options1Matrix setState:[self confirmOnClose] at:CONFCLOSEAT :0];
[options1Matrix setState:[self confirmOnQuit] at:CONFQUITAT :0];
[options1Matrix setState:[self keepBackupCopy] at:KEEPBACKUPAT :0];
[onErrorMatrix setState:YES at:[self errorAbort] :0];
[options2Matrix setState:[self dblClickMatch] at:DBLCLICKAT :0];
[options2Matrix setState:[self autoindent] at:AUTOINDENTAT :0];
[options2Matrix setState:[self matchParens] at:MATCHPARENAT :0];
[options2Matrix setState:[self formatAfterPaste] at:FORMATPASTEAT :0];
[dialectMatrix setState:YES at:[self schemeDialect] :0];
[self _setDialectOpts:[self schemeDialect]];
[self _specialFormOpts:-1];
return self;
}
- _setDefaults
{
int i,sizetot;
DEBUG_FUNC1(DEBUGLEVEL);
DEBUG_ASSERT(defaults!=NULL)
NXZoneFree(agentZone, defaults[EVALUATEALL].value);
NXZoneFree(agentZone, defaults[COMMENTOUTPUT].value);
NXZoneFree(agentZone, defaults[INSERTERRORS].value);
NXZoneFree(agentZone, defaults[TRANSCRIPT].value);
NXZoneFree(agentZone, defaults[AUTOSCROLL].value);
NXZoneFree(agentZone, defaults[CONFIRMONCLOSE].value);
NXZoneFree(agentZone, defaults[CONFIRMONQUIT].value);
NXZoneFree(agentZone, defaults[KEEPBACKUPCOPY].value);
defaults[EVALUATEALL].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:EVALALLAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[EVALUATEALL].value!=NULL)&&(*defaults[EVALUATEALL].value))
if ([[options1Matrix cellAt:EVALALLAT :0] state])
[[[[[NXApp mainMenu] findCellWithTag:MENU_ACTIONS] target] findCellWithTag:MENU_ACTIONS_EvalAll] setEnabled:YES];
else
[[[[[NXApp mainMenu] findCellWithTag:MENU_ACTIONS] target] findCellWithTag:MENU_ACTIONS_EvalAll] setEnabled:NO];
defaults[COMMENTOUTPUT].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:COMMMENTOUTAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[COMMENTOUTPUT].value!=NULL)&&(*defaults[COMMENTOUTPUT].value))
defaults[INSERTERRORS].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:INSERTERRSAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[INSERTERRORS].value!=NULL)&&(*defaults[INSERTERRORS].value))
defaults[TRANSCRIPT].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:TRANSCRIPTAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[TRANSCRIPT].value!=NULL)&&(*defaults[TRANSCRIPT].value))
defaults[AUTOSCROLL].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:AUTOSCROLLAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[AUTOSCROLL].value!=NULL)&&(*defaults[AUTOSCROLL].value))
defaults[CONFIRMONCLOSE].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:CONFCLOSEAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[CONFIRMONCLOSE].value!=NULL)&&(*defaults[CONFIRMONCLOSE].value))
defaults[CONFIRMONQUIT].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:CONFQUITAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[CONFIRMONQUIT].value!=NULL)&&(*defaults[CONFIRMONQUIT].value))
defaults[KEEPBACKUPCOPY].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:KEEPBACKUPAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[KEEPBACKUPCOPY].value!=NULL)&&(*defaults[KEEPBACKUPCOPY].value))
sprintf(defaults[ERRORABORT].value, "%i", [[onErrorMatrix selectedCell] tag]);
DEBUG_ASSERT((defaults[ERRORABORT].value!=NULL)&&(*defaults[ERRORABORT].value))
NXZoneFree(agentZone, defaults[DBLCLICKMATCH].value);
NXZoneFree(agentZone, defaults[AUTOINDENT].value);
NXZoneFree(agentZone, defaults[MATCHPARENS].value);
NXZoneFree(agentZone, defaults[FRMTAFTRPASTE].value);
defaults[DBLCLICKMATCH].value = NXCopyStringBufferFromZone(([[options2Matrix cellAt:DBLCLICKAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[DBLCLICKMATCH].value!=NULL)&&(*defaults[DBLCLICKMATCH].value))
defaults[AUTOINDENT].value = NXCopyStringBufferFromZone(([[options2Matrix cellAt:AUTOINDENTAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[AUTOINDENT].value!=NULL)&&(*defaults[AUTOINDENT].value))
defaults[MATCHPARENS].value = NXCopyStringBufferFromZone(([[options2Matrix cellAt:MATCHPARENAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[MATCHPARENS].value!=NULL)&&(*defaults[MATCHPARENS].value))
defaults[FRMTAFTRPASTE].value = NXCopyStringBufferFromZone(([[options2Matrix cellAt:FORMATPASTEAT :0] state]?"YES":"NO"), agentZone);
DEBUG_ASSERT((defaults[FRMTAFTRPASTE].value!=NULL)&&(*defaults[FRMTAFTRPASTE].value))
sprintf(defaults[SCHEMEDIALECT].value, "%i", [[dialectMatrix selectedCell] tag]);
DEBUG_ASSERT((defaults[SCHEMEDIALECT].value!=NULL)&&(*defaults[SCHEMEDIALECT].value))
switch ([[dialectMatrix selectedCell] tag])
{
case SICPDIALECT: NXZoneFree(agentZone, defaults[SICPPARAMETERS].value);
defaults[SICPPARAMETERS].value = NXCopyStringBufferFromZone([parametersField stringValue], agentZone);
DEBUG_ASSERT((defaults[SICPPARAMETERS].value!=NULL)&&(*defaults[SICPPARAMETERS].value))
break;
case MITDIALECT :
case MITDIALECTCOMP:NXZoneFree(agentZone, defaults[MITPARAMETERS].value);
defaults[MITPARAMETERS].value = NXCopyStringBufferFromZone([parametersField stringValue], agentZone);
DEBUG_ASSERT((defaults[MITPARAMETERS].value!=NULL)&&(*defaults[MITPARAMETERS].value))
break;
case OTHERDIALECT:NXZoneFree(agentZone, defaults[EXECUTABLE].value);
NXZoneFree(agentZone, defaults[PARAMETERS].value);
defaults[EXECUTABLE].value = NXCopyStringBufferFromZone([executableForm stringValue], agentZone);
DEBUG_ASSERT((defaults[EXECUTABLE].value!=NULL)&&(*defaults[EXECUTABLE].value))
defaults[PARAMETERS].value = NXCopyStringBufferFromZone([parametersField stringValue], agentZone);
DEBUG_ASSERT((defaults[PARAMETERS].value!=NULL)&&(*defaults[PARAMETERS].value))
}
NXZoneFree(agentZone, defaults[SPECIALFORMS].value);
defaults[SPECIALFORMS].value = NXCopyStringBufferFromZone("", agentZone);
DEBUG_ASSERT((defaults[SPECIALFORMS].value!=NULL)&&(!*defaults[SPECIALFORMS].value))
sizetot = strlen(defaults[SPECIALFORMS].value)+1;
[[oldKeywordList freeObjects] free];
oldKeywordList = keywordList;
keywordList = [self _copyKeywordList];
for(i=0; i<[keywordList count]; i++)
{
char temp[128];
sprintf(temp, "{%s,%i}", [[keywordList objectAt:i] keyword], [[keywordList objectAt:i] distinguishedElems]);
defaults[SPECIALFORMS].value = (char *)NXZoneRealloc(agentZone, defaults[SPECIALFORMS].value, (sizetot+=strlen(temp)+1));
DEBUG_ASSERT(defaults[SPECIALFORMS].value!=NULL)
strcat(defaults[SPECIALFORMS].value, temp);
}
NXWriteDefaults([NXApp appName], defaults);
keywordListVersion++;
return self;
}
- _setDialectOpts:(int)dialect
{
DEBUG_FUNC1(DEBUGLEVEL);
if (dialect<OTHERDIALECT)
{
[executableForm setEnabled:NO];
[executableForm setStringValue:""];
if (dialect==SICPDIALECT)
[parametersField setStringValue:defaults[SICPPARAMETERS].value];
else
[parametersField setStringValue:defaults[MITPARAMETERS].value];
[parametersBox setTitle:ADDCMDLINEPARAMS];
}
else
{
[executableForm setEnabled:YES];
[executableForm setStringValue:defaults[EXECUTABLE].value];
[parametersField setStringValue:defaults[PARAMETERS].value];
[parametersBox setTitle:CMDLINEPARAMS];
}
[parametersBox display];
return self;
}
- _specialFormOpts:(int)buttontag
{
id matrix=[formsBrowser matrixInColumn:0];
int rowNum=[matrix selectedRow];
DEBUG_FUNC1(DEBUGLEVEL);
switch (buttontag)
{
case -1: [formsField setStringValue:NULL];
[deField setStringValue:NULL];
[[keywordList freeObjects] free];
keywordList = oldKeywordList;
oldKeywordList = [self _copyKeywordList];
[formsBrowser loadColumnZero];
return self;
case 0 : if (rowNum<0) break;
if (NXOrderStrings((unsigned char *)[formsField stringValue],(unsigned char *)[[keywordList objectAt:rowNum] keyword],NO,-1,NULL))
{
[[keywordList objectAt:rowNum] setKeyword:(char *)[formsField stringValue]];
[formsBrowser reloadColumn:0];
}
if ([deField intValue]!=[[keywordList objectAt:rowNum] distinguishedElems])
[[keywordList objectAt:rowNum] setDistElems:[deField intValue]];
[matrix selectCellAt:rowNum :0];
[self formsBrowserClick:self];
return self;
case 1 : if (![self isSpecialForm:[formsField stringValue]])
{
[keywordList addObject:[[Keyword allocFromZone:agentZone] initTo:(char *)[formsField stringValue] with:[deField intValue]]];
[formsBrowser reloadColumn:0];
[matrix selectCellAt:[matrix cellCount]-1 :0];
[self formsBrowserClick:self];
}
return self;
case 2 : if (rowNum<0) break;
[[keywordList removeObjectAt:rowNum] free];
[deField setStringValue:""];
[[formsField setStringValue:"" at:0] selectTextAt:0];
[formsBrowser reloadColumn:0];
return self;
}
return self;
}
- _copyKeywordList
{
int i;
id list;
list = [[List alloc] init];
for(i=0; i<[keywordList count]; i++)
[list addObject:[[keywordList objectAt:i] copy]];
return list;
}
@end
@implementation PrefAgent (FormsBrowser)
- (int)browser:sender fillMatrix:matrix inColumn:(int)column
{
int i;
DEBUG_FUNC1(DEBUGLEVEL);
for(i=0; i<[keywordList count]; i--)
{
[matrix addRow];
[[matrix cellAt:i :0] setTag:i];
}
return [keywordList count];
}
- browser:sender loadCell:aCell atRow:(int)row inColumn:(int)column
{
DEBUG_FUNC1(DEBUGLEVEL);
if (defaults[SPECIALFORMS].value)
{
[aCell setStringValueNoCopy:[[keywordList objectAt:row] keyword]];
DEBUG_ASSERT(!NXOrderStrings((unsigned char *)[aCell stringValue], (unsigned char *)[[keywordList objectAt:row] keyword], YES, -1, NULL))
[aCell setLeaf:YES];
[aCell setLoaded:YES];
}
return self;
}
@end
@implementation Keyword
- init
{
DEBUG_FUNC1(DEBUGLEVEL);
return [self initTo:"" with:-1];
}
- initTo:(char *)aString with:(int)anInt
{
DEBUG_FUNC1(DEBUGLEVEL);
[super init];
keyword = NXCopyStringBufferFromZone(aString,[self zone]);
distelems = anInt;
return self;
}
- copy
{
return [[Keyword allocFromZone:[self zone]] initTo:keyword with:distelems];
}
- free
{
free(keyword);
return [super free];
}
- (char *)keyword
{
DEBUG_FUNC1(DEBUGLEVEL);
return keyword;
}
- (int)distinguishedElems
{
DEBUG_FUNC1(DEBUGLEVEL);
return distelems;
}
- setKeyword:(char *)aString
{
DEBUG_FUNC1(DEBUGLEVEL);
if (keyword!=NULL) free(keyword);
keyword = NXCopyStringBufferFromZone(aString,[self zone]);
DEBUG_ASSERT((keyword!=NULL)&&(*keyword))
return self;
}
- setDistElems:(int)anInt
{
DEBUG_FUNC1(DEBUGLEVEL);
distelems = anInt;
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.