
/*--------------------------------------------------------------------------------- 
   An abstract class for lines.
	 
	 HISTORY
	 
	 22Mar93	DM	Works with colors, sort of.
	 	9mar93	DM	New
	 
 ---------------------------------------------------------------------------------*/

#import <dpsclient/wraps.h>

#import <appkit/ActionCell.h>
#import <objc/List.h>

#import "ActionLine.h"
#import "line.h"												// really line.psw

@implementation ActionLine

+ initialize;
{
  PSInit();															// fire up some ps things for line drawing
	return self;
}
  
-initFrame:(NXRect*)theFrame
	title:(const char *)aString
	tag:(int)anInt
	target:anObject
	action:(SEL)aSelector
	key:(unsigned short)charCode
	enabled:(BOOL)flag;
{
  /*---------------------------------------------------------------------------------
	   Designated initializer.  Get everything set up as we want it.
	---------------------------------------------------------------------------------*/
	self = [super initFrame:theFrame
						title:aString
						tag:anInt
						target:anObject
						action:aSelector
						key:charCode
						enabled:flag];
	
	lineWidth 		= 2.0;
	enabledColor	= NX_COLORBLACK;
	disabledColor = NX_COLORDKGRAY;
	startArrow 		= NO;
	endArrow   		= NO;
	
	[self setTransparent:YES];
		
  return self;
}
	
- (const char*)inspectorName
{
  /*---------------------------------------------------------------------------------
	   The name of the class that is our inspector.  Used by IB to figure out
		 what to load when we're inspected.
	---------------------------------------------------------------------------------*/
	
    return "LinesInspector";
}

- setLineWidth:(float)pLineWidth;

{
  lineWidth = pLineWidth;
	return self;
}

- setEnabledColor:(NXColor)pLineColor;
{
  enabledColor = pLineColor;
	return self;
}

- setDisabledColor:(NXColor)pLineColor;
{
  disabledColor = pLineColor;
	return self;
}

- setEndArrow:(BOOL)pOn;
{endArrow = pOn; return self;
}

- setStartArrow:(BOOL)pOn;
{startArrow = pOn; return self;
}


- (float)lineWidth;
{ return lineWidth;}

- (NXColor)enabledColor;
{return enabledColor;
}

- (NXColor)disabledColor;
{return disabledColor;
}

- (BOOL)endArrow;
{ return endArrow;
}

- (BOOL)startArrow;
{ return startArrow;
}

- passOnEvent:(NXEvent*)theEvent;									// Pass on the event if the mouseDown missed the line
{
  /*--------------------------------------------------------------------------------
	   The event missed the lines in the view.  This is potenitially serious; eg,
		 we might have a diagonal line.  If we miss the line but still hit the (always 
		 rectangular) view, we might unintentionally catch and not release events intended 
		 for UI objects people can see underneath us.  So the button would never click.
		 
		 Just lateralling to the next responder isn't cool, since it's probably a
		 content view and just terminates in the window object.  Probably wouldn't
		 find a mouseDown: interesting anyway.
		 
		 This gets the superview, then takes a trip trough the subview list looking for
		 (1) something that isn't us, and (2) something that has a frame rectangle
		 within the mouseDown.  Not foolproof, but OK.
	--------------------------------------------------------------------------------*/
	
	View		*ourSuperview, *siblingView;							// our superview, one of our brother subviews
	List		*brotherViews;														// No, not a quaker.  the subviews of our superview
	NXPoint	hitPoint;																	// mouse down location in our superview's coord system
	NXRect	siblingFrame;
	int			i;
	BOOL		foundSibling = NO;
	
	ourSuperview = [self superview];
	brotherViews = (List*)[ourSuperview subviews];
	
	for(i = 0; i < [brotherViews count]; i++)
		{
			siblingView = [brotherViews objectAt:i];
			
			if(siblingView == self)											// Not me, nope
				continue;
			
				// event location originally in window base coords; convert it to our 
				// super view's coords.
				
			hitPoint = theEvent->location;
			[ourSuperview convertPoint:&hitPoint fromView:nil];
			[siblingView getFrame:&siblingFrame];
			
			if(NXMouseInRect(&hitPoint, &siblingFrame, NO))
				{
					[siblingView mouseDown:theEvent];			// Found another subview under us? try sending to it.
					foundSibling = YES;
					break;
				}
		}																						// end of loop thru subviews
	
	if(!foundSibling)															// didn't find it? send it on the the superview, most likely
		[nextResponder mouseDown:theEvent];
		
	return self;
}
	
	
	
	
- read:(NXTypedStream*)stream;									// Need these to get draw & drop from IB working
{
  [super read:stream];
	NXReadType(stream, "f", &lineWidth);
	enabledColor 	= NXReadColor(stream);
	disabledColor = NXReadColor(stream);
	NXReadType(stream, "c", &endArrow);
	NXReadType(stream, "c", &startArrow);
	return self;
}

- write:(NXTypedStream*)stream;
{
  [super write:stream];
	NXWriteType(stream, "f", &lineWidth);
	NXWriteColor(stream, enabledColor);
	NXWriteColor(stream, disabledColor);
	NXWriteType(stream, "c", &endArrow);
	NXWriteType(stream, "c", &startArrow);
	
	return self;
}

@end
