Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.app / org.gvsig.vectorediting.app.mainplugin / src / main / java / org / gvsig / vectorediting / app / mainplugin / EditingToolOptionsPanel.java @ 3016

History | View | Annotate | Download (30.2 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.vectorediting.app.mainplugin;
7

    
8
import java.awt.BorderLayout;
9
import java.awt.FlowLayout;
10
import java.awt.event.ActionEvent;
11
import java.util.ArrayList;
12
import java.util.HashMap;
13
import java.util.List;
14
import java.util.Map;
15
import java.util.Objects;
16
import javax.json.JsonObject;
17
import javax.json.JsonValue;
18
import javax.swing.BoxLayout;
19
import javax.swing.ImageIcon;
20
import javax.swing.JButton;
21
import javax.swing.JLabel;
22
import javax.swing.JPanel;
23
import javax.swing.JTabbedPane;
24
import javax.swing.SwingConstants;
25
import org.apache.commons.lang.StringUtils;
26
import org.gvsig.featureform.swing.JFeatureForm;
27
import org.gvsig.fmap.dal.DALLocator;
28
import org.gvsig.fmap.dal.DataTypes;
29
import org.gvsig.fmap.dal.exception.DataException;
30
import org.gvsig.fmap.dal.feature.EditableFeature;
31
import org.gvsig.fmap.dal.feature.Feature;
32
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
33
import org.gvsig.fmap.dal.feature.FeatureStore;
34
import org.gvsig.fmap.dal.feature.FeatureType;
35
import org.gvsig.fmap.dal.feature.FeatureTypeDefinitionsManager;
36
import org.gvsig.fmap.dal.swing.DALSwingLocator;
37
import org.gvsig.fmap.dal.swing.DataSwingManager;
38
import org.gvsig.json.Json;
39
import org.gvsig.tools.ToolsLocator;
40
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
41
import org.gvsig.tools.bookmarksandhistory.BookmarksAndHistoryManager;
42
import org.gvsig.tools.dynform.DynFormDefinition;
43
import org.gvsig.tools.dynform.DynFormFieldDefinition;
44
import org.gvsig.tools.dynform.DynFormLocator;
45
import org.gvsig.tools.dynform.DynFormManager;
46
import org.gvsig.tools.dynform.JDynForm;
47
import org.gvsig.tools.dynform.JDynFormField;
48
import org.gvsig.tools.dynobject.DynClass;
49
import org.gvsig.tools.dynobject.DynField_v2;
50
import org.gvsig.tools.dynobject.DynObjectValueItem;
51
import org.gvsig.tools.dynobject.DynStruct;
52
import org.gvsig.tools.dynobject.DynStruct_v2;
53
import org.gvsig.tools.dynobject.Tags;
54
import org.gvsig.tools.i18n.I18nManager;
55
import org.gvsig.tools.observer.Notification;
56
import org.gvsig.tools.observer.Observable;
57
import org.gvsig.tools.observer.Observer;
58
import org.gvsig.tools.persistence.PersistenceManager;
59
import org.gvsig.tools.persistence.Persistent;
60
import org.gvsig.tools.persistence.PersistentState;
61
import org.gvsig.tools.persistence.exception.PersistenceException;
62
import org.gvsig.tools.swing.api.ToolsSwingLocator;
63
import org.gvsig.tools.swing.api.ToolsSwingUtils;
64
import org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue;
65
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_GETVALUE;
66
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_SETVALUE;
67
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController;
68
import org.gvsig.vectorediting.app.mainplugin.dynformfield.point.JDynFormFieldPointFactory;
69
import org.gvsig.vectorediting.lib.api.EditingService;
70
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
71
import org.gvsig.vectorediting.lib.api.EditingServiceParameterOptions;
72
import org.gvsig.vectorediting.lib.api.EditingServiceParameterOptions.ParameterOption;
73
import org.gvsig.vectorediting.swing.api.EditingContext;
74
import org.slf4j.Logger;
75
import org.slf4j.LoggerFactory;
76

    
77
/**
78
 *
79
 * @author gvSIG Team
80
 */
81
@SuppressWarnings("UseSpecificCatch")
82
class EditingToolOptionsPanel extends JPanel {
83
    private static final Logger LOGGER = LoggerFactory.getLogger(EditingToolOptionsPanel.class);
84

    
85
    private static final String BOOKMARKSANDHISTORY_NAME = "EditingToolOptionsPanel";
86
    
87
    private final EditingContext editingContext;
88
    private EditingService service;
89
    private JDynForm form;
90
    private DynStruct_v2 definition;
91
    private final Observer contextObserver = (Observable observable, Object notification) -> {
92
        doContextChanged((Notification) notification);
93
    };
94
    private final Observer serviceObserver = (Observable observable, Object notification) -> {
95
        doServiceChanged((Notification) notification);
96
    };
97
    private JFeatureForm featureform;
98
    private JButton applyDefaultValuesButton;
99
    private ImageIcon confirmIcon;
100
    
101
    private static final Map<String, JsonObject> defaultValues = new HashMap<>();
102
    private JTabbedPane tab;
103
    private static int currentTab = 0;
104
    private JButton acceptOptionsButton;
105

    
106
    @SuppressWarnings(value = {"OverridableMethodCallInConstructor", "LeakingThisInConstructor"})
107
    public EditingToolOptionsPanel(EditingContext editingContext) {
108
        this.setLayout(new BorderLayout());
109
        this.editingContext = editingContext;
110
        this.editingContext.addObserver(this.contextObserver);
111
        EditingService activeService = editingContext.getActiveService();
112
        this.set(activeService);
113
        this.put(activeService);
114
        this.setPreferredSize(ToolsSwingUtils.ensureRowsCols(this, 10, 30));
115
        try {
116
            this.confirmIcon = ToolsSwingLocator.getIconThemeManager()
117
                    .getCurrent().get("vector-editing-tooloptions-confirm");
118
        } catch(Exception ex) {
119
            
120
        }
121
    }
122

    
123
    private Bookmarks getBookmarks(FeatureStore store) {
124
        boolean useBookmarksByTable = false; // TODO: poner esto en preferencias de edicion.
125
        BookmarksAndHistoryManager manager = ToolsLocator.getBookmarksAndHistoryManager();
126
        
127
        if( useBookmarksByTable ) {
128
            return manager.getBookmarksGroup(BOOKMARKSANDHISTORY_NAME+"_"+store.getName());        
129
        } else {
130
            return manager.getBookmarksGroup(BOOKMARKSANDHISTORY_NAME);        
131
        }
132
        
133
    }
134
    
135
    private void set(EditingService service) {
136
        if(this.service == service && service != null) {
137
            return;
138
        }
139

    
140
        if (this.service != null) {
141
            this.service.deleteObserver(this.serviceObserver);
142
        }
143
        I18nManager i18n = ToolsLocator.getI18nManager();
144
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
145
        if(this.tab != null){
146
            currentTab = this.tab.getSelectedIndex();
147
        }
148
        if (service == null) {
149
            this.removeAll();
150
            this.tab = null;
151
            JLabel label = new JLabel(
152
                    "<html><center>" +
153
                    i18n.getTranslation("_Activate_an_editing_tool_to_see_your_options_here")+
154
                    "</center></html>"
155
            );
156
            label.setHorizontalAlignment(SwingConstants.CENTER);
157
            this.add(label, BorderLayout.CENTER);
158
        } else if( service != this.service ) {
159
            this.removeAll();
160
            this.tab = null;
161
            JPanel header = new JPanel();
162
            header.setLayout(new BoxLayout(header,BoxLayout.Y_AXIS));
163
            FeatureStore store = service.getStore();
164
            header.add(
165
                    new JLabel(
166
                            i18n.getTranslation("_Table")
167
                            + ": "
168
                            + (store == null ? "(unknown)" : store.getName())
169
                    )
170
            );
171
            header.add(
172
                    new JLabel(
173
                            i18n.getTranslation("_Tool")
174
                            + ": "
175
                            + i18n.getTranslation(service.getDescription())
176
                    )
177
            );
178
            this.add(header, BorderLayout.NORTH);
179

    
180
            this.tab = new JTabbedPane();
181
            tab.setTabPlacement(JTabbedPane.BOTTOM);
182
            tab.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
183
            
184
            this.add(tab, BorderLayout.CENTER);
185
            
186
            definition = this.getToolOptionsDefinition(service);
187
            if (definition != null) {
188
                DynFormManager dynFormManager = DynFormLocator.getDynFormManager();
189
                form = dynFormManager.createJDynForm(definition);
190

    
191
                JPanel optionsPanel = new JPanel();
192
                optionsPanel.setLayout(new BorderLayout());
193
                optionsPanel.add(form.asJComponent(), BorderLayout.CENTER);
194
                JButton cancelButton = new JButton(i18n.getTranslation("_Cancel"));
195
                cancelButton.addActionListener((e) -> {
196
                    editingContext.cancelActiveService();
197
                });
198
                this.acceptOptionsButton = new JButton(i18n.getTranslation("_Accept"));
199
                this.acceptOptionsButton.addActionListener((e) -> {
200
                    applyOptions();
201
                });
202
                JPanel buttonsPanel = new JPanel();
203
                buttonsPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 2, 0 ));
204
                buttonsPanel.add(this.acceptOptionsButton);
205
                buttonsPanel.add(cancelButton);
206
                optionsPanel.add(buttonsPanel, BorderLayout.PAGE_END);
207

    
208
                tab.add(i18n.getTranslation("_Options"), optionsPanel);
209

    
210
                this.form.addListener(new JDynForm.JDynFormListener() {
211
                    @Override
212
                    public void message(String message) {
213
                    }
214

    
215
                    @Override
216
                    public void fieldChanged(JDynFormField field) {
217
                        if (acceptOptionsButton != null) {
218
                            acceptOptionsButton.setIcon(confirmIcon);
219
                        }
220
                    }
221
                });
222
            }
223
            try {
224
                JsonObject xx = defaultValues.get(store.getFullName());
225
                EditableFeature f = service.getDefaultFeatureValues();
226
                if(xx != null){
227
                    f.copyFrom(xx);
228
                }
229
                DynFormDefinition formdef = this.createFormDefinition(service);
230
                this.featureform = dataSwingManager.createJFeatureForm(formdef);                
231
                this.featureform.getDynForm().setContext(dataSwingManager.createFeaturesFormContext(store));
232
                this.featureform.setFeature(f);
233
                JPanel valuesPanel = new JPanel();
234
                valuesPanel.setLayout(new BorderLayout());
235
                valuesPanel.add(featureform.asJComponent(), BorderLayout.CENTER);
236
                applyDefaultValuesButton = new JButton(i18n.getTranslation("_Apply"));
237
                applyDefaultValuesButton.addActionListener((e) -> { applyDefaultValues(); });
238
                JButton resetDefaultValuesButton = new JButton(i18n.getTranslation("_Reset"));
239
                resetDefaultValuesButton.addActionListener((e) -> {
240
                    resetDefaultValues();
241
                });
242
                
243
                Bookmarks bookmarks = this.getBookmarks(store);
244
                JButton bookmarksButton = new JButton("...");
245
                BookmarksController bookmarksController = ToolsSwingLocator.getToolsSwingManager().createBookmarksController(
246
                        bookmarks,
247
                        bookmarksButton
248
                );
249
                bookmarksController.addActionListener((ActionEvent e) -> {
250
                    EditableFeature feature;
251
                    ActionEventWithCurrentValue<EditingToolOptionsDefaultValueBookmark> b = (ActionEventWithCurrentValue<EditingToolOptionsDefaultValueBookmark>) e;
252
                    switch (b.getID()) {
253
                        case ID_GETVALUE:
254
                            EditingToolOptionsDefaultValueBookmark bookmark = new EditingToolOptionsDefaultValueBookmark();
255
                            bookmark.setDefaultValues(service.getDefaultFeatureValues());
256
                            b.setCurrentValue(bookmark);
257
                            break;
258
                        case ID_SETVALUE:
259
                            if (b.getCurrentValue() == null) {
260
                                return;
261
                            }
262
                            JsonObject bookmarkFeature = b.getCurrentValue().getDefaultValues();
263
                            feature = service.getDefaultFeatureValues();
264
                            feature.copyFrom(bookmarkFeature);
265
                            featureform.setFeature(feature);
266
                            break;
267
                    }
268
                });
269

    
270
                JPanel applyPanel = new JPanel();
271
                applyPanel.setLayout(new FlowLayout(FlowLayout.RIGHT,4,0));
272
                applyPanel.add(applyDefaultValuesButton);
273
                applyPanel.add(resetDefaultValuesButton);
274
                applyPanel.add(bookmarksButton);
275
                valuesPanel.add(applyPanel, BorderLayout.PAGE_END);
276
                
277
                tab.add(i18n.getTranslation("_Default_values"), valuesPanel );
278
                
279
                featureform.getDynForm().addListener(new JDynForm.JDynFormListener() {
280
                    @Override
281
                    public void message(String message) {
282
                    }
283

    
284
                    @Override
285
                    public void fieldChanged(JDynFormField field) {
286
                        if(applyDefaultValuesButton != null){
287
                            applyDefaultValuesButton.setIcon(confirmIcon);
288
                        }
289
                    }
290
                });
291
                
292
            } catch (Exception ex) {
293
                LOGGER.debug("Can't create panel",ex);
294
            }
295
            ToolsSwingUtils.ensureRowsCols(this, 8, 43, 25, 60);
296
            try {
297
                tab.setSelectedIndex(currentTab);
298
            } catch (Exception ex) {
299
                LOGGER.debug("Can't activate tab",ex);
300
            }
301
            service.addObserver(this.serviceObserver);
302
        }
303
        this.service = service;
304
    }
