This is DownhillLine.m in view mode; [Download] [Up]
/*---------------------------------------------------------------------------------------------------- Implementation of the "DownhillLine" class. See "uphillLine" for a little more documentation. HISTORY 22Mar93 DM New ----------------------------------------------------------------------------------------------------*/ #import <dpsclient/wraps.h> #import <math.h> #import "DownhillLine.h" #import "line.h" @implementation DownhillLine - drawSelf:(NXRect *)rects :(int)count; // The classic NeXT method { /*----------------------------------------------------------------------------- A "downhill" line, going from the upper left of the box to the lower right. -----------------------------------------------------------------------------*/ float redComponent, greenComponent, blueComponent, alphaComponent; // The components of the color NXColor drawingColor; // either the enabled or disabled color float angle, leg1, leg2; // utility trig things // Get the line grey and the width set, then start drawing things drawingColor = ([self isEnabled]) ? enabledColor : disabledColor; [self setFlipped:NO]; // starts out flipped in buttons. // fix that and conserve sanity NXConvertColorToRGBA(drawingColor, &redComponent, &greenComponent, &blueComponent, &alphaComponent); // Deal with the alpha component. If none is specified, set it to 1.0 (opaque paint); // otherwise, respect what was set in the color. if(alphaComponent == NX_NOALPHA) PSsetalpha(1.0); else PSsetalpha(alphaComponent); PSsetrgbcolor(redComponent, greenComponent, blueComponent); PSsetlinewidth(lineWidth); // Figure out the "start" and "end" points; don't want to go all the way to the edge, since // this screws up the arrows. angle = atan(bounds.size.height/bounds.size.width); leg1 = sin(angle) * lineWidth; leg2 = cos(angle) * lineWidth; angle = (angle/(2 * M_PI)) * 360; // Convert from radians // Draw arrows on end, if so desired. if(startArrow) { PSArrow(leg2, bounds.size.height - leg1, 180.0 - angle); // Don't go quite all the way to the edges PSstroke(); } if(endArrow) { PSArrow(bounds.size.width - leg2, leg1, 360 - angle); PSstroke(); } PSnewpath(); // Some munging around to get the arrows looking neat, if any if(startArrow) // Don't want square end butts screwing up my arrows PSmoveto(leg2, bounds.size.height - leg1); else PSmoveto(0, bounds.size.height); if(endArrow) PSlineto(bounds.size.width - leg2, leg1); else PSlineto(bounds.size.width, 0); PSstroke(); return self; } - mouseDown:(NXEvent*)theEvent; // Mousedown handling { /*---------------------------------------------------------------------- See comments in "UphillLine.m" ----------------------------------------------------------------------*/ float diagonalAngle, mouseClickAngle; //angle from x-axis, generally NXPoint mousePoint; //the click point, usually float distance; //distance to line // Convert from window coordinates to local view coordinates. mousePoint.x = theEvent->location.x; mousePoint.y = theEvent->location.y; [self convertPoint:&mousePoint fromView:nil]; mousePoint.x = mousePoint.x - bounds.origin.x; mousePoint.y = mousePoint.y - bounds.origin.y; mousePoint.y = bounds.size.height - mousePoint.y; // find the angles and the difference between them diagonalAngle = atan(bounds.size.height/bounds.size.width); mouseClickAngle = atan(mousePoint.y/mousePoint.x); distance = sqrt(mousePoint.x*mousePoint.x + mousePoint.y*mousePoint.y)* sin(fabs(diagonalAngle - mouseClickAngle)); if ((distance - (lineWidth/2.0) - HIT_TOLERANCE) <= 0.0) return [self performClick:self]; else return [self passOnEvent:theEvent]; return self; // compiler fodder } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.