This is DataPane.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: DataPane.m,v 1.13 1993/05/18 03:54:59 davis Exp $"; #import <appkit/Application.h> #import <appkit/Box.h> #import <appkit/Form.h> #import <appkit/OpenPanel.h> #import <appkit/View.h> #import <sys/param.h> /* MAXPATHLEN */ #import "CellScrollView.h" #import "DataOptionsPanel.h" #import "DataPane.h" #import "FunctionObject.h" #import "EditMatrix.h" #import "GnuplotPlot.h" #import "Status.h" #import "SubCell.h" @interface DataPane (Private) - _updateFunctionsMatrix; - _updateControlsForSelectedFunction; @end @implementation DataPane - init { [super init]; [NXApp loadNibSection: "DataPane.nib" owner: self withNames: NO fromZone: [self zone]]; icon = "InspectorData.tiff"; /* Initialize the CellScrollView of functions */ [functionsScrollView initMatrixCellClass:[SubCell class] cols:1]; functionsMatrix = [functionsScrollView cellMatrix]; [[functionsMatrix setAction:@selector(selectFunction:)] setTarget:self]; return self; } - free { [optionsPanel free]; return [super free]; } /* * Overridden from Pane. */ - selectControl:sender { [functionsForm selectTextAt:0]; 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)) { Window *viewWindow; [(viewWindow = [view window]) disableDisplay]; functionObjects = [status functions]; [dummyFormCellX setStringValue:[status dummyVar:X_TAG]]; [dummyFormCellY setStringValue:[status dummyVar:Y_TAG]]; [dummyFormCellY setEnabled:[status isThreeD]]; [self _updateFunctionsMatrix]; if (![functionsMatrix selectedCell] && ![functionsMatrix multipleCellsSelected]) [functionsMatrix selectCellAt:0:0]; /* Make a selection */ [self _updateControlsForSelectedFunction]; [viewWindow reenableDisplay]; [self perform:@selector(selectControl:) with:self afterDelay:1 cancelPrevious:YES]; didSwap = NO; [optionsPanel ownerDidSwapIn:self]; /* We're done swapping now */ return YES; } return NO; } - (BOOL)forceUpdateStatus:aStatus doc:aDoc { BOOL needsRedisplay; /* * Must update ourself first, then update the options panel * because the options panel may look at our controls, etc. to * update itself. */ needsRedisplay = [super forceUpdateStatus:aStatus doc:aDoc]; if ([[optionsPanel panel] isVisible]) [optionsPanel forceUpdate]; return needsRedisplay; } - didSwapIn:sender { [super didSwapIn:sender]; didSwap = YES; return self; } - didSwapOut:sender { [super didSwapOut:sender]; [optionsPanel ownerDidSwapOut:self]; return self; } - doSetDummy:sender { [status setDummyVar:[sender tag] to:[sender stringValue]]; return self; } - findDataFile:sender { const char *const *files; id openPanel; char fullName[MAXPATHLEN]; openPanel = [[OpenPanel new] allowMultipleFiles:YES]; [openPanel setTitle:"Add Data File"]; if ([openPanel runModalForTypes:NULL]) for (files = [openPanel filenames]; files && *files; files++) { sprintf (fullName, "%s/%s", [openPanel directory], *files); [self addDataFile:fullName]; } return self; } - selectFunction:sender { if (![functionsMatrix selectedCell] && ![functionsMatrix multipleCellsSelected]) { [functionsMatrix selectCellAt:0:0]; [self _updateControlsForSelectedFunction]; } else { [self _updateControlsForSelectedFunction]; [functionsForm selectTextAt:0]; } [optionsPanel forceUpdate]; return self; } - deleteSelectedFunctions:sender { int i; int maxrow = [functionsMatrix cellCount] - 1; int row = maxrow; BOOL gotRow = NO; int col = [functionsMatrix selectedCol]; for (i = maxrow; i >= 0; i--) { SubCell *cell = [functionsMatrix cellAt:i:0]; if ([cell isHighlighted]) { /* * If a cell is highlighted, remove (and free) the corresponding * item from the list of SubObjects. */ [[functionObjects removeObject:[cell subObject]] free]; if (!gotRow) { row = (i == maxrow)? i - 1: i; gotRow = YES; } else row--; } } [functionsScrollView loadCol:0 from:functionObjects]; [functionsMatrix selectCellAt: row:col]; [functionsMatrix scrollCellToVisible: row:col]; [self selectFunction:self]; /* * We change the list of functions maintainted by Status without * going through Status, so we need to make sure the changes are * noticed. */ [status reportSettingsChange:self]; return self; } - modifySelectedFunction:sender { id cell = [functionsMatrix selectedCell]; [[cell subObject] setStringValue: [functionsForm stringValue]]; [functionsScrollView loadCol:0 from:functionObjects]; [functionsMatrix selectCell:cell]; [self selectFunction:self]; [status reportSettingsChange:self]; return self; } - addFunction:sender { const char *stringValue; int count; FunctionObject *functionObject; stringValue = [functionsForm stringValue]; if (![FunctionObject isAcceptableStringValue:stringValue]) { [self selectFunction:self]; return nil; } functionObject = [[FunctionObject allocFromZone: [status zone]] initFromString: stringValue isThreeD: [status isThreeD]]; [functionObjects addObject:functionObject]; [functionsScrollView loadCol:0 from:functionObjects]; /* * Assumptions in this next line: * There are as many SubCells as there are functionObjects * We've added the new functionObject at the end of the list. * We want to display the functionObject we just added and highlight it. * In short, this is a hack. * -- CellScrollView, NeXT Example */ count = [functionObjects count] - 1; [functionsMatrix scrollCellToVisible:count :0]; [functionsMatrix selectCellAt:count:0]; [self selectFunction:self]; [status reportSettingsChange:self]; return self; } - functionsMatrix { return functionsMatrix; } - addDataFile:(const char *)aPath { int count; [doc addDataFile:aPath]; [functionsScrollView loadCol:0 from:functionObjects]; /* * Assumptions in this next line: * There are as many SubCells as there are functionObjects * We've added the new functionObject at the end of the list. * We want to display the functionObject we just added and highlight it. * In short, this is a hack. * -- CellScrollView, NeXT Example */ count = [functionObjects count] - 1; [functionsMatrix scrollCellToVisible:count :0]; [functionsMatrix selectCellAt:count:0]; [self selectFunction:self]; return self; } - showOptionsPanel:sender { if (!optionsPanel) { optionsPanel = [[DataOptionsPanel allocFromZone:[self zone]] init]; [optionsPanel setOwner:self]; } [optionsPanel showPanel:self]; return self; } // Shuts up the compiler about unused RCSId - (const char *) rcsid { return RCSId; } @end @implementation DataPane (Private) - _updateFunctionsMatrix { int functionCount, counter = 0; int fieldcount; int row = [functionsMatrix selectedRow]; int col = [functionsMatrix selectedCol]; [functionsScrollView loadCol:0 from:functionObjects]; if (functionCount = [functionObjects count]) { for (counter = 0; counter < functionCount; counter++) [[functionsMatrix cellAt:counter:0] setStringValue:[[functionObjects objectAt:counter] stringValue]]; } fieldcount = [functionsMatrix cellCount]; while (counter < fieldcount) [[functionsMatrix cellAt:counter++:0] setStringValue:""]; [functionsMatrix selectCellAt:(row > fieldcount)? fieldcount:row :col]; return self; } - _updateControlsForSelectedFunction { id singleCell = [functionsMatrix selectedCell]; BOOL enabled = (singleCell || [functionsMatrix multipleCellsSelected]); if (singleCell) [functionsForm setStringValue:[[singleCell subObject] stringValue]]; else if (enabled) [functionsForm setStringValue:""]; [inspectButton setEnabled:enabled]; [deleteFunctionButton setEnabled:enabled]; [modifyFunctionButton setEnabled:singleCell? YES:NO]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.