305

    
306
    private DynFormDefinition createFormDefinition(EditingService service) throws DataException {
307
        FeatureTypeDefinitionsManager featureTypeDefinitionsManager = DALLocator.getFeatureTypeDefinitionsManager();
308
        
309
        FeatureStore store = service.getStore();
310
        FeatureType featureType = store.getDefaultFeatureType();
311
        DynClass dynClass = featureTypeDefinitionsManager.get(store,featureType);
312
        DynFormDefinition formdef = DynFormLocator.getDynFormManager().createDefinition(dynClass);
313
        for (FeatureAttributeDescriptor attr : featureType) {
314
            if( attr.isPrimaryKey() || attr.isReadOnly() ) {
315
                formdef.remove(attr.getName());
316
            }
317
        }
318
        for (DynFormFieldDefinition fielddef : formdef) {
319
            fielddef.setMandatory(false);
320
        }
321
        return formdef;
322
    }
323
    
324
    private DynStruct_v2 getToolOptionsDefinition(EditingService service) {
325
        if (service == null) {
326
            return null;
327
        }
328
        DynStruct_v2 def = (DynStruct_v2) ToolsLocator.getDynObjectManager().createDynClass(
329
                service.getName(), null
330
        );
331
        I18nManager i18n = ToolsLocator.getI18nManager();
332
        DynField_v2 field;
333
        Tags tags;
334
        List<ServiceParameterField> params = this.getServiceParameters(service);
335
        for (ServiceParameterField param : params) {
336
            switch(param.getType()) {
337
                case POSITION:
338
                    field = (DynField_v2) def.addDynField(param.getFieldName(), DataTypes.GEOMETRY);
339
                    field.setLabel(i18n.getTranslation(param.getName()));
340
                    field.setDescription(i18n.getTranslation(param.getDescription()));
341
                    field.setDefaultFieldValue(param.getDefaultValue());
342
                    tags = field.getTags();
343
                    tags.set("EditingContext", this.editingContext);
344
                    tags.set("ParamType", param.getType());
345
                    field.setSubtype(JDynFormFieldPointFactory.NAME);
346
                    field.setMandatory(false);
347
                    break;
348
                case LIST_POSITIONS:
349
                    field = (DynField_v2) def.addDynField(param.getFieldName(), DataTypes.GEOMETRY);
350
                    field.setLabel(i18n.getTranslation(param.getName()));
351
                    field.setDescription(i18n.getTranslation(param.getDescription()));
352
                    field.setDefaultFieldValue(param.getDefaultValue());
353
                    tags = field.getTags();
354
                    tags.set("EditingContext", this.editingContext);
355
                    tags.set("ParamType", param.getType());
356
                    field.setSubtype(JDynFormFieldPointFactory.NAME);
357
                    field.setMandatory(false);
358
                    break;
359
                case VALUE:
360
                    field = (DynField_v2) def.addDynFieldDouble(param.getFieldName());
361
//                    field = (DynField_v2) def.addDynField(param.getFieldName(), param.getDataType());
362
                    if( param.isAditional() ) {
363
                        field.setLabel(i18n.getTranslation("_Value"));
364
                    } else {
365
                        field.setLabel(i18n.getTranslation(param.getName()));
366
                    }
367
                    tags = field.getTags();
368
                    tags.set("ParamType", param.getType());
369
                    field.setDescription(i18n.getTranslation(param.getDescription()));
370
                    field.setDefaultFieldValue(param.getDefaultValue());
371
                    field.setMandatory(false);
372
                    break;
373

    
374
                case DISTANCE:
375
                    field = (DynField_v2) def.addDynFieldDouble(param.getFieldName());
376
//                    field = (DynField_v2) def.addDynField(param.getFieldName(), param.getDataType());
377
                    if( param.isAditional() ) {
378
                        field.setLabel(i18n.getTranslation("_Distance"));
379
                    } else {
380
                        field.setLabel(i18n.getTranslation(param.getName()));
381
                    }
382
                    tags = field.getTags();
383
                    tags.set("ParamType", param.getType());
384
                    field.setDescription(i18n.getTranslation(param.getDescription()));
385
                    field.setDefaultFieldValue(param.getDefaultValue());
386
                    field.setMandatory(false);
387
                    break;
388

    
389
                case OPTION:
390
                    field = (DynField_v2) def.addDynField(param.getFieldName(), param.getDataType());
391
                    if( param.isAditional() ) {
392
                        field.setLabel(i18n.getTranslation("_Options"));
393
                    } else {
394
                        field.setLabel(i18n.getTranslation(param.getName()));
395
                    }
396
                    field.setDescription(i18n.getTranslation(param.getDescription()));
397
                    List<DynObjectValueItem> availableValues = new ArrayList<>();
398
                    availableValues.add(new DynObjectValueItem(null, " "));
399
                    if(param.getOptions() == null){
400
                        for (ParameterOption option : param.getOptions2()) {
401
                            Object value = option.getValue();
402
                            String label = i18n.getTranslation(option.getLabel());
403
                            availableValues.add(new DynObjectValueItem(value, label));
404
                        }
405
                    } else {
406
                        for (Map.Entry<String, String> option : param.getOptions().entrySet()) {
407
                            String value = option.getKey();
408
                            String label = i18n.getTranslation(option.getValue());
409
                            availableValues.add(new DynObjectValueItem(value, label));
410
                        }
411
                    }
412
                    tags = field.getTags();
413
                    tags.set("ParamType", param.getType());
414
                    field.setAvailableValues(availableValues);
415
                    field.setDefaultFieldValue(param.getDefaultValue());
416
                    field.setMandatory(false);
417
                    break;
418
                case GEOMETRY:
419
                case SELECTION:
420
                case CLIPBOARD:
421
                    break;
422
            }
423
        }
424
        return def;
425
    }
