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 @ 46978

History | View | Annotate | Download (29.1 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.featuretype.FeatureTypeAttributePanel;
33
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.Tag;
34
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.TagsModel;
35
import org.gvsig.texteditor.JTextEditor;
36
import org.gvsig.tools.ToolsLocator;
37
import org.gvsig.tools.dataTypes.DataType;
38
import org.gvsig.tools.dataTypes.DataTypes;
39
import org.gvsig.tools.dynobject.DynStruct_v2;
40
import org.gvsig.tools.i18n.I18nManager;
41
import org.gvsig.tools.locator.ReferenceNotRegisteredException;
42
import org.gvsig.tools.swing.api.ChangeListenerHelper;
43
import org.gvsig.tools.swing.api.ToolsSwingLocator;
44
import org.gvsig.tools.swing.api.ToolsSwingManager;
45
import org.gvsig.tools.swing.api.ToolsSwingUtils;
46
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
47
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
48
import org.gvsig.tools.swing.icontheme.IconTheme;
49
import org.gvsig.tools.util.ToolsUtilLocator;
50
import org.slf4j.Logger;
51
import org.slf4j.LoggerFactory;
52

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

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

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

    
70
    private class FeatureTypeTableModel extends AbstractTableModel {
71

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

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

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

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

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

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

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

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

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

    
213
            JTextEditor editor = ToolsSwingLocator.getTextEditorManager().createTextEditor();
214
            editor.setContents(featureType.toJsonBuilder().toString());
215

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
669
    private void doNewField() {
670
        EditableFeatureType eft = (EditableFeatureType)this.featureType;
671
        EditableFeatureAttributeDescriptor descriptor = eft.add(
672
                this.featureType.getNewFieldName(), 
673
                DataTypes.STRING,
674
                50
675
        );
676
        if( this.mode == MODE_EDIT_ONLY_METADATA ) {
677
            descriptor.setFeatureAttributeEmulator(ExpressionUtils.createExpression("NULL"));
678
        }
679
        this.tableModel.fireUpdateEvent();
680
        int row = descriptor.getIndex();
681
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
682
        this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
683
        updateButtonState();
684

    
685
        this.descriptorPanel.put(descriptor);
686
        this.descriptorPanel.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
687
        this.btnFormFieldAccept.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
688
        this.btnFormFieldDiscard.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
689
        this.btnFormFieldModify.setEnabled(false);
690
        this.btnNew.setEnabled(false);
691
        this.btnDelete.setEnabled(false);
692
        if (descriptor instanceof EditableFeatureAttributeDescriptor) {
693
            if(this.mode == MODE_EDIT_ONLY_METADATA) {
694
                this.descriptorPanel.setMode(FeatureTypeAttributePanel.MODE_VIRTUAL_FIELD);
695
            } else {
696
                this.descriptorPanel.setMode(this.mode);
697
            }
698
        } else {
699
            this.descriptorPanel.setMode(MODE_SHOW_ONLY);
700
        }
701
        this.fieldSelectionAllowed = false;
702

    
703
        this.changeListenerHelper.fireEvent();
704
    }
705
    
706
    private void doDeleteField() {
707
        int row = this.tblFields.getSelectedRow();
708
        int[] rows = this.tblFields.getSelectedRows();
709
        ArrayList FeatureAttributeDescriptor;
710
        ArrayList<String> descriptors = new ArrayList<>();
711
        for (int rowDescriptor : rows) {
712
            if (rowDescriptor < 0) {
713
                continue;
714
            }
715
            descriptors.add(this.featureType.getAttributeDescriptor(rowDescriptor).getName());
716
        }
717
        for (String descriptor : descriptors) {
718
            ((EditableFeatureType)this.featureType).remove(descriptor);
719
        }
720
        this.tableModel.fireUpdateEvent();
721
        if( row >= this.tblFields.getRowCount()) {
722
            row = this.tblFields.getRowCount()-1;
723
        }
724
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
725
        updateButtonState();
726
        doFormFieldPut();       
727
        this.changeListenerHelper.fireEvent();
728
    }
729

    
730
    @Override
731
    public void addChangeListener(ChangeListener listener) {
732
        this.changeListenerHelper.addChangeListener(listener);
733
    }
734

    
735
    @Override
736
    public ChangeListener[] getChangeListeners() {
737
        return this.changeListenerHelper.getChangeListeners();
738
    }
739

    
740
    @Override
741
    public void removeChangeListener(ChangeListener listener) {
742
        this.changeListenerHelper.removeChangeListener(listener);
743
    }
744

    
745
    @Override
746
    public void removeAllChangeListener() {
747
        this.changeListenerHelper.removeAllChangeListener();
748
    }
749

    
750
    @Override
751
    public boolean hasChangeListeners() {
752
        return this.changeListenerHelper.hasChangeListeners();
753
    }
754
    
755
  public static void selfRegister() {
756
        ConfigurableActionsMamager cfgActionsManager;
757
        try {
758
            cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
759
        } catch(ReferenceNotRegisteredException ex) {
760
            return;
761
        }
762
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new ViewAsJsonAction());
763
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new ForceSynchronizeAction());
764
  }
765
}