1//  PXPencilTool.m
2//  Pixen
3//
4//  Created by Joe Osborn on Tue Sep 30 2003.
5//  Copyright (c) 2003 Open Sword Group. All rights reserved.
6//
7
8#import "PXPencilTool.h"
9#import "PXCanvas.h"
10#import "PXCanvasController.h"
11#import "PXPencilToolPropertiesView.h"
12
13@implementation PXPencilTool
14
15- (NSString *)name
16{
17	return NSLocalizedString(@"PENCIL_NAME", @"Pencil Tool");
18}
19
20- (BOOL)shiftKeyDown
21{
22	shiftDown = YES;
23	return YES;
24}
25
26- (BOOL)shiftKeyUp
27{
28	shiftDown = NO;
29	return YES;
30}
31
32- init
33{
34    [super init];
35    propertiesView = [[PXPencilToolPropertiesView alloc] init];
36	shiftDown = NO;
37    return self;
38}
39
40- (void)dealloc
41{
42    [propertiesView release];
43	[super dealloc];
44}
45
46- actionName
47{
48    return NSLocalizedString(@"PENCIL_ACTION", @"Drawing");
49}
50
51- (void)setColor:aColor
52{
53    color = aColor;
54}
55
56- color
57{
58    return color;
59}
60
61- (void)drawWithOldColor:(NSColor *)oldColor newColor:(NSColor *)newColor atPoint:(NSPoint)aPoint inLayer:aLayer ofCanvas:aCanvas
62{
63	if(![aCanvas canDrawAtPoint:aPoint]) { return; }
64    id setColor = newColor;
65    [[[self undoManager] prepareWithInvocationTarget:self]
66drawWithOldColor:newColor newColor:oldColor atPoint:aPoint inLayer:aLayer ofCanvas:aCanvas];
67    [aLayer setColor:setColor atPoint:aPoint];
68    [aCanvas changedInRect:NSMakeRect(aPoint.x, aPoint.y, 1, 1)];
69}
70
71- (void)drawPixelAtPoint:(NSPoint)aPoint inCanvas:aCanvas
72{
73    if (![propertiesView respondsToSelector:@selector(lineThickness)]) {
74		[self drawWithOldColor:[aCanvas
75colorAtPoint:aPoint] newColor:[self color] atPoint:aPoint inLayer:[aCanvas activeLayer] ofCanvas:aCanvas];
76		return;
77    }
78	if ([propertiesView drawingPoints] != nil) {
79		NSArray *points = [propertiesView drawingPoints];
80		int i;
81		for (i=0; i<[points count]; i++) {
82			NSPoint point = [[points objectAtIndex:i] pointValue];
83			point.x += ceilf(aPoint.x - ([propertiesView patternSize].width / 2));
84			point.y += ceilf(aPoint.y - ([propertiesView patternSize].height / 2));
85			[self drawWithOldColor:[aCanvas
86colorAtPoint:point] newColor:[self color] atPoint:point inLayer:[aCanvas activeLayer] ofCanvas:aCanvas];
87		}
88		return;
89	}
90    int diameter = [propertiesView lineThickness];
91    int radius = diameter/2;
92    NSRect rect = NSMakeRect(aPoint.x-radius, aPoint.y-radius, diameter, diameter);
93    int x,y;
94    for (x=rect.origin.x; x<rect.origin.x+rect.size.width; x++) {
95        for (y=rect.origin.y; y<rect.origin.y+rect.size.height; y++) {
96            [self drawWithOldColor:[aCanvas
97colorAtPoint:NSMakePoint(x,y)] newColor:[self color] atPoint:NSMakePoint(x,y) inLayer:[aCanvas activeLayer] ofCanvas:aCanvas];
98        }
99    }
100}
101
102- (void)drawLineFrom:(NSPoint)initialPoint to:(NSPoint)finalPoint inCanvas:canvas
103{
104    NSPoint differencePoint = NSMakePoint(finalPoint.x - initialPoint.x, finalPoint.y - initialPoint.y);
105    NSPoint currentPoint = initialPoint;
106    while(!NSEqualPoints(finalPoint, currentPoint))
107    {
108        if(differencePoint.x == 0) { currentPoint.y += ((differencePoint.y > 0) ? 1 : -1); }
109        else if(differencePoint.y == 0) { currentPoint.x += ((differencePoint.x > 0) ? 1 : -1); }
110        else if(abs(differencePoint.x) < abs(differencePoint.y))
111        {
112            currentPoint.y += ((differencePoint.y > 0) ? 1 : -1);
113            currentPoint.x = rintf((differencePoint.x/differencePoint.y)*(currentPoint.y-initialPoint.y) + initialPoint.x);
114        }
115        else
116        {
117            currentPoint.x += ((differencePoint.x > 0) ? 1 : -1);
118            currentPoint.y = rintf((differencePoint.y/differencePoint.x)*(currentPoint.x-initialPoint.x) + initialPoint.y);
119        }
120        if([canvas canDrawAtPoint:currentPoint]) { [self drawPixelAtPoint:currentPoint inCanvas:canvas]; }
121    }
122}
123
124- (void)mouseDownAt:(NSPoint)aPoint fromCanvasController:controller
125{
126    [[self undoManager] setActionName:[self actionName]];
127    [[self undoManager] beginUndoGrouping];
128    [[[NSDocumentController sharedDocumentController] currentDocument] updateChangeCount:NSChangeDone];
129	if (!shiftDown || [[controller canvas] lastDrawnPoint].x == -1) {
130		[self drawPixelAtPoint:aPoint inCanvas:[controller canvas]];
131		[[controller canvas] changedInRect:NSMakeRect(aPoint.x, aPoint.y, 1, 1)];
132	} else {
133		[self drawLineFrom:[[controller canvas] lastDrawnPoint] to:aPoint inCanvas:[controller canvas]];
134	}
135	[[controller canvas] setLastDrawnPoint:aPoint];
136}
137
138- (void)mouseDraggedFrom:(NSPoint)initialPoint to:(NSPoint)finalPoint fromCanvasController:controller
139{
140	if (!shiftDown) {
141		[[controller canvas] setLastDrawnPoint:finalPoint];
142		[self drawLineFrom:initialPoint to:finalPoint inCanvas:[controller canvas]];
143	}
144}
145
146- (void)mouseUpAt:(NSPoint)aPoint fromCanvasController:controller
147{
148    if([[self undoManager] groupingLevel] != 0)
149	{
150		[[self undoManager] endUndoGrouping];
151	}
152}
153
154@end