426

    
427
    private void clear() {
428
        this.form.clear();
429
    }
430

    
431
    private void put(EditingService service) {
432
        if(this.service != service || service == null) {
433
            return;
434
        }
435

    
436
        List<ServiceParameterField> params = this.getServiceParameters(service); 
437
        for (ServiceParameterField param : params) {
438
            if(param.getIgnoreCurrentValue()){
439
                this.form.setValue(
440
                        param.getFieldName(), 
441
                        null
442
                );
443
                
444
            } else {
445
                this.form.setValue(
446
                        param.getFieldName(), 
447
                        service.getValue(param.getParameters(),param.getType())
448
                );
449
            }
450
        }
451
    }
452

    
453
    private boolean ignore_events = false;
454
    private void doServiceChanged(Notification notification) {
455
        if( ignore_events ) {
456
            return;
457
        }
458
        try {
459
            ignore_events = true;
460
            switch (notification.getType()) {
461
                case EditingService.PARAMETER_CHANGED2_NOTIFICATION:
462
                case EditingService.PARAMETER_CHANGED1_NOTIFICATION:
463
                    this.put(this.editingContext.getActiveService());
464
                    break;
465
                case EditingService.ACTIVATE_NOTIFICATION:
466
                    this.set(this.editingContext.getActiveService());
467
                    this.put(this.editingContext.getActiveService());
468
                    break;
469
                case EditingService.START_NOTIFICATION:
470
    //                this.clear();
471
                    break;
472
            }
473
        } finally {
474
            ignore_events = false;
475
        }
476
    }
