Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.swing / org.gvsig.fmap.dal.swing.impl / src / main / java / org / gvsig / fmap / dal / swing / impl / featuretype / DefaultFeatureTypePanel.java @ 46850

History | View | Annotate | Download (28.2 KB)

1
package org.gvsig.fmap.dal.swing.impl.featuretype;
2

    
3
import org.gvsig.fmap.dal.swing.impl.featuretype.featurerule.FeatureRulesModel;
4
import org.gvsig.fmap.dal.swing.impl.featuretype.featurerule.FeatureRuleController;
5
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.TagController;
6
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel;
7
import java.awt.BorderLayout;
8
import java.awt.Dimension;
9
import java.awt.event.ActionEvent;
10
import java.awt.event.ActionListener;
11
import java.util.ArrayList;
12
import java.util.Objects;
13
import javax.swing.AbstractAction;
14
import javax.swing.JComponent;
15
import javax.swing.JOptionPane;
16
import javax.swing.JSplitPane;
17
import javax.swing.SwingUtilities;
18
import javax.swing.event.ChangeListener;
19
import javax.swing.event.ListSelectionEvent;
20
import javax.swing.event.ListSelectionListener;
21
import javax.swing.event.TableModelEvent;
22
import javax.swing.table.AbstractTableModel;
23
import org.apache.commons.lang3.StringUtils;
24
import org.gvsig.configurableactions.ConfigurableActionsMamager;
25
import org.gvsig.expressionevaluator.ExpressionUtils;
26
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
27
import org.gvsig.fmap.dal.feature.EditableFeatureType;
28
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
29
import org.gvsig.fmap.dal.feature.FeatureRule;
30
import org.gvsig.fmap.dal.feature.FeatureStore;
31
import org.gvsig.fmap.dal.feature.FeatureType;
32
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.Tag;
33
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.TagsModel;
34
import org.gvsig.texteditor.JTextEditor;
35
import org.gvsig.tools.ToolsLocator;
36
import org.gvsig.tools.dataTypes.DataType;
37
import org.gvsig.tools.dataTypes.DataTypes;
38
import org.gvsig.tools.dynobject.DynStruct_v2;
39
import org.gvsig.tools.i18n.I18nManager;
40
import org.gvsig.tools.locator.ReferenceNotRegisteredException;
41
import org.gvsig.tools.swing.api.ChangeListenerHelper;
42
import org.gvsig.tools.swing.api.ToolsSwingLocator;
43
import org.gvsig.tools.swing.api.ToolsSwingManager;
44
import org.gvsig.tools.swing.api.ToolsSwingUtils;
45
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
46
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
47
import org.gvsig.tools.swing.icontheme.IconTheme;
48
import org.gvsig.tools.util.ToolsUtilLocator;
49
import org.slf4j.Logger;
50
import org.slf4j.LoggerFactory;
51

    
52
/**
53
 *
54
 * @author jjdelcerro
55
 */
56
public class DefaultFeatureTypePanel 
57
        extends DefaultFeatureTypePanelView
58
        implements FeatureTypePanel
59
    {
60

    
61
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypePanel.class);
62

    
63
    private FeatureType originalFeatureType = null;
64
    private JSplitPane splRules;
65
    private JSplitPane splAttributes;
66
    private FeatureRuleController ruleController;
67
    private JSplitPane splTags;
