This is GradeSlider.m in view mode; [Download] [Up]
/* * A 4 button slider. There are some optimizations that need to be done. * Rob Ferrante, 2/92 */ #import "GradeSlider.h" #import <appkit/View.h> #import <appkit/NXImage.h> #import <dpsclient/wraps.h> #import <appkit/Application.h> #import <appkit/graphics.h> @implementation GradeSlider - initFrame: (NXRect *)r { NXSize knobSize; self = [super initFrame:r]; knobA = [[NXImage alloc] initFromSection:"A.tiff"]; knobB = [[NXImage alloc] initFromSection:"B.tiff"]; knobC = [[NXImage alloc] initFromSection:"C.tiff"]; knobD = [[NXImage alloc] initFromSection:"D.tiff"]; [knobA getSize:&knobSize]; knobOff = knobSize.width/2.0; NXSetRect(&rectA, 90,0,knobSize.width, knobSize.height); NXSetRect(&rectB, 190,0,knobSize.width, knobSize.height); NXSetRect(&rectC, 290,0,knobSize.width, knobSize.height); NXSetRect(&rectD, 390,0,knobSize.width, knobSize.height); return self; } - setAction:(SEL)a { action = a; return self; } - setTarget:(id)t { target = t; return self; } - drawSelf:(NXRect *)list:(int)count { PSsetgray(NX_DKGRAY); NXRectFill(&bounds); [knobA composite:NX_SOVER toPoint:&(rectA.origin)]; [knobB composite:NX_SOVER toPoint:&(rectB.origin)]; [knobC composite:NX_SOVER toPoint:&(rectC.origin)]; [knobD composite:NX_SOVER toPoint:&(rectD.origin)]; return self; } - mouseDown: (NXEvent *)e { NXPoint mLoc, oldLoc; NXRect *currentKnobRect, oldRect, penRect = bounds; id currentKnobImage; NXEvent *nextEvent; int oldMask, checkMask; oldMask = [window eventMask]; checkMask = NX_MOUSEUPMASK | NX_MOUSEDRAGGEDMASK; [window setEventMask:( oldMask|checkMask)]; oldLoc = e->location; [self convertPoint:&oldLoc fromView:nil]; /* Check if the cursor clicked on a button, and set up if so */ if (NXMouseInRect(&oldLoc, &rectA, NO)) { currentKnobImage = knobA; currentKnobRect = &rectA; penRect.origin.x = bounds.origin.x; penRect.size.width = rectB.origin.x - penRect.origin.x; action = @selector(moveA:); } else if (NXMouseInRect(&oldLoc, &rectB, NO)) { currentKnobImage = knobB; currentKnobRect = &rectB; penRect.origin.x = rectA.origin.x + rectA.size.width; penRect.size.width = rectC.origin.x - penRect.origin.x; action = @selector(moveB:); } else if (NXMouseInRect(&oldLoc, &rectC, NO)) { currentKnobImage = knobC; currentKnobRect = &rectC; penRect.origin.x = rectB.origin.x + rectB.size.width; penRect.size.width = rectD.origin.x - penRect.origin.x; action = @selector(moveC:); } else if (NXMouseInRect(&oldLoc, &rectD, NO)) { currentKnobImage = knobD; currentKnobRect = &rectD; penRect.origin.x = rectC.origin.x + rectC.size.width; penRect.size.width = bounds.size.width - penRect.origin.x; action = @selector(moveD:); } else return self; [self lockFocus]; PSsetgray(NX_DKGRAY); /* Loop while dragging the slider */ while ((nextEvent = [NXApp getNextEvent:checkMask])->type !=NX_MOUSEUP) { mLoc = nextEvent->location; [self convertPoint:&mLoc fromView:nil]; oldRect = *currentKnobRect; NXOffsetRect(currentKnobRect, mLoc.x - oldLoc.x, 0); if ( NXContainsRect(&penRect, currentKnobRect)==YES) { NXRectFill(&oldRect); [currentKnobImage composite:NX_COPY toPoint: ¤tKnobRect->origin]; [window flushWindow]; // so cursor doesn't flicker [self sendAction:action to:target]; oldLoc = mLoc; } else *currentKnobRect =oldRect; } [self unlockFocus]; [window setEventMask:oldMask]; return self; } - (float)posA { return rectA.origin.x + knobOff; } - (float)posB { return rectB.origin.x + knobOff; } - (float)posC { return rectC.origin.x + knobOff; } - (float)posD { return rectD.origin.x + knobOff; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.