This is Preferences.m in view mode; [Download] [Up]
//************************************************************************
//
// Preferences.m.
//
// Controller for the preferences panel.
//
// by Felipe A. Rodriguez
//
// This code is supplied "as is" the author makes no warranty as to its
// suitability for any purpose. This code is free and may be distributed
// in accordance with the terms of the:
//
// GNU GENERAL PUBLIC LICENSE
// Version 2, June 1991
// copyright (C) 1989, 1991 Free Software Foundation, Inc.
// 675 Mass Ave, Cambridge, MA 02139, USA
//
//************************************************************************
#import "Preferences.h"
#import "SwapView.h"
#import "OptionsEditor.h"
#import "ToolBar.h"
#import "HLDelegate.h"
// used in creating a FIFO
typedef unsigned short mode_t;
int mkfifo (const char *path, mode_t mode);
#define FMOD (S_IREAD | S_IWRITE) // read, write by owner
@implementation Preferences
//************************************************************************
//
// sent to us after nib objects are unarchived and init'd
//
//************************************************************************
- awakeFromNib
{
int i = 0;
[swapView initPopUp];
[swapView inspectName:"Switches"];
// remem loc/size
[[swapView window] setFrameUsingName:[[swapView window] title]];
[[swapView window] setFrameAutosaveName:[[swapView window] title]];
// default switches
do { // if set in ddb turn check switch on
if(strcmp(NXGetDefaultValue([NXApp appName], sList[i]), "YES") == 0)
[[swMatrix findCellWithTag:i] setIntValue:1];
}
while(sList[++i]);
for(i = 0; rsList[i] != NULL; i++) // redial switches
{ // if set in ddb turn check switch on
if(strcmp(NXGetDefaultValue([NXApp appName], rsList[i]), "YES") == 0)
[[redialSwMatrix findCellWithTag:i] setIntValue:1];
}
[preTimeoutSw setIntValue:1];
for(i = 0; cList[i]; i++) // display default trigger str's
[defaultsForm setStringValue:NXGetDefaultValue([NXApp appName],
cList[i]) at:i];
for(i = 0; rfList[i]; i++) // display redial trigger str's
[redialForm setStringValue:NXGetDefaultValue([NXApp appName],
rfList[i]) at:i];
[self setPPPForm:radioButtons]; // set ppp form strings
[self timeout:self]; // set timeout circ slide/text field
[self timeoutThreshold:self]; // set timeout circ slide/text field
[[[[[[[[pHLBrowser setTitled:NO] // create and configure nxbrowser
setHorizontalScrollButtonsEnabled:NO]
setDelegate:[[NXApp delegate] hotListDelegate]]
setTarget:[[NXApp delegate] hotListDelegate]]
setAction:@selector(pBrowserHit:)]
setDoubleAction:@selector(pBrowserDoubleClick:)]
setMinColumnWidth:200]
setMaxVisibleColumns:1];
[self resetPHLBrowser];
[hlPathTextField setStringValue:
NXGetDefaultValue([NXApp appName], HLLIST)];
return self;
}
//************************************************************************
//
// show pppEditor
//
//************************************************************************
- show_pppEditor:sender
{
[self setPPPForm:radioButtons]; // set ppp form strings
return self;
}
//***************************** Editor subview ***************************
//************************************************************************
//
// Edit ppp file button was pressed, open radio sel'd file in edit
//
//************************************************************************
- pppFileEdit:sender
{ // if readable
if([[NXApp delegate]
readable:[self pathOf:(int)[radioButtons selectedTag]]])
// call edit to open radioButtons selected file
[[Application workspace] openFile:[self pathOf:
(int)[radioButtons selectedTag]] withApplication:"Edit"];
return self;
}
//************************************************************************
//
// Edit example ppp file button was pressed, in Editor subview.
//
//************************************************************************
- pppExampleEdit:sender
{ // appWrapper is mainBundle, return path to resources
// bundled within
if(![[NXBundle mainBundle]getPath:Path forResource:"Examples" ofType:NULL])
[[NXApp delegate] showAlert:"Error getting mainbundle path"];
strcat(Path, exlist[(int)[radioButtons selectedTag]]);
// call edit to open file
[[Application workspace] openFile:Path withApplication:"Edit"];
return self;
}
//************************************************************************
//
// send formcell a path based on the tag of the selected radio button.
//
//************************************************************************
- setPPPForm:sender
{
[pppForm setStringValue:[self pathOf:(int)[sender selectedTag]] at:0];
if((2 < (int)[sender selectedTag]))
[pppForm setEnabled:NO];
else
[pppForm setEnabled:YES];
return self;
}
//************************************************************************
//
// return the path of the item selected in flist[]
//
//************************************************************************
- (char *)pathOf:(int)i
{
strcpy(Path, NXGetDefaultValue([NXApp appName], flist[i]));
return Path;
}
//***************************** defaults subview *************************
//************************************************************************
//
// user has changed the path of one of the ppp files.
//
//************************************************************************
- pppFilesPathChanged:sender
{ // write an entry to defaults database
if(!NXWriteDefault([NXApp appName], flist[(int)[radioButtons selectedTag]],
[sender stringValueAt:[sender selectedIndex]]))
[[NXApp delegate] showAlert:"ddbWriteError"];
return self;
}
//************************************************************************
//
// user has changed a control string, store change in ddb
//
//************************************************************************
- defaultsForm:sender
{
int i = (int)[sender selectedIndex];
// write an entry to defaults database
if(!NXWriteDefault([NXApp appName], cList[i], [sender stringValueAt:i]))
[[NXApp delegate] showAlert:"ddbWriteError"];
return self;
}
//***************************** Link subview *****************************
//************************************************************************
//
// hotList path changed
//
//************************************************************************
- setHotListPath:sender
{ // write an entry to defaults database
if(!NXWriteDefault([NXApp appName], HLLIST, [sender stringValue]))
[[NXApp delegate] showAlert:"ddbWriteError"];
[[[NXApp delegate] hotListDelegate] initHotListPath];
[self resetPHLBrowser];
return self;
}
//************************************************************************
//
// select a hotList path
//
//************************************************************************
- selectHotListPath:sender
{
id theOpenPanel;
const char *filter[2] = {"Gate", NULL}; // filter for Gate doc path's
theOpenPanel = [OpenPanel new];
[theOpenPanel setTitle:"HotList Path"];
if(NX_OKTAG == [theOpenPanel runModalForDirectory:
NXGetDefaultValue([NXApp appName], "path") file:NULL
types:filter])
{
if(!NXWriteDefault([NXApp appName], HLLIST, [theOpenPanel directory]))
[[NXApp delegate] showAlert:"ddbWriteError"];
[hlPathTextField setStringValue:[theOpenPanel directory]];
[[[NXApp delegate] hotListDelegate] initHotListPath];
[self resetPHLBrowser];
}
return self;
}
//************************************************************************
//
// reset preferences hot list browswer
//
//************************************************************************
- resetPHLBrowser
{ // NXBrowser s/load cols from its delegate
[pHLBrowser loadColumnZero];
mat = [pHLBrowser matrixInColumn:0];
[[[NXApp delegate] hotListDelegate] setPreferencesBMat:mat];
[mat selectCellAt:[[[NXApp delegate]hotListDelegate]hLSelectedCell]:0];
return self;
}
//************************************************************************
//
// user has changed a redial trigger string, store change in ddb
//
//************************************************************************
- redialForm:sender
{
int i = (int)[sender selectedIndex];
// write an entry to defaults database
if(!NXWriteDefault([NXApp appName], rfList[i], [sender stringValueAt:i]))
[[NXApp delegate] showAlert:"ddbWriteError"];
return self;
}
//************************************************************************
//
// Target method of defaults db entries for our preferences
// check switches based on the tag assigned in IB to each switch.
//
//************************************************************************
- switch:sender
{
int tag = [sender selectedTag];
// toggles entries YES/NO
if(strcmp(NXGetDefaultValue([NXApp appName], sList[tag]),"NO") == 0)
{ // sw set ON
if(!NXWriteDefault([NXApp appName], sList[tag], "YES"))
[[NXApp delegate] showAlert:"ddbWriteError"];
else
{ // use fifo was enabled,
if(tag == 0)
[self makeFIFO];
if(tag == 4) // Dial on Demand was enabled
[[NXApp delegate] DialOnDemand]; // prepare for dial on
if(tag == 6) // app icon time enabled
[[NXApp delegate] setAppIconTimer:YES];
}
}
else // sw set OFF
{
if(tag == 0)
[self makeFile]; // if previously using FIFO create a log file
if(tag == 4) // Dial on Demand was disabled, revert to
[[NXApp delegate] namedReset:"/usr/etc/named"]; // system named
if(tag == 6) // app icon time disabled
[[NXApp delegate] setAppIconTimer:NO];
if(!NXWriteDefault([NXApp appName], sList[tag], "NO"))
[[NXApp delegate] showAlert:"ddbWriteError"];
}
return self;
}
//*****************************************************************************
//
// target of redial panel's switch matrix
//
//*****************************************************************************
- redialSwitch:sender;
{
if((BOOL)[sender intValue])
{
if(!NXWriteDefault([NXApp appName],rsList[[sender selectedTag]],"YES"))
[[NXApp delegate] showAlert:"ddbWriteError"];
}
else
{
if(!NXWriteDefault([NXApp appName], rsList[[sender selectedTag]],"NO"))
[[NXApp delegate] showAlert:"ddbWriteError"];
}
if([sender selectedTag] == 4) // Redial Backoff state change
[[NXApp delegate] resetDelay:sender];
return self;
}
//*****************************************************************************
//
// make the FIFO
//
//*****************************************************************************
- makeFIFO
{ // find FIFO path per /etc/syslog.conf
[[NXApp delegate] fifo];
// remove FIFO and then remake it
if((strlen(NXGetDefaultValue([NXApp appName],"locFIFO")) + 20)< MAXPATHLEN)
{
strcpy(Path, [[[NXApp delegate] stringTable]
valueForStringKey:"createFIFO"]);
strcat(Path, NXGetDefaultValue([NXApp appName],"locFIFO"));
strcat(Path, " ?");
if(NXRunAlertPanel(0, Path,
[[[NXApp delegate] stringTable] valueForStringKey:"Yes"],
[[[NXApp delegate] stringTable] valueForStringKey:"No"],
NULL) == NX_OKTAG)
{
unlink(NXGetDefaultValue([NXApp appName],"locFIFO"));
mkfifo(NXGetDefaultValue([NXApp appName],"locFIFO"),(mode_t) FMOD);
[[NXApp delegate] syslogdRun]; // restart syslogd
}
}
else
[[NXApp delegate] showAlert:"Error FIFO path is too long"];
return self;
}
//*****************************************************************************
//
// make the Log File
//
//*****************************************************************************
- makeFile
{
int fd;
// find path per /etc/syslog.conf
[[NXApp delegate] fifo];
// remove FIFO and then remake it
if((strlen(NXGetDefaultValue([NXApp appName],"locFIFO")) + 27)< MAXPATHLEN)
{
strcpy(Path, [[[NXApp delegate] stringTable]
valueForStringKey:"createFile"]);
strcat(Path, NXGetDefaultValue([NXApp appName],"locFIFO"));
strcat(Path, " ?");
if(NXRunAlertPanel(0, Path,
[[[NXApp delegate] stringTable] valueForStringKey:"Yes"],
[[[NXApp delegate] stringTable] valueForStringKey:"No"],
NULL) == NX_OKTAG)
{
unlink(NXGetDefaultValue([NXApp appName],"locFIFO"));
if((fd = open(NXGetDefaultValue([NXApp appName],"locFIFO"),
O_RDWR|O_CREAT|O_TRUNC,(mode_t) 644)) != -1)
close(fd);
[[NXApp delegate] syslogdRun]; // restart syslogd
}
}
else
[[NXApp delegate] showAlert:"log file path is too long"];
return self;
}
//*****************************************************************************
//
// target of timeout circular slider
//
//*****************************************************************************
- timeout:sender
{
int i;
if(sender == self) // if initial display of pref
i = atoi(NXGetDefaultValue([NXApp appName], "iTimeout"));
else // else user changed control
{
i = [sender intValue];
[[NXApp delegate] setTimeout:i]; // set timeout in Coordinator
}
if(i == 0)
[timeoutField setStringValue:"Off"];
else
[timeoutField setIntValue:i];
[timeoutCircSlider setIntValue:i];
return self;
}
//*****************************************************************************
//
// target of pre timeout switch
//
//*****************************************************************************
- setPreTimeout:sender
{
if((BOOL)[sender intValue])
{
if(!NXWriteDefault([NXApp appName], "preTimeout", "YES"))
[[NXApp delegate] showAlert:"ddbWriteError"];
}
else
{
if(!NXWriteDefault([NXApp appName], "preTimeout", "NO"))
[[NXApp delegate] showAlert:"ddbWriteError"];
}
return self;
}
//*****************************************************************************
//
// target of timeout threshold circular slider
//
//*****************************************************************************
- timeoutThreshold:sender
{
int i;
if(sender == self) // if initial display of pref
i = atoi(NXGetDefaultValue([NXApp appName], "iTimeThreshold"));
else // else user changed control
{
i = [sender intValue];
sprintf(Path,"%d",(int)i);
if(!NXWriteDefault([NXApp appName], "iTimeThreshold", Path))
[[NXApp delegate] showAlert:"ddbWriteError"];
}
[timeoutThreshField setIntValue:i];
[timeoutThreshCircSlider setIntValue:i];
return self;
}
//*********************** text field matrix delegation ************************
//*****************************************************************************
//
// as text delegate we recieve this when textfield cell is being edited
//
//*****************************************************************************
- (BOOL)textWillChange:textObject
{
[[swapView window] setDocEdited:YES]; // indicate change is not saved
return NO;
}
//*****************************************************************************
//
// text delegate receives when editing of textfield cell is ended
//
//*****************************************************************************
- textDidEnd:textObject endChar:(unsigned short)whyEnd
{
if ((whyEnd == 16) || (whyEnd == 17))
[[swapView window] setDocEdited:NO]; // indicate change is saved
return self;
}
@end
//*****************************************************************************
//
// create FIFO at designated path with mode set to
//
//*****************************************************************************
int mkfifo (const char *path, mode_t mode)
{
return mknod (path, mode | S_IFIFO, 0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.