68

    
69
    private class FeatureTypeTableModel extends AbstractTableModel {
70

    
71
        private final FeatureType featureType;
72
        private final String[] columnNames = new String[] {
73
          "Name",
74
          "Type",
75
          "Size",
76
          "Precision",
77
          "Scale",
78
          "Default value",
79
          "Calculated",
80
          "Fk"
81
        };
82
        private final Class[] columnClasses = new Class[] {
83
          String.class,
84
          String.class,
85
          Integer.class,
86
          Integer.class,
87
          Integer.class,
88
          String.class,
89
          Boolean.class,
90
          Boolean.class
91
        };
92
        
93
        public FeatureTypeTableModel() {
94
            this.featureType = null;
95
        }
96
        
97
        public FeatureTypeTableModel(FeatureType featureType) {
98
            this.featureType = featureType;
99
        }
100
        
101
        @Override
102
        public int getRowCount() {
103
            if( this.featureType==null ) {
104
                return 0;
105
            }
106
            return this.featureType.size();
107
        }
108

    
109
        @Override
110
        public int getColumnCount() {
111
            if( this.featureType==null ) {
112
                return 0;
113
            }
114
            return this.columnNames.length;
115
        }
116

    
117
        @Override
118
        public String getColumnName(int columnIndex) {
119
            if( this.featureType==null ) {
120
                return "";
121
            }
122
            return this.columnNames[columnIndex];
123
        }
124

    
125
        @Override
126
        public Class<?> getColumnClass(int columnIndex) {
127
            if( this.featureType==null ) {
128
                return String.class;
129
            }
130
            return this.columnClasses[columnIndex];
131
        }
132

    
133
        @Override
134
        public boolean isCellEditable(int rowIndex, int columnIndex) {
135
            return false;
136
        }
137

    
138
        @Override
139
        public Object getValueAt(int rowIndex, int columnIndex) {
140
            if( this.featureType==null ) {
141
                return "";
142
            }
143
            FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(rowIndex);
144
            DataType dataType = descriptor.getDataType();
145
            switch(columnIndex) {
146
                case 0:
147
                    return descriptor.getName();
148
                case 1:
149
                    return descriptor.getDataTypeName();
150
                case 2:
151
                    if( dataType.supportSize() ) {
152
                      return descriptor.getSize();
153
                    }
154
                    return null;
155
                case 3:
156
                    if( dataType.supportPrecision()) {
157
                      return descriptor.getPrecision();
158
                    }
159
                    return null;
160
                case 4:
161
                    if( dataType.supportScale()) {
162
                      return descriptor.getScale();
163
                    }
164
                    if( dataType.isNumeric() ) {
165
                      return 0;
166
                    }
167
                    return null;
168
                case 5:
169
                    return Objects.toString(descriptor.getDefaultValue(),"");
170
                case 6:
171
                    return descriptor.isComputed();
172
                case 7:
173
                    return descriptor.isForeingKey();
174
                default:
175
                    return "";
176
            }
177
        }
178

    
179
        @Override
180
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
181
        }
182
    
183
        public void fireUpdateEvent() {
184
            this.fireTableChanged(new TableModelEvent(this));
185
        }
186
    }
187
    
188
    public static class ViewAsJsonAction extends AbstractAction {
189
        
190
        @SuppressWarnings("OverridableMethodCallInConstructor")
191
        public ViewAsJsonAction() {
192
            I18nManager i18n = ToolsLocator.getI18nManager();
193

    
194
            this.putValue(NAME, i18n.getTranslation("_View_as_Json"));
195
            this.putValue(ACTION_COMMAND_KEY, "ViewAsJson");
196
        }
197

    
198
        @Override
199
        public Object getValue(String key) {
200
            if (NAME.equals(key)) {
201
                // Cuando se registra la accion aun no se han cargado las traducciones
202
                I18nManager i18n = ToolsLocator.getI18nManager();
203
                return i18n.getTranslation("_View_as_Json");
204
            }
205
            return super.getValue(key);
206
        }
207
        @Override
208
        public void actionPerformed(ActionEvent e) {
209
            DefaultFeatureTypePanel featureTypePanel = (DefaultFeatureTypePanel) e.getSource();
210
            FeatureType featureType = featureTypePanel.fetch(null);
211

    
212
            JTextEditor editor = ToolsUtilLocator.getTextEditorManager().createTextEditor();
213
            editor.setText(featureType.toJsonBuilder().toString());
214

    
215
            WindowManager winmanager = ToolsSwingLocator.getWindowManager();
216
            winmanager.showWindow(
217
                    editor.asJComponent(), 
218
                    "FeatureType - "+featureType.getName(), 
219
                    WindowManager.MODE.WINDOW
220
            );
221
        }
222
        
223
    }
