/*	MiscVerticalArrowShape.m

	Copyright 1996 Uwe Hoffmann.

	This notice may not be removed from this source code.
	The use and distribution of this software is governed by the
	terms of the MiscKit license agreement.  Refer to the license
	document included with the MiscKit distribution for the terms.

	Version 2 (August 1996)
*/

#import <Foundation/Foundation.h>

#import "MiscVerticalArrowShape.h"
#import "MiscUserPath.h"
#import "MiscHitPath.h"
#import "MiscTDUtils.h"

@implementation MiscVerticalArrowShape 

- (NSRect)innerBounds
{
	NSRect ir,b;
	
	b = [path bounds];
	ir.origin.x = b.origin.x + b.size.width / 4;
        if(!vR)
		ir.origin.y = b.origin.y;
        else
            	ir.origin.y = b.origin.y + b.size.height / 5;
	ir.size.width = b.size.width / 2;
	ir.size.height = b.size.height * 4 / 5;
	return ir;
}

- (MiscShapeType)shapeType
{
	return MiscVerticalArrowShapeType;
}

- (void)calcIntersection:(NSPoint *)ip angle:(float *)alpha toPoint:(NSPoint)aPoint
{
	NSPoint middle,l1,l2,pos;
	float s,width,height,*bbox,ausdruck;
	
	bbox = [path bbox];
	pos.x = bbox[0];
	pos.y = bbox[1];
	width = bbox[2] - bbox[0];
	height = bbox[3] - bbox[1];	middle.x = pos.x + width / 2;
	middle.y = pos.y + height / 2;
        if(aPoint.y == middle.y){
                 ip->y = middle.y;
                 if(aPoint.x > middle.x){
                         *alpha = 0;
                         ip->x = middle.x + width / 4;
                 } else {
                         *alpha = 180;
                         ip->x = pos.x + width / 4;
                 }
                 return;
         }
	if(aPoint.x == middle.x){
		ip->x = middle.x;
		if(aPoint.y > middle.y){
			ip->y = pos.y + height;
			*alpha = 90;
		} else {
			ip->y = pos.y;
			*alpha = -90;
		}
		return;
	}
	s = (aPoint.y - middle.y) / (aPoint.x - middle.x);
	*alpha = 57.29577951 * atan(s);
        if(!vR){
            if(aPoint.y > middle.y){
                    if(aPoint.x > middle.x){ 						// I. quadrant
                            l1.x = middle.x;
                            l1.y = pos.y + height;
                            l2.y = pos.y + height * 3 / 5;
                            l2.x = pos.x + width;
                            if(miscTD_straddles(l1, l2, middle, aPoint)){
                                    ausdruck = (l2.y - l1.y) / (l2.x - l1.x);
                                    ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s);
                                    ip->y = middle.y + s * (ip->x - middle.x);
                            } else {
                                    ip->x = middle.x + width / 4;
                                    ip->y = middle.y + s * (ip->x - middle.x);
                            }
                    } else { 										// II. quadrant
                            l1.x = middle.x;
                            l1.y = pos.y + height;
                            l2.y = pos.y + height * 3 / 5;
                            l2.x = pos.x;
                            if(miscTD_straddles(l1, l2, middle, aPoint)){
                                ausdruck = (l2.y - l1.y) / (l2.x - l1.x);
                                ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s);
                                ip->y = middle.y + s * (ip->x - middle.x);
                            } else {
                                ip->x = middle.x - width / 4;
                                ip->y = middle.y + s * (ip->x - middle.x);
                            }
                            *alpha += 180;
                    }
            } else {
                    if(aPoint.x > middle.x){ 						// IV. quadrant
                            l1.x = middle.x;
                            l1.y = l2.y = pos.y;
                            l2.x = pos.x + width * 3 / 4;
                            if(miscTD_straddles(l1, l2, middle, aPoint)){
                                    ip->y = l1.y;
                                    ip->x = middle.x + (ip->y - middle.y) / s;
                            } else {
                                    ip->x = l2.x;
                                    ip->y = middle.y + s * (ip->x - middle.x);
                            }
                    } else { 										// III. quadrant
                            l1.x = middle.x;
                            l1.y = l2.y = pos.y;
                            l2.x = pos.x + width / 4;
                            if(miscTD_straddles(l1, l2, middle, aPoint)){
                                    ip->y = l1.y;
                                    ip->x = middle.x + (ip->y - middle.y) / s;
                            } else {
                                    ip->x = l2.x;
                                    ip->y = middle.y + s * (ip->x - middle.x);
                            }
                            *alpha += 180;
                    }
            }
        } else {
            if(aPoint.y > middle.y){
                    if(aPoint.x > middle.x){ 						// I. quadrant
                            l1.x = middle.x;
                            l1.y = l2.y = pos.y + height;
                            l2.x = pos.x + width * 3 / 4;
                            if(miscTD_straddles(l1, l2, middle, aPoint)){
                                ip->y = l1.y;
                                ip->x = middle.x + (ip->y - middle.y) / s;
                            } else {
                                ip->x = l2.x;
                                ip->y = middle.y + s * (ip->x - middle.x);
                            }
                    } else { 										// II. quadrant
                            l1.x = middle.x;
                            l1.y = l2.y = pos.y + height;
                            l2.x = pos.x + width / 4;
                            if(miscTD_straddles(l1, l2, middle, aPoint)){
                                ip->y = l1.y;
                                ip->x = middle.x + (ip->y - middle.y) / s;
                            } else {
                                ip->x = l2.x;
                                ip->y = middle.y + s * (ip->x - middle.x);
                            }
                            *alpha += 180;
                    }
            } else {
                    if(aPoint.x > middle.x){ 						// IV. quadrant
                            l1.x = middle.x;
                            l1.y = pos.y;
                            l2.y = pos.y + height * 2 / 5;
                            l2.x = pos.x + width;
                            if(miscTD_straddles(l1, l2, middle, aPoint)){
                                ausdruck = (l2.y - l1.y) / (l2.x - l1.x);
                                ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s);
                                ip->y = middle.y + s * (ip->x - middle.x);
                            } else {
                                ip->x = middle.x + width / 4;
                                ip->y = middle.y + s * (ip->x - middle.x);
                            }
                    } else { 										// III. quadrant
                            l1.x = middle.x;
                            l1.y = pos.y;
                            l2.y = pos.y + height * 2 / 5;
                            l2.x = pos.x;
                            if(miscTD_straddles(l1, l2, middle, aPoint)){
                                ausdruck = (l2.y - l1.y) / (l2.x - l1.x);
                                ip->x = (middle.y + ausdruck * l1.x - s * middle.x - l1.y) / (ausdruck - s);
                                ip->y = middle.y + s * (ip->x - middle.x);
                            } else {
                                ip->x = middle.x - width / 4;
                                ip->y = middle.y + s * (ip->x - middle.x);
                            }
                            *alpha += 180;
                    }
            }
        }
}


