1/*
2 Project: Graphos
3 GRPropsEditor.m
4
5 Copyright (C) 2000-2018 GNUstep Application Project
6
7 Author: Enrico Sersale (original GDraw implementation)
8 Author: Ing. Riccardo Mottola
9
10 This application is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public
12 License as published by the Free Software Foundation; either
13 version 2 of the License, or (at your option) any later version.
14
15 This application is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 Library General Public License for more details.
19
20 You should have received a copy of the GNU General Public
21 License along with this library; if not, write to the Free
22 Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
23 */
24
25#import "GRPropsEditor.h"
26#import "GRDocView.h"
27
28@implementation GRPropsEditor
29
30- (id)init
31{
32  self = [super init];
33  if(self)
34    {
35      [NSBundle loadNibNamed:@"PropertiesEditor" owner:self];
36      docView = nil;
37      [self setControlsEnabled: NO];
38
39      [[NSNotificationCenter defaultCenter] addObserver:self
40					    selector:@selector(selectionChanged:)
41					    name:@"ObjectSelectionChanged" object:nil];
42
43      [flatnessStepper setIncrement: 0.1];
44      [miterlimitStepper setIncrement: 0.1];
45      [linewidthStepper setIncrement: 0.1];
46      [flatnessStepper setMaxValue:100];
47      [miterlimitStepper setMaxValue:180];
48      [linewidthStepper setMaxValue:1000];
49    }
50  return self;
51}
52
53
54- (void)setControlsEnabled:(BOOL)state
55{
56  [fllButt setEnabled: state];
57  [stkButt setEnabled: state];
58
59  [fillColorWell setEnabled: state];
60  [strokeColorWell setEnabled: state];
61
62  [flatnessField setEnabled: state];
63  [miterlimitField setEnabled: state];
64  [linewidthField setEnabled: state];
65  [flatnessStepper setEnabled: state];
66  [miterlimitStepper setEnabled: state];
67  [linewidthStepper setEnabled: state];
68
69  [lineCapMatrix setEnabled: state];
70  [lineJoinMatrix setEnabled: state];
71
72  [flatnessField setEnabled: state];
73  [miterlimitField setEnabled: state];
74  [linewidthField setEnabled: state];
75}
76
77- (void)readProperties
78{
79  id obj;
80  NSDictionary *props;
81
82  [[NSColorPanel sharedColorPanel] setShowsAlpha:YES];
83
84  [self setControlsEnabled: NO];
85
86  props = [docView selectionProperties];
87  if (props == nil)
88    return;
89
90  filled = [[props objectForKey: @"filled"] boolValue];
91  obj = [props objectForKey: @"fillcolor"];
92  if (obj != nil)
93    {
94      fillColor = (NSColor *)obj;
95      [fillColor retain];
96      [fllButt setEnabled: YES];
97      if (filled)
98	[fllButt setState: NSOnState];
99      else
100        [fllButt setState: NSOffState];
101      [fillColorWell setEnabled: YES];
102    }
103  else
104    fillColor = nil;
105  [fillColorWell setColor: fillColor];
106
107  stroked = [[props objectForKey:@"stroked"] boolValue];
108  obj = [props objectForKey: @"strokecolor"];
109  if (obj != nil)
110    {
111      strokeColor = (NSColor *)obj;
112      [strokeColor retain];
113      [stkButt setEnabled: YES];
114      if (stroked)
115	[stkButt setState: NSOnState];
116      else
117        [stkButt setState: NSOffState];
118      [strokeColorWell setEnabled: YES];
119    }
120  else
121    strokeColor = nil;
122  [strokeColorWell setColor: strokeColor];
123
124  obj = [props objectForKey: @"flatness"];
125  if (obj != nil)
126    {
127      flatness = [obj floatValue];
128      [flatnessField setEnabled: YES];
129      [flatnessStepper setEnabled: YES];
130    }
131  else
132    flatness = 0;
133  [flatnessField setStringValue: [NSString stringWithFormat:@"%.2f", flatness]];
134  [flatnessStepper setFloatValue: flatness];
135
136  obj = [props objectForKey: @"miterlimit"];
137  if (obj != nil)
138    {
139      miterlimit = [obj floatValue];
140      [miterlimitField setEnabled: YES];
141      [miterlimitStepper setEnabled: YES];
142    }
143  else
144    miterlimit = 0;
145  [miterlimitField setStringValue: [NSString stringWithFormat:@"%.2f", miterlimit]];
146  [miterlimitStepper setFloatValue: miterlimit];
147
148  obj = [props objectForKey: @"linewidth"];
149  if (obj != nil)
150    {
151      linewidth = [obj floatValue];
152      [linewidthField setEnabled: YES];
153      [linewidthStepper setEnabled: YES];
154    }
155  else
156    linewidth = 0.0;
157  [linewidthField setStringValue: [NSString stringWithFormat:@"%.2f", linewidth]];
158  [linewidthStepper setFloatValue:linewidth];
159
160  obj = [props objectForKey:@"linecap"];
161  if (obj != nil)
162    {
163      linecap = [[props objectForKey: @"linecap"] intValue];
164      [lineCapMatrix setEnabled: YES];
165    }
166  else
167    linecap = -1;
168
169  if(linecap == 0)
170    [lineCapMatrix setState: NSOnState atRow: 0 column: 0];
171  else if(linecap == 1)
172    [lineCapMatrix setState: NSOnState atRow: 1 column: 0];
173  else if(linecap == 2)
174    [lineCapMatrix setState: NSOnState atRow: 2 column: 0];
175
176  obj = [props objectForKey: @"linejoin"];
177  if (obj != nil)
178    {
179      linejoin = [obj intValue];
180      [lineJoinMatrix setEnabled: YES];
181    }
182  else
183    linejoin = -1;
184
185  if(linejoin == 0)
186    [lineJoinMatrix setState: NSOnState atRow: 0 column: 0];
187  else if(linejoin == 1)
188    [lineJoinMatrix setState: NSOnState atRow: 1 column: 0];
189  else if(linejoin == 2)
190    [lineJoinMatrix setState: NSOnState atRow: 2 column: 0];
191}
192
193- (void)setDocView: (GRDocView *)view
194{
195  docView = view;
196}
197
198- (void) dealloc
199{
200  [super dealloc];
201  [strokeColor release];
202  [fillColor release];
203}
204
205- (void)selectionChanged: (NSNotification *)notif
206{
207  [self readProperties];
208}
209
210- (void)makeKeyAndOrderFront:(id)sender
211{
212  [propsPanel makeKeyAndOrderFront:sender];
213}
214
215/* as delegate */
216- (void)controlTextDidEndEditing:(NSNotification *)aNotification
217{
218  NSTextField *field = (NSTextField *)[aNotification object];
219
220  if(field == flatnessField)
221    {
222      flatness = [flatnessField floatValue];
223      [flatnessStepper setFloatValue:flatness];
224    }
225  else if(field == miterlimitField)
226    {
227      miterlimit = [miterlimitField floatValue];
228      [miterlimitStepper setFloatValue:miterlimit];
229    }
230  else if(field == linewidthField)
231    {
232      linewidth = [linewidthField floatValue];
233      [linewidthStepper setFloatValue:linewidth];
234    }
235
236  [self valuesChanged: field];
237}
238
239- (IBAction)stepperAction:(id)sender
240{
241  if (sender == linewidthStepper)
242    {
243      linewidth = [sender floatValue];
244      [linewidthField setFloatValue:linewidth];
245    }
246  else if (sender == flatnessStepper)
247    {
248      flatness = [sender floatValue];
249      [flatnessField setFloatValue:flatness];
250    }
251  else if (sender == miterlimitStepper)
252    {
253      miterlimit = [sender floatValue];
254      [miterlimitField setFloatValue:miterlimit];
255    }
256  [self valuesChanged: sender];
257}
258
259- (IBAction)setLnCap:(id)sender
260{
261  linecap = [[sender selectedCell] tag];
262  [self valuesChanged: sender];
263}
264
265- (IBAction)setLnJoin:(id)sender
266{
267  linejoin = [[sender selectedCell] tag];
268  [self valuesChanged: sender];
269}
270
271- (IBAction)fllButtPressed:(id)sender
272{
273    id butt = (NSButton *)sender;
274    if([butt state] == NSOnState)
275    {
276        filled = YES;
277        [fillColorWell setEnabled: YES];
278      }
279    else
280      {
281        filled = NO;
282        [fillColorWell setEnabled: NO];
283      }
284  [self valuesChanged: sender];
285}
286
287- (IBAction)stkButtPressed:(id)sender
288{
289    id butt = (NSButton *)sender;
290    if([butt state] == NSOnState)
291      {
292        stroked = YES;
293        [strokeColorWell setEnabled: YES];
294      }
295    else
296      {
297        stroked = NO;
298        [strokeColorWell setEnabled: NO];
299      }
300  [self valuesChanged: sender];
301}
302
303- (IBAction)valuesChanged:(id)sender
304{
305  [fillColor release];
306  [strokeColor release];
307  fillColor = [[fillColorWell color] retain];
308  strokeColor = [[strokeColorWell color] retain];
309
310  [docView setSelectionProperties: [self properties]];
311}
312
313
314/* panel delegate */
315- (BOOL)windowShouldClose:(id)sender
316{
317  return YES;
318}
319
320- (NSDictionary *)properties
321{
322  NSMutableDictionary *dict;
323  NSNumber *num;
324
325  dict = [NSMutableDictionary dictionaryWithCapacity: 1];
326
327  if ([flatnessField isEnabled])
328    {
329      num = [NSNumber numberWithFloat: flatness];
330      [dict setObject: num forKey: @"flatness"];
331    }
332
333  if ([lineJoinMatrix isEnabled])
334    {
335      num = [NSNumber numberWithInt: linejoin];
336      [dict setObject: num forKey: @"linejoin"];
337    }
338
339  if ([lineCapMatrix isEnabled])
340    {
341      num = [NSNumber numberWithInt: linecap];
342      [dict setObject: num forKey: @"linecap"];
343    }
344
345  if ([miterlimitField isEnabled])
346    {
347      num = [NSNumber numberWithFloat: miterlimit];
348      [dict setObject: num forKey: @"miterlimit"];
349    }
350
351  if ([linewidthField isEnabled])
352    {
353      num = [NSNumber numberWithFloat: linewidth];
354      [dict setObject: num forKey: @"linewidth"];
355    }
356
357  if (strokeColor != nil)
358    {
359      [dict setObject: [NSNumber numberWithBool:stroked] forKey: @"stroked"];
360      [dict setObject: strokeColor forKey: @"strokecolor"];
361    }
362
363  if (fillColor != nil)
364    {
365      [dict setObject: [NSNumber numberWithBool:filled] forKey: @"filled"];
366      [dict setObject: fillColor forKey: @"fillcolor"];
367    }
368
369  return dict;
370}
371
372
373@end
374
375