This is DataOptionsPanel.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: DataOptionsPanel.m,v 1.10 1993/05/24 03:59:41 davis Exp $";
#import <appkit/Application.h>
#import <appkit/Cell.h>
#import <appkit/Panel.h>
#import <appkit/TextField.h>
#import <objc/NXStringTable.h>
#import "DataOptionsPanel.h"
#import "DataFilePane.h"
#import "DataFileThreeDPane.h"
#import "DataPane.h"
#import "EditMatrix.h"
#import "FunctionPane.h"
#import "FunctionObject.h"
#import "GnuplotPlot.h"
#import "NoDataPane.h"
#import "Pane.h"
#import "Status.h"
#import "SubObjectCategory.h"
#define FUNCTION_PANE 0
#define DATAFILE_PANE 1
#define DATAFILE_THREED_PANE 2
#define NO_PANE 3
@interface DataOptionsPanel (Private)
- _setupPane:(Pane *)aPane;
- _selectPane:(int)aPane;
- _swapPane:(Pane *)new;
- _updatePanel; /** Overridden from OptionsPanel (Private) **/
@end
@implementation DataOptionsPanel
- init
{
NXSize interCellSpacing = {1.0, 1.0};
[super init];
[NXApp loadNibSection: "DataOptionsPanel.nib"
owner: self
withNames: NO
fromZone: [self zone]];
[panel setFrameUsingName:"DataOptionsPanel"];
[panel setFrameAutosaveName:"DataOptionsPanel"];
[panel setBecomeKeyOnlyIfNeeded:YES];
isOwnerCurrent = YES;
isMult = NO;
return self;
}
- free
{
[stringSet free];
[functionPane free];
[dataFilePane free];
[dataFileThreeDPane free];
[noPane free];
return [super free];
}
- setOwner:anObject
{
if ([anObject respondsTo:@selector(functionsMatrix)]) {
owner = anObject;
functionsMatrix = [owner functionsMatrix];
}
return self;
}
- forceUpdate
{
id mainWindow;
if (isOwnerCurrent && (mainWindow = [NXApp mainWindow])) {
status = [[mainWindow delegate] status];
function = [[functionsMatrix selectedCell] subObject];
isMult = !function && [functionsMatrix multipleCellsSelected];
} else {
status = nil;
function = nil;
isMult = NO;
}
[self _updatePanel];
return self;
}
- windowDidUpdate:sender
{
id mainWindow;
id newStatus, newFunction;
BOOL newMult;
if (isOwnerCurrent && (mainWindow = [NXApp mainWindow])) {
newStatus = [[mainWindow delegate] status];
newFunction = [[functionsMatrix selectedCell] subObject];
newMult = [functionsMatrix multipleCellsSelected];
} else {
newStatus = nil;
newFunction = nil;
newMult = NO;
}
if ((newStatus != status) || (newFunction != function)
|| (newMult != isMult)) {
status = newStatus;
function = newFunction;
isMult = newMult;
[self _updatePanel];
}
return self;
}
- ownerDidSwapIn:sender
{
isOwnerCurrent = YES;
[self forceUpdate];
return self;
}
- ownerDidSwapOut:sender
{
isOwnerCurrent = NO;
[self forceUpdate];
return self;
}
- function
{
return function;
}
- functionsMatrix
{
return functionsMatrix;
}
- setFunctionTitle:sender
{
int i;
Cell *cell;
id lastHighlightedObject = nil;
BOOL didChange = NO;
/* Set title of all selected functions. */
for (i = [functionsMatrix cellCount] - 1 ; i >= 0 ; i--) {
cell = [functionsMatrix cellAt:i:0];
if ([cell isHighlighted]) {
lastHighlightedObject = [cell subObject];
[lastHighlightedObject setTitle: [titleField stringValue]];
didChange = YES;
}
}
/* The subObjects may have fixed the title */
[titleField setStringValue:[lastHighlightedObject title]];
/*
* We changed the functions directly instead of going through
* status, so we must inform status of the change.
*/
if (didChange)
[status reportSettingsChange:self];
return self;
}
// Shuts up the compiler about unused RCSId
- (const char *) rcsid
{
return RCSId;
}
@end
@implementation DataOptionsPanel (Private)
- _setupPane:(Pane *)aPane
{
if (aPane) {
View *panesView = [aPane view];
[[panel contentView] addSubview: panesView];
[[panesView allocateGState] lockFocus];
[panesView unlockFocus];
[panesView moveTo:0:0];
}
return self;
}
- _selectPane:(int)aPane
{
switch (aPane) {
case FUNCTION_PANE:
if (!functionPane) {
functionPane = [[FunctionPane allocFromZone:[self zone]] init];
[self _setupPane:functionPane];
}
[self _swapPane:functionPane];
break;
case DATAFILE_PANE:
if (!dataFilePane) {
dataFilePane = [[DataFilePane allocFromZone:[self zone]] init];
[self _setupPane:dataFilePane];
}
[self _swapPane:dataFilePane];
break;
case DATAFILE_THREED_PANE:
if (!dataFileThreeDPane) {
dataFileThreeDPane =
[[DataFileThreeDPane allocFromZone:[self zone]] init];
[self _setupPane:dataFileThreeDPane];
}
[self _swapPane:dataFileThreeDPane];
break;
default:
if (!noPane) {
noPane = [[NoDataPane allocFromZone:[self zone]] init];
[self _setupPane:noPane];
}
[self _swapPane:noPane];
break;
}
return self;
}
- _swapPane:(Pane *)new
{
/*
* If the new pane is not already visible, move it into the panel.
*/
if (new != currentPane) {
[[panel contentView] replaceSubview:[currentPane view]
with:[new view]];
[currentPane didSwapOut:self];
/*
* Notice we give ourselves as the "doc" when updating one of
* our Panes. It may then query us for current function.
*/
[[new didSwapIn:self] updateStatus:status doc:self];
// [panel display];
[panel setTitle:[new title]];
[panel setMiniwindowIcon:[new icon]];
currentPane = new;
}
return self;
}
- _updatePanel
{
BOOL enabled = (isOwnerCurrent && status);// is status necessary?
[panel disableDisplay];
if (enabled && isMult) {
[stringField setStringValue:[stringSet valueForStringKey:"multiple"]];
[titleField setStringValue:""];
[self _selectPane:FUNCTION_PANE];
} else if (enabled && function) {
[stringField setStringValue:[function stringValue]];
[titleField setStringValue:[function title]];
if ([function isDataFile]) {
if ([status isThreeD])
[self _selectPane:DATAFILE_THREED_PANE];
else
[self _selectPane:DATAFILE_PANE];
} else
[self _selectPane:FUNCTION_PANE];
} else {
[stringField setStringValue:[stringSet valueForStringKey:"none"]];
[titleField setStringValue:""];
[self _selectPane:NO_PANE];
}
[titleField setEnabled:enabled && (isMult || function)];
[currentPane updateStatus:status doc:self];
[panel reenableDisplay];
[panel display];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.