This is UGArgSlider.m in view mode; [Download] [Up]
/**************************************************
* SynthBuilder
* Copyright 1993 Nick Porcaro All Rights Reserved
**************************************************/
/*
* UGArgSlider.m
*/
#import <stdlib.h>
#import <stddef.h>
#import <string.h>
#import <appkit/Application.h>
#import <appkit/Control.h>
#import <appkit/Slider.h>
#import <appkit/Window.h>
#import <appkit/Panel.h>
#import "UGArgSlider.h"
#import "UGDef.h"
#import "FakeUG.h"
#import "FakeSynthPatch.h"
@implementation UGArgSlider
static char argValueStr[256];
+ initialize
/* Set the version. This can be used in a later version to distinguish older
* formats when unarchiving documents.
*/
{
[UGArgSlider setVersion:1];
return self;
}
- init
{
theFakeUG = nil;
theArgField = nil;
theArgNum = -1;
inspector = nil;
return self;
}
- initFromFakeUG: aFakeUG ArgNum:(int) argnum ArgField:aTextField ArgType:(int) type
/* Call this after allocating the object */
{
double cur_val, max_val;
NXRect virginRect;
theFakeUG = aFakeUG;
theArgNum = argnum;
theArgField = aTextField;
theArgType = type;
if (! inspector)
{
[NXApp loadNibSection:"UGArgSlider.nib" owner:self withNames:YES];
[inspector getFrame:&virginRect];
}
if (! inspectorRectJustLoaded)
{
inspectorRect = virginRect;
}
cur_val = [theArgField doubleValue];
if (cur_val <= 0)
{
/* Make a wild ass guess for the max */
max_val = 10.0;
}
else
{
/* Base the max on twice the current value */
max_val = 2 * cur_val;
}
[self setMaxVal:max_val];
[self setMinVal:0];
if (theArgType == DOUBLE)
{
[theSlider setContinuous:YES];
[theSliderValue setDoubleValue:cur_val];
[theSlider setDoubleValue:cur_val];
}
else
{
[theSlider setContinuous:NO];
[theSliderValue setIntValue:(int) cur_val];
[theSlider setIntValue:cur_val];
}
sprintf(argValueStr, "%s %s",
[aFakeUG getName],
[aFakeUG getArgName:theArgNum]);
[inspector setTitle:argValueStr];
return self;
}
- updateInspectorTitle
{
sprintf(argValueStr, "%s %s",
[theFakeUG getName],
[theFakeUG getArgName:theArgNum]);
[inspector setTitle:argValueStr];
return self;
}
- setMaxVal:(double) val
{
int ival;
[theSlider setMaxValue:val];
if (theArgType == DOUBLE)
{
[theMaxField setDoubleValue:val];
}
else
{
ival = val; /* Convert double to int */
[theMaxField setIntValue:ival];
}
return self;
}
- setMinVal:(double) val
{
int ival;
[theSlider setMinValue:val];
if (theArgType == DOUBLE)
{
[theMinField setDoubleValue:val];
}
else
{
ival = val; /* Convert double to int */
[theMinField setIntValue:ival];
}
return self;
}
- takeSliderValueFrom:aField
/* This can be called from another object to make theSlider
* and theSliderValue reflect the new value. It will also
* adjust max and min fields if they are overblown
*/
{
double val;
double ival;
if (theArgType == DOUBLE)
{
val = [aField doubleValue];
if (val > [(Slider *) theSlider maxValue])
{
[self setMaxVal:val];
}
else if (val < [(Slider *) theSlider minValue])
{
[self setMinVal:val];
}
[theSlider setDoubleValue:val];
[theSliderValue setDoubleValue:val];
}
else
{
ival = [aField intValue];
if (ival > [(Slider *) theSlider maxValue])
{
[self setMaxVal:ival];
}
else if (ival < [(Slider *) theSlider minValue])
{
[self setMinVal:ival];
}
[theSlider setIntValue:ival];
[theSliderValue setIntValue:ival];
}
return self;
}
- takeSliderMaxFrom:sender
{
[self setMaxVal:[sender doubleValue]];
return self;
}
- takeSliderMinFrom:sender
{
[self setMinVal:[sender doubleValue]];
return self;
}
- pingUGInspector
{
sprintf(argValueStr, "%f", [theSlider doubleValue]);
[theFakeUG setArg:theArgNum To:argValueStr];
return self;
}
- dispatchSliderValue:sender
/* This gets called when the slider is moved,
* or when a value is entered in theSliderValue
*/
{
double dval;
int ival;
if (theArgType == DOUBLE)
{
dval = [sender doubleValue];
sprintf(argValueStr, "%f", dval);
if ([sender isKindOfClassNamed: "TextField"])
{
[theSlider setDoubleValue:dval];
}
else
{
[theSliderValue setStringValue:argValueStr];
}
}
else /* Assume it's int for now */
{
ival = [sender intValue];
sprintf(argValueStr, "%d", ival);
if ([sender isKindOfClassNamed: "TextField"])
{
[theSlider setIntValue:ival];
}
else
{
[theSliderValue setStringValue:argValueStr];
}
}
/* Send this back to the field on the inspector
* and the theFakeUG
*/
[theFakeUG setArg:theArgNum To:argValueStr];
return self;
}
- displayInspector
{
NXRect virginRect;
if (! inspector)
{
[NXApp loadNibSection:"UGArgSlider.nib" owner:self withNames:YES];
[inspector getFrame:&virginRect];
}
if (inspectorRectJustLoaded)
{
if (useInspectorRect)
{
[inspector placeWindowAndDisplay:&inspectorRect];
useInspectorRect = NO;
}
inspectorRectJustLoaded = NO;
}
else
{
inspectorRect = virginRect;
}
/* This line adds the inspector to the WindowsMenu
* This happens automatically for FakePatchPoints and FakeUGs
* (maybe because they are separate Views?).
*/
sprintf(argValueStr, "%s %s",
[theFakeUG getName],
[theFakeUG getArgName:theArgNum]);
[NXApp addWindowsItem: inspector title:argValueStr filename:NO];
/* doHighlight toggle prevents the instance
* from being highlighted twice
*/
doHighlight = NO;
[inspector makeKeyAndOrderFront:self];
inspectorDisplayed = YES;
doHighlight = YES;
return self;
}
- highlightSelf
{
if ( (![[theFakeUG getSP] windowMiniaturized]) && doHighlight)
{
[self pingUGInspector];
[[theFakeUG inspector] orderFront:self];
}
return self;
}
- displayInspectorIfWasActive
{
if (inspectorDisplayed)
{
[self displayInspector];
}
return self;
}
- inspectorClosed
/* Called by the inspector's delegate */
{
inspectorDisplayed = NO;
return self;
}
- closeInspector
{
[inspector performClose:self];
inspectorDisplayed = NO;
return self;
}
- write:(NXTypedStream *) stream
{
[super write:stream];
if (inspector)
{
useInspectorRect = YES;
[inspector getFrame:&inspectorRect];
}
else
{
useInspectorRect = NO;
inspectorRect.origin.x = -1;
inspectorRect.origin.y = -1;
inspectorRect.size.width = -1;
inspectorRect.size.height = -1;
}
NXWriteTypes(stream, "d", &inspectorRect.origin.x);
NXWriteTypes(stream, "d", &inspectorRect.origin.y);
NXWriteTypes(stream, "d", &inspectorRect.size.width);
NXWriteTypes(stream, "d", &inspectorRect.size.height);
NXWriteTypes(stream, "c", &useInspectorRect);
NXWriteTypes(stream, "c", &inspectorDisplayed);
return self;
}
- read:(NXTypedStream *) stream
{
int version;
[super read:stream];
useInspectorRect = NO;
inspectorRectJustLoaded = NO;
version = NXTypedStreamClassVersion(stream, "UGArgSlider");
switch (version)
{
case(1):
{
NXReadTypes(stream, "d", &inspectorRect.origin.x);
NXReadTypes(stream, "d", &inspectorRect.origin.y);
NXReadTypes(stream, "d", &inspectorRect.size.width);
NXReadTypes(stream, "d", &inspectorRect.size.height);
NXReadTypes(stream, "c", &useInspectorRect);
NXReadTypes(stream, "c", &inspectorDisplayed);
inspectorRectJustLoaded = YES;
break;
}
default:
{
/* Versions before 1 did not archive anything */
break;
}
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.