This is UserTicsPane.m in view mode; [Download] [Up]
/*
* Copyright (C) 1993 Robert Davis
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of Version 2, or any later version, of
* the GNU General Public License as published by the Free Software
* Foundation.
*/
static char RCSId[]="$Id: UserTicsPane.m,v 1.4 1993/05/04 16:23:15 davis Exp $";
#import <appkit/Application.h>
#import <appkit/Form.h>
#import <appkit/FormCell.h>
#import <appkit/publicWraps.h> /* NXBeep() */
#import <appkit/View.h>
#import "CellScrollView.h"
#import "DoubleValueSortedList.h"
#import "EditMatrix.h"
#import "Status.h"
#import "StatusTics.h"
#import "TicCell.h"
#import "TicObject.h"
#import "TicOptionsPanel.h"
#import "UserTicsPane.h"
@interface UserTicsPane (Private)
- _updateControlsForSelectedTic;
@end
@implementation UserTicsPane
- init
{
[super init];
[NXApp loadNibSection: "UserTicsPane.nib"
owner: self
withNames: NO
fromZone: [self zone]];
/* Initialize custom tics CellScrollView */
[userScrollView initMatrixCellClass:[TicCell class] cols:1];
userMatrix = [userScrollView cellMatrix];
[[userMatrix setAction:@selector(selectTic:)] setTarget:self];
return self;
}
- (BOOL)updateStatus:aStatus doc:aDoc
{
BOOL isEnabled;
if ([super updateStatus:aStatus doc:aDoc]) {
int i;
int coord = [doc coord];
for (i = 0; i < 3; i++)
ticsList[i] = [status ticDefsCoord:i];
[userScrollView loadCol:0 from:ticsList[coord]];
} else
[userScrollView loadCol:0 from:nil];
[self selectTic:self];
[addTicButton setEnabled:isEnabled = (status? YES:NO)];
[userTitleForm setEnabled:isEnabled];
[userValueForm setEnabled:isEnabled];
[userMatrix setEnabled:isEnabled];
[deleteTicButton setEnabled:isEnabled = (status &&
[userMatrix selectedCell])];
[modifyTicButton setEnabled:isEnabled];
return YES;
}
- addTic:sender
{
int coord = [doc coord];
TicObject *ticObject;
int location;
BOOL changed = YES;
ticObject = [[TicObject allocFromZone:[status zone]]
initFromString:[userTitleForm stringValueAt:0]
doubleValue:[userValueForm doubleValueAt:0]];
location = [ticsList[coord] addObjectIfDoubleAbsent:ticObject];
if (location == NX_NOT_IN_LIST) {
[ticObject free];
location = [userMatrix selectedRow];
changed = NO;
NXBeep();
}
[userScrollView loadCol:0 from:ticsList[coord]];
[userMatrix scrollCellToVisible:location :0];
[userMatrix selectCellAt:location :0];
[self selectTic:self];
if (changed)
[status reportSettingsChange:self];
return self;
}
- deleteTics:sender
{
int coord = [doc coord];
int i;
int maxrow = [userMatrix cellCount] - 1;
int row = maxrow;
BOOL gotRow = NO;
for (i = maxrow; i >= 0; i--) {
TicCell *cell = [userMatrix cellAt:i:0];
if ([cell isHighlighted]) {
/*
* If a cell is highlighted, remove (and free) the
* corresponding item from the list of TicObjects.
*/
[[ticsList[coord] removeObject:[cell subObject]] free];
if (!gotRow) {
row = (i == maxrow)? i - 1 :i;
gotRow = YES;
} else
row--;
}
}
[userScrollView loadCol:0 from:ticsList[coord]];
[userMatrix selectCellAt: row:0];
[userMatrix scrollCellToVisible: row:0];
[self selectTic:self];
[status reportSettingsChange:self];
return self;
}
- modifyTic:sender
{
int coord = [doc coord];
TicObject *tic = [[userMatrix selectedCell] subObject];
int location;
[tic setStringValue:[userTitleForm stringValueAt:0]];
[tic setDoubleValue:[userValueForm doubleValueAt:0]];
/*
* Remove the tic from the list and reinsert
* it, to maintain the sort order of the list.
*/
location = [ticsList[coord] addObject:[ticsList[coord] removeObject:tic]];
[userScrollView loadCol:0 from:ticsList[coord]];
[userMatrix scrollCellToVisible: location:0];
[userMatrix selectCellAt: location:0];
[self selectTic:self];
[status reportSettingsChange:self];
return self;
}
/*
* Make other controls in the window reflect the currently selected
* tic. Assumes that the current tic type is TIC_USER.
*/
- selectTic:sender
{
if (![userMatrix selectedCell]
&& ![userMatrix multipleCellsSelected]) {
[userMatrix selectCellAt:0:0];
}
[self _updateControlsForSelectedTic];
return self;
}
// Shuts up the compiler about unused RCSId
- (const char *) rcsid
{
return RCSId;
}
@end
@implementation UserTicsPane (Private)
- _updateControlsForSelectedTic
{
TicCell *singleCell = [userMatrix selectedCell];
BOOL enabled = (singleCell || [userMatrix multipleCellsSelected]);
if (singleCell) {
TicObject *tic = [singleCell subObject];
[userTitleForm setStringValue:[tic stringValue] at:0];
[userValueForm setDoubleValue:[tic doubleValue] at:0];
} else {
[userTitleForm setStringValue:"" at:0];
[userValueForm setStringValue:"" at:0];
}
[deleteTicButton setEnabled:enabled];
[modifyTicButton setEnabled:singleCell? YES:NO];
[userValueForm selectTextAt:0];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.