//
//  EXPCloudComponent.m
//  Expression
//
//  Created by ashley on 16/12/2008.
//  Copyright 2008 __MyCompanyName__. All rights reserved.
//

#import "EXPCloudComponent.h"

@implementation EXPCloudComponent

- (id) componentType
{
	return @"Cloud";
}

- (BOOL) acceptsInputs
{
	return NO;
}

- (BOOL) acceptsOutputs
{
	return NO;
}

- (BOOL) containsPoint:(NSPoint)point
{
	printf("%s %s containsPoint:(%g,%g)\n", [[self name] UTF8String], [[[self class] description] UTF8String], point.x, point.y);
	if ([self path]==nil) {
		[self computePath];
	}
	
	BOOL contains = [[self path] containsPoint:point];
	
	return contains;
}

- (void) computePath
{
	NSPoint position = [self pos];
	float x = position.x;
	float y = position.y;

	NSBezierPath *path = [[NSBezierPath alloc] init];
	[path moveToPoint:NSMakePoint(10.0, 35.0)];
	[path curveToPoint:NSMakePoint(10.0, 10.0) controlPoint1:NSMakePoint(-10.0, 40.0) controlPoint2:NSMakePoint(-10.0, 10.0)];
	[path curveToPoint:NSMakePoint(40.0, 10.0) controlPoint1:NSMakePoint(20.0, 0.0) controlPoint2:NSMakePoint(20.0, 0.0)];
	[path curveToPoint:NSMakePoint(75.0, 10.0) controlPoint1:NSMakePoint(50.0, 0.0) controlPoint2:NSMakePoint(50.0, 0.0)];
	[path curveToPoint:NSMakePoint(75.0, 35.0) controlPoint1:NSMakePoint(85.0, 20.0) controlPoint2:NSMakePoint(85.0, 25.0)];
	[path curveToPoint:NSMakePoint(40.0, 40.0) controlPoint1:NSMakePoint(60.0, 60.0) controlPoint2:NSMakePoint(40.0, 50.0)];
	[path curveToPoint:NSMakePoint(10.0, 35.0) controlPoint1:NSMakePoint(40.0, 60.0) controlPoint2:NSMakePoint(20.0, 50.0)];
	[path closePath];
	
	NSAffineTransform *transform = [NSAffineTransform transform];
	[transform translateXBy:x yBy:y];
	[path transformUsingAffineTransform:transform];
	[self setPath:path];
	[path release];

}

- (NSPoint) closestSurfacePointToPoint:(NSPoint)point
{
	NSPoint pos = [self pos];
	NSSize size = [self size];
	float h = size.height/2.0;
	float w = size.width/2.0;
	
	float x = (point.x - pos.x - w)/w;
	float y = (point.y - pos.y - h)/h;
	NSPoint pt = EXPNearestPointOnUnitSquareToPoint(x, y);
	return NSMakePoint(pt.x*w + w + pos.x, pt.y*h + h + pos.y);
}

- (NSRect) drawingBounds
{
	if ([self path]==nil) {
		[self computePath];
	}

	NSRect bounds = [[self path] bounds];
	
	return bounds;
}

- (void) drawInView:(id)view isSelected:(BOOL)flag
{
	if ([self path]==nil) {
		[self computePath];
	}

	EXPModelObject *modelObject = [self modelObject];
	NSDictionary *defaults = [modelObject defaults];
	
	NSBezierPath *path = [self path];
	[[defaults objectForKey:@"CloudFillColour"] set];
	[path fill];
	[path setLineWidth:2.0];
	[[defaults objectForKey:@"CloudStrokeColour"] set];
	[path stroke];
	
	if (flag) {
		NSRect bounds = [path bounds];
		NSPoint pos = bounds.origin;
		NSSize size = bounds.size;
		float controlSquareSize = [[defaults objectForKey:@"ControlSquareSize"] floatValue];
		NSFrameRect(NSMakeRect(pos.x - controlSquareSize/2.0, pos.y - controlSquareSize/2.0, controlSquareSize, controlSquareSize));
		NSFrameRect(NSMakeRect(pos.x + size.width - controlSquareSize/2.0, pos.y - controlSquareSize/2.0, controlSquareSize, controlSquareSize));
		NSFrameRect(NSMakeRect(pos.x - controlSquareSize/2.0, pos.y + size.height - controlSquareSize/2.0, controlSquareSize, controlSquareSize));
		NSFrameRect(NSMakeRect(pos.x + size.width - controlSquareSize/2.0, pos.y + size.height - controlSquareSize/2.0, controlSquareSize, controlSquareSize));
	}

}	

@end