- (void)makePathWithBounds:(NSRect)aRect
{
    	if(!vR){
            [path moveto:aRect.origin.x + aRect.size.width / 4 :aRect.origin.y];
            [path rlineto:aRect.size.width / 2 :0.0];
            [path rlineto:0.0 :aRect.size.height * 3 / 5];
            [path rlineto:aRect.size.width / 4 :0.0];
            [path rlineto:-aRect.size.width / 2 :aRect.size.height * 2 / 5];
            [path rlineto:-aRect.size.width / 2 :-aRect.size.height * 2 / 5];
            [path rlineto:aRect.size.width / 4 :0.0];
        } else {
            [path moveto:aRect.origin.x + aRect.size.width / 2 :aRect.origin.y];
            [path rlineto:aRect.size.width / 2 :aRect.size.height * 2 / 5];
            [path rlineto:-aRect.size.width / 4 :0.0];
            [path rlineto:0.0 :aRect.size.height * 3 / 5];
            [path rlineto:-aRect.size.width / 2 :0.0];
            [path rlineto:0.0 :-aRect.size.height * 3 / 5];
            [path rlineto:-aRect.size.width / 4 :0.0];
        }
	[path closepath];
}
			
- (void)fillParamsWithBounds:(NSRect)aRect
{
	float *params, *bbox;
	
	params = [path params];
	bbox = [path bbox];
	bbox[0] = aRect.origin.x;
	bbox[1] = aRect.origin.y;
	bbox[2] = aRect.origin.x + aRect.size.width;
	bbox[3] = aRect.origin.y + aRect.size.height;
        if(!vR){
            params[0] = aRect.origin.x + aRect.size.width / 4;
            params[1] = aRect.origin.y;
            params[2] = aRect.size.width / 2;
            params[3] = 0.0;
            params[4] = 0.0;
            params[5] = aRect.size.height * 3 / 5;
            params[6] = aRect.size.width / 4;
            params[7] =0.0;
            params[8] = -aRect.size.width / 2;
            params[9] = aRect.size.height * 2 / 5;
            params[10] = -aRect.size.width / 2;
            params[11] = -aRect.size.height * 2 / 5;
            params[12] = aRect.size.width / 4;
            params[13] = 0.0;
        } else {
            params[0] = aRect.origin.x + aRect.size.width / 2;
            params[1] = aRect.origin.y;
            params[2] = aRect.size.width / 2;
            params[3] = aRect.size.height * 2 / 5;
            params[4] = -aRect.size.width / 4;
            params[5] = 0.0;
            params[6] = 0.0;
            params[7] = aRect.size.height * 3 / 5;
            params[8] = -aRect.size.width / 2;
            params[9] = 0.0;
            params[10] = 0.0;
            params[11] = -aRect.size.height * 3 / 5;
            params[12] = -aRect.size.width / 4;
            params[13] = 0.0;
        }
}

+ (NSSize)calcSizeForInnerSize:(NSSize)aSize
{
	NSSize os;
	
	os.width = aSize.width * 2;
	os.height = aSize.height * 5 / 4;
	return os;
}
		              
@end


	