477

    
478
    private void doContextChanged(Notification notification) {
479
        if (ignore_events) {
480
            return;
481
        }
482
        try {
483
            ignore_events = true;
484
            switch (notification.getType()) {
485
                case EditingContext.CHANGE_SELECTED_TOOL_NOTIFICATION:
486
                    EditingService activeService = this.editingContext.getActiveService();
487
                    this.set(activeService);
488
                    if (activeService != null) {
489
                        this.put(activeService);
490
                    }
491
                    break;
492

    
493
            }
494
        } finally {
495
            ignore_events = false;
496
        }
497
    }
498

    
499
    public void applyDefaultValues() {
500
        I18nManager i18n = ToolsLocator.getI18nManager();
501
        EditableFeature feature = this.service.getDefaultFeatureValues();
502
        this.featureform.fetch(feature);
503
        applyDefaultValuesButton.setIcon(null);
504
        defaultValues.put(this.service.getStore().getFullName(), feature.toJson());
505
    }
506
    
507
    public void resetDefaultValues() {
508
        try {
509
            FeatureStore store = this.service.getStore();
510
            EditableFeature resetValues = store.createNewFeature();
511
            EditableFeature feature = this.service.getDefaultFeatureValues();
512
            feature.copyFrom(resetValues);
513
            
514
            this.featureform.setFeature(feature);
515
            applyDefaultValuesButton.setIcon(null);
516
            defaultValues.put(this.service.getStore().getFullName(), feature.toJson());
517
        } catch (Exception ex) {
518
            LOGGER.warn("Can't reset default values",ex);
519
        }
520
    }
