This is Controller.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "Controller.h" #import "EnvelopeView.h" #import <appkit/Application.h> #import <appkit/Panel.h> #import <appkit/Button.h> #import <appkit/ButtonCell.h> #import <appkit/Cell.h> #import <appkit/ActionCell.h> #import <appkit/Matrix.h> #import <appkit/View.h> #import <appkit/Form.h> #import <appkit/Listener.h> #import <appkit/PopUpList.h> #import <appkit/NXSplitView.h> #import <objc/List.h> #import <stdlib.h> #import <ctype.h> #import <math.h> extern NXDefaultsVector envelopeDefaults; @implementation Controller - appDidInit:sender { lastDeleted=NULL; theEnvelope=NULL; myListener=[NXApp appListener]; [myListener setServicesDelegate: self]; [theWindow makeKeyAndOrderFront: self]; NXRegisterDefaults("EnvelopeEd",envelopeDefaults); [self addEnvelope: self]; return self; } - infoPanel:sender { if(!infoPanel) { [NXApp loadNibSection:"Info.nib" owner:self]; } [infoPanel makeKeyAndOrderFront:sender]; return self; } - helpPanel:sender { if(!helpPanel) { [NXApp loadNibSection:"Info.nib" owner:self]; } [helpPanel makeKeyAndOrderFront:sender]; return self; } //=================================================================== // Operations on Envelopes //=================================================================== - addEnvelope:sender { id old; NXRect * theFrame; theFrame = malloc (sizeof (NXRect)); [theSplitView getFrame: theFrame]; old=theEnvelope; if (old!=NULL) [old dim]; theEnvelope=[[EnvelopeView alloc] initFrame: theFrame]; [theEnvelope controllerIs: self]; [theSplitView addSubview: theEnvelope]; [theSplitView adjustSubviews]; [theSplitView display]; [theWindow makeFirstResponder: theEnvelope]; if (old!=NULL && [theLinkX state]==1) [self broadcastXLimitsOf: old]; free (theFrame); return self; } - removeEnvelope:sender { id views; unsigned int lastIndex; if (theEnvelope!=NULL) { lastIndex=[[theSplitView subviews] indexOf: theEnvelope]; // where is on the subview list? lastDeleted=[theEnvelope copy]; // remember last envelope... [theEnvelope removeFromSuperview]; // ...but delete it from the window! views=[theSplitView subviews]; if ([views count]==0) // define pointer to new envelope theEnvelope=NULL; else { if ((theEnvelope=[views objectAt: lastIndex])==NULL) theEnvelope=[views objectAt: 0]; } if (theEnvelope!=NULL) [theWindow makeFirstResponder: theEnvelope]; [theSplitView adjustSubviews]; // display new split view [theSplitView display]; } return self; } - unRemoveEnvelope:sender { id old; if (lastDeleted!=NULL) { // only if previous delete [theSplitView addSubview: lastDeleted]; old=theEnvelope; if (old!=NULL) [old dim]; theEnvelope=lastDeleted; // set new current envelope lastDeleted=NULL; [theWindow makeFirstResponder: theEnvelope]; if (old!=NULL && [theLinkX state]==1) [self broadcastXLimitsOf: old]; [theSplitView adjustSubviews]; [theSplitView display]; } return self; } - update: sender { int point; if (theEnvelope!=NULL && theEnvelope!=sender) [theEnvelope dim]; if (theEnvelope!=sender) { theEnvelope=sender; [theEnvelope highlight]; [theWindow makeFirstResponder: theEnvelope]; } point=[sender getPoint]; [thePoint setIntValue: point]; [theXCoord setFloatValue: [sender getX: point]]; [theYCoord setFloatValue: [sender getY: point]]; [theYrCoord setFloatValue: [sender getYr: point]]; [theSmoothing setFloatValue: [sender getSmoothing: point]]; [theSmoothSlider setFloatValue: [sender getSmoothing: point]]; [theXMinCoord setFloatValue: [sender getXMin]]; [theXMaxCoord setFloatValue: [sender getXMax]]; [theYMinCoord setFloatValue: [sender getYMin]]; [theYMaxCoord setFloatValue: [sender getYMax]]; [theXSnapCoord setFloatValue: [sender getXSnap]]; [theYSnapCoord setFloatValue: [sender getYSnap]]; [theStickyPoint setState: [sender getSticky: point]]; [theGraphType setState: [sender getShowSmooth]]; return self; } - updateCoords: sender at: (int)point { [theXCoord setFloatValue: [sender getX: point]]; [theYCoord setFloatValue: [sender getY: point]]; [theYrCoord setFloatValue: [sender getYr: point]]; return self; } //=================================================================== // Pasteboard interface methods //=================================================================== - copy:sender { if (theEnvelope!=NULL) return [theEnvelope copy: sender]; return self; } - paste:sender { if (theEnvelope!=NULL) return [theEnvelope paste: sender]; return self; } //=================================================================== // Messages received from panel buttons and fields to update parameters //=================================================================== - nextPoint:sender { if (theEnvelope!=NULL) [theEnvelope nextPoint]; return self; } - previousPoint:sender { if (theEnvelope!=NULL) [theEnvelope previousPoint]; return self; } - setPoint:sender { if (theEnvelope!=NULL) [theEnvelope setPointTo: [sender intValue]]; return self; } - setXValue:sender { if (theEnvelope!=NULL) [theEnvelope setXAt: [thePoint intValue] to: [sender floatValue]]; return self; } - setYValue:sender { if (theEnvelope!=NULL) [theEnvelope setYAt: [thePoint intValue] to: [sender floatValue]]; return self; } - setYrValue:sender { if (theEnvelope!=NULL) [theEnvelope setYrAt: [thePoint intValue] to: [sender floatValue]]; return self; } - setSmoothValue:sender { float smooth; smooth=[sender floatValue]; smooth=rint(smooth*1000)/1000; [theSmoothSlider setFloatValue: smooth]; if (theEnvelope!=NULL) [theEnvelope setSmoothAt: [thePoint intValue] to: smooth]; return self; } - setSmoothFromSlider:sender { float smooth; smooth=[sender floatValue]; smooth=rint(smooth*1000)/1000; [theSmoothing setFloatValue: smooth]; if (theEnvelope!=NULL) [theEnvelope setSmoothAt: [thePoint intValue] to: smooth]; return self; } - broadcastXLimitsOf:envelope { unsigned int i; List * envelopes; double max, min; min=[envelope getXMin]; max=[envelope getXMax]; envelopes=[theSplitView subviews]; for (i=0; i<[envelopes count]; i++) [[envelopes objectAt: i] setXLimitsTo:min :max]; return self; } - setXMinValue:sender { if (theEnvelope!=NULL) { [theEnvelope setXMinTo: [sender floatValue]]; if ([theLinkX state]==1) [self broadcastXLimitsOf: theEnvelope]; } return self; } - setXMaxValue:sender { if (theEnvelope!=NULL) { [theEnvelope setXMaxTo: [sender floatValue]]; if ([theLinkX state]==1) [self broadcastXLimitsOf: theEnvelope]; } return self; } - setYMinValue:sender { if (theEnvelope!=NULL) { [theEnvelope setYMinTo: [sender floatValue]]; } return self; } - setYMaxValue:sender { if (theEnvelope!=NULL) { [theEnvelope setYMaxTo: [sender floatValue]]; } return self; } - setXSnapValue:sender { if (theEnvelope!=NULL) { [theEnvelope setXSnapTo: [sender floatValue]]; } return self; } - setYSnapValue:sender { if (theEnvelope!=NULL) { [theEnvelope setYSnapTo: [sender floatValue]]; } return self; } - setStickyPoint:sender { if (theEnvelope!=NULL) [theEnvelope setStickyAt: [thePoint intValue] To: [sender state]]; return self; } - setGraphType:sender { if (theEnvelope!=NULL) [theEnvelope setShowSmooth: [sender state]]; return self; } - setDrawSegmentsState:sender { if (theEnvelope!=NULL) { if ([theEnvelope getDrawSegments]==-1) [theEnvelope setDrawSegments: 0]; else [theEnvelope setDrawSegments: -1]; } return self; } - setLinkX:sender { if (theEnvelope!=NULL && [sender state]==1) [self broadcastXLimitsOf: theEnvelope]; return self; } - reScaleLimits:sender; { if (theEnvelope!=NULL) { [theEnvelope scaleLimits]; if ([theLinkX state]==1) [self broadcastXLimitsOf: theEnvelope]; } return self; } //=================================================================== // Messages received from the envelope to query for parameters //=================================================================== - (const char *)getStyle { return [[[theOutputTypes cell] target] selectedItem]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.