Bug #: 4157
[WebKit-https.git] / WebKitTools / DrawTest / DrawTestToolbarController.m
1 /*
2  * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "DrawTestToolbarController.h"
27
28 #import <WebCore+SVG/DrawViewPrivate.h>
29
30 enum
31 {
32     ToolbarBrowseToolTag = 0,
33     ToolbarPanToolTag,
34     ToolbarZoomToolTag,
35     
36     ToolbarPointerToolTag,
37     ToolbarLineToolTag,
38     ToolbarRectangleToolTag,
39     ToolbarElipseToolTag,
40     ToolbarTriangleToolTag,
41     ToolbarPolyLineToolTag,
42     ToolbarArcToolTag,
43     
44     ToolbarDeleteSelectionTag,
45     
46     ToolbarMoveForwardTag,
47     ToolbarMoveBackwardTag,
48     ToolbarMoveToFrontTag,
49     ToolbarMoveToBackTag,
50     ToolbarMiscItem
51 };
52
53 // Constants
54 NSString *ToolbarIdentifier = @"Main Document Toolbar";
55
56 NSString *ToolbarBrowseToolIdentifier = @"Browse";
57 NSString *ToolbarPanToolIdentifier = @"Pan";
58 NSString *ToolbarZoomToolIdentifier = @"Zoom";
59
60 NSString *ToolbarPointerToolIdentifier = @"Pointer";
61 NSString *ToolbarRectangleToolIdentifier = @"Rectangle";
62 NSString *ToolbarElipseToolIdentifier = @"Oval";
63 NSString *ToolbarTriangleToolIdentifier = @"Triangle";
64 NSString *ToolbarPolyLineToolIdentifier = @"PolyLine";
65 NSString *ToolbarArcToolIdentifier = @"Arc";
66
67 NSString *ToolbarDeleteShapeIdentifier = @"Delete";
68 NSString *ToolbarMoveForwardIdentifier = @"Forward";
69 NSString *ToolbarMoveBackwardIdentifier = @"Backward";
70 NSString *ToolbarMoveToFrontIdentifier = @"Front";
71 NSString *ToolbarMoveToBackIdentifier = @"Back";
72
73 NSString *ToolbarPointerToolImage = @"Toolbar_Pointer";
74 NSString *ToolbarRectangleToolImage = @"Toolbar_Rectangle";
75 NSString *ToolbarElipseToolImage = @"Toolbar_Oval";
76 NSString *ToolbarTriangleToolImage = @"Toolbar_Triangle";
77
78 NSString *ToolbarDeleteShapeImage = @"Toolbar_Delete";
79 NSString *ToolbarMoveForwardImage = @"Toolbar_Forward";
80 NSString *ToolbarMoveBackwardImage = @"Toolbar_Backward";
81 NSString *ToolbarMoveToFrontImage = @"Toolbar_Front";
82 NSString *ToolbarMoveToBackImage = @"Toolbar_Back";
83
84 @interface DrawTestToolbarController (InternalMethods)
85 - (void)setupToolbar;
86 - (void)addToolbarItemWithIdentifier:(NSString *)identifier withImage:(NSString *)image withTag:(int)tag;
87 - (void)addToolbarItemWithIdentifier:(NSString *)identifier withImage:(NSString *)image;
88 - (void)addToolbarItem:(NSString *)identifier
89              withLabel:(NSString *)label
90       withPaletteLabel:(NSString *)paletteLabel
91              withImage:(NSString *)imageName
92            withToolTip:(NSString *)toolTip
93                withTag:(int)tag;
94 @end
95
96
97 @implementation DrawTestToolbarController
98
99 - (id)initWithDrawView:(DrawView *)drawView
100 {
101     if (self = [super init]){
102         _drawView = [drawView retain];
103         [self setupToolbar]; // could be done lazily.
104     }
105     return self;
106 }
107
108 - (void)dealloc
109 {
110     [_toolbarItems release];
111     [super dealloc];
112 }
113
114
115 - (void)addToolbarItemWithIdentifier:(NSString *)identifier withImage:(NSString *)image withTag:(int)tag
116 {
117     
118     [self addToolbarItem:identifier
119                withLabel:identifier
120         withPaletteLabel:identifier
121                withImage:image
122              withToolTip:identifier
123                  withTag:tag];
124 }
125
126 - (void)addToolbarItemWithIdentifier:(NSString *)identifier withImage:(NSString *)image
127 {
128     [self addToolbarItemWithIdentifier:identifier withImage:image withTag:ToolbarMiscItem];
129 }
130
131 - (void)addToolbarItem:(NSString *)identifier
132              withLabel:(NSString *)label
133       withPaletteLabel:(NSString *)paletteLabel
134              withImage:(NSString *)imageName
135            withToolTip:(NSString *)toolTip
136                withTag:(int)tag
137 {
138     NSToolbarItem *item = [[[NSToolbarItem alloc] initWithItemIdentifier:identifier] autorelease];
139     
140     [item setLabel:label];
141     [item setPaletteLabel:paletteLabel];
142     [item setToolTip:toolTip];
143     [item setImage:[NSImage imageNamed:imageName]];
144     [item setTarget:self];
145     [item setAction:@selector(clickedToolbarItem:)];
146     [item setTag:tag];
147     
148     [_toolbarItems setObject:item forKey:identifier];
149 }
150
151 - (void)setupToolbar
152 {
153     _toolbarItems = [[NSMutableDictionary alloc] init];
154     
155     [self addToolbarItemWithIdentifier:ToolbarBrowseToolIdentifier 
156                              withImage:ToolbarPointerToolImage
157                                withTag:ToolbarBrowseToolTag];
158     [[_toolbarItems objectForKey:ToolbarBrowseToolIdentifier] setImage:[[NSCursor pointingHandCursor] image]];
159     
160     [self addToolbarItemWithIdentifier:ToolbarPanToolIdentifier 
161                              withImage:ToolbarPointerToolImage
162                                withTag:ToolbarPanToolTag];
163     [[_toolbarItems objectForKey:ToolbarPanToolIdentifier] setImage:[[NSCursor openHandCursor] image]];
164     
165     [self addToolbarItemWithIdentifier:ToolbarZoomToolIdentifier 
166                              withImage:ToolbarPointerToolImage
167                                withTag:ToolbarZoomToolTag];
168     
169     
170     [self addToolbarItemWithIdentifier:ToolbarPointerToolIdentifier 
171                              withImage:ToolbarPointerToolImage
172                                withTag:ToolbarPointerToolTag];
173     
174     [self addToolbarItemWithIdentifier:ToolbarRectangleToolIdentifier 
175                              withImage:ToolbarRectangleToolImage
176                                withTag:ToolbarRectangleToolTag];
177     
178     [self addToolbarItemWithIdentifier:ToolbarElipseToolIdentifier 
179                              withImage:ToolbarElipseToolImage 
180                                withTag:ToolbarElipseToolTag];
181     
182     [self addToolbarItemWithIdentifier:ToolbarTriangleToolIdentifier 
183                              withImage:ToolbarTriangleToolImage
184                                withTag:ToolbarTriangleToolTag];
185     
186     [self addToolbarItemWithIdentifier:ToolbarDeleteShapeIdentifier 
187                              withImage:ToolbarDeleteShapeImage
188                                withTag:ToolbarDeleteSelectionTag];
189     
190     [self addToolbarItemWithIdentifier:ToolbarMoveForwardIdentifier 
191                              withImage:ToolbarMoveForwardImage
192                                withTag:ToolbarMoveForwardTag];
193     
194     [self addToolbarItemWithIdentifier:ToolbarMoveBackwardIdentifier 
195                              withImage:ToolbarMoveBackwardImage
196                                withTag:ToolbarMoveBackwardTag];
197     
198     [self addToolbarItemWithIdentifier:ToolbarMoveToFrontIdentifier 
199                              withImage:ToolbarMoveToFrontImage
200                                withTag:ToolbarMoveToFrontTag];
201     
202     [self addToolbarItemWithIdentifier:ToolbarMoveToBackIdentifier 
203                              withImage:ToolbarMoveToBackImage
204                                withTag:ToolbarMoveToBackTag];
205     
206     
207     NSToolbar *toolbar = [[[NSToolbar alloc] initWithIdentifier:ToolbarIdentifier] autorelease];
208     
209     [toolbar setAllowsUserCustomization:YES];
210     [toolbar setAutosavesConfiguration:YES];
211     [toolbar setDisplayMode:NSToolbarDisplayModeIconAndLabel];
212     [toolbar setSizeMode:NSToolbarSizeModeSmall];
213     [toolbar setDisplayMode:NSToolbarDisplayModeLabelOnly];
214     [toolbar setDelegate:self];
215     [toolbar setSelectedItemIdentifier:ToolbarBrowseToolIdentifier];
216     [toolbar setVisible:NO];
217     
218     [[_drawView window] setToolbar:toolbar];
219 }
220
221
222 - (void)clickedToolbarItem:(id)sender
223 {
224     int tag = [sender tag];
225     
226     switch(tag) {
227         case ToolbarBrowseToolTag:
228             [_drawView setToolMode:DrawViewToolBrowse];
229             break;
230         case ToolbarPanToolTag:
231             [_drawView setToolMode:DrawViewToolPan];
232             break;
233         case ToolbarZoomToolTag:
234             [_drawView setToolMode:DrawViewToolZoom];
235             break;
236         case ToolbarPointerToolTag:
237             [_drawView setToolMode:DrawViewToolArrow];
238             break;
239         case ToolbarRectangleToolTag:
240             [_drawView setToolMode:DrawViewToolRectangle];
241             break;
242         case ToolbarElipseToolTag:
243             [_drawView setToolMode:DrawViewToolElipse];
244             break;
245         case ToolbarTriangleToolTag:
246             [_drawView setToolMode:DrawViewToolTriangle];
247             break;
248         case ToolbarMoveForwardTag:
249             [_drawView moveSelectionForward:sender];
250             break;
251         case ToolbarMoveBackwardTag:
252             [_drawView moveSelectionBackward:sender];
253             break;
254         case ToolbarDeleteSelectionTag:
255             [_drawView deleteSelection:sender];
256             break;
257         default:
258             NSLog(@"Toolbar item: %i not implemented!", tag);
259     }
260     
261     [_drawView setNeedsDisplay:YES];
262 }
263
264 // NSToolbar delegate methods
265 - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdent 
266  willBeInsertedIntoToolbar:(BOOL)willBeInserted
267
268     NSToolbarItem *    toolbarItem = [_toolbarItems objectForKey:itemIdent];
269     
270     if( toolbarItem == nil )
271         toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier:itemIdent] autorelease];
272     
273     return toolbarItem;
274 }
275
276 - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
277 {
278     return [NSArray arrayWithObjects:
279         ToolbarBrowseToolIdentifier,
280         ToolbarPanToolIdentifier,
281         ToolbarZoomToolIdentifier,
282         ToolbarPointerToolIdentifier,
283         ToolbarRectangleToolIdentifier,
284         ToolbarElipseToolIdentifier,
285         ToolbarTriangleToolIdentifier,
286         ToolbarDeleteShapeIdentifier, 
287         NSToolbarShowColorsItemIdentifier,
288         ToolbarMoveForwardIdentifier,
289         ToolbarMoveBackwardIdentifier,
290         ToolbarMoveToFrontIdentifier,
291         ToolbarMoveToBackIdentifier,
292         NSToolbarCustomizeToolbarItemIdentifier,
293         NSToolbarFlexibleSpaceItemIdentifier, 
294         NSToolbarSpaceItemIdentifier, 
295         NSToolbarSeparatorItemIdentifier, nil];
296 }
297
298 - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar
299 {    
300     return [NSArray arrayWithObjects:
301         ToolbarBrowseToolIdentifier,
302         ToolbarPanToolIdentifier,
303         //ToolbarZoomToolIdentifier,
304         NSToolbarFlexibleSpaceItemIdentifier,
305         ToolbarPointerToolIdentifier,
306         ToolbarRectangleToolIdentifier,
307         ToolbarElipseToolIdentifier,
308         //ToolbarTriangleToolIdentifier, 
309         //NSToolbarSeparatorItemIdentifier,
310         ToolbarDeleteShapeIdentifier, 
311         //ToolbarMoveForwardIdentifier,
312         //ToolbarMoveBackwardIdentifier,
313         //ToolbarMoveToFrontIdentifier,
314         //ToolbarMoveToBackIdentifier, 
315         NSToolbarSeparatorItemIdentifier,
316         //NSToolbarShowColorsItemIdentifier, 
317         //NSToolbarFlexibleSpaceItemIdentifier, 
318         NSToolbarCustomizeToolbarItemIdentifier,
319         nil];
320 }
321
322 - (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar
323 {
324     return [NSArray arrayWithObjects:
325         ToolbarBrowseToolIdentifier,
326         ToolbarPanToolIdentifier,
327         ToolbarZoomToolIdentifier,    
328         ToolbarPointerToolIdentifier,
329         ToolbarRectangleToolIdentifier,
330         ToolbarElipseToolIdentifier,
331         ToolbarTriangleToolIdentifier,
332         nil];
333 }
334
335 - (BOOL)validateToolbarItem:(NSToolbarItem *)theItem
336 {
337     BOOL enabled = YES;
338     
339     switch([theItem tag]) {
340         case ToolbarMoveForwardTag:
341         case ToolbarMoveBackwardTag:
342         case ToolbarMoveToFrontTag:
343         case ToolbarMoveToBackTag:
344         case ToolbarDeleteSelectionTag:
345             enabled = ([[_drawView selectedCanvasItems] count] != 0);
346     }
347     
348     return enabled;
349 }
350
351 @end