This is EnvController.m in view mode; [Download] [Up]
/**************************************************
* SynthBuilder
* Copyright 1993 Nick Porcaro All Rights Reserved
**************************************************/
/* Generated by Interface Builder */
#import "EnvController.h"
#import "EnvelopeView.h"
#import "EnvDelegate.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 EnvController
//===================================================================
// Operations on Envelopes
//===================================================================
- free
{
[theEnvelopeView free];
return [super free];
}
- envelope
{
return [theEnvelopeView envelope];
}
- setNewEnvelope:anEnv
{
if (!theEnvelopeView)
{
[self addEnvelope:self];
}
[theEnvelopeView setNewEnvelope:anEnv];
return self;
}
- envelopeDrawn
/* Do the right thing when the envelope has been drawn */
{
[theDelegate sendEnvelope];
return self;
}
- addEnvelope:sender
{
id old;
NXRect * theFrame;
[theDelegate willAddEnvelope];
theFrame = NXZoneMalloc([self zone], sizeof (NXRect));
[theSplitView getFrame: theFrame];
old=theEnvelopeView;
if (old!=NULL) [old dim];
theEnvelopeView=[[EnvelopeView alloc] initFrame: theFrame];
[theEnvelopeView controllerIs: self];
[theDelegate willSplitView];
[theSplitView addSubview: theEnvelopeView];
[theSplitView adjustSubviews];
[theSplitView display];
[theWindow makeFirstResponder: theEnvelopeView];
if (old!=NULL && [theLinkX state]==1)
[self broadcastXLimitsOf: old];
NXZoneFree([self zone], theFrame);
[theDelegate envelopeAdded];
return self;
}
- removeEnvelope:sender
{
id views;
unsigned int lastIndex;
[theDelegate willRemoveEnvelope];
if (theEnvelopeView!=NULL) {
lastIndex=[[theSplitView subviews]
indexOf: theEnvelopeView]; // where is on the subview list?
lastDeleted=[theEnvelopeView copy]; // remember last envelope...
[theEnvelopeView removeFromSuperview]; // ...but delete it from the window!
views=[theSplitView subviews];
if ([views count]==0) // define pointer to new envelope
theEnvelopeView=NULL;
else {
if ((theEnvelopeView=[views objectAt: lastIndex])==NULL)
theEnvelopeView=[views objectAt: 0];
}
if (theEnvelopeView!=NULL)
[theWindow makeFirstResponder: theEnvelopeView];
[theDelegate willSplitView];
[theSplitView adjustSubviews]; // display new split view
[theSplitView display];
}
[theDelegate envelopeRemoved];
return self;
}
- unRemoveEnvelope:sender
{
id old;
if (lastDeleted!=NULL) { // only if previous delete
[theSplitView addSubview: lastDeleted];
old=theEnvelopeView;
if (old!=NULL) [old dim];
theEnvelopeView=lastDeleted; // set new current envelope
lastDeleted=NULL;
[theWindow makeFirstResponder: theEnvelopeView];
if (old!=NULL && [theLinkX state]==1)
[self broadcastXLimitsOf: old];
[theDelegate willSplitView];
[theSplitView adjustSubviews];
[theSplitView display];
}
return self;
}
- update: sender
{
int point;
if (theEnvelopeView!=NULL && theEnvelopeView!=sender)
[theEnvelopeView dim];
if (theEnvelopeView!=sender) {
theEnvelopeView=sender;
[theEnvelopeView highlight];
[theWindow makeFirstResponder: theEnvelopeView];
}
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 (theEnvelopeView!=NULL)
return [theEnvelopeView copy: sender];
return self;
}
- paste:sender
{
if (theEnvelopeView!=NULL)
return [theEnvelopeView paste: sender];
return self;
}
//===================================================================
// Messages received from panel buttons and fields to update parameters
//===================================================================
- nextPoint:sender
{
if (theEnvelopeView!=NULL) [theEnvelopeView nextPoint];
return self;
}
- previousPoint:sender
{
if (theEnvelopeView!=NULL) [theEnvelopeView previousPoint];
return self;
}
- setPoint:sender
{
if (theEnvelopeView!=NULL) [theEnvelopeView setPointTo: [sender intValue]];
return self;
}
- setXValue:sender
{
if (theEnvelopeView!=NULL)
[theEnvelopeView setXAt: [thePoint intValue] to: [sender floatValue]];
return self;
}
- setYValue:sender
{
if (theEnvelopeView!=NULL)
[theEnvelopeView setYAt: [thePoint intValue] to: [sender floatValue]];
return self;
}
- setYrValue:sender
{
if (theEnvelopeView!=NULL)
[theEnvelopeView setYrAt: [thePoint intValue] to: [sender floatValue]];
return self;
}
- setSmoothValue:sender
{
float smooth;
smooth=[sender floatValue];
smooth=rint(smooth*1000)/1000;
[theSmoothSlider setFloatValue: smooth];
if (theEnvelopeView!=NULL)
[theEnvelopeView setSmoothAt: [thePoint intValue] to: smooth];
return self;
}
- setSmoothFromSlider:sender
{
float smooth;
smooth=[sender floatValue];
smooth=rint(smooth*1000)/1000;
[theSmoothing setFloatValue: smooth];
if (theEnvelopeView!=NULL)
[theEnvelopeView 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
{
[self makeXMinValue: [sender floatValue]];
return self;
}
- makeXMinValue:(double) val
{
if (theEnvelopeView!=NULL) {
[theEnvelopeView setXMinTo: val];
if ([theLinkX state]==1)
[self broadcastXLimitsOf: theEnvelopeView];
}
return self;
}
- setXMaxValue:sender
{
[self makeXMaxValue: [sender floatValue]];
return self;
}
- makeXMaxValue:(double) val
{
if (theEnvelopeView!=NULL) {
[theEnvelopeView setXMaxTo: val];
if ([theLinkX state]==1)
[self broadcastXLimitsOf: theEnvelopeView];
}
return self;
}
- setYMinValue:sender
{
[self makeYMinValue: [sender floatValue]];
return self;
}
- makeYMinValue:(double) val
{
if (theEnvelopeView!=NULL) {
[theEnvelopeView setYMinTo:val];
}
return self;
}
- setYMaxValue:sender
{
[self makeYMaxValue: [sender floatValue]];
return self;
}
- makeYMaxValue:(double) val
{
if (theEnvelopeView!=NULL) {
[theEnvelopeView setYMaxTo:val];
}
return self;
}
- setXSnapValue:sender
{
if (theEnvelopeView!=NULL) {
[theEnvelopeView setXSnapTo: [sender floatValue]];
}
return self;
}
- setYSnapValue:sender
{
if (theEnvelopeView!=NULL) {
[theEnvelopeView setYSnapTo: [sender floatValue]];
}
return self;
}
- setStickyPoint:sender
{
if (theEnvelopeView!=NULL)
[theEnvelopeView setStickyAt: [thePoint intValue] To: [sender state]];
return self;
}
- makeGraphType:(int) val
{
if (theEnvelopeView!=NULL)
[theEnvelopeView setShowSmooth: val];
return self;
}
- setGraphType:sender
{
[self makeGraphType:(int) [sender state]];
return self;
}
- setDrawSegmentsState:sender
{
if (theEnvelopeView!=NULL) {
if ([theEnvelopeView getDrawSegments]==-1)
[theEnvelopeView setDrawSegments: 0];
else
[theEnvelopeView setDrawSegments: -1];
}
return self;
}
- setLinkX:sender
{
if (theEnvelopeView!=NULL && [sender state]==1)
[self broadcastXLimitsOf: theEnvelopeView];
return self;
}
- reScaleLimits:sender;
{
if (theEnvelopeView!=NULL) {
[theEnvelopeView scaleLimits];
if ([theLinkX state]==1)
[self broadcastXLimitsOf: theEnvelopeView];
}
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.