This is NTPrefThinker.m in view mode; [Download] [Up]
#import "NTPrefThinker.h" #import "NetTalkThinker.h" #import "OrderMatrix.h" #import <appkit/appkit.h> @implementation NTPrefThinker - setupMatrixScroller { NXRect scrollRect, matrixRect; NXSize interCellSpacing = {0.0, 0.0}, cellSize; [serverScroller setBorderType:NX_BEZEL]; [serverScroller setVertScrollerRequired:YES]; [serverScroller setHorizScrollerRequired:NO]; [serverScroller getFrame:&scrollRect]; [ScrollView getContentSize:&(matrixRect.size) forFrameSize:&(scrollRect.size) horizScroller:YES vertScroller:YES borderType:NX_BEZEL]; serverMatrix = [[OrderMatrix alloc] initFrame:&matrixRect mode:NX_LISTMODE cellClass:[Cell class] numRows:0 numCols:1]; [serverMatrix setIntercell:&interCellSpacing]; [serverMatrix setTextDelegate:self]; [self loadServer]; [serverMatrix getCellSize:&cellSize]; cellSize.width = NX_WIDTH(&matrixRect); [serverMatrix setCellSize:&cellSize]; [serverMatrix sizeToCells]; [serverMatrix setAutosizeCells:YES]; [serverMatrix setAutoscroll:YES]; [[serverScroller setDocView:serverMatrix] free]; [[serverMatrix superview] setAutoresizeSubviews:YES]; [serverMatrix setAutosizing:NX_WIDTHSIZABLE]; return self; } - awakeFromNib { const char *value; value = NXGetDefaultValue(APPNAME, NTD_SOUNDNAME); if (strrchr(value, '/')) [soundText setStringValue:strrchr(value, '/')+1]; else [soundText setStringValue:value]; [audibleSwitch setState: (strcmp(NXGetDefaultValue(APPNAME, NTD_MUTEALARM), NTD_NO) == 0)]; value = NXGetDefaultValue(APPNAME, NTD_RINGSOUNDNAME); if (strrchr(value, '/')) [ringingText setStringValue:strrchr(value, '/')+1]; else [ringingText setStringValue:value]; [ringingAllowedSwitch setState: (strcmp(NXGetDefaultValue(APPNAME, NTD_RINGINGALLOWED), NTD_YES) == 0)]; [self setupMatrixScroller]; NXWriteDefault(APPNAME, NTD_USESELECTED, NTD_YES); value = NXGetDefaultValue(APPNAME, NTD_DEFAULTTOPIC); [defaultTopicField setStringValue:value]; return self; } - free { [self saveServer]; return [super free]; } - loadServer { const char *token; char value[8192]; int i; token = NXGetDefaultValue(APPNAME, NTD_SERVERLIST); if (token) { strcpy(value, token); token = strtok(value, " "); } else token = NULL; i = 0; while (token) { [serverMatrix addRow]; [[serverMatrix cellAt:i :0] setStringValue:token]; token = strtok(NULL, " "); i++; } return self; } - saveServer { int i = 0; char value[8192] = ""; while (i < [serverMatrix cellCount]) { strcat(value, [[serverMatrix cellAt:i :0] stringValue]); i++; if (i < [serverMatrix cellCount]) strcat(value, " "); } NXWriteDefault(APPNAME, NTD_SERVERLIST, value); return self; } - addServer:sender { Cell *newCell; [serverMatrix addRow]; newCell = [serverMatrix cellAt:[serverMatrix cellCount]-1 :0]; [newCell setStringValue:[serverTextField stringValue]]; [[[serverMatrix sizeToCells] selectCellAt:[serverMatrix cellCount]-1 :0] display]; [serverTextField selectText:nil]; [self saveServer]; return self; } - replaceServer:sender { Cell *oldCell; oldCell = [serverMatrix selectedCell]; [oldCell setStringValue:[serverTextField stringValue]]; [serverMatrix display]; [serverTextField selectText:nil]; [self saveServer]; return self; } - setRequestSound:sender { OpenPanel *openPanel = [OpenPanel new]; const char *type[2] = {"snd", NULL}; char filePath[MAXPATHLEN]; strcpy(filePath, NXGetDefaultValue(APPNAME, NTD_SOUNDNAME)); if (strrchr(filePath, '/')) *strrchr(filePath, '/') = 0; else strcpy(filePath, "/NextLibrary/Sounds"); [openPanel allowMultipleFiles:NO]; [openPanel chooseDirectories:NO]; if ([openPanel runModalForDirectory:filePath file:[soundText stringValue] types:type]) { strcpy(filePath, [openPanel filename]); NXWriteDefault(APPNAME, NTD_SOUNDNAME, [openPanel filename]); [soundText setStringValue:(strrchr(filePath, '/')+1)]; [[[[Sound alloc] initFromSoundfile:filePath] play:nil] free]; } return self; } - setAudible:sender { if ([audibleSwitch state]) NXWriteDefault(APPNAME, NTD_MUTEALARM, NTD_NO); else NXWriteDefault(APPNAME, NTD_MUTEALARM, NTD_YES); return self; } - setRingSound:sender { OpenPanel *openPanel = [OpenPanel new]; const char *type[2] = {"snd", NULL}; char filePath[MAXPATHLEN]; strcpy(filePath, NXGetDefaultValue(APPNAME, NTD_RINGSOUNDNAME)); if (strrchr(filePath, '/')) *strrchr(filePath, '/') = 0; else strcpy(filePath, "/NextLibrary/Sounds"); [openPanel allowMultipleFiles:NO]; [openPanel chooseDirectories:NO]; if ([openPanel runModalForDirectory:filePath file:[ringingText stringValue] types:type]) { strcpy(filePath, [openPanel filename]); NXWriteDefault(APPNAME, NTD_RINGSOUNDNAME, [openPanel filename]); [ringingText setStringValue:(strrchr(filePath, '/')+1)]; [[[[Sound alloc] initFromSoundfile:filePath] play:nil] free]; } return self; } - setRingingFlag:sender { if ([ringingAllowedSwitch state]) NXWriteDefault(APPNAME, NTD_RINGINGALLOWED, NTD_YES); else NXWriteDefault(APPNAME, NTD_RINGINGALLOWED, NTD_NO); return self; } - setDefaultTopic:sender { NXWriteDefault(APPNAME, NTD_DEFAULTTOPIC, [defaultTopicField stringValue]); return self; } @end @implementation NTPrefThinker(TextDelegate) - textDidChange:sender { if (sender == serverMatrix) [self saveServer]; return self; } - (BOOL)textWillChange:sender { return NO; } - textDidGetKeys:textObject isEmpty:(BOOL)flag { [addButton setEnabled:!flag]; [replaceButton setEnabled:(!flag && [serverMatrix selectedCell])]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.