This is MiscLogSliderCell.m in view mode; [Download] [Up]
// // MiscLogSliderCell.h -- a SliderCell with logarithmic transfer function // Written by Don Yacktman, Copyright (c) 1994 by Don Yacktman. // Version 1.0 All rights reserved. // This notice may not be removed from this source code. // // This object is included in the MiscKit by permission from the author // and its use is governed by the MiscKit license, found in the file // "LICENSE.rtf" in the MiscKit distribution. Please refer to that file // for a list of all applicable permissions and restrictions. // #import "MiscLogSliderCell.h" #import <math.h> #import <sys/param.h> @interface MiscLogSliderCell(Private) - _setLB; @end @implementation MiscLogSliderCell - init { id ret = [super init]; base = 10; realMax = 1000; realMin = 1; [self _setLB]; [self setDoubleValue:1]; return ret; } - _setLB { _lbx = log(realMax) / log(base); _lbn = log(realMin) / log(base); return self; } - (double)base { return base; } - (double)maxValue { return realMax; } - (double)minValue { return realMin; } // ***** need to implement range checking to make sure we are using sane numbers here! - setBase:(double)newBase { base = MAX(2, newBase); [self _setLB]; return self; } - setMaxValue:(double)aDouble { realMax = MAX(1, aDouble); [self _setLB]; return self; } - setMinValue:(double)aDouble { realMin = MAX(1, aDouble); [self _setLB]; return self; } // -doubleValue returns the right value and does all the work; the other // methods generate their values from the return from -doubleValue. // ***** These need to be implemented properly. - (const char *)stringValue { return [super stringValue]; } - setStringValue:(const char *)aString { return [super setStringValue:aString]; } // These are finished: - (int)intValue { return [self doubleValue]; } - setIntValue:(int)anInt { return [self setDoubleValue:anInt]; } - (float)floatValue { return [self doubleValue]; } - setFloatValue:(float)aFloat { return [self setDoubleValue:aFloat]; } - (double)doubleValue { return pow(base, (_lbn + [super doubleValue] * (_lbx - _lbn))); } - setDoubleValue:(double)aDouble { return [super setDoubleValue: (((log(aDouble) / log(base)) - _lbn) / (_lbx - _lbn))]; } - read:(NXTypedStream *)stream { [super read:stream]; NXReadTypes(stream, "ddd", &base, &realMax, &realMin); [self _setLB]; return self; } - write:(NXTypedStream *)stream { [super write:stream]; NXWriteTypes(stream, "ddd", &base, &realMax, &realMin); return self; } - awake { // this is all just "to be sure" if (base < 2) base = 1; if (realMax < 1) realMax = 1; if (realMin < 1) realMin = 1; [self _setLB]; return [super awake]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.