224
    public static class ForceSynchronizeAction extends AbstractAction {
225
        
226
        @SuppressWarnings("OverridableMethodCallInConstructor")
227
        public ForceSynchronizeAction() {
228
            I18nManager i18n = ToolsLocator.getI18nManager();
229

    
230
            this.putValue(NAME, i18n.getTranslation("_Force_synchronize"));
231
            this.putValue(ACTION_COMMAND_KEY, "ForceSynchronize");
232
        }
233

    
234
        @Override
235
        public Object getValue(String key) {
236
            if (NAME.equals(key)) {
237
                // Cuando se registra la accion aun no se han cargado las traducciones
238
                I18nManager i18n = ToolsLocator.getI18nManager();
239
                return i18n.getTranslation("_Force_synchronize");
240
            }
241
            return super.getValue(key);
242
        }
243
        @Override
244
        public void actionPerformed(ActionEvent e) {
245
            DefaultFeatureTypePanel featureTypePanel = (DefaultFeatureTypePanel) e.getSource();
246
            featureTypePanel.featureType.forceStrongChanges();
247
        }
248
        
249
    }
250
    
251
    private DefaultFeatureAttributePanel descriptorPanel;
252
    private EditableFeatureType featureType;
253
    private int mode;
254
    private FeatureTypeTableModel tableModel;
255
    private FeatureStore store;
256
    private int currentRow;
257
    private boolean fieldSelectionAllowed;
258
    private AggregateController<Tag> tagsController;
259
    private ChangeListenerHelper changeListenerHelper;
260
    private AggregateController<FeatureRule> rulesController;
261
        
262
    public DefaultFeatureTypePanel() {
263
        this.mode = MODE_SHOW_ONLY;
264
        this.currentRow = -1;
265
        this.fieldSelectionAllowed = true;
266
        this.initComponents();
267
    }
268
    
269
    @SuppressWarnings("Convert2Lambda")
270
    private void initComponents() {
271
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
272
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
273
        JComponent c = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
274
        this.pnlCfgActions.setLayout(new BorderLayout(0,0));
275
        this.pnlCfgActions.add(c, BorderLayout.CENTER);
276

    
277
        this.splRules = ToolsSwingUtils.createVerticalSplit(
278
                this.gridRules, 
279
                this.gridRulesTable, false,
280
                this.gridRulesDetail, true
281
        );
282
        this.splAttributes = ToolsSwingUtils.createVerticalSplit(
283
                this.gridAttributes,
284
                this.gridAttributesTable, false,
285
                this.gridAttributesDetail, true
286
        );
287
        this.splTags = ToolsSwingUtils.createVerticalSplit(
288
                this.gridTags,
289
                this.gridTagsItems, false,
290
                this.gridTagsItem, true
291
        );
292
        
293
        this.changeListenerHelper = swingManager.createChangeListenerHelper();
294
        
295
        swingManager.translate(this.btnDelete);
296
        swingManager.translate(this.btnFormFieldAccept);
297
        swingManager.translate(this.btnFormFieldDiscard);
298
        swingManager.translate(this.btnFormFieldModify);
299
        swingManager.translate(this.btnNew);
300
        swingManager.translate(this.lblLabel);
301
        swingManager.translate(this.lblDescription);
302
        swingManager.translate(this.lblTags);
303
        swingManager.translate(this.tabFeatureType);
304
        swingManager.translate(this.lblRulesDefaultRules);
305
        swingManager.translate(this.lblRulesCustomRules);
306
        swingManager.translate(this.chkRulesValidateFeatureBeforeInsert);
307
        swingManager.translate(this.chkRulesValidateFeaturesAtFinishEditing);
308
        swingManager.translate(this.lblRuleName);
309
        swingManager.translate(this.lblRuleDescription);
310
        swingManager.translate(this.lblRuleCheckAtFinishEditing);
311
        swingManager.translate(this.lblRuleCheckAtUpdate);
312
        swingManager.translate(this.lblRuleValidation);
313
        swingManager.translate(this.btnRulesNew);
314
        swingManager.translate(this.btnRulesDelete);
315
        swingManager.translate(this.btnRuleFormFieldModify);
316
        swingManager.translate(this.btnRuleFormFieldAccept);
317
        swingManager.translate(this.btnRuleFormFieldDiscard);
318
        swingManager.translate(this.btnRuleValidation);
319
        swingManager.translate(this.btnRuleValidationBookmarks);
320
        swingManager.translate(this.btnRuleValidationHistory);
321
        swingManager.translate(this.lblTagsItemName);
322
        swingManager.translate(this.lblTagsItemValue);
323
        swingManager.translate(this.lblTagsItemNotes);
324
                
325
        this.tableModel = new FeatureTypeTableModel();
326
        this.tblFields.setModel(this.tableModel);
327
        this.tblFields.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
328
            @Override
329
            public void valueChanged(ListSelectionEvent e) {
330
                if( e.getValueIsAdjusting() ) {
331
                    return;
332
                }
333
                doChangeFieldSelection();
334
            }
335
        });
