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

History | View | Annotate | Download (27.8 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

    
68
    private class FeatureTypeTableModel extends AbstractTableModel {
69

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
377
        this.ruleController = new FeatureRuleController(
378
                txtRuleName,
379
                txtRuleDescription,
380
                chkRuleCheckAtFinishEditing,
381
                chkRuleCheckAtUpdate,
382
                txtRuleValidation,
383
                btnRuleValidation,
384
                btnRuleValidationBookmarks, 
385
                btnRuleValidationHistory
386
        );
387
                
388
        this.rulesController = new DefaultAggregateController<>(
389
                this.tblRules, 
390
                this.btnRuleFormFieldModify, 
391
                this.btnRuleFormFieldDiscard, 
392
                this.btnRuleFormFieldAccept, 
393
                this.btnRulesNew, 
394
                this.btnRulesDelete,
395
                ruleController
396
        );
397

    
398
        if( this.tblFields.getRowCount()>0 ) {
399
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
400
            doFormFieldPut();
401
        }
402
        ToolsSwingUtils.ensureRowsCols(this, 22, 110, 26, 120);
403
        SwingUtilities.invokeLater(new Runnable() {
404
            @Override
405
            public void run() {
406
                splAttributes.setDividerLocation(0.3);
407
            }
408
        });
409
        
410
    }
411
       
412
    private boolean doFormFieldFetch() {
413
        int row = this.tblFields.getSelectedRow();
414
        if (row < 0) {
415
            return true;
416
        }
417
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
418
        int previousType = descriptor.getType();
419
        if (descriptor instanceof EditableFeatureAttributeDescriptor) {
420
            if (this.descriptorPanel.fetch((EditableFeatureAttributeDescriptor) descriptor) == null) {
421
                return false;
422
            }
423
            this.tableModel.fireUpdateEvent();
424
        }
425
        FeatureAttributeDescriptor oldDescriptor = null;
426
        if (this.originalFeatureType != null) {
427
            oldDescriptor = this.originalFeatureType.getAttributeDescriptor(descriptor.getName());
428
        }
429
        if (oldDescriptor != null
430
                && oldDescriptor.getDataType() != descriptor.getDataType()
431
                && previousType != descriptor.getType()) {
432
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
433
            I18nManager i18manager = ToolsLocator.getI18nManager();
434
            StringBuilder message = new StringBuilder();
435

    
436
            String[] messageArgs = new String[]{oldDescriptor.getName()};
437
            message.append(i18manager.getTranslation("_Already_existed_a_field_named_XfieldnameX_but_with_different_data_type", messageArgs));
438
            message.append(".\n");
439
            message.append(i18manager.getTranslation("_Values_of_data_will_try_to_coerce_to_this_type"));
440
            dialogs.messageDialog(
441
                    message.toString(),
442
                    null,
443
                    i18manager.getTranslation("_Values_will_change"),
444
                    JOptionPane.INFORMATION_MESSAGE,
445
                    "feature-type-manager-field-already-exist-in-previous-schema");
446
        }
447

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

    
552
    private void doChangeFieldSelection() {
553
        int row = this.tblFields.getSelectedRow();
554
        if( row<0 ) {
555
            return;
556
        }
557
        if( !this.fieldSelectionAllowed ) {
558
            if( row !=this.currentRow ) {
559
                I18nManager i18n = ToolsLocator.getI18nManager();
560
                JOptionPane.showMessageDialog(
561
                    this, 
562
                    i18n.getTranslation("_Before_changing_field_accept_or_discard_the_changes"), 
563
                    i18n.getTranslation("_Warning"), 
564
                    JOptionPane.WARNING_MESSAGE
565
                );
566
                this.tblFields.getSelectionModel().setSelectionInterval(
567
                        this.currentRow, 
568
                        this.currentRow
569
                );
570
            }
571
            return;
572
        }
573
        doFormFieldPut();   
574
    }
575
    
576
    @Override
577
    public JComponent asJComponent() {
578
        return this;
579
    }
580

    
581
    @Override
582
    public int getMode() {
583
        return this.mode;
584
    }
585
    
586
    @Override
587
    public void setMode(int mode) {
588
        this.mode = mode;
589
        updateButtonState();
590
    }
591

    
592
    @Override
593
    public EditableFeatureType fetch(EditableFeatureType type) {
594
        if( type == null ) {
595
            type = (EditableFeatureType) this.featureType.getCopy();
596
        } else {
597
            type.removeAll();
598
            type.copyFrom(this.featureType);
599
        }
600
        type.setLabel(
601
            StringUtils.defaultIfBlank(this.txtLabel.getText(), null)
602
        );
603
        type.setDescription(
604
            StringUtils.defaultIfBlank(this.txtDescription.getText(), null)
605
        );
606
        this.tagsController.getModel().fetch(type.getTags());
607
        type.setCheckFeaturesAtInsert(this.chkRulesValidateFeatureBeforeInsert.isSelected());
608
        type.setCheckFeaturesAtFinishEditing(this.chkRulesValidateFeaturesAtFinishEditing.isSelected());
609
        return type;
610
    }
611

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

    
656
        updateButtonState();
657
        doFormFieldPut();       
658
    }
659

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

    
703
    @Override
704
    public void addChangeListener(ChangeListener listener) {
705
        this.changeListenerHelper.addChangeListener(listener);
706
    }
707

    
708
    @Override
709
    public ChangeListener[] getChangeListeners() {
710
        return this.changeListenerHelper.getChangeListeners();
711
    }
712

    
713
    @Override
714
    public void removeChangeListener(ChangeListener listener) {
715
        this.changeListenerHelper.removeChangeListener(listener);
716
    }
717

    
718
    @Override
719
    public void removeAllChangeListener() {
720
        this.changeListenerHelper.removeAllChangeListener();
721
    }
722

    
723
    @Override
724
    public boolean hasChangeListeners() {
725
        return this.changeListenerHelper.hasChangeListeners();
726
    }
727
    
728
  public static void selfRegister() {
729
        ConfigurableActionsMamager cfgActionsManager;
730
        try {
731
            cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
732
        } catch(ReferenceNotRegisteredException ex) {
733
            return;
734
        }
735
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new ViewAsJsonAction());
736
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new ForceSynchronizeAction());
737
  }
738
}