This is PrefsPanel.m in view mode; [Download] [Up]
/** ** PrefsPanel is a subclass of Panel which ** defines the logic for managing user preferences. **/ #import "PrefsPanel.h" #import "Eval.h" #import "EvalText.h" #import "CodeBrowser.h" #import <defaults/defaults.h> #import "EvalString.h" #include <stdio.h> #define TEXTDEFAULTKNT 7 /* number of text categories */ static NXDefaultsVector evalDefaults = { {"Frame","100.0 100.0 300.0 300.0"}, {"TextScrollViewSize","300.0 150.0"}, {"GraphicsScrollViewSize","300.0 150.0"}, {"GraphicsViewSize","400.0 400.0"}, {"EmacsBindings","1"}, {"TextBackgroundColor","0.666 0.666 0.666"}, {"CompilerSwitches",""}, {"CompilerOutput","0"}, {"Libraries",""}, {"LastFileOpened",""}, // preproc,directive,methoddef,comment,string,keyword,normal {"text0", "Courier \\fs28 \\red0\\green0\\blue0 \\ul0"}, {"text1", "Courier \\fs28 \\red0\\green0\\blue0 \\ul0"}, {"text2", "Ohlfs \\fs22 \\red0\\green0\\blue0 \\ul"}, {"text3", "Courier \\fs22 \\red0\\green0\\blue0 \\ul0"}, {"text4", "Courier \\fs22 \\red0\\green0\\blue0 \\ul0 "}, {"text5", "Courier \\fs22 \\red0\\green0\\blue0 \\ul0 "}, {"text6", "Courier \\fs22 \\red0\\green0\\blue0 \\ul0 "}, {NULL} } ; // archive (library) extension const char *libTypes[] = { "a", "o", NULL } ; @implementation PrefsPanel { id prefsView ; id graphicsViewSizeForm ; id compilerSwitchesForm ; id compilerOutput ; id emacsBindings ; id fontNameAndSize ; id fontColor ; id fontUnderline ; id textBackgroundColorWell ; id libBrowser ; id libList ; id libSelection ; } - (int)browser:sender fillMatrix:matrix inColumn:(int)column ; { // This is a delegate method for libBrowser, the browser object // displaying a list of libraries. return [libList count] ; } - browser:sender loadCell:cell atRow:(int)row inColumn:(int)column ; { // Load a cell in the libBrowser. [cell setStringValue: [[libList objectAt: row] cString]] ; [cell setLeaf: YES] ; return self ; } - changeFont: sender ; { // This message is automagically sent down the responder chain // from the FontManager whenever a new font is selected. This // implementation writes the font and size currently selected // in the FontPanel to the Button instance currently selected in the // fontNameAndSize Matrix. char buf[80] ; id aFont = [sender convertFont: [sender selFont]] ; sprintf(buf,"%s %.3f",[aFont name],[aFont pointSize]) ; [[fontNameAndSize selectedCell] setTitle: buf] ; [self doFont: sender] ; return self ; } - changePrefsView: sender ; { // Force the prefs panel to display a different part of its // prefsView subView. NXRect aRect ; [prefsView getFrame: &aRect] ; [prefsView moveTo: -370 *[[sender selectedCell] tag] :aRect.origin.y] ; return [self display] ; } - doCompilerOutput: sender { // Process the Compiler Output switch char *defaultName = "CompilerOutput" ; if(sender) // set default from widget NXWriteDefault([NXApp appName],defaultName, [compilerOutput selectedCol] ? "1" : "0") ; else // set widget from default [compilerOutput selectCellAt: *NXGetDefaultValue([NXApp appName],defaultName) == '0' ? 0 : 1 :0 ] ; return self ; } - doCompilerSwitches: sender { // Process the compiler switches. char *defaultName = "CompilerSwitches" ; if(sender) // set defaults from widget NXWriteDefault([NXApp appName],defaultName, [compilerSwitchesForm stringValue]) ; else // set widget from defaults [compilerSwitchesForm setStringValue: NXGetDefaultValue([NXApp appName],"CompilerSwitches")] ; return self ; } - doEmacsBindings: sender { // Process the Emacs Bindings preference. char *defaultName = "EmacsBindings" ; if(sender) // set default from widget NXWriteDefault([NXApp appName],defaultName, [emacsBindings selectedRow] ? "1" : "0") ; else // set widget from default [emacsBindings selectCellAt: *NXGetDefaultValue([NXApp appName],defaultName) == '0' ? 0 : 1 :0 ] ; // set transcript text's state [[NXApp transcriptText] useEmacsBindings: [emacsBindings selectedRow]] ; return self ; } - doFont: sender { // Process a font attribute. char prefsValue[512], fontName[256], defaultName[6] ; float fontSize, red, green, blue ; if(sender) // set default from widgets { int tag ; // sender might be a Matrix, FontManager, or NXColorWell instance if([sender isMemberOf: [NXColorWell class]]) tag = [sender tag] ; else if([sender isMemberOf: [FontManager class]]) tag = [[fontNameAndSize selectedCell] tag] ; else tag = [[sender selectedCell] tag] ; sprintf(defaultName,"text%1d",tag) ; sscanf([[fontNameAndSize cellAt: tag :0] title],"%s %f",fontName,&fontSize) ; NXConvertColorToRGB([[fontColor findViewWithTag: tag] color], &red, &green, &blue) ; sprintf(prefsValue,"%s \\fs%d \\red%d\\green%d\\blue%d \\ul%s", fontName,(int) fontSize * 2,(int) (red * 256), (int) (green * 256), (int) (blue * 256), ([[fontUnderline cellAt: tag :0] state] == 1) ? "" : "0") ; NXWriteDefault([NXApp appName],defaultName,prefsValue) ; } return self ; } - doGraphicsViewSize: sender ; { // Process the graphics size preference. char *defaultName = "GraphicsViewSize" ; if(sender) // set defaults from widget NXWriteDefault([NXApp appName], defaultName,[graphicsViewSizeForm stringValue]) ; else // set widget from defaults [graphicsViewSizeForm setStringValue: NXGetDefaultValue([NXApp appName],defaultName)] ; return self ; } - doLibraries: sender ; { // Process the libraries preference. const char *s, *defaultName = "Libraries" ; int i = 0 ; if(sender) // set default from widget { int knt = [libList count] ; NXStream *libStream = NXOpenMemory(NULL, 0, NX_WRITEONLY) ; for( ; i < knt ; i++) NXPrintf(libStream,"%s ",[[libList objectAt: i] cString]) ; NXGetMemoryBuffer(libStream,&s,&i,&knt) ; NXWriteDefault([NXApp appName],defaultName,s) ; NXCloseMemory(libStream,NX_FREEBUFFER) ; } else // set widget from default { const char *delims = " \n\t" ; const char *aString ; s = NXGetDefaultValue([NXApp appName],defaultName) ; if(aString = strtok((char *) s,delims)) { do [libList addObject: [EvalString new: aString]] ; while(aString = strtok(NULL,delims)) ; } [libBrowser loadColumnZero] ; } return self ; } - doTextBackgroundColor: sender ; { // Process the text background color preference. char *defaultName = "TextBackgroundColor" ; float red, green, blue ; id aWin = [NXApp mainWindow] ; if(![aWin isKindOf: [CodeBrowser class]]) aWin = nil ; if(sender) // set defaults from widget { char buf[80] ; NXConvertColorToRGB([textBackgroundColorWell color], &red, &green, &blue) ; sprintf(buf,"%f %f %f",red,green,blue) ; NXWriteDefault([NXApp appName],defaultName,buf) ; } else // set widget from default { sscanf(NXGetDefaultValue([NXApp appName],defaultName), "%f %f %f",&red,&green,&blue) ; [textBackgroundColorWell setColor: NXConvertRGBToColor(red,green,blue)] ; } if([[NXApp transcriptText] shouldDrawColor]) { if(aWin) [[aWin codeBrowserText] setBackgroundColor: [textBackgroundColorWell color]] ; } else { float g ; NXConvertColorToGray([textBackgroundColorWell color], &g) ; if(aWin) [[aWin codeBrowserText] setBackgroundGray:g] ; } if(aWin) [aWin display] ; return self ; } - libAdd: sender ; { // Add a library file's name to the list // of libraries to be searched. id openPanel ; char **theList, buf[256] ; openPanel = [OpenPanel new] ; if([openPanel runModalForTypes: libTypes]) { theList = (char **) [openPanel filenames] ; { sprintf(buf,"%s/%s",[openPanel directory], *theList++) ; [libList addObject: [EvalString new:buf]] ; } [libBrowser loadColumnZero] ; [self doLibraries: self] ; } return self ; } - libBrowserHit: sender ; { // whenever a library is selected in the browser, we // copy the entry into the libSelection, because long path names // may be truncated in the browser. [libSelection setStringValue: [[[libBrowser matrixInColumn: 0] selectedCell] stringValue]] ; return self ; } - libList ; { // Return the libList, a List instance containing // EvalString instances each of which is the name of // a library to be searched during linking. return libList ; } - libRemove: sender ; { // Remove a library file's name from the list // of libraries to be searched. int theRow ; theRow = [[libBrowser matrixInColumn: 0] selectedRow] ; if(theRow >= 0) { [[libList removeObjectAt: theRow] free] ; [libBrowser loadColumnZero] ; [self doLibraries: self] ; } return self ; } - setup ; { // Read in the app's defaults, then populate the preferences // panel widgets and initialize user interface objects as required. const char * theAppName = [NXApp appName] ; int i ; int red, green, blue ; // setup the defaults NXRegisterDefaults(theAppName, evalDefaults) ; // Populate prefs panel widgets and set state of UI objects // as required by calling the "do" methods with a NULL argument [self doGraphicsViewSize: NULL] ; [self doEmacsBindings: NULL] ; [self doTextBackgroundColor: NULL] ; [self doCompilerSwitches: NULL] ; [self doCompilerOutput: NULL] ; // init the libList, display in browser libList = [[List alloc] init] ; [self doLibraries: NULL] ; [libBrowser loadColumnZero] ; // Populate the font options for(i = 0 ; i < TEXTDEFAULTKNT ; i++) { char defaultName[6] ; char fontName[256],fontUnderlineString[10],tmp[256] ; float fontSize ; sprintf(defaultName,"text%1d",i) ; sscanf(NXGetDefaultValue(theAppName,defaultName), "%s \\fs%f \\red%d\\green%d\\blue%d %s ", fontName, &fontSize, &red, &green, &blue, fontUnderlineString) ; sprintf(tmp,"%s %.3f", fontName, fontSize / 2.0) ; [[fontNameAndSize cellAt: i:0] setTitle: tmp] ; [[fontColor findViewWithTag:i] setColor: NXConvertRGBAToColor(red/255.0, green/255.0 , blue/255.0, NX_NOALPHA)]; [[fontUnderline cellAt: i :0] setState: !strcmp(fontUnderlineString,"\\ul") ? 1 : 0] ; } return self ; } - textBackgroundColorWell ; { return textBackgroundColorWell ; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.