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.