
/*--------------------------------------------------------------------------------- 
   One method that draws the line.  Farily vanilla postscript; we define
	 one pswrap to draw the arrows, which I lifted from NeXT's Draw app.
	 
	 We don't always go all the way to the edges, since this can make the
	 line look ugly; eg, the pointy part of the arrow clipped off, or the
	 square end butt of the line messing up the arrow.
	 
	 HISTORY
	 
	 	9Mar93	DM	New

 ---------------------------------------------------------------------------------*/

#import "VertLine.h"
#import "line.h"

#import <dpsclient/wraps.h>

@implementation VertLine

- drawSelf:(NXRect *)rects :(int)count;
{
	float	redComponent, greenComponent, blueComponent, alphaComponent;	// The components of the color
	NXColor	drawingColor;																								// either the enabled or disabled color

		// Get the line grey and the width set, then start drawing things
	
	drawingColor = ([self isEnabled]) ? enabledColor : disabledColor;

	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);
	
			// Draw arrows on end, if so desired.
	if(startArrow)
		{
			PSArrow(bounds.size.width/2.0, 0.0 + lineWidth,270.0);					// Don't go quite all the way to the edges
			PSstroke();
		}
	
	if(endArrow)
		{
			PSArrow(bounds.size.width/2.0, bounds.size.height - lineWidth, 90);
			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(bounds.size.width/2, lineWidth);
	 else
		PSmoveto(bounds.size.width/2, 0);
	
	if(endArrow)
		PSlineto(bounds.size.width/2.0,(bounds.size.height - lineWidth));
	 else
	 	PSlineto(bounds.size.width/2.0, bounds.size.height);
	
	PSstroke();
	
	return self;
}

- mouseDown:(NXEvent*)theEvent;																	// Mousedown handling
{
	/*----------------------------------------------------------------------------
	   If the mousedown is pretty close to the vertical centerline of the view,
		 assume we got hit.  This should cause a perfromClick: operation to occur.
	----------------------------------------------------------------------------*/
  NXPoint	viewCoordHit;												// Coordinates of the hit in view-land, rather than window-land
 
 	viewCoordHit.x = theEvent->location.x;
 	viewCoordHit.y = theEvent->location.y;
 
 	[self convertPoint:&viewCoordHit fromView:NULL];

  if((viewCoordHit.x < ((bounds.size.width/2.0) + (lineWidth/2.0) + HIT_TOLERANCE)) &&
		 (viewCoordHit.x > ((bounds.size.width/2.0) - (lineWidth/2.0) - HIT_TOLERANCE)))
		{
			[self performClick:self];
		}
	else
	 		return [self passOnEvent:theEvent];

	
	return self;															// Keep compiler happy
}


@end
