This is ThreeDPane.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: ThreeDPane.m,v 1.8 1993/05/18 03:55:44 davis Exp $"; #import <appkit/Application.h> #import <appkit/Box.h> #import <appkit/Matrix.h> #import <appkit/Slider.h> #import <appkit/TextField.h> #import <appkit/TextFieldCell.h> #import <appkit/View.h> #import "ContourOptionsPanel.h" #import "GnuplotPlot.h" #import "Status.h" #import "StatusContour.h" #import "ThreeDPane.h" #define SURF_WIREFRAME 0 #define SURF_OPAQUE 1 #define SURF_INVISIBLE 2 @interface ThreeDPane (Private) - _updateRotationIsThreeD:(BOOL)isThreeD; - _updateContourIsThreeD:(BOOL)isThreeD; - _updateSurfaceTypeIsThreeD:(BOOL)isThreeD; - _updateIsoSamplesIsThreeD:(BOOL)isThreeD; @end @implementation ThreeDPane - init { [super init]; [NXApp loadNibSection: "ThreeDPane.nib" owner: self withNames: NO fromZone: [self zone]]; icon = "InspectorThreeD.tiff"; return self; } - free { if (contourOptionsPanel) [contourOptionsPanel free]; return [super free]; } /* * Overridden from Pane. */ - selectControl:sender { [isoSamplesMatrix selectText:self]; return self; } - (BOOL)updateStatus:aStatus doc:aDoc { id oldStatus = status; id oldDoc = doc; /* * 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, isPolar; Window *viewWindow; [(viewWindow = [view window]) disableDisplay]; [threeDButton setState:(isThreeD = [status isThreeD])]; [threeDButton setEnabled:!(isPolar = [status isPolar])]; [self _updateRotationIsThreeD:isThreeD]; [self _updateContourIsThreeD:isThreeD]; [self _updateSurfaceTypeIsThreeD:isThreeD]; [self _updateIsoSamplesIsThreeD:isThreeD]; [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 ourselves first, then the options panel */ needsRedisplay = [super forceUpdateStatus:aStatus doc:aDoc]; if ([[contourOptionsPanel panel] isVisible]) [contourOptionsPanel forceUpdate]; return needsRedisplay; } - didSwapIn:sender { [super didSwapIn:self]; didSwap = YES; return self; } - doSetThreeD:sender { BOOL isThreeD; [status setThreeD:isThreeD = [sender state]]; /* * Making changes that might affect other controls in the same * pane or one of our options panels should update the pane using * the current status and doc. */ if ([self forceUpdateStatus:status doc:doc]) [view display]; return self; } - doSetSurfaceType:sender { BOOL oldReport = [status report]; [status setReport:NO]; switch ([surfaceTypeMatrix selectedTag]) { case SURF_WIREFRAME: [status setSurface:YES]; [status setHiddenThreeD:NO]; break; case SURF_OPAQUE: [status setSurface:YES]; [status setHiddenThreeD:YES]; break; case SURF_INVISIBLE: [status setSurface:NO]; [status setHiddenThreeD:NO]; break; } [status setReport:oldReport]; [status reportSettingsChange:self]; if ([self forceUpdateStatus:status doc:doc]) [view display]; return self; } - doSetIsoSamples:sender { int samples = [sender intValue]; if (samples > 1) [status setIsoSamplesCoord:[sender selectedTag] to:samples]; else [sender setIntValue:[status isoSamples:[sender selectedTag]]]; return self; } - doSetRotation:sender { if (sender == rotMatrix) [status setRotCoord:[sender selectedTag] to:[[sender selectedCell] floatValue]]; else if (sender == rotZSlider) [status setRotCoord:Z_TAG to:359.0 - [sender floatValue]]; else [status setRotCoord:[sender tag] to:[sender floatValue]]; [self _updateRotationIsThreeD:[status isThreeD]]; return self; } - doResetRotation:sender { [status resetRotation]; [self _updateRotationIsThreeD:[status isThreeD]]; return self; } - doSetContourBase:sender { [status setContourBase:[sender state]]; if ([self forceUpdateStatus:status doc:doc]) [view display]; return self; } - doSetContourSurface:sender { [status setContourSurface:[sender state]]; if ([self forceUpdateStatus:status doc:doc]) [view display]; return self; } - showContourOptionsPanel:sender { if (!contourOptionsPanel) contourOptionsPanel = [[ContourOptionsPanel allocFromZone:[self zone]] init]; [contourOptionsPanel showPanel:self]; return self; } // Shuts up the compiler about unused RCSId - (const char *) rcsid { return RCSId; } @end @implementation ThreeDPane (Private) - _updateRotationIsThreeD:(BOOL)isThreeD { float aFloat; Box *aBox; Cell *aCell; BOOL wasEnabled; [rotXSlider setFloatValue:aFloat = [status rotCoord:X_TAG]]; [rotXSlider setEnabled: isThreeD]; [aCell = [rotMatrix findCellWithTag:X_TAG] setFloatValue:aFloat]; [aCell setEnabled: isThreeD]; [rotZSlider setFloatValue:359.0 - (aFloat = [status rotCoord:Z_TAG])]; [rotZSlider setEnabled: isThreeD]; [aCell = [rotMatrix findCellWithTag:Z_TAG] setFloatValue:aFloat]; [aCell setEnabled: isThreeD]; [rotationResetButton setEnabled:isThreeD]; /* * If the plot is not threeD, we'll make the text title of the * box dark gray to indicate that all 3d rotation is disabled. * We only redisplay if the enabledment changes. */ wasEnabled = [[aBox = [[rotXSlider superview] superview] cell] isEnabled]; if (wasEnabled != isThreeD) [[aBox cell] setEnabled: isThreeD]; return self; } - _updateContourIsThreeD:(BOOL)isThreeD { BOOL isOpaque = [status hiddenThreeD]; BOOL contourBase = [status contourBase]; BOOL contourSurface = [status contourSurface]; [[[[contourBaseButton superview] superview] cell] setEnabled:isThreeD]; [contourBaseButton setState:contourBase]; [contourBaseButton setEnabled:isThreeD]; /* * Contours on surfaces don't seem to show up when hidden * line removal is turned on (in 3.3 beta). */ // [contourSurfaceButton setState:contourSurface && !isOpaque]; [contourSurfaceButton setEnabled:isThreeD && !isOpaque]; [contourOptionsButton setEnabled:isThreeD && (contourBase || (contourSurface && !isOpaque))]; return self; } - _updateSurfaceTypeIsThreeD:(BOOL)isThreeD { Box *aBox; BOOL wasEnabled; wasEnabled = [[aBox = [[surfaceTypeMatrix superview] superview] cell] isEnabled]; if (wasEnabled != isThreeD) [[aBox cell] setEnabled: isThreeD]; if ([status surface]) { if ([status hiddenThreeD]) [surfaceTypeMatrix selectCellWithTag:SURF_OPAQUE]; else [surfaceTypeMatrix selectCellWithTag:SURF_WIREFRAME]; } else [surfaceTypeMatrix selectCellWithTag:SURF_INVISIBLE]; [surfaceTypeMatrix setEnabled:isThreeD]; return self; } - _updateIsoSamplesIsThreeD:(BOOL)isThreeD { BOOL wasEnabled; Box *aBox; [[isoSamplesMatrix findCellWithTag:X_TAG] setIntValue: [status isoSamples:X_TAG]]; [[isoSamplesMatrix findCellWithTag:Y_TAG] setIntValue: [status isoSamples:Y_TAG]]; [isoSamplesMatrix setEnabled:isThreeD]; [isoSamplesLabel setTextGray: isThreeD? NX_BLACK: NX_DKGRAY]; wasEnabled = [[aBox = [[isoSamplesMatrix superview] superview] cell] isEnabled]; if (wasEnabled != isThreeD) [[aBox cell] setEnabled: isThreeD]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.