336
        this.descriptorPanel = new DefaultFeatureAttributePanel();
337
        this.pnlField.setLayout(new BorderLayout());
338
        this.pnlField.add(this.descriptorPanel, BorderLayout.CENTER);
339
        this.descriptorPanel.setEnabled(false);
340

    
341
        this.btnFormFieldModify.addActionListener(new ActionListener() {
342
            @Override
343
            public void actionPerformed(ActionEvent e) {
344
                doFormFieldModify();
345
            }
346
        });
347
        this.btnFormFieldDiscard.addActionListener(new ActionListener() {
348
            @Override
349
            public void actionPerformed(ActionEvent e) {
350
                doFormFieldDiscard();
351
            }
352
        });
353
        this.btnFormFieldAccept.addActionListener(new ActionListener() {
354
            @Override
355
            public void actionPerformed(ActionEvent e) {
356
                doFormFieldAccept();
357
            }
358
        });
359
        this.btnNew.addActionListener(new ActionListener() {
360
            @Override
361
            public void actionPerformed(ActionEvent e) {
362
                doNewField();
363
            }
364
        });
365
        this.btnDelete.addActionListener(new ActionListener() {
366
            @Override
367
            public void actionPerformed(ActionEvent e) {
368
                doDeleteField();
369
            }
370
        });
371
        
372
        this.tagsController = new DefaultAggregateController<>(
373
                this.tblTagsItems,
374
                this.btnTagsModify,
375
                this.btnTagsDiscard,
376
                this.btnTagsAccept,
377
                this.btnTagsNew,
378
                this.btnTagsDelete,
379
                new TagController(
380
                        this.cboTagsItemName,
381
                        this.cboTagsItemValue,
382
                        this.lblTagsItemNotesValue
383
                )
384
        );
385

    
386
        this.ruleController = new FeatureRuleController(
387
                txtRuleName,
388
                txtRuleDescription,
389
                chkRuleCheckAtFinishEditing,
390
                chkRuleCheckAtUpdate,
391
                txtRuleValidation,
392
                btnRuleValidation,
393
                btnRuleValidationBookmarks, 
394
                btnRuleValidationHistory
395
        );
396
                
397
        this.rulesController = new DefaultAggregateController<>(
398
                this.tblRules, 
399
                this.btnRuleFormFieldModify, 
400
                this.btnRuleFormFieldDiscard, 
401
                this.btnRuleFormFieldAccept, 
402
                this.btnRulesNew, 
403
                this.btnRulesDelete,
404
                ruleController
405
        );
406

    
407
        if( this.tblFields.getRowCount()>0 ) {
408
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
409
            doFormFieldPut();
410
        }
411
        this.tabFeatureType.setSelectedIndex(1);
412
        ToolsSwingUtils.ensureRowsCols(this, 30, 120, 45, 150);
413
        SwingUtilities.invokeLater( () -> {
414
                splAttributes.setDividerLocation(0.3);
415
            }
416
        );
417
        
418
    }
419
       
