This is AxesPane.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: AxesPane.m,v 1.10 1993/05/18 03:54:40 davis Exp $"; #import <appkit/Application.h> #import <appkit/Button.h> #import <appkit/Form.h> #import <appkit/Matrix.h> #import <appkit/Panel.h> /* NXRunAlertPanel() */ #import <appkit/PopUpList.h> #import <appkit/Text.h> /* This Pane is a text delegate */ #import <appkit/TextFieldCell.h> #import <appkit/View.h> #import <objc/NXStringTable.h> #import "AxesPane.h" #import "GnuplotPlot.h" #import "Status.h" #import "StatusTics.h" #import "TicCell.h" #import "TicObject.h" #import "TicOptionsPanel.h" @interface AxesPane (Private) - _updateLabelIsThreeD:(BOOL)isThreeD; - _updateTicsIsThreeD:(BOOL)isThreeD; - _updateRangeIsThreeD:(BOOL)isThreeD isPolar:(BOOL)isPolar; @end @implementation AxesPane - init { [super init]; [NXApp loadNibSection: "AxesPane.nib" owner: self withNames: NO fromZone: [self zone]]; icon = "InspectorAxes.tiff"; return self; } - free { [ticOptionsPanel free]; return [super free]; } /* * Overridden from Pane. */ - selectControl:sender { if ([[rangeAutoMatrix findCellWithTag:X_TAG] state] && [[rangeAutoMatrix findCellWithTag:Y_TAG] state] && [[rangeAutoMatrix findCellWithTag:Z_TAG] state]) [labelMatrix selectText:self]; else [rangeMatrix selectText:self]; return self; } - (BOOL)updateStatus:aStatus doc:aDoc { id oldStatus = status; /* * We only bother updating if status has changed since we last * updated, or if we just became the current pane (didSwap) -- * assuming that status and aDoc are non-nil, of course. */ if ([super updateStatus:aStatus doc:aDoc] && ((status != oldStatus) || didSwap)) { BOOL isThreeD = [status isThreeD]; BOOL isPolar = [status isPolar]; Window *viewWindow; id cell; [(viewWindow = [view window]) disableDisplay]; [axisXButton setState:[status axisCoord:X_TAG]]; [axisXButton setEnabled:!isThreeD]; [axisYButton setState:[status axisCoord:Y_TAG]]; [axisYButton setEnabled:!isThreeD]; [axisTitleField setTextGray:isThreeD? NX_DKGRAY :NX_BLACK]; /* Grid in 3d plots only show up if there's a border. */ // [gridButton setState:[status grid] && !(isThreeD && ![status border])]; [gridButton setEnabled:!(isThreeD && ![status border])]; [[logMatrix findCellWithTag:X_TAG] setState:[status isLogCoord:X_TAG]]; [[logMatrix findCellWithTag:Y_TAG] setState:[status isLogCoord:Y_TAG]]; [cell = [logMatrix findCellWithTag:Z_TAG] setState: [status isLogCoord:Z_TAG] && !isPolar]; [cell setEnabled:isThreeD]; [logMatrix display]; [anglesButton setEnabled:isPolar]; [anglesButton setTitle:[status degrees]? "Degrees" :"Radians"]; [self _updateLabelIsThreeD:isThreeD]; [self _updateTicsIsThreeD:isThreeD]; [self _updateRangeIsThreeD:isThreeD isPolar:isPolar]; [viewWindow reenableDisplay]; [self perform:@selector(selectControl:) with:self afterDelay:1 cancelPrevious:YES]; didSwap = NO; return YES; } return NO; } - (BOOL)forceUpdateStatus:aStatus doc:aDoc { BOOL needsRedisplay; /* Update ourself first, then the options panel */ needsRedisplay = [super forceUpdateStatus:aStatus doc:aDoc]; if ([[ticOptionsPanel panel] isVisible]) [ticOptionsPanel forceUpdate]; return needsRedisplay; } - didSwapIn:sender { [super didSwapIn:self]; didSwap = YES; return self; } - doSetRange:sender { int tag = [[sender selectedCell] tag]; BOOL isPolar = [status isPolar]; double min = [[sender cellAt:tag :0] doubleValue]; double max = [[sender cellAt:tag :1] doubleValue]; if (min == max) NXRunAlertPanel ([stringSet valueForStringKey: "range"], [stringSet valueForStringKey: "zeroRange"], NULL, NULL, NULL); else { if (isPolar && (tag == Z_TAG)) tag = R_TAG; if ([status isLogCoord:tag] && ((min <= 0) || (max <= 0))) NXRunAlertPanel ([stringSet valueForStringKey: "log"], [stringSet valueForStringKey: "logRange"], NULL, NULL, NULL); else [status setRangeCoord:tag min:min max:max]; } [self _updateRangeIsThreeD:[status isThreeD] isPolar:isPolar]; return self; } - doSetRangeAuto:sender { Window *win; id cell = [sender selectedCell]; int tag = [cell tag]; BOOL isPolar = [status isPolar]; [status setAutoscaleCoord:(tag == Z_TAG)? (isPolar? R_TAG :Z_TAG) :tag isOn: [cell state]]; [win = [view window] disableDisplay]; [self _updateRangeIsThreeD:[status isThreeD] isPolar:isPolar]; [rangeMatrix selectTextAt:tag :0]; [win reenableDisplay]; [rangeMatrix display]; return self; } - doSetLog:sender { id cell = [sender selectedCell]; int tag = [cell tag]; BOOL state = [cell state]; BOOL isPolar = [status isPolar]; double min = [[rangeMatrix cellAt:tag :0] doubleValue]; double max = [[rangeMatrix cellAt:tag :1] doubleValue]; if ( state && ((min <= 0) || (max <= 0)) ) { NXRunAlertPanel ([stringSet valueForStringKey: "log"], [stringSet valueForStringKey: "logRange"], NULL, NULL, NULL); [cell setState:0]; return nil; } else return [status setIsLogCoord:(tag == Z_TAG)? (isPolar?R_TAG:Z_TAG) :tag isOn:state]; } - doSetAngles:sender { int tag = [sender selectedTag]; if (tag != oldAnglesTag) { [status setDegrees:tag == ANGLES_DEGREES]; [self _updateRangeIsThreeD:[status isThreeD] isPolar:[status isPolar]]; oldAnglesTag = tag; } return self; } - doSetLabel:sender { id cell = [sender selectedCell]; int tag = [cell tag]; [status setLabelCoord:tag to:[cell stringValue]]; /* status might fix the label */ [cell setStringValue:[status labelCoord:tag]]; return self; } - doSetTics:sender { TicCell *cell = [sender selectedCell]; [status setTicsCoord:[cell tag] isOn:[cell state]]; [self _updateTicsIsThreeD:[status isThreeD]]; return self; } - doSetAxis:sender { return [status setAxisCoord:[sender tag] on:[sender state]]; } - doSetGrid:sender { return [status setGrid:[sender state]]; } - doSetTicsIn:sender { return [status setTicsIn:([ticsInMatrix selectedTag] == 0)]; } - showTicOptionsPanel:sender { if (!ticOptionsPanel) ticOptionsPanel = [[TicOptionsPanel allocFromZone:[self zone]] init]; [ticOptionsPanel showPanel:self]; return self; } - windowDidUpdate:sender { return self; } // Shuts up the compiler about unused RCSId - (const char *) rcsid { return RCSId; } @end @implementation AxesPane (Private) - _updateLabelIsThreeD:(BOOL)isThreeD { int i; for (i = 0 ; i < 3 ; i++) [[labelMatrix findCellWithTag:i] setStringValue:[status labelCoord:i]]; [[labelMatrix findCellWithTag:Z_TAG] setEnabled:isThreeD]; [[labelMatrixLabelMatrix findCellWithTag:Z_TAG] setTextGray:isThreeD? NX_BLACK: NX_DKGRAY]; return self; } - _updateTicsIsThreeD:(BOOL)isThreeD { id cell; BOOL ticsX = [status ticsCoord:X_TAG]; BOOL ticsY = [status ticsCoord:Y_TAG]; BOOL ticsZ = [status ticsCoord:Z_TAG]; [ticsInMatrix selectCellWithTag: [status ticsIn]? 0: 1]; [ticsInMatrix setEnabled: (ticsX || ticsY || (ticsZ && isThreeD))]; cell = [ticsMatrix findCellWithTag:X_TAG]; [cell setState:ticsX]; cell = [ticsMatrix findCellWithTag:Y_TAG]; [cell setState:ticsY]; cell = [ticsMatrix findCellWithTag:Z_TAG]; if (ticsZ) [cell setState:ticsZ && isThreeD]; [cell setEnabled:isThreeD]; [ticsMatrix display]; return self; } - _updateRangeIsThreeD:(BOOL)isThreeD isPolar:(BOOL)isPolar { int state, i; id cell; /* Update X & Y Ranges */ for (i = 0 ; i <= 1 ; i++) { [[rangeAutoMatrix findCellWithTag:i] setState: state = [status autoscaleCoord:i]]; [cell = [rangeMatrix cellAt:i :0] setDoubleValue: [status minCoord:i]]; [cell setEnabled:!state]; [cell = [rangeMatrix cellAt:i :1] setDoubleValue: [status maxCoord:i]]; [cell setEnabled:!state]; } /* * We use the Z controls as R when the plot is polar. In cases * like this, the tag of the control will be Z_TAG, so it will * seem to refer to a Z coordinate instead of an R coordinate. * We need to be careful, here and elsewhere in Inspector, to * deal with the control using Z_TAG and deal with Status * settings using R_TAG if the plot is polar. */ i = isPolar? R_TAG :Z_TAG; cell = [rangeAutoMatrix findCellWithTag:Z_TAG]; [cell setTitle:isPolar? "R " :"Z "]; [cell setState:state = [status autoscaleCoord:i]]; [cell setEnabled:isPolar || isThreeD]; cell = [rangeMatrix cellAt:Z_TAG :0]; [cell setEnabled:!state && (isPolar || isThreeD)]; [cell setDoubleValue: [status minCoord:i]]; cell = [rangeMatrix cellAt:Z_TAG :1]; [cell setEnabled:!state && (isPolar || isThreeD)]; [cell setDoubleValue: [status maxCoord:i]]; [rangeMatrix display]; [rangeAutoMatrix display]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.