This is Configure.m in view mode; [Download] [Up]
/*--------------------------------------------------------------------------- Configure.m -- Copyright (c) 1991 Rex Pruess This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or send electronic mail to the the author. This routine loads & displays the configuration window. It also contains the methods for handling the user requests generated from within the configuration window. Rex Pruess <rpruess@umaxc.weeg.uiowa.edu> $Header: /rpruess/apps/Remotes3.0/RCS/Configure.m,v 3.0 92/09/23 21:53:52 rpruess Exp $ ----------------------------------------------------------------------------- $Log: Configure.m,v $ Revision 3.0 92/09/23 21:53:52 rpruess Upgraded for NeXT System Release 3.0. Revision 2.0 91/01/22 15:32:00 rpruess Remotes-2.0 was upgraded for NeXT System Release 2.0 (standard or extended). Remotes-2.0 supports the NeXT supplied Terminal application and the Stuart shareware product. Revision 1.2 90/05/17 15:03:17 rpruess Minor changes to comments. Revision 1.1 90/04/10 14:25:10 rpruess Initial revision -----------------------------------------------------------------------------*/ /* Standard C header files */ #include <libc.h> #include <stdio.h> #include <strings.h> /* Configure class header files */ #import "Configure.h" #import "BoxViewSwitcher.h" #import "HostListManager.h" /* Appkit header files */ #import <appkit/Application.h> #import <appkit/Button.h> #import <appkit/Cell.h> #import <appkit/Form.h> #import <appkit/Matrix.h> #import <appkit/Menu.h> #import <appkit/PopUpList.h> #import <appkit/View.h> #import <defaults/defaults.h> @implementation Configure /*--------------------------------------------------------------------------- Create the Configure object. -----------------------------------------------------------------------------*/ - init { self = [super init]; [NXApp loadNibSection:"Configure.nib" owner:self withNames:NO]; [configWindow setMiniwindowIcon:"app"]; configurePUL = [[PopUpList alloc] init]; theBVS = [[BoxViewSwitcher alloc] init]; [theBVS setBoxView:boxView]; [theBVS setBoxViewWindow:boxViewWindow]; [theBVS setControlButton:appsButton]; [theBVS setDelegate:self]; return self; } /*--------------------------------------------------------------------------- Initialize the fields in the configuration window. -----------------------------------------------------------------------------*/ - initConfigWindow:sender { const char *string; [configWindow disableDisplay]; /* Clear some fields */ [buttonForm setStringValue:""]; [hostForm setStringValue:""]; /* Set user ID form value */ [idForm setStringValue:NXUserName ()]; /* Unselect autoStart switch */ [autoStartButton setIntValue:NO]; /* Set protocol/app values */ [protocolMatrix selectCellWithTag:RLOGIN]; [self rloginSet:self]; /* Set font form size value */ string = NXGetDefaultValue ("Terminal", "NXFixedPitchFontSize"); if (string != NULL) [fontForm setStringValue:string]; else [fontForm setStringValue:""]; /* Set font marix value */ string = NXGetDefaultValue ("Terminal", "NXFixedPitchFont"); if (strcmp (string, "Courier") == 0) { [fontMatrix selectCellWithTag:COURIER]; [self courierSet:self]; } else { [fontMatrix selectCellWithTag:OHLFS]; [self ohlfsSet:self]; } /* Set X & Y default values */ [xCell setIntValue:XDEFAULT]; [yCell setIntValue:YDEFAULT]; /* Set columns form value */ string = NXGetDefaultValue ("Terminal", "Columns"); if (string != NULL) [colsCell setStringValue:string]; /* Set lines form value */ string = NXGetDefaultValue ("Terminal", "Rows"); if (string != NULL) [linesCell setStringValue:string]; /* Set default Terminal matrix items */ [self initMatrixFlags:terminalMatrix]; [[terminalMatrix selectCellWithTag:TTRANSLAT] setIntValue:YES]; [[terminalMatrix selectCellWithTag:TAUTOWRAP] setIntValue:YES]; [[terminalMatrix selectCellWithTag:TSCROLLBK] setIntValue:YES]; [terminalMetaMatrix selectCellWithTag:METAESC]; appType = TERMINAL; [theBVS selectBoxViewTitle:TERMLAB]; /* Set default Stuart matrix items */ [self initMatrixFlags:stuartMatrix]; [[stuartMatrix selectCellWithTag:SSCROLLBK] setIntValue:YES]; [[stuartMatrix selectCellWithTag:STRANSLAT] setIntValue:YES]; [[stuartMatrix selectCellWithTag:STERMSPAC] setIntValue:YES]; [stuartMetaMatrix selectCellWithTag:METAESC]; [self launchState:NO]; /* Position cursor to the button form field */ [buttonForm selectTextAt:0]; [configWindow reenableDisplay]; [configWindow displayIfNeeded]; return self; } /*--------------------------------------------------------------------------- Add a host into the internal linked list and into the popup/pulldown lists. -----------------------------------------------------------------------------*/ - addNewItem:sender { id aMetaMatrix; char buttonName[MAXPOPLEN + 1]; char errMsg[256]; int slotNum; /* Slot position of host in linked list */ if ([self validHostFields:self] != 0) return self; strcpy (buttonName,[buttonForm stringValueAt:0]); slotNum = [theHLM getHostSlotNum:buttonName]; if (slotNum >= 0) { [buttonForm selectTextAt:0]; strcpy (errMsg, "The button name '%s' is already listed under Remote "); strcat (errMsg, "Systems. If you want to update it, click Change; "); strcat (errMsg, "otherwise rename '%s' and click Add."); NXRunAlertPanel (NULL, errMsg, NULL, NULL, NULL, buttonName, buttonName); return self; } if (appType == TERMINAL) aMetaMatrix = terminalMetaMatrix; else aMetaMatrix = stuartMetaMatrix; slotNum = [theHLM addHost:buttonName fullHostName:[hostForm stringValueAt:0] loginName:[idForm stringValueAt:0] application:appType protocol:protocolType locX:[xCell intValue] locY:[yCell intValue] nLines:[linesCell intValue] nCols:[colsCell intValue] font:fontType fontSize:[fontForm intValueAt:0] autoStart:[autoStartButton intValue] flags:[self getMatrixFlags:self] meta:[[aMetaMatrix selectedCell] tag] updateConfigFile:YES]; if (slotNum < 0) return self; /* Insert host into popup & pulldown lists. */ [theHostsPUL insertItem:buttonName at:slotNum]; [configurePUL insertItem:buttonName at:slotNum + 1]; [self launchState:YES]; /* Position to button form to indicate success. */ [buttonForm selectTextAt:0]; return self; } /*--------------------------------------------------------------------------- Change the host's values for the specified button. -----------------------------------------------------------------------------*/ - changeOldItem:sender { id aMetaMatrix; char buttonName[MAXPOPLEN + 1]; char errMsg[256]; short int fontNum; int slotNum; /* Slot position of host in linked list */ if ([self validHostFields:self] != 0) return self; strcpy (buttonName,[buttonForm stringValueAt:0]); fontNum = [fontForm intValueAt:0]; slotNum = [theHLM getHostSlotNum:buttonName]; if (slotNum < 0) { [buttonForm selectTextAt:0]; strcpy (errMsg, "The button name '%s' is not listed under Remote "); strcat (errMsg, "Systems. If you would like to add '%s' to the "); strcat (errMsg, "Remote Systems list, click Add."); NXRunAlertPanel (NULL, errMsg, NULL, NULL, NULL, buttonName, buttonName); return self; } if (appType == TERMINAL) aMetaMatrix = terminalMetaMatrix; else aMetaMatrix = stuartMetaMatrix; slotNum = [theHLM changeHost:[buttonForm stringValueAt:0] fullHostName:[hostForm stringValueAt:0] loginName:[idForm stringValueAt:0] application:appType protocol:protocolType locX:[xCell intValue] locY:[yCell intValue] nLines:[linesCell intValue] nCols:[colsCell intValue] font:fontType fontSize:fontNum autoStart:[autoStartButton intValue] flags:[self getMatrixFlags:self] meta:[[aMetaMatrix selectedCell] tag]]; if (slotNum < 0) return self; [self launchState:YES]; /* Position to button form to indicate success. */ [buttonForm selectTextAt:0]; return self; } /*--------------------------------------------------------------------------- Delete the host entry from internal list & popup/pulldown lists. -----------------------------------------------------------------------------*/ - deleteOldItem:sender { char buttonName[MAXPOPLEN + 1]; char errMsg[256]; int slotNum; /* Slot position of host in linked list */ strcpy (buttonName,[buttonForm stringValueAt:0]); slotNum = [theHLM getHostSlotNum:buttonName]; if (slotNum < 0) { strcpy (errMsg, "The button name '%s' is not listed under Remote "); strcat (errMsg, "Systems. Nothing has been deleted."); NXRunAlertPanel (NULL, errMsg, NULL, NULL, NULL, buttonName); return self; } if (NXRunAlertPanel (NULL, "OK to delete '%s'?", "OK", "Cancel", NULL, buttonName) != NX_ALERTDEFAULT) return self; slotNum = [theHLM deleteHost:slotNum]; if (slotNum < 0) return self; [[theHostsPUL removeItemAt:slotNum] free]; [[configurePUL removeItemAt:slotNum + 1] free]; if (strcmp (buttonName,[theHostsButton title]) == 0) { slotNum--; if (slotNum < 0 && [theHLM getNumHosts:sender] > 0) slotNum = 0; if (slotNum < 0) [theHostsButton setTitle:""]; else [theHostsButton setTitle:[theHLM getButtonName:slotNum]]; } [self launchState:NO]; /* Position to button form to indicate success. */ [buttonForm selectTextAt:0]; return self; } /*--------------------------------------------------------------------------- Display the host information for this button. -----------------------------------------------------------------------------*/ - display:sender { char buttonName[MAXPOPLEN + 1]; unsigned int flagValues; int font; int protocol; int slotNum; /* Slot position of host in linked list */ if ([sender selectedRow] == 0) return self; strcpy (buttonName,[[sender selectedCell] title]); slotNum = [theHLM getHostSlotNum:buttonName]; if (slotNum < 0) { NXRunAlertPanel (NULL, "The button name '%s' is not in the Remotes data base.", NULL, NULL, NULL, buttonName); return self; } [configWindow disableDisplay]; [autoStartButton setIntValue:[theHLM getAutoStart:slotNum]]; [buttonForm setStringValue:buttonName at:0]; [colsCell setIntValue:[theHLM getColumns:slotNum]]; [fontForm setIntValue:[theHLM getFontSize:slotNum] at:0]; [hostForm setStringValue:[theHLM getFullHostName:slotNum] at:0]; [idForm setStringValue:[theHLM getUserID:slotNum] at:0]; [linesCell setIntValue:[theHLM getLines:slotNum]]; [xCell setIntValue:[theHLM getX:slotNum]]; [yCell setIntValue:[theHLM getY:slotNum]]; protocol = [theHLM getProtocolType:slotNum]; [protocolMatrix selectCellWithTag:protocol]; if (protocol == TELNET) [self telnetSet:self]; else if (protocol == TN3270) [self tn3270Set:self]; else [self rloginSet:self]; appType = [theHLM getAppType:slotNum]; flagValues = [theHLM getFlags:slotNum]; if (appType == STUART) { [[stuartMatrix selectCellWithTag:SSTRICTEM] setIntValue:(flagValues & SSTRICTEM)]; [[stuartMatrix selectCellWithTag:SKEYPAD] setIntValue:(flagValues & SKEYPAD)]; [[stuartMatrix selectCellWithTag:SSCROLLBK] setIntValue:(flagValues & SSCROLLBK)]; [[stuartMatrix selectCellWithTag:STRANSLAT] setIntValue:(flagValues & STRANSLAT)]; [[stuartMatrix selectCellWithTag:SREVERSE] setIntValue:(flagValues & SREVERSE)]; [[stuartMatrix selectCellWithTag:SKEYBDFOC] setIntValue:(flagValues & SKEYBDFOC)]; [[stuartMatrix selectCellWithTag:STERMSPAC] setIntValue:(flagValues & STERMSPAC)]; [[stuartMatrix selectCellWithTag:SMOUSEFOC] setIntValue:(flagValues & SMOUSEFOC)]; [[stuartMatrix selectCellWithTag:SSOURCEDL] setIntValue:(flagValues & SSOURCEDL)]; [[stuartMatrix selectCellWithTag:STESTEXIT] setIntValue:(flagValues & STESTEXIT)]; [stuartMetaMatrix selectCellWithTag:[theHLM getMeta:slotNum]]; [theBVS selectBoxViewTitle:STUARTLAB]; } else { [[terminalMatrix selectCellWithTag:TTRANSLAT] setIntValue:(flagValues & TTRANSLAT)]; [[terminalMatrix selectCellWithTag:TKEYPAD] setIntValue:(flagValues & TKEYPAD)]; [[terminalMatrix selectCellWithTag:TSTRICTEM] setIntValue:(flagValues & TSTRICTEM)]; [[terminalMatrix selectCellWithTag:TAUTOWRAP] setIntValue:(flagValues & TAUTOWRAP)]; [[terminalMatrix selectCellWithTag:TSCROLLBK] setIntValue:(flagValues & TSCROLLBK)]; [[terminalMatrix selectCellWithTag:TAUTOFOCS] setIntValue:(flagValues & TAUTOFOCS)]; [[terminalMatrix selectCellWithTag:TSOURCEDL] setIntValue:(flagValues & TSOURCEDL)]; [terminalMetaMatrix selectCellWithTag:[theHLM getMeta:slotNum]]; [theBVS selectBoxViewTitle:TERMLAB]; } font = [theHLM getFontType:slotNum]; [fontMatrix selectCellWithTag:font]; if (font == COURIER) [self courierSet:self]; else [self ohlfsSet:self]; [self launchState:YES]; [configWindow reenableDisplay]; [configWindow displayIfNeeded]; return self; } /*--------------------------------------------------------------------------- Get the Terminal or Stuart flag values. -----------------------------------------------------------------------------*/ - (unsigned int)getMatrixFlags:sender { id aCell; id aMatrix; unsigned int flagValues; int i; int j; int nCols; int nRows; if (appType == TERMINAL) aMatrix = terminalMatrix; else aMatrix = stuartMatrix; [aMatrix getNumRows:&nRows numCols:&nCols]; flagValues = 0; for (j = 0; j < nCols; j++) for (i = 0; i < nRows; i++) { aCell = [aMatrix cellAt:i:j]; if ([aCell isEnabled] && [aCell intValue] == YES) flagValues |= [[aMatrix cellAt:i:j] tag]; } return flagValues; } /*--------------------------------------------------------------------------- Initialize the flags in the Terminal or Stuart matrix. -----------------------------------------------------------------------------*/ - initMatrixFlags:aMatrix { id aCell; int i; int j; int nCols; int nRows; [aMatrix getNumRows:&nRows numCols:&nCols]; for (j = 0; j < nCols; j++) for (i = 0; i < nRows; i++) { aCell = [aMatrix cellAt:i:j]; if ([aCell isEnabled]) [aCell setIntValue:NO]; } return self; } /*--------------------------------------------------------------------------- Set configuration values based on chosen application (boxView). -----------------------------------------------------------------------------*/ - boxViewDidSwitch:sender { if ( strcmp ([[sender boxView] title], STUARTLAB) == 0) [self stuart:self]; else [self terminal:self]; return self; } /*--------------------------------------------------------------------------- Set variables and enable/disable fields based on the application type. -----------------------------------------------------------------------------*/ - stuart:sender { appType = STUART; [self launchState:NO]; return self; } - terminal:sender { appType = TERMINAL; [self launchState:NO]; return self; } /*--------------------------------------------------------------------------- Set variables and enable/disable fields based on the font style. -----------------------------------------------------------------------------*/ - courierFont:sender { [self courierSet:self]; [self launchState:NO]; return self; } - courierSet:sender { fontType = COURIER; return self; } - ohlfsFont:sender { [self ohlfsSet:self]; [self launchState:NO]; return self; } - ohlfsSet:sender { fontType = OHLFS; return self; } /*--------------------------------------------------------------------------- Set variables and enable/disable fields based on the protocol. -----------------------------------------------------------------------------*/ - rlogin:sender { [self rloginSet:self]; [self launchState:NO]; return self; } - rloginSet:sender { protocolType = RLOGIN; [idForm setEnabled:YES]; return self; } - telnet:sender { [self telnetSet:self]; [self launchState:NO]; return self; } - telnetSet:sender { protocolType = TELNET; [idForm setEnabled:NO]; return self; } - tn3270:sender { [self tn3270Set:self]; [self launchState:NO]; return self; } - tn3270Set:sender { protocolType = TN3270; [idForm setEnabled:NO]; return self; } /*--------------------------------------------------------------------------- Handle launch request from the configuration window. Must login to a host. -----------------------------------------------------------------------------*/ - launch:sender { [theHLM loginToHost:[buttonForm stringValueAt:0] activate:YES]; return self; } /*--------------------------------------------------------------------------- Disable the launch button. This method is connected to some of the boxes in the configuration window via the Interface Builder. This method is not called internally by this program. -----------------------------------------------------------------------------*/ - launchDisable:sender { [self launchState:NO]; return self; } /*--------------------------------------------------------------------------- Enable or disable the launch button. This routine is called by various methods within this program. It provides a single focal point for controlling the status of the launch button. -----------------------------------------------------------------------------*/ - launchState:(BOOL) flag { [launchButton setEnabled:flag]; launchFlag =flag; return self; } /*--------------------------------------------------------------------------- The user pressed the menu revert button. -----------------------------------------------------------------------------*/ - menuRevert:sender { if ([configWindow isKeyWindow] == YES) [self initConfigWindow:self]; return self; } /*--------------------------------------------------------------------------- Slap that configuration window onto the screen. -----------------------------------------------------------------------------*/ - showConfigWindow:sender { [configWindow makeKeyAndOrderFront:sender]; return self; } /*--------------------------------------------------------------------------- Validate the fields in the configuration window. -----------------------------------------------------------------------------*/ - (int)validHostFields:sender { int length; /* Temporary variable */ NXSize screenSize; /* Screen width/height */ int xMin; /* Minimum X value allowed */ int xMax; /* Maximum X value allowed */ int yMin; /* Minimum Y value allowed */ int yMax; /* Maximum Y value allowed */ /* Button name validation */ length = strlen ([buttonForm stringValueAt:0]); if (length > MAXPOPLEN || length <= 0) { [buttonForm selectTextAt:0]; NXRunAlertPanel (NULL, "Button name length must be between 1 & %d.", NULL, NULL, NULL, MAXPOPLEN); return -1; } /* Host name validation */ length = strlen ([hostForm stringValueAt:0]); if (length > HOSTENTRYLEN || length <= 0) { [hostForm selectTextAt:0]; NXRunAlertPanel (NULL, "Hostname length must be between 1 & %d.", NULL, NULL, NULL, HOSTENTRYLEN); return -1; } if (index ([hostForm stringValueAt:0], ' ') != 0) { [hostForm selectTextAt:0]; if (NXRunAlertPanel (NULL, "There is a blank in the hostname.", "OK", "Cancel", NULL, NULL) != NX_ALERTDEFAULT) return -1; } /* User ID validation */ length = strlen ([idForm stringValueAt:0]); if (length > MAXIDLEN) { [idForm selectTextAt:0]; NXRunAlertPanel (NULL, "User ID length can not exceed %d.", NULL, NULL, NULL, MAXIDLEN); return -1; } if (index ([idForm stringValueAt:0], ' ') != 0) { [idForm selectTextAt:0]; NXRunAlertPanel (NULL, "Blanks are not allowed in user IDs.", NULL, NULL, NULL); return -1; } /* Font size validation */ length = [fontForm intValueAt:0]; if (length < MINFONTSIZE || length > MAXFONTSIZE) { [fontForm selectTextAt:0]; NXRunAlertPanel (NULL, "Font size must be between %d & %d.", NULL, NULL, NULL, MINFONTSIZE, MAXFONTSIZE); return -1; } /* Get the screen size & establish maximum/minimum values allowed. */ [NXApp getScreenSize:&screenSize]; xMin = 0; xMax = screenSize.width - (screenSize.width *.08); yMin = 100; yMax = screenSize.height; /* X validation */ length = [xCell intValue]; if (length < xMin || length > xMax) { [windowMatrix selectCell:xCell]; NXRunAlertPanel (NULL, "X position must be between %d & %d pixels.", NULL, NULL, NULL, xMin, xMax); return -1; } /* Y validation */ length = [yCell intValue]; if (length < yMin || length > yMax) { [windowMatrix selectCell:yCell]; NXRunAlertPanel (NULL, "Y position must be between %d & %d pixels.", NULL, NULL, NULL, yMin, yMax); return -1; } length = [linesCell intValue]; if (length < MINLINES || length > MAXLINES) { [windowMatrix selectCell:linesCell]; NXRunAlertPanel (NULL, "X size (lines) must be between %d & %d.", NULL, NULL, NULL, MINLINES, MAXLINES); return -1; } length = [colsCell intValue]; if (length < MINCOLS || length > MAXCOLS) { [windowMatrix selectCell:colsCell]; NXRunAlertPanel (NULL, "Y size (columns) must be between %d & %d.", NULL, NULL, NULL, MINCOLS, MAXCOLS); return -1; } return 0; } /*--------------------------------------------------------------------------- Text changed in configuration window so disable the launch button. -----------------------------------------------------------------------------*/ - text:sender isEmpty:(BOOL) flag { [self launchState:NO]; return self; } /*--------------------------------------------------------------------------- Establish the outlets. -----------------------------------------------------------------------------*/ - setAppsButton:anObject { appsButton = anObject; return self; } - setAutoStartButton:anObject { autoStartButton = anObject; return self; } - setButtonForm:anObject { buttonForm = anObject; return self; } - setColsCell:anObject { colsCell = anObject; return self; } - setFontForm:anObject { fontForm = anObject; return self; } - setHostForm:anObject { hostForm = anObject; return self; } - setIdForm:anObject { idForm = anObject; return self; } - setLaunchButton:anObject { launchButton = anObject; return self; } - setLinesCell:anObject { linesCell = anObject; return self; } - setXCell:anObject { xCell = anObject; return self; } - setYCell:anObject { yCell = anObject; return self; } - setFontMatrix:anObject { fontMatrix = anObject; return self; } - setProtocolMatrix:anObject { protocolMatrix = anObject; return self; } - setTerminalMatrix:anObject { terminalMatrix = anObject; return self; } - setTerminalMetaMatrix:anObject { terminalMetaMatrix = anObject; return self; } - setStuartMatrix:anObject { stuartMatrix = anObject; return self; } - setStuartMetaMatrix:anObject { stuartMetaMatrix = anObject; return self; } - setWindowMatrix:anObject { windowMatrix = anObject; return self; } - setConfigWindow:anObject { configWindow = anObject; return self; } - setBoxViewWindow:anObject { boxViewWindow = anObject; return self; } - setBoxView:anObject { boxView = anObject; return self; } /*--------------------------------------------------------------------------- Set up the configuration pulldown list and its associated button. -----------------------------------------------------------------------------*/ - setConfigureButton:anObject { configureButton = anObject; return self; } - initConfigButton:anObject { [configurePUL addItem:"Remote Systems"]; [theHLM loadPopUpList:configurePUL]; [configureButton setTarget:configurePUL]; [configureButton setAction:@selector (popUp:)]; NXAttachPopUpList (configureButton, configurePUL); [configurePUL changeButtonTitle:NO]; [configureButton setIcon:"pulldown" position:NX_ICONRIGHT]; [configureButton setAltIcon:"pulldownH"]; [configurePUL setTarget:self]; [configurePUL setAction:@selector (display:)]; return self; } /*--------------------------------------------------------------------------- Messages from Remotes.m result in the execution of these sets. -----------------------------------------------------------------------------*/ - setHostsButton:anObject { theHostsButton = anObject; return self; } - setHostsPUL:anObject { theHostsPUL = anObject; return self; } - setHLM:anObject { theHLM = anObject; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.