521
    
522
    public void applyOptions() {
523
        boolean ignore_events_save = this.ignore_events;
524
        try {
525
            this.ignore_events = true;
526
            List<ServiceParameterField> params = this.getServiceParameters(service);
527
            for (ServiceParameterField param : params) {
528
                Object value = this.form.getValue(param.getFieldName());
529
                try {
530
                    editingContext.setValue(param.getParameters(), value);
531
                } catch (Throwable th) {
532
                    LOGGER.debug("Can't set service parameter '" + param.getName() + "' to '" + Objects.toString(value) + "'.", th);
533
                }
534
            }
535
            try {
536
                editingContext.nextParameter();
537
            } catch (Exception ex) {
538
                LOGGER.debug("Can't apply service parameters.", ex);
539
            }
540
            this.acceptOptionsButton.setIcon(null);
541
        } finally {
542
            this.ignore_events = ignore_events_save;
543
        }
544
        this.put(service);
545
    }
546
    
547
    private static class ServiceParameterField {
548
        private final EditingServiceParameter param;
549
        private final EditingServiceParameter.TYPE type;
550
        private final String fieldName;
551
        private final boolean aditional;
552
        private boolean ignoreCurrentValue;
553
        
554
        public ServiceParameterField(
555
            EditingServiceParameter param,
556
            EditingServiceParameter.TYPE type,
557
            String fieldName,
558
            boolean aditional
559
            ) {
560
            this.aditional = aditional;
561
            this.fieldName = fieldName;
562
            this.param = param;
563
            this.type = type;
564
            this.ignoreCurrentValue = false;
565
        }
566

    
567
        private EditingServiceParameter.TYPE getType() {
568
            return this.type;
569
        }
570

    
571
        private String getName() {
572
            return this.param.getName();
573
        }
574

    
575
        private int getDataType() {
576
            return this.param.getDataType();
577
        }
578

    
579
        private String getDescription() {
580
            return this.param.getDescription();
581
        }
582

    
583
        private String getFieldName() {
584
            return this.fieldName;
585
        }
586

    
587
        private Object getDefaultValue() {
588
            return this.param.getDefaultValue();
589
        }
590

    
591
        private Map<String, String> getOptions() {
592
            return this.param.getOptions();
593
        }
594

    
595
        private EditingServiceParameterOptions getOptions2() {
596
            return this.param.getOptions2();
597
        }
598

    
599
        private boolean isAditional() {
600
            return this.aditional;
601
        }
602

    
603
        private EditingServiceParameter getParameters() {
604
            return this.param;
605
        }
606

    
607
        public void setIgnoreCurrentValue(boolean ignoreCurrentValue) {
608
            this.ignoreCurrentValue = ignoreCurrentValue;
609
        }
610

    
611
        public boolean getIgnoreCurrentValue() {
612
            return this.ignoreCurrentValue;
613
        }
614
    }
