This is FunctionPane.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: FunctionPane.m,v 1.5 1993/05/30 10:01:53 davis Exp $";
#import <appkit/Application.h>
#import <appkit/Cell.h>
#import <appkit/View.h>
#import "DataOptionsPanel.h"
#import "EditMatrix.h"
#import "FunctionObject.h"
#import "FunctionPane.h"
#import "Status.h"
#import "SubObjectCategory.h"
#define STYLE 0
#define STYLE_LINE 1
#define STYLE_POINTS 2
@interface FunctionPane (Private)
- (int)_findMultStyleType:(int)type ofMatrix:(Matrix *)aMatrix;
- _setStyleType:(unsigned int)type to:(int)style;
@end
@implementation FunctionPane
- init
{
[super init];
[NXApp loadNibSection: "FunctionPane.nib"
owner: self
withNames: NO
fromZone: [self zone]];
return self;
}
- (BOOL)updateStatus:aStatus doc:aDoc
{
/*
* aDoc should be the controlling object that we can query for
* the current function, function matrix, etc.
*/
FunctionObject *f = [aDoc function];
EditMatrix *fm = [aDoc functionsMatrix];
int style;
BOOL styleRight;
BOOL isMult = [fm multipleCellsSelected];
[super updateStatus:aStatus doc:aDoc];
if (isMult) { /* Multiple functions selected */
[styleMatrix selectCellWithTag:
[self _findMultStyleType:STYLE ofMatrix:fm]];
[pointsStyleMatrix selectCellWithTag:
[self _findMultStyleType:STYLE_POINTS ofMatrix:fm]];
[lineStyleMatrix selectCellWithTag:
[self _findMultStyleType:STYLE_LINE ofMatrix:fm]];
} else if (f) { /* Single function selected */
[styleMatrix selectCellWithTag: [f style]];
[pointsStyleMatrix selectCellWithTag: [f pointsStyle]];
[lineStyleMatrix selectCellWithTag: [f lineStyle]];
} else if (!f) { /* No selection */
[styleMatrix selectCellWithTag: FUNCTION_NOSTYLE];
[pointsStyleMatrix selectCellWithTag: POINTS_NOSTYLE];
[lineStyleMatrix selectCellWithTag: LINE_NOSTYLE];
}
[styleMatrix setEnabled:isMult || f];
if (isMult || f) {
BOOL isThreeD = [status isThreeD];
[[styleMatrix findCellWithTag:FUNCTION_BOXES] setEnabled:!isThreeD];
[[styleMatrix findCellWithTag:FUNCTION_BOXERRORBARS] setEnabled:
!isThreeD];
[[styleMatrix findCellWithTag:FUNCTION_STEPS] setEnabled:!isThreeD];
}
style = [styleMatrix selectedTag];
styleRight = (isMult || f) &&
((style == FUNCTION_POINTS) || (style == FUNCTION_LINESPOINTS));
[pointsStyleMatrix setEnabled:styleRight];
[pointsStyleLabel setEnabled:styleRight];
styleRight = (isMult || f) &&
((style == FUNCTION_LINES) || (style == FUNCTION_LINESPOINTS));
[lineStyleMatrix setEnabled:styleRight];
[lineStyleLabel setEnabled:styleRight];
/* The boxes cell should also be disabled */
[[[[styleMatrix superview] superview] cell] setEnabled:isMult || f];
return YES;
}
- setFunctionStyle:sender
{
[self _setStyleType:STYLE to:[sender selectedTag]];
if ([self forceUpdateStatus:status doc:doc])
[view display];
return self;
}
- setFunctionPointsStyle:sender
{
return [self _setStyleType:STYLE_POINTS to:[sender selectedTag]];
}
- setFunctionLineStyle:sender
{
return [self _setStyleType:STYLE_LINE to:[sender selectedTag]];
}
// Shuts up the compiler about unused RCSId
- (const char *) rcsid
{
return RCSId;
}
@end
@implementation FunctionPane (Private)
- (int)_findMultStyleType:(int)type ofMatrix:(Matrix *)aMatrix;
{
Cell *cell;
int i, style = FUNCTION_NOSTYLE;
BOOL gotStyle = NO;
int defaultStyle;
switch (type) {
case STYLE_LINE: defaultStyle = POINTS_NOSTYLE; break;
case STYLE_POINTS: defaultStyle = LINE_NOSTYLE; break;
default: defaultStyle = FUNCTION_NOSTYLE; break;
}
for (i = [aMatrix cellCount] - 1; i >= 0; i--) {
cell = [aMatrix cellAt:i:0];
if ([cell isHighlighted]) {
int cellstyle;
switch (type) {
case STYLE_LINE:
cellstyle = [[cell subObject] lineStyle]; break;
case STYLE_POINTS:
cellstyle = [[cell subObject] pointsStyle]; break;
default:
cellstyle = [[cell subObject] style]; break;
}
if (gotStyle) {
if (cellstyle != style)
return defaultStyle;
} else {
style = cellstyle;
gotStyle = YES;
}
}
}
return style;
}
- _setStyleType:(unsigned int)type to:(int)style
{
BOOL didChange = NO;
FunctionObject *f = [doc function];
if (f) {
switch (type) {
case STYLE: [f setStyle: style]; break;
case STYLE_LINE: [f setLineStyle: style]; break;
case STYLE_POINTS: [f setPointsStyle: style]; break;
}
didChange = YES;
} else {
Cell *cell;
EditMatrix *fm = [doc functionsMatrix];
int i;
if ([fm multipleCellsSelected]) {
for (i = [fm cellCount] - 1 ; i >= 0 ; i--) {
cell = [fm cellAt:i:0];
if ([cell isHighlighted]) {
switch (type) {
case STYLE:
[[cell subObject] setStyle: style]; break;
case STYLE_LINE:
[[cell subObject] setLineStyle: style]; break;
case STYLE_POINTS:
[[cell subObject] setPointsStyle: style]; break;
}
didChange = YES;
}
}
}
}
if (didChange) {
[status reportSettingsChange:self];
/* Setting style may affect other controls */
[self forceUpdateStatus:status doc:doc];
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.