This is InspectCut.m in view mode; [Download] [Up]
/* InspectCut.m by Mike Gravina November 1991
* Controls the cuts on plots
*
* Copyright (C) 1991 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*/
#import "HGraphicView.h"
#import "InspectCut.h"
const char InspectCut_h_rcsid[] = INSPECTCUT_H_ID;
const char InspectCut_m_rcsid[] = "$Id: InspectCut.m,v 2.41.2.3 1994/02/08 20:29:21 rensing Exp $";
#import "FineSlider.h"
#import "HDrawApp.h"
#import "InspectTuple.h"
#import "NewInspector.h"
#define SCALE_FACTOR 5.0
#define CUT_HI 0
#define CUT_LO 1
#define SHOW_ALL 0
#define SHOW_PLOT 1
@interface InspectCut(Private)
- (const char *) calcCutText:(Plot *)cut;
/*
* Formats the string to be placed in cut browser cell.
*/
- checkValues;
/*
* checks the range of the cut and runs alert panel if low > hig
*/
- internalUpdateView;
/*
* Forced update even if selected plot hasn't changed. This
* method differs from updateView in that it is used internally
* when cuts are added or removed to a plot.
*/
- reDrawPlot: (SEL) operation inList:aList;
/*
* Sends message operation to each Plot object in List aList and
* redraws them.
*/
- removeCut:plot;
/*
* Removes the cut plot from any plot that depends on it. Method
* used internally.
*/
- setSliders:(BOOL)flag;
/*
* Sets initial range and valudes of sliders and forms if flag is YES,
* otherwise disables them
*/
- setShowAllState:(BOOL) state;
/*
* Sets the state of the cut browser to show all cuts if state is YES,
* or show cuts on selected plot if not.
*/
- updateForm;
/*
* Updates the contents of the cut high and low form entries.
*/
- setHTuple: atuple;
/*
* Sets the tuple with already prepared display held by this object
*/
@end
@implementation InspectCut
- initInspFor:aDraw
{
NXBundle *bundle;
char buffer[MAXPATHLEN+1];
[super initInspFor:aDraw];
bundle = [NXBundle bundleForClass:[self class]];
if ( [bundle getPath:buffer forResource:"InspectCut" ofType:"nib"] ) {
[NXApp loadNibFile:buffer owner:self
withNames:NO fromZone:[self zone]];
}
[self setSliders:NO];
[self updateForm];
[loSlider setScaleFactor:SCALE_FACTOR];
[hiSlider setScaleFactor:SCALE_FACTOR];
hTuple = NULL;
tupleCutList = [[List alloc] initCount:0];
[theInspector addView:[contentBox contentView]
withName:"Cut Options" withSupervisor:self];
return self;
}
- newValueInForm:sender
{
cutLow = [cutValueForm floatValueAt:CUT_LO];
cutHigh = [cutValueForm floatValueAt:CUT_HI];
[self checkValues];
[cutPlot setCutLow:cutLow High:cutHigh];
[self setSliders:YES];
[self reDrawPlot:@selector(changeCutPlot:) inList:[cutPlot dependList]];
return self;
}
- newValueInSlider2:sender
{
float newValue, diff;
newValue = [loSlider floatValue];
if (newValue == cutLow)
return self;
diff = newValue - cutLow;
cutLow = newValue;
[cutValueForm setFloatValue:cutLow at:CUT_LO];
if ([zpSwitch state] == YES) {
cutHigh += diff;
[cutValueForm setFloatValue:cutHigh at:CUT_HI];
[hiSlider setFloatValue:cutHigh];
}
[cutPlot setCutLow:cutLow High:cutHigh];
[self reDrawPlot:@selector(changeCutPlot:) inList:[cutPlot dependList]];
return self;
}
- newValueInSlider1:sender
{
float newValue, diff;
newValue = [hiSlider floatValue];
if (newValue == cutHigh)
return self;
diff = newValue - cutHigh;
cutHigh = newValue;
[cutValueForm setFloatValue:cutHigh at:CUT_HI];
if ([zpSwitch state] == YES) {
cutLow -= diff;
[cutValueForm setFloatValue:cutLow at:CUT_LO];
[loSlider setFloatValue:cutLow];
}
[cutPlot setCutLow:cutLow High:cutHigh];
[self reDrawPlot:@selector(changeCutPlot:) inList:[cutPlot dependList]];
return self;
}
- newCut:sender
{
int col;
if (!hTuple) {
return self;
}
col = [tpBrowserCells selectedRow];
cutPlot = [[Plot alloc] initCutWithTuple: hTuple Column:col];
[graphicView addPlot:cutPlot andSelect:NO];
[graphicView graphicsPerformNOP:cutPlot];
[self setSliders:YES];
if ( selectedPlot ) {
[buttonMatrix setEnabled:YES];
[graphicView graphicsPerform:@selector(addCutPlot:)
with:cutPlot andDraw:YES];
[graphicView graphicsPerformNOP:cutPlot];
} else {
[self setShowAllState:YES];
}
[cutBrowser setAutodisplay:NO];
[self internalUpdateView];
[cutBrowser setAutodisplay:YES];
[cutBrowser display];
NXPing();
[[[graphicView window] flushWindow] makeKeyWindow];
return self;
}
/*
- deleteCut:plot
{
if ( selectedPlot == plot ) {
selectedPlot = nil;
}
[self setSliders:NO];
[self internalUpdateView];
return self;
}
- addCut:plot
{
[docCutList addObjectIfAbsent:plot];
return self;
}
*/
- add:sender
{
Cell *aCell;
Matrix *matrix;
List *cellList;
Plot *cut;
int i, count;
matrix = [cutBrowser matrixInColumn:0];
cellList = [matrix cellList];
count = [cellList count];
for ( i = 0; i < count; i++ ) {
aCell = [cellList objectAt:i];
if ( [aCell isHighlighted] ) {
cut = [cutList objectAt:i];
[graphicView graphicsPerform:@selector(addCutPlot:)
with:cut andDraw:YES];
[graphicView graphicsPerformNOP:cut];
}
}
[[[graphicView window] flushWindow] makeKeyWindow];
return self;
}
- invert:sender
{
NXBrowserCell *aCell;
Matrix *matrix;
List *cellList;
Plot *cut;
const char *cutText;
int i, count;
matrix = [cutBrowser matrixInColumn:0];
cellList = [matrix cellList];
count = [cellList count];
for ( i = 0; i < count; i++ ) {
aCell = [cellList objectAt:i];
if ( [aCell isHighlighted] ) {
cut = [cutList objectAt:i];
[graphicView graphicsPerform:@selector(invertCutPlot:)
with:cut andDraw:YES];
cutText = [self calcCutText:cut];
[aCell setStringValue:cutText];
}
}
lastPlot = nil;
[cutBrowser display];
[[[graphicView window] flushWindow] makeKeyWindow];
return self;
}
- remove:sender
{
NXBrowserCell *aCell;
Matrix *matrix;
List *cellList;
Plot *cut;
int i, count;
matrix = [cutBrowser matrixInColumn:0];
cellList = [matrix cellList];
count = [cellList count];
for ( i = 0; i < count; i++ ) {
aCell = [cellList objectAt:i];
if ( [aCell isHighlighted] ) {
cut = [cutList objectAt:i];
[graphicView graphicsPerform:@selector(removeCutPlot:)
with:cut andDraw:YES];
}
}
[[[graphicView window] flushWindow] makeKeyWindow];
[self internalUpdateView];
return self;
}
- replace:sender
{
List *applyList;
NXBrowserCell *aCell;
const char *cutText;
int i;
if ( !cutPlot ) {
return self;
}
applyList = [[cutPlot dependList] copy];
[self removeCut:cutPlot];
[cutPlot initCutParmsForColumn: [tpBrowserCells selectedRow]];
[self reDrawPlot:@selector(addCutPlot:) inList: applyList];
[applyList free];
[graphicView graphicsPerformNOP:cutPlot];
[[[graphicView window] flushWindow] makeKeyWindow];
i = [cutList indexOf:cutPlot];
if ( i != NX_NOT_IN_LIST ) {
aCell = [[cutBrowser matrixInColumn:0] cellAt:i :0];
cutText = [self calcCutText:cutPlot];
[aCell setStringValue:cutText];
[cutBrowser display];
}
[self setSliders:YES];
[self updateForm];
return self;
}
- showCutsRadio:sender
{
unsigned int showtype;
showtype = [showCutsRadio selectedCol];
switch (showtype) {
case SHOW_ALL:
[cutBrowser setTitle:"All Available Cuts on Selected Tuple"
ofColumn:0];
break;
case SHOW_PLOT:
[cutBrowser setTitle:"Cuts on Selected Plot" ofColumn:0];
break;
default:
;
}
[self internalUpdateView];
return self;
}
- mouseMoved:(const NXPoint *)offset in:sender withKey:(int)flag
{
double hiMaxValue, hiMinValue;
double loMaxValue, loMinValue;
float tempValue;
float diff;
int index;
unsigned int state;
state = [showCutsRadio selectedCol];
if ( state == SHOW_PLOT ) {
[self setShowAllState:YES];
[self internalUpdateView];
}
/** select the current cut */
index = [cutList indexOf:sender];
[[cutBrowser matrixInColumn:0] selectCellAt:index :0];
[self selectCut:self];
/* update high slider */
hiMaxValue = [hiSlider mmaxValue];
hiMinValue = [hiSlider mminValue];
diff = hiMaxValue - hiMinValue;
tempValue = [hiSlider floatValue];
tempValue += offset->x * diff/100;
if (tempValue > hiMaxValue)
tempValue = hiMaxValue;
if (tempValue < hiMinValue)
tempValue = hiMinValue;
[hiSlider setFloatValue:tempValue];
loMaxValue = [loSlider mmaxValue];
loMinValue = [loSlider mminValue];
diff = loMaxValue - loMinValue;
tempValue = [loSlider floatValue];
/* if command key was pressed, move the cut */
if (flag & NX_COMMANDMASK)
tempValue += offset->x * diff/100;
else /* increase or decrease the cut area */
tempValue -= offset->x * diff/100;
if (tempValue > hiMaxValue)
tempValue = hiMaxValue;
if (tempValue < hiMinValue)
tempValue = hiMinValue;
[loSlider setFloatValue:tempValue];
[self newValueInSlider1:hiSlider];
[self newValueInSlider2:loSlider];
return self;
}
/* Methods that update the view */
- updateView
{
if ( lastPlot == firstPlot && !comingForward ) {
return self;
}
[self internalUpdateView];
lastPlot = firstPlot;
return self;
}
- updateEmptySelection
{
InspectTuple *inspector;
lastPlot = nil;
inspector = [hDraw inspectTuple];
[self setHTuple:[inspector currentHTuple]];
[self internalUpdateView];
return self;
}
- selectCut:sender
{
List *selCellList = [[List alloc] init];
int i, j;
cutBrowserCells = [cutBrowser matrixInColumn:0];
[cutBrowserCells getSelectedCells:selCellList];
if ( !cutBrowserCells ||
( [selCellList count] > 1 ) ) {
cutPlot = nil;
[self setSliders:NO];
[self updateForm];
return self;
}
[cutBrowserCells getRow:&i andCol:&j ofCell:[selCellList objectAt:0]];
[cutBrowserCells scrollCellToVisible:i :0];
cutPlot = [cutList objectAt:i];
[cutPlot getCutLow:&cutLow High:&cutHigh];
[self setSliders:YES];
[self updateForm];
[selCellList free];
return self;
}
/* Delegate Methods for NXBrowsers */
- (int) browser: sender fillMatrix: matrix inColumn: (int) column
{
Plot *cut;
NXBrowserCell *aCell;
int i, count = 0;
const char *cutText;
ntuple ant;
if (sender == tpBrowser) {
[matrix setEmptySelectionEnabled:NO];
if ( !hTuple ) {
return count;
}
ant = [hTuple ntuple];
count = h_getNtDim(ant);
for (i = 0; i < count; i++) {
[matrix insertRowAt:i];
aCell = [matrix cellAt:i :0];
[aCell setStringValue:h_getNtLabel(ant, i)];
[aCell setLeaf:YES];
[aCell setLoaded:YES];
}
} else if (sender == cutBrowser) {
/*
* load up a cell for each cut
*/
count = [cutList count];
for (i = 0; i < count; i++) {
cut = [cutList objectAt:i];
[matrix insertRowAt:i];
aCell = [matrix cellAt:i :0];
cutText = [self calcCutText:cut];
[aCell setStringValue:cutText];
[aCell setLeaf:YES];
[aCell setLoaded:YES];
}
}
return count;
}
@end
/* Private Methods */
@implementation InspectCut(Private)
- (const char *) calcCutText:(Plot *)cut
{
#define CUT_SYMBOL_LEN 13
#define CUT_TEXT_LEN 255
static char cutText[CUT_TEXT_LEN+1];
int index;
index = [cut getCutColumn];
strncpy(cutText, h_getNtLabel([cut ntuple], index),
(CUT_TEXT_LEN - CUT_SYMBOL_LEN) );
if ( [selectedPlot isInvertedCut:cut] ) {
strcat( cutText, " ---| |---" );
} else {
strcat( cutText, " |---| " );
}
return cutText;
}
- checkValues
{
List *dependList;
float delta;
ntuple ant = [hTuple ntuple];
if ( cutLow > cutHigh ) {
int index = [cutPlot getCutColumn];
delta = ( h_getNtHigh(ant)[index] -
h_getNtLow(ant)[index] ) /100.;
cutHigh = cutLow + delta;
cutLow = cutLow - delta;
dependList = [cutPlot dependList];
[cutPlot setCutLow:cutLow High:cutHigh];
[self setSliders:YES];
[self reDrawPlot:@selector(changeCutPlot:) inList :dependList];
NXRunAlertPanel( "Warning",
"The low edge of the cut has become greater then the high edge.",
NULL, NULL, NULL );
}
return self;
}
- internalUpdateView
{
List *oldCutList;
List *docCutList;
Plot *cut;
unsigned int state;
int i, count;
int oldCount;
if ( selectedPlot ) {
[self setHTuple:[selectedPlot hTuple]];
}
state = [showCutsRadio selectedCol];
oldCutList = cutList;
if (cutList == NULL)
oldCount = 0;
else
oldCount = [cutList count];
if ( state == SHOW_ALL ) {
if ( selectedPlot ) {
docCutList = [graphicView cutList];
[tupleCutList empty];
count = [docCutList count];
for ( i = 0; i < count; i++ ) {
cut = [docCutList objectAt:i];
if ( hTuple == [cut hTuple] ) {
[tupleCutList addObject:cut];
}
}
cutList = tupleCutList;
/* oldCutList = nil; */
} else {
cutList = nil;
}
} else {
if ( selectedPlot ) {
cutList = [selectedPlot cutList];
} else {
cutList = nil;
}
}
if ( cutList != oldCutList
|| (cutList != NULL && oldCount != [cutList count]) )
{
[cutBrowser reloadColumn:0];
cutBrowserCells = [cutBrowser matrixInColumn:0];
if ( cutList ) {
[buttonMatrix setEnabled:YES];
i = [cutList indexOf:cutPlot];
if (i < 0) i = 0;
[cutBrowserCells selectCellAt:i :0];
} else {
[buttonMatrix setEnabled:NO];
}
}
if ( state == SHOW_ALL ) {
if ( [selectedPlot isCutPlot] ) {
i = [cutList indexOf:selectedPlot];
[cutBrowserCells selectCellAt:i :0];
}
}
[self selectCut:self];
[cutBrowser setNeedsDisplay:YES];
return self;
}
- reDrawPlot: (SEL) operation inList:aList
{
[graphicView graphicsPerform:operation /* redraw selected list */
with:cutPlot
andDraw:YES
inList:aList];
[graphicView graphicsPerformNOP:cutPlot];
/*
* flush window buffer to screen
*/
[[[graphicView window] flushWindow] makeKeyWindow];
return self;
}
- removeCut:plot
{
List *drawList;
drawList = [[cutPlot dependList] copy];
[self reDrawPlot:@selector(removeCutPlot:) inList:drawList];
[drawList free];
return self;
}
- setSliders:(BOOL)flag
{
float xlp, xhp;
double xl, xh;
if ( !flag ) {
[hiSlider setEnabled:NO];
[loSlider setEnabled:NO];
return self;
}
[cutPlot getRangeForAxis:XAXIS low:&xlp high:&xhp];
xl = (cutLow < xlp) ? cutLow : xlp ;
xh = (cutHigh > xhp) ? cutHigh : xhp;
[hiSlider setMinValue: xl];
[hiSlider setMaxValue: xh];
[loSlider setMinValue: xl];
[loSlider setMaxValue: xh];
[loSlider setFloatValue:cutLow];
[loSlider setEnabled:YES];
[hiSlider setFloatValue:cutHigh];
[hiSlider setEnabled:YES];
[zpSwitch setEnabled:YES];
return self;
}
- setShowAllState:(BOOL) state
{
unsigned int curState;
curState = [showCutsRadio selectedCol];
if ( state && (curState == SHOW_PLOT) ) {
[showCutsRadio selectCellAt:0 :SHOW_ALL];
[self showCutsRadio:self];
} else if ( !state && (curState == SHOW_ALL) ) {
[showCutsRadio selectCellAt:0 :SHOW_PLOT];
[self showCutsRadio:self];
}
return self;
}
- updateForm
{
if ( !cutPlot ) {
[cutValueForm setStringValue:"" at:CUT_LO];
[cutValueForm setStringValue:"" at:CUT_HI];
[cutValueForm setEnabled:NO];
return self;
}
[cutPlot getCutLow:&cutLow High:&cutHigh];
[self checkValues];
[cutValueForm setFloatValue:cutLow at:CUT_LO];
[cutValueForm setFloatValue:cutHigh at:CUT_HI];
[cutValueForm setEnabled:YES];
return self;
}
- setHTuple: atuple
{
if (hTuple == atuple && !comingForward )
return self;
hTuple = atuple;
[tpBrowser reloadColumn:0];
tpBrowserCells = [tpBrowser matrixInColumn:0];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.