420
    private boolean doFormFieldFetch() {
421
        int row = this.tblFields.getSelectedRow();
422
        if (row < 0) {
423
            return true;
424
        }
425
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
426
        int previousType = descriptor.getType();
427
        if (descriptor instanceof EditableFeatureAttributeDescriptor) {
428
            if (this.descriptorPanel.fetch((EditableFeatureAttributeDescriptor) descriptor) == null) {
429
                return false;
430
            }
431
            this.tableModel.fireUpdateEvent();
432
        }
433
        FeatureAttributeDescriptor oldDescriptor = null;
434
        if (this.originalFeatureType != null) {
435
            oldDescriptor = this.originalFeatureType.getAttributeDescriptor(descriptor.getName());
436
        }
437
        if (oldDescriptor != null
438
                && oldDescriptor.getDataType() != descriptor.getDataType()
439
                && previousType != descriptor.getType()) {
440
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
441
            I18nManager i18manager = ToolsLocator.getI18nManager();
442
            StringBuilder message = new StringBuilder();
443

    
444
            String[] messageArgs = new String[]{oldDescriptor.getName()};
445
            message.append(i18manager.getTranslation("_Already_existed_a_field_named_XfieldnameX_but_with_different_data_type", messageArgs));
446
            message.append(".\n");
447
            message.append(i18manager.getTranslation("_Values_of_data_will_try_to_coerce_to_this_type"));
448
            dialogs.messageDialog(
449
                    message.toString(),
450
                    null,
451
                    i18manager.getTranslation("_Values_will_change"),
452
                    JOptionPane.INFORMATION_MESSAGE,
453
                    "feature-type-manager-field-already-exist-in-previous-schema");
454
        }
455

    
456
        return true;
457
    }
458
    
459
    private void doFormFieldPut() {
460
        int row = this.tblFields.getSelectedRow();
461
        if( row<0 ) {
462
            return;
463
        }
464
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
465
        this.currentRow = row;
466
        this.descriptorPanel.put(descriptor);
467
        updateButtonState();
468
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
469
            this.btnFormFieldModify.setEnabled((this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA) && this.tblFields.getSelectedRowCount()==1);
470
        } else {
471
            this.btnFormFieldModify.setEnabled(false);
472
        }
473
    }
474
    
475
    private void updateButtonState() {
476
        this.descriptorPanel.setEnabled(true);
477
        this.descriptorPanel.setMode(MODE_SHOW_ONLY);
478
        this.btnFormFieldAccept.setEnabled(false);
479
        this.btnFormFieldDiscard.setEnabled(false);
480
        
481
        switch(this.mode) {
482
            case MODE_EDIT_ALL:
483
                this.btnDelete.setEnabled(true);
484
                this.btnFormFieldModify.setEnabled(true);
485
                this.btnNew.setEnabled(true);
486
                this.tagsController.setEnabled(true);
487
                this.rulesController.setEnabled(true);
488
                this.txtLabel.setEditable(true);
489
                this.txtDescription.setEditable(true);
490
                break;
491
            case MODE_EDIT_ONLY_METADATA:
492
                this.btnDelete.setEnabled(this.descriptorPanel.isVirtualField());
493
                this.btnFormFieldModify.setEnabled(true);
494
                this.btnNew.setEnabled(true);
495
                this.tagsController.setEnabled(true);
496
                this.rulesController.setEnabled(true);
497
                this.txtLabel.setEditable(true);
498
                this.txtDescription.setEditable(true);
499
                break;
500
            case MODE_SHOW_ONLY:
501
                this.btnDelete.setEnabled(false);
502
                this.btnFormFieldModify.setEnabled(false);
503
                this.btnNew.setEnabled(false);
504
                this.tagsController.setEnabled(false);
505
                this.rulesController.setEnabled(false);
506
                this.txtLabel.setEditable(false);
507
                this.txtDescription.setEditable(false);
508
                break;
509
        }
510
    }
511
    
512
    private void doFormFieldModify() {
513
        int row = this.tblFields.getSelectedRow();
514
        if( row<0 ) {
515
            return;
516
        }
517
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
518
        this.descriptorPanel.put(descriptor);
519
        this.descriptorPanel.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
520
        this.btnFormFieldAccept.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
521
        this.btnFormFieldDiscard.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
522
        this.btnFormFieldModify.setEnabled(false);
523
        this.btnNew.setEnabled(false);
524
        this.btnDelete.setEnabled(false);
525
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
526
            this.descriptorPanel.setMode(this.mode);
527
        } else {
528
            this.descriptorPanel.setMode(MODE_SHOW_ONLY);
529
        }
