#import "EXPModelView.h"
#import "EXPDocument.h"
#import "EXPModelObject.h"
#import "EXPComponent.h"

@implementation EXPModelView

- (id)initWithFrame:(NSRect)frameRect
{
	if ((self = [super initWithFrame:frameRect]) != nil) {
	}
	return self;
}

- (NSRect) drawingBounds
{
	EXPDocument *doc = [self delegate];
	EXPModelObject *modelObject = [doc modelObject];

	return [modelObject drawingBounds];
}

- (BOOL) isFlipped
{
	return YES;
}

- (BOOL)isOpaque
{
	return YES;
}

- (void)drawRect:(NSRect)rect
{
//	NSLog(@"EXPModelView drawRect: %@", NSStringFromRect(rect));
	EXPDocument *doc = [self delegate];
	EXPModelObject *modelObject = [doc modelObject];
	[modelObject drawInView:self];
}

- (void)mouseDown:(NSEvent *)event
{
//	NSLog(@"EXPModelView: mouseDown, event = %@", event);
	NSPoint point = [event locationInWindow];
	point = [self convertPoint:point fromView:nil];
	lastPoint = point;
	
//	int button = [event buttonNumber];
//	printf("Button = %d\n", button);
	
	[[self delegate] mouseDownAtPoint:point];
}

- (void)mouseUp:(NSEvent *)event
{
//	NSLog(@"EXPModelView: mouseUp, event = %@", event);
	NSPoint point = [event locationInWindow];
	point = [self convertPoint:point fromView:nil];
//	lastPoint = point;
	
	[[self delegate] mouseUpAtPoint:point];
}

- (void)mouseDragged:(NSEvent *)event
{
	NSPoint point = [event locationInWindow];
	point = [self convertPoint:point fromView:nil];
//	printf("Mouse dragged: {%g, %g}\n", point.x, point.y);

	[[self delegate] mouseDraggedToPoint:point];
}

- (void) setLastPoint:(NSPoint)newLastPoint
{
	lastPoint = newLastPoint;
}

- (NSPoint) lastPoint
{
	return lastPoint;
}

- (void) drawLineToPoint:(NSPoint)point
{
	float lineDash[2];
	lineDash[0] = 4.0;
	lineDash[1] = 6.0;
	[[NSColor blackColor] set];
	NSBezierPath *path = [[NSBezierPath alloc] init];
	[path setLineDash:lineDash count:2 phase:0.0];
	[path moveToPoint:lastPoint];
	[path lineToPoint:point];
	[path setLineWidth:1.0];
	[path stroke];
	[path release];

	[self setNeedsDisplay:YES];
}

- (void)setDelegate:(id)delegate
{
	_delegate = delegate;
}

- (id) delegate
{
	return _delegate;
}

@end