This is Inspector.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: Inspector.m,v 1.13 1993/05/18 03:55:15 davis Exp $";
#import <appkit/Application.h>
#import <appkit/Button.h>
#import <appkit/Matrix.h>
#import <appkit/Panel.h>
#import <appkit/Pasteboard.h>
#import <appkit/publicWraps.h> /* NXBeep() */
#import <dpsclient/wraps.h>
#import "AxesPane.h"
#import "DataPane.h"
#import "GeneralPane.h"
#import "Gnuplot.h"
#import "GnuplotPlot.h"
#import "Inspector.h"
#import "NoPane.h"
#import "Pane.h"
#import "Status.h"
#import "ThreeDPane.h"
@interface Inspector (Private)
- _setupPane:(Pane *)aPane;
- _selectPane:(int)aPane;
- _swapPane:(Pane *)new;
- _determineNewStatusAndDoc;
- _updateForce:(BOOL)force all:(BOOL)all;
@end
@implementation Inspector
- init
{
const char *validSend[] = {NXAsciiPboardType, NULL};
const char *validReturn[] = {NXAsciiPboardType, NULL};
[super init];
[NXApp loadNibSection: "Inspector.nib"
owner: self
withNames: NO
fromZone: [self zone]];
[window setFrameUsingName:"InspectorPanel"];
[window setFrameAutosaveName:"InspectorPanel"];
[NXApp registerServicesMenuSendTypes: validSend
andReturnTypes: validReturn];
[[window contentView] allocateGState];
return self;
}
- free
{
[window free];
[noPane free];
[generalPane free];
[dataPane free];
[axesPane free];
[threeDPane free];
return [super free];
}
- window
{
return window;
}
- showPane:sender
{
if (status)
[self _selectPane:[sender selectedTag]];
return self;
}
/*
* Services. The Inspector instance is the inspector panel's
* delegate, so these methods work when the inspector panel is the
* key window. We pass service requests on to the current
* GnuplotPlot so that the filename of the current doc can always be
* offered to servers, even when the inspector is the key window.
*/
- validRequestorForSendType:(NXAtom)sendType andReturnType:(NXAtom) returnType
{
return [gnuplotPlot validRequestorForSendType:sendType
andReturnType:returnType];
}
- (BOOL)writeSelectionToPasteboard:pboard types:(NXAtom *)types
{
return [gnuplotPlot writeSelectionToPasteboard:pboard types:types];
}
/*
* This method is similar to -windowDidUpdate except that it forces
* ALL panes to update instead of just allowing the current pane to
* possibly update. This is necessary to keep a pane's OptionsPanels
* up-to-date even when that pane is not selected. (This is only a
* problem after such operations as "Revert to Saved" when NXApp's
* delegate must send this method.)
*/
- update
{
return [self _updateForce:YES all:YES];
}
/*
* The user can force a plot by pressing the Plot button in the
* Inspector.
*/
- doPlot:sender
{
if (gnuplotPlot)
[gnuplotPlot plot:self];
else
NXBeep();
return self;
}
/*
* This method is similar to -update except that it updates only the
* current pane, and allows it to decide whether or not it should
* update itself instead of forcing it to update.
*/
- windowDidUpdate:sender
{
return [self _updateForce:NO all:NO];
}
- selectPane:(int)aPane
{
if (aPane != NO_INSPECTOR)
[buttonMatrix selectCellWithTag:aPane];
[self _selectPane:aPane];
return self;
}
// Shuts up the compiler about unused RCSId
- (const char *) rcsid
{
return RCSId;
}
@end
@implementation Inspector (Private)
- _setupPane:(Pane *)aPane
{
if (aPane) {
View *panesView = [aPane view];
[[window contentView] addSubview: panesView];
[[panesView allocateGState] lockFocus];
[panesView unlockFocus];
[panesView moveTo:0:30];
}
return self;
}
- _selectPane:(int)aPane
{
if (![window isVisible])
[self _determineNewStatusAndDoc];
if (!status)
aPane = NO_INSPECTOR;
switch (aPane) {
case GENERAL_INSPECTOR:
if (!generalPane) {
generalPane = [[GeneralPane allocFromZone:[self zone]] init];
[self _setupPane:generalPane];
}
[self _swapPane:generalPane];
break;
case DATA_INSPECTOR:
if (!dataPane) {
dataPane = [[DataPane allocFromZone:[self zone]] init];
[self _setupPane:dataPane];
}
[self _swapPane:dataPane];
break;
case AXES_INSPECTOR:
if (!axesPane) {
axesPane = [[AxesPane allocFromZone:[self zone]] init];
[self _setupPane:axesPane];
}
[self _swapPane:axesPane];
break;
case THREED_INSPECTOR:
if (!threeDPane) {
threeDPane = [[ThreeDPane allocFromZone:[self zone]] init];
[self _setupPane:threeDPane];
}
[self _swapPane:threeDPane];
break;
default:
if (!noPane) {
noPane = [[NoPane allocFromZone:[self zone]] init];
[self _setupPane:noPane];
}
[self _swapPane:noPane];
break;
}
return self;
}
- _swapPane:(Pane *)new
{
/*
* If "new" is nil, we look at the button matrix
* to determine which inspector to swap in.
*/
if (!new)
switch ([buttonMatrix selectedTag]) {
case GENERAL_INSPECTOR:
new = generalPane; break;
case DATA_INSPECTOR:
new = dataPane; break;
case AXES_INSPECTOR:
new = axesPane; break;
case THREED_INSPECTOR:
new = threeDPane; break;
default:
new = noPane; break;
}
/*
* Now, if the new pane is not already visible,
* move it into the inspector panel.
*/
if (new != currentPane) {
[[window contentView] replaceSubview:[currentPane view]
with:[new view]];
[currentPane didSwapOut:self];
[[new didSwapIn:self] updateStatus:status doc:gnuplotPlot];
[window display];
[window setTitle:[new title]];
[window setMiniwindowIcon:[new icon]];
currentPane = new;
}
return self;
}
- _determineNewStatusAndDoc
{
Window *mainWindow = [NXApp mainWindow];
/* Set instance variables that indicate the current doc. */
if (mainWindow) {
gnuplotPlot = [mainWindow delegate];
status = [gnuplotPlot status];
} else {
if (gnuplotPlot = [[NXApp delegate] currentDoc])
status = [gnuplotPlot status];
else
status = nil;
}
return self;
}
- _updateForce:(BOOL)force all:(BOOL)all
{
BOOL needsRedisplay = NO;
[self _determineNewStatusAndDoc];
[window disableDisplay];
if (!status) { /* No current selection */
[self selectPane:NO_INSPECTOR];
needsRedisplay = YES;
} else { /* Update/replace controls */
if (force) {
if (all) {
needsRedisplay = [noPane forceUpdateStatus:status
doc:gnuplotPlot]? YES :NO;
needsRedisplay = ([generalPane forceUpdateStatus:status
doc:gnuplotPlot]? YES :NO) || needsRedisplay;
needsRedisplay = ([dataPane forceUpdateStatus:status
doc:gnuplotPlot]? YES :NO) || needsRedisplay;
needsRedisplay = ([axesPane forceUpdateStatus:status
doc:gnuplotPlot]? YES :NO) || needsRedisplay;
needsRedisplay = ([threeDPane forceUpdateStatus:status
doc:gnuplotPlot]? YES :NO) || needsRedisplay;
} else
needsRedisplay = [currentPane forceUpdateStatus:status
doc:gnuplotPlot]? YES :NO;
} else
needsRedisplay = [currentPane updateStatus:status doc:gnuplotPlot]?
YES :NO;
if (currentPane == noPane)
[self selectPane:[buttonMatrix selectedTag]];
}
[window reenableDisplay];
if (needsRedisplay)
[window display];
/*
* We disable the plot button if
* 1) No current status, or
* 2) Current plot's status reports that it can't plot
*/
[plotButton setEnabled:status && [status canPlot]];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.