530
        this.fieldSelectionAllowed = false;
531
        this.changeListenerHelper.fireEvent();
532
    }
533
    
534
    @Override
535
    public boolean isEditing() {
536
        return btnFormFieldAccept.isEnabled() || this.rulesController.isEditing();
537
    }
538
    
539
    private void doFormFieldAccept() {
540
        int row = this.tblFields.getSelectedRow();
541
        if( row<0 ) {
542
            return;
543
        }
544
        if( doFormFieldFetch() ) {
545
            this.updateButtonState();
546
            this.tblFields.getSelectionModel().setSelectionInterval(row, row);
547
            this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
548
            this.fieldSelectionAllowed = true;
549
        }
550
        this.changeListenerHelper.fireEvent();
551
    }
552
    
553
    private void doFormFieldDiscard() {
554
        doFormFieldPut();
555
        this.updateButtonState();
556
        this.fieldSelectionAllowed = true;
557
        this.changeListenerHelper.fireEvent();
558
    }
559

    
560
    private void doChangeFieldSelection() {
561
        int row = this.tblFields.getSelectedRow();
562
        if( row<0 ) {
563
            return;
564
        }
565
        if( !this.fieldSelectionAllowed ) {
566
            if( row !=this.currentRow ) {
567
                I18nManager i18n = ToolsLocator.getI18nManager();
568
                JOptionPane.showMessageDialog(
569
                    this, 
570
                    i18n.getTranslation("_Before_changing_field_accept_or_discard_the_changes"), 
571
                    i18n.getTranslation("_Warning"), 
572
                    JOptionPane.WARNING_MESSAGE
573
                );
574
                this.tblFields.getSelectionModel().setSelectionInterval(
575
                        this.currentRow, 
576
                        this.currentRow
577
                );
578
            }
579
            return;
580
        }
581
        doFormFieldPut();   
582
    }
583
    
584
    @Override
585
    public JComponent asJComponent() {
586
        return this;
587
    }
588

    
589
    @Override
590
    public int getMode() {
591
        return this.mode;
592
    }
593
    
594
    @Override
595
    public void setMode(int mode) {
596
        this.mode = mode;
597
        updateButtonState();
598
    }
599

    
600
    @Override
601
    public EditableFeatureType fetch(EditableFeatureType type) {
602
        if( type == null ) {
603
            type = (EditableFeatureType) this.featureType.getCopy();
604
        } else {
605
            type.removeAll();
606
            type.copyFrom(this.featureType);
607
        }
608
        type.setLabel(
609
            StringUtils.defaultIfBlank(this.txtLabel.getText(), null)
610
        );
611
        type.setDescription(
612
            StringUtils.defaultIfBlank(this.txtDescription.getText(), null)
613
        );
614
        this.tagsController.getModel().fetch(type.getTags());
615
        type.setCheckFeaturesAtInsert(this.chkRulesValidateFeatureBeforeInsert.isSelected());
616
        type.setCheckFeaturesAtFinishEditing(this.chkRulesValidateFeaturesAtFinishEditing.isSelected());
617
        return type;
618
    }
619

    
620
    @Override
