This is hgvMenu.m in view mode; [Download] [Up]
/* Hippo Graphic View by Paul Kunz June 1991 * a subclass of GraphicView in /NextDeveloper/Examples/Draw * to add or over-ride so that it can handle hippo Graphic objects * * This category handles targets of menu items and keyboard envents * * Copyright (C) 1993 The Board of Trustees of * The Leland Stanford Junior University. All Rights Reserved. */ #import "Draw.subproj/draw.h" #import "HGraphicView.h" const char hgvMenu_m_rcsid[] = "$Id: hgvMenu.m,v 2.8.2.2 1994/02/08 20:30:24 rensing Exp $"; #import "HDrawApp.h" #import "InspectBase.h" #import "Overlay.h" #import "PageMarker.h" #import "Plot.h" #import "SaveWindow.h" @implementation HGraphicView(Menu) /* This routine is needed for the "Add Page" menu item. */ - addPage:sender { return [self addPages: 1]; } - deletePage:sender { Graphic *g; NXRect box; NXRect curRect; int i; [[[self window] delegate] getPageFrame:&box]; [self getBBox:&curRect of:glist extended:NO]; if (NXIntersectsRect(&curRect, &box)) { NXRunAlertPanel("Error", "Last page is not empty", "OK", NULL, NULL); return self; } box.size.width = 0.0; box.size.height = -box.size.height; [self sizeBy:box.size.width :box.size.height ]; i = [glist count]; while( i-- ) { g = [glist objectAt:i]; if ( ![g isLocked] ) { [g moveBy:(const NXPoint *)&box.size]; } } [self getFrame:&box ]; [self cache:&box ]; [window flushWindow]; return self; } - addSaveWindow:sender { [[[SaveWindow new] init] addSelf: self]; return self; } - alignAll:sender { // This method is obsolete and kept in the 1.1 release for // backward compatability. return [self overlay:sender]; } - alignSize:sender { // backward compatible code. Remove in next release return [self overlay:sender]; } - alignXRange:sender { id inspector; Plot *firstPlot; NXPoint theRange; binding_t xaxis = XAXIS; inspector = [hippoDraw currentInspector]; if ( inspector == nil ) return self; firstPlot = [inspector firstPlot]; if ( firstPlot == nil ) return self; [firstPlot getRangeForAxis:XAXIS low:&theRange.x high:&theRange.y]; [self graphicsPerform:@selector(setRange:to:) with:&xaxis with: (id)&theRange andDraw:YES ]; [window flushWindow]; return self; } - alignYRange:sender { id inspector; Plot *firstPlot; NXPoint theRange; binding_t yaxis = YAXIS; inspector = [hippoDraw currentInspector]; if ( inspector == nil ) return self; firstPlot = [inspector firstPlot]; if ( firstPlot == nil ) return self; [firstPlot getRangeForAxis:YAXIS low:&theRange.x high:&theRange.y]; [self graphicsPerform:@selector(setRange:to:) with:&yaxis with:(id)&theRange andDraw:YES ]; [window flushWindow]; return self; } - alignXNumBins:sender { id inspector; Plot *firstPlot; binding_t xaxis = XAXIS; int numBins; inspector = [hippoDraw currentInspector]; if ( inspector == nil ) return self; firstPlot = [inspector firstPlot]; if ( firstPlot == nil ) return self; numBins = [firstPlot numBinsForAxis: XAXIS ]; [self graphicsPerform:@selector(setNumBins:to:) with:(id)&xaxis with:(id)&numBins andDraw:YES ]; [[window flushWindow] makeKeyWindow]; return self; } - alignYNumBins:sender { id inspector; Plot *firstPlot; display disp; binding_t yaxis = YAXIS; int numBins; graphtype_t gt; inspector = [hippoDraw currentInspector]; if ( inspector == nil ) return self; firstPlot = [inspector firstPlot]; if ( firstPlot == nil ) return self; disp = [firstPlot histDisplay]; gt = h_getDispType( disp ); if ( gt == HISTOGRAM ) return self; numBins = h_getBinNum( disp, YAXIS ); [self graphicsPerform:@selector(setNumBins:to:) with:(id)&yaxis with: (id)&numBins andDraw:YES ]; [[window flushWindow] makeKeyWindow]; return self; } - cut:sender { if ( [self isAllowed] ) { return [super cut:sender]; } return self; } - delete:sender { Plot *g; int i; if ( [self isAllowed] ) { /* Do this before handing delete to GraphicView because * GraphicView doesn't free the graphic objects. If I fix * GraphicView to free objects, then ChangeManager get's messed * up because we're not dealing with changes in Plots correctly * - pfk Jul '92 */ i = [slist count]; while (i--) { g = [slist objectAt:i]; if ( [g isKindOf:[Plot class]] ) { [g removeAllCuts]; } } return [super delete:sender]; } return self; } - duplicate: sender /* * Duplicate is equivalent to copy + paste, except that the new objects are * placed on the page using the plot placement method. If more than one * object is selected, the relative positions are maintained. */ { List *pblist; Pasteboard *pboard; /* copy selection to the pasteboard */ [self copy:sender]; /* * paste in and move */ pboard = [Pasteboard new]; /* the following call sets the selection list as well */ pblist = [self pasteFromPasteboard:pboard andLink:DontLink at:NULL]; if (pblist) { NXPoint location, offset; NXRect bbox; [self getBBox:&bbox of:pblist extended:NO];/*don't include handles*/ [self calcPlacement: &(bbox.size) result: &location ]; /* calcPlacement can change bbox if pages are added. */ [self getBBox:&bbox of:pblist extended:NO]; offset.x = location.x - bbox.origin.x; offset.y = location.y - bbox.origin.y; [pblist makeObjectsPerform:@selector(moveBy:) with:(id)&offset]; [pblist free]; } [self recacheSelection]; return self; } - overlay:sender /* * Creates a new Group object with the current slist as its member list. * See the Group class for more info. */ { id g, insp, firstPlot; NXRect eb; int i; insp = [hippoDraw currentInspector]; if ( insp == nil ) return self; firstPlot = [insp firstPlot]; /* If firstPlot is nil, which can happen if user just did a unoverlay, * then pick a plot in the list to be the firstPlot. */ if ( firstPlot == nil ) { i = [slist count]; while( i-- ) { g = [slist objectAt:i]; if ( [g isKindOf:[Plot class]] ) { firstPlot = g; break; } } } i = [slist count]; if (i > 1) { while (i--) [glist removeObject:[slist objectAt:i]]; g = [[Overlay allocFromZone:[self zone]] initList:slist with:firstPlot]; [glist insertObject:g at:0]; slist = [[List allocFromZone:[self zone]] init]; [slist addObject:g]; gvFlags.groupInSlist = YES; [self cache:[g getInitialBounds:&eb]]; if (sender != self) [window flushWindow]; } [ window flushWindow]; return self; } - unoverlay:sender /* * Goes through the slist and ungroups any Group objects in it. * Does not descend any further than that (i.e. all the Group objects * in the slist are ungrouped, but any Group objects in those ungrouped * objects are NOT ungrouped). */ { id g, tlist; int i, j, k; NXRect sbounds, tbounds; BOOL found = NO; [self getBBox:&sbounds of:slist]; i = [slist count]; while (i--) { g = [slist objectAt:i]; if ([g isKindOf:[Overlay class]]) { k = [glist indexOf:g]; [glist removeObjectAt:k]; found = YES; tlist = [[List allocFromZone:[self zone]] initCount:0]; [[g transferSubGraphicsTo:tlist at:0] free]; [self getBBox:&tbounds of:tlist]; NXUnionRect( &tbounds, &sbounds ); j = [tlist count]; while ( j-- ) { g = [tlist objectAt:j]; [glist insertObject:g at:k]; } [tlist free]; } } if (found) { [self cache:&sbounds]; if (sender != self) [window flushWindow]; [self getSelection]; } return self; } - prefPanel:sender { NXBundle *bundle; char buffer[MAXPATHLEN+1]; const char *defaultValue; if( ! prefPanel ){ bundle = [NXBundle bundleForClass:[self class]]; if ( [bundle getPath:buffer forResource:"HGraphicView" ofType:"nib"] ) { [NXApp loadNibFile:buffer owner:self withNames:NO fromZone:[self zone]]; } } defaultValue = NXGetDefaultValue("HippoDraw", "NumPlotCols" ); [prefForm setStringValue:defaultValue at:0]; defaultValue = NXGetDefaultValue("HippoDraw", "NumPlotRows" ); [prefForm setStringValue:defaultValue at:1]; [prefPanel makeKeyAndOrderFront:sender]; return self; } - prefButton:sender { char string[80]; unsigned int cols, rows; [prefPanel orderOut:self]; if ( [sender selectedCol] == 1 ) { cols = [prefForm intValueAt:0]; rows = [prefForm intValueAt:1]; sprintf( string, "%u", cols ); NXWriteDefault("HippoDraw", "NumPlotCols", string ); sprintf( string, "%u", rows ); NXWriteDefault("HippoDraw", "NumPlotRows", string ); [self deselectAll:self]; [window flushWindow]; } NXUpdateDefaults(); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.