615
    
616
    private List<ServiceParameterField> getServiceParameters(EditingService service) {
617
        List<ServiceParameterField>params = new ArrayList<>();
618
        EditingServiceParameter.TYPE paramTypesOrdered[] =  new EditingServiceParameter.TYPE[] {
619
            EditingServiceParameter.TYPE.POSITION, 
620
            EditingServiceParameter.TYPE.LIST_POSITIONS, 
621
            EditingServiceParameter.TYPE.VALUE, 
622
            EditingServiceParameter.TYPE.DISTANCE, 
623
            EditingServiceParameter.TYPE.OPTION, 
624
            EditingServiceParameter.TYPE.GEOMETRY, 
625
            EditingServiceParameter.TYPE.SELECTION, 
626
            EditingServiceParameter.TYPE.CLIPBOARD            
627
        };
628
        int n = 0;
629
        for (EditingServiceParameter param : service.getParameters()) {
630
            int count = 0;
631
            for (int ntype = 0; ntype < paramTypesOrdered.length; ntype++) {
632
                EditingServiceParameter.TYPE type = paramTypesOrdered[ntype];
633
                if( !param.getTypes().contains(type) ) {
634
                    continue;
635
                }
636
                switch(type) {
637
                    case POSITION:
638
                    case LIST_POSITIONS:
639
                    case DISTANCE:
640
                    case GEOMETRY:
641
                    case SELECTION:
642
                    case CLIPBOARD:
643
                        break;
644
                    case VALUE:
645
                    case OPTION:
646
                        String name = String.format("param%02d%02d", n, ntype);
647
                        ServiceParameterField serviceField = new ServiceParameterField(param, type, name, count>0);
648
                        if(param.getTypes().contains(EditingServiceParameter.TYPE.LIST_POSITIONS)){
649
                            //Ver la herramienta Polyline
650
                            serviceField.setIgnoreCurrentValue(true);
651
                        }
652
                        params.add(serviceField);
653
                        count++;
654
                        break;
655

    
656
                }
657
            }
658
            n++;
659
        }
660
        return params;
661
    }
