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