621
    public void put(FeatureType type) {
622
        this.featureType = null;
623
        this.originalFeatureType = null;
624
        if (type == null) {
625
            this.store = null;
626
            this.rulesController.clean();
627
            this.tagsController.clean();
628
            this.chkRulesValidateFeatureBeforeInsert.setSelected(true);
629
            this.chkRulesValidateFeaturesAtFinishEditing.setSelected(false);
630
        } else {
631
            FeatureType ftypeToCompare = type.getOriginalFeatureType();
632
            if (ftypeToCompare == null) {
633
                ftypeToCompare = type;
634
            }
635
            this.originalFeatureType = ftypeToCompare.getCopy();
636
            this.featureType = (EditableFeatureType) type.getCopy();
637
            this.rulesController.setModel(new FeatureRulesModel(this.featureType.getRules()));
638
            this.chkRulesValidateFeatureBeforeInsert.setSelected(type.isCheckFeaturesAtInsert());
639
            this.chkRulesValidateFeaturesAtFinishEditing.setSelected(type.isCheckFeaturesAtFinishEditing());
640
            // Nos quedamos una referencia para evitar que se destruya, ya que
641
            // el featureType se guarda solo una WeakReference.
642
            this.store = type.getStore();
643
            this.ruleController.setFeatureStore(this.store);
644
            this.txtLabel.setText(
645
                    StringUtils.defaultIfBlank(((DynStruct_v2) type).getLabel(), "")
646
            );
647
            this.txtDescription.setText(
648
                    StringUtils.defaultIfBlank(((DynStruct_v2) type).getDescription(), "")
649
            );
650
            this.tagsController.setModel( new TagsModel(((DynStruct_v2) type).getTags()));
651
        }
652
        if( !(type instanceof EditableFeatureType) ) {
653
            this.setMode(MODE_SHOW_ONLY);
654
        }
655
        this.tableModel = new FeatureTypeTableModel(this.featureType);
656
        this.tblFields.setModel(this.tableModel);
657
        if( type!=null && !type.isEmpty() ) {
658
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
659
        }
660
        SwingUtilities.invokeLater(() -> {
661
            this.splAttributes.setDividerLocation(0.3);
662
        });
663

    
664
        updateButtonState();
665
        doFormFieldPut();       
666
    }
667

    
668
    private void doNewField() {
669
        EditableFeatureType eft = (EditableFeatureType)this.featureType;
670
        EditableFeatureAttributeDescriptor descriptor = eft.add(
671
                this.featureType.getNewFieldName(), 
672
                DataTypes.STRING,
673
                50
674
        );
675
        if( this.mode == MODE_EDIT_ONLY_METADATA ) {
676
            descriptor.setFeatureAttributeEmulator(ExpressionUtils.createExpression("NULL"));
677
        }
678
        this.tableModel.fireUpdateEvent();
679
        int row = descriptor.getIndex();
680
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
681
        this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
682
        updateButtonState();
683
        doFormFieldModify();    
684
        this.changeListenerHelper.fireEvent();
685
    }
686
    
687
    private void doDeleteField() {
688
        int row = this.tblFields.getSelectedRow();
689
        int[] rows = this.tblFields.getSelectedRows();
690
        ArrayList FeatureAttributeDescriptor;
691
        ArrayList<String> descriptors = new ArrayList<>();
692
        for (int rowDescriptor : rows) {
693
            if (rowDescriptor < 0) {
694
                continue;
695
            }
696
            descriptors.add(this.featureType.getAttributeDescriptor(rowDescriptor).getName());
697
        }
698
        for (String descriptor : descriptors) {
699
            ((EditableFeatureType)this.featureType).remove(descriptor);
700
        }
701
        this.tableModel.fireUpdateEvent();
702
        if( row >= this.tblFields.getRowCount()) {
703
            row = this.tblFields.getRowCount()-1;
704
        }
705
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
706
        updateButtonState();
707
        doFormFieldPut();       
708
        this.changeListenerHelper.fireEvent();
709
    }
710

    
711
    @Override
712
    public void addChangeListener(ChangeListener listener) {
713
        this.changeListenerHelper.addChangeListener(listener);
714
    }
715

    
716
    @Override
717
    public ChangeListener[] getChangeListeners() {
718
        return this.changeListenerHelper.getChangeListeners();
719
    }
720

    
721
    @Override
722
    public void removeChangeListener(ChangeListener listener) {
723
        this.changeListenerHelper.removeChangeListener(listener);
724
    }
725

    
726
    @Override
727
    public void removeAllChangeListener() {
728
        this.changeListenerHelper.removeAllChangeListener();
729
    }
730

    
731
    @Override
732
    public boolean hasChangeListeners() {
733
        return this.changeListenerHelper.hasChangeListeners();
734
    }
735
    
736
  public static void selfRegister() {
737
        ConfigurableActionsMamager cfgActionsManager;
738
        try {
739
            cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
740
        } catch(ReferenceNotRegisteredException ex) {
741
            return;
742
        }
743
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new ViewAsJsonAction());
744
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new ForceSynchronizeAction());
745
  }
746
}