662
    
663
    public static class EditingToolOptionsDefaultValueBookmark implements Persistent {
664
        
665
        private JsonObject values;
666
        private String label;
667
        
668
        public EditingToolOptionsDefaultValueBookmark() {
669
            
670
        }
671
        
672
        public JsonObject getDefaultValues() {
673
            return this.values;
674
        }
675
        
676
        public void setDefaultValues(Feature feature) {
677
            this.values = feature.toJson();
678
        }
679

    
680
        @Override
681
        public String toString() {
682
            try {
683
                StringBuilder buffer = new StringBuilder();
684
                boolean needcolon = false;
685
                for (JsonValue value : this.values.values()) {
686
                    if( value!=null ) {
687
                        String s = Json.toString(value);
688
                        if( StringUtils.isNotBlank(s) ) {
689
                            if( needcolon ) {
690
                                buffer.append(",");
691
                            } else {
692
                                needcolon = true;
693
                            }
694
                            buffer.append(s);
695
                        }
696
                    }
697
                }
698
                return buffer.toString();
699
            } catch(Exception ex) {
700
                return "default values";
701
            }
702
        }
703

    
704
        @Override
705
        public void saveToState(PersistentState state) throws PersistenceException {            
706
            state.set("values", Objects.toString(this.values,null));
707
        }
708

    
709
        @Override
710
        public void loadFromState(PersistentState state) throws PersistenceException {
711
            String json_s = state.getString("values");
712
            if( StringUtils.isBlank(json_s) ) {
713
                this.values = null;
714
            } else {
715
                try {
716
                    this.values = Json.createObject(json_s);
717
                } catch(Exception ex) {
718
                    LOGGER.warn("Can't restore default value from persistence", ex);
719
                }
720
            }
721
        }
722
    }
723
    
724
    public static void registerPersistence() {
725
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
726
        if (manager.getDefinition("EditingToolOptionsDefaultValueBookmark") == null) {
727
            DynStruct definition = manager.addDefinition(EditingToolOptionsDefaultValueBookmark.class,
728
                    "EditingToolOptionsDefaultValueBookmark", "EditingToolOptionsDefaultValueBookmark persistence definition", null, null);
729
            definition.addDynFieldString("values");
730
        }
731
    }
732
    
733
}