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

History | View | Annotate | Download (32.6 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.event.ActionEvent;
9
import java.awt.event.ActionListener;
10
import java.util.ArrayList;
11
import java.util.Objects;
12
import java.util.function.Predicate;
13
import javax.swing.AbstractAction;
14
import static javax.swing.Action.ACTION_COMMAND_KEY;
15
import static javax.swing.Action.NAME;
16
import javax.swing.JComponent;
17
import javax.swing.JOptionPane;
18
import javax.swing.JSplitPane;
19
import javax.swing.SwingUtilities;
20
import javax.swing.event.ChangeListener;
21
import javax.swing.event.ListSelectionEvent;
22
import javax.swing.event.ListSelectionListener;
23
import javax.swing.event.TableModelEvent;
24
import javax.swing.table.AbstractTableModel;
25
import org.apache.commons.lang3.StringUtils;
26
import org.cresques.cts.IProjection;
27
import org.gvsig.configurableactions.ConfigurableActionsMamager;
28
import org.gvsig.expressionevaluator.ExpressionUtils;
29
import org.gvsig.featureform.swing.impl.DefaultJFeatureForm;
30
import org.gvsig.fmap.dal.DataTypes;
31
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
32
import org.gvsig.fmap.dal.feature.EditableFeatureType;
33
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
34
import org.gvsig.fmap.dal.feature.FeatureRule;
35
import org.gvsig.fmap.dal.feature.FeatureStore;
36
import org.gvsig.fmap.dal.feature.FeatureType;
37
import org.gvsig.fmap.dal.swing.DALSwingLocator;
38
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
39
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypeAttributePanel;
40
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.Tag;
41
import org.gvsig.fmap.dal.swing.impl.featuretype.tags.TagsModel;
42
import org.gvsig.texteditor.JTextEditor;
43
import org.gvsig.tools.ToolsLocator;
44
import org.gvsig.tools.dataTypes.DataType;
45
import org.gvsig.tools.dynobject.DynStruct_v2;
46
import org.gvsig.tools.i18n.I18nManager;
47
import org.gvsig.tools.locator.ReferenceNotRegisteredException;
48
import org.gvsig.tools.swing.api.ChangeListenerHelper;
49
import org.gvsig.tools.swing.api.ToolsSwingLocator;
50
import org.gvsig.tools.swing.api.ToolsSwingManager;
51
import org.gvsig.tools.swing.api.ToolsSwingUtils;
52
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
53
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
54
import org.gvsig.tools.util.ToolsUtilLocator;
55
import org.slf4j.Logger;
56
import org.slf4j.LoggerFactory;
57

    
58
/**
59
 *
60
 * @author jjdelcerro
61
 */
62
public class DefaultFeatureTypePanel 
63
        extends DefaultFeatureTypePanelView
64
        implements FeatureTypePanel
65
    {
66

    
67
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureTypePanel.class);
68

    
69
    private FeatureType originalFeatureType = null;
70
    private JSplitPane splRules;
71
    private JSplitPane splAttributes;
72
    private FeatureRuleController ruleController;
73
    private JSplitPane splTags;
74
    private IProjection defaultProjection;
75
    private AttributeDescriptorPickerController defaultGeometryController;
76

    
77
    private class FeatureTypeTableModel extends AbstractTableModel {
78

    
79
        private final FeatureType featureType;
80
        private final String[] columnNames = new String[] {
81
          "Name",
82
          "Type",
83
          "Size",
84
          "Precision",
85
          "Scale",
86
          "Default",
87
          "Calculated",
88
          "Key",
89
          "Nulls",
90
          "Hidden",
91
          "Relation"
92
        };
93
        private final Class[] columnClasses = new Class[] {
94
          String.class,
95
          String.class,
96
          Integer.class,
97
          Integer.class,
98
          Integer.class,
99
          String.class,
100
          Boolean.class,
101
          String.class,
102
          Boolean.class,
103
          Boolean.class,
104
          Integer.class
105
        };
106
        
107
        public FeatureTypeTableModel() {
108
            this.featureType = null;
109
        }
110
        
111
        public FeatureTypeTableModel(FeatureType featureType) {
112
            this.featureType = featureType;
113
        }
114
        
115
        @Override
116
        public int getRowCount() {
117
            if( this.featureType==null ) {
118
                return 0;
119
            }
120
            return this.featureType.size();
121
        }
122

    
123
        @Override
124
        public int getColumnCount() {
125
            if( this.featureType==null ) {
126
                return 0;
127
            }
128
            return this.columnNames.length;
129
        }
130

    
131
        @Override
132
        public String getColumnName(int columnIndex) {
133
            if( this.featureType==null ) {
134
                return "";
135
            }
136
            return this.columnNames[columnIndex];
137
        }
138

    
139
        @Override
140
        public Class<?> getColumnClass(int columnIndex) {
141
            if( this.featureType==null ) {
142
                return String.class;
143
            }
144
            return this.columnClasses[columnIndex];
145
        }
146

    
147
        @Override
148
        public boolean isCellEditable(int rowIndex, int columnIndex) {
149
            return false;
150
        }
151

    
152
        @Override
153
        public Object getValueAt(int rowIndex, int columnIndex) {
154
            if( this.featureType==null ) {
155
                return "";
156
            }
157
            FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(rowIndex);
158
            DataType dataType = descriptor.getDataType();
159
            switch(columnIndex) {
160
                case 0:
161
                    return descriptor.getName();
162
                case 1:
163
                    return descriptor.getDataTypeName();
164
                case 2:
165
                    if( dataType.supportSize() ) {
166
                      return descriptor.getSize();
167
                    }
168
                    return null;
169
                case 3:
170
                    if( dataType.supportPrecision()) {
171
                      return descriptor.getPrecision();
172
                    }
173
                    return null;
174
                case 4:
175
                    if( dataType.supportScale()) {
176
                      return descriptor.getScale();
177
                    }
178
                    if( dataType.isNumeric() ) {
179
                      return 0;
180
                    }
181
                    return null;
182
                case 5:
183
                    return Objects.toString(descriptor.getDefaultValue(),"");
184
                case 6:
185
                    return descriptor.isComputed();
186
                case 7:
187
                    if( descriptor.isPrimaryKey() ) {
188
                        return "Pk";
189
                    }
190
                    if( descriptor.isForeingKey() ) {
191
                        return "Fk";
192
                    }
193
                    return "";
194
                case 8:
195
                    return descriptor.allowNull();
196
                case 9:
197
                    return descriptor.isHidden();
198
                case 10:
199
                    return descriptor.getRelationType();
200
                default:
201
                    return "";
202
            }
203
        }
204

    
205
        @Override
206
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
207
        }
208
    
209
        public void fireUpdateEvent() {
210
            this.fireTableChanged(new TableModelEvent(this));
211
        }
212
    }
213
    
214
    public static class ViewAsJsonAction extends AbstractAction {
215
        
216
        @SuppressWarnings("OverridableMethodCallInConstructor")
217
        public ViewAsJsonAction() {
218
            I18nManager i18n = ToolsLocator.getI18nManager();
219

    
220
            this.putValue(NAME, i18n.getTranslation("_View_as_Json"));
221
            this.putValue(ACTION_COMMAND_KEY, "ViewAsJson");
222
        }
223

    
224
        @Override
225
        public Object getValue(String key) {
226
            if (NAME.equals(key)) {
227
                // Cuando se registra la accion aun no se han cargado las traducciones
228
                I18nManager i18n = ToolsLocator.getI18nManager();
229
                return i18n.getTranslation("_View_as_Json");
230
            }
231
            return super.getValue(key);
232
        }
233
        @Override
234
        public void actionPerformed(ActionEvent e) {
235
            DefaultFeatureTypePanel featureTypePanel = (DefaultFeatureTypePanel) e.getSource();
236
            FeatureType featureType = featureTypePanel.fetch(null);
237

    
238
            JTextEditor editor = ToolsSwingLocator.getTextEditorManager().createTextEditor();
239
            editor.setContents(featureType.toJsonBuilder().toString());
240

    
241
            WindowManager winmanager = ToolsSwingLocator.getWindowManager();
242
            winmanager.showWindow(
243
                    editor.asJComponent(), 
244
                    "FeatureType - "+featureType.getName(), 
245
                    WindowManager.MODE.WINDOW
246
            );
247
        }
248
        
249
    }
250

    
251
    public static class PreviewFormAction extends AbstractAction {
252
        
253
        @SuppressWarnings("OverridableMethodCallInConstructor")
254
        public PreviewFormAction() {
255
            I18nManager i18n = ToolsLocator.getI18nManager();
256

    
257
            this.putValue(NAME, i18n.getTranslation("_Preview_form"));
258
            this.putValue(ACTION_COMMAND_KEY, "PreviewForm");
259
        }
260

    
261
        @Override
262
        public Object getValue(String key) {
263
            if (NAME.equals(key)) {
264
                // Cuando se registra la accion aun no se han cargado las traducciones
265
                I18nManager i18n = ToolsLocator.getI18nManager();
266
                return i18n.getTranslation("_Preview_form");
267
            }
268
            return super.getValue(key);
269
        }
270
        @Override
271
        public void actionPerformed(ActionEvent e) {
272
            DefaultFeatureTypePanel featureTypePanel = (DefaultFeatureTypePanel) e.getSource();
273
            FeatureType featureType = featureTypePanel.fetch(null);
274

    
275
            DefaultJFeatureForm form = new DefaultJFeatureForm();
276
            form.setFeatureType(featureType);
277
            
278
            WindowManager winmanager = ToolsSwingLocator.getWindowManager();
279
            winmanager.showWindow(
280
                    form.asJComponent(), 
281
                    ToolsSwingUtils.makeTitle("Form preview",featureType.getName(),null), 
282
                    WindowManager.MODE.WINDOW
283
            );
284
        }
285
        
286
    }
287

    
288
    public static class ForceSynchronizeAction extends AbstractAction {
289
        
290
        @SuppressWarnings("OverridableMethodCallInConstructor")
291
        public ForceSynchronizeAction() {
292
            I18nManager i18n = ToolsLocator.getI18nManager();
293

    
294
            this.putValue(NAME, i18n.getTranslation("_Force_synchronize"));
295
            this.putValue(ACTION_COMMAND_KEY, "ForceSynchronize");
296
        }
297

    
298
        @Override
299
        public Object getValue(String key) {
300
            if (NAME.equals(key)) {
301
                // Cuando se registra la accion aun no se han cargado las traducciones
302
                I18nManager i18n = ToolsLocator.getI18nManager();
303
                return i18n.getTranslation("_Force_synchronize");
304
            }
305
            return super.getValue(key);
306
        }
307
        @Override
308
        public void actionPerformed(ActionEvent e) {
309
            DefaultFeatureTypePanel featureTypePanel = (DefaultFeatureTypePanel) e.getSource();
310
            featureTypePanel.featureType.forceStrongChanges();
311
        }
312
        
313
    }
314
    
315
    private DefaultFeatureAttributePanel descriptorPanel;
316
    private EditableFeatureType featureType;
317
    private int mode;
318
    private FeatureTypeTableModel tableModel;
319
    private FeatureStore store;
320
    private int currentRow;
321
    private boolean fieldSelectionAllowed;
322
    private AggregateController<Tag> tagsController;
323
    private ChangeListenerHelper changeListenerHelper;
324
    private AggregateController<FeatureRule> rulesController;
325
        
326
    public DefaultFeatureTypePanel() {
327
        this.mode = MODE_SHOW_ONLY;
328
        this.currentRow = -1;
329
        this.fieldSelectionAllowed = true;
330
        this.initComponents();
331
    }
332
    
333
    @SuppressWarnings("Convert2Lambda")
334
    private void initComponents() {
335
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
336
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
337
        JComponent c = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
338
        this.pnlCfgActions.setLayout(new BorderLayout(0,0));
339
        this.pnlCfgActions.add(c, BorderLayout.CENTER);
340

    
341
        this.splRules = ToolsSwingUtils.createVerticalSplit(
342
                this.gridRules, 
343
                this.gridRulesTable, false,
344
                this.gridRulesDetail, true
345
        );
346
        this.splAttributes = ToolsSwingUtils.createVerticalSplit(
347
                this.gridAttributes,
348
                this.gridAttributesTable, false,
349
                this.gridAttributesDetail, true
350
        );
351
        this.splTags = ToolsSwingUtils.createVerticalSplit(
352
                this.gridTags,
353
                this.gridTagsItems, false,
354
                this.gridTagsItem, true
355
        );
356
        
357
        this.changeListenerHelper = swingManager.createChangeListenerHelper();
358
        
359
        swingManager.translate(this.btnDelete);
360
        swingManager.translate(this.btnFormFieldAccept);
361
        swingManager.translate(this.btnFormFieldDiscard);
362
        swingManager.translate(this.btnFormFieldModify);
363
        swingManager.translate(this.btnNew);
364
        swingManager.translate(this.lblLabel);
365
        swingManager.translate(this.lblDescription);
366
        swingManager.translate(this.lblTags);
367
        swingManager.translate(this.tabFeatureType);
368
        swingManager.translate(this.lblRulesDefaultRules);
369
        swingManager.translate(this.lblRulesCustomRules);
370
        swingManager.translate(this.chkRulesValidateFeatureBeforeInsert);
371
        swingManager.translate(this.chkRulesValidateFeaturesAtFinishEditing);
372
        swingManager.translate(this.lblRuleName);
373
        swingManager.translate(this.lblRuleDescription);
374
        swingManager.translate(this.lblRuleCheckAtFinishEditing);
375
        swingManager.translate(this.lblRuleCheckAtUpdate);
376
        swingManager.translate(this.lblRuleCheckAtEditFeature);
377
        swingManager.translate(this.lblRuleValidation);
378
        swingManager.translate(this.btnRulesNew);
379
        swingManager.translate(this.btnRulesDelete);
380
        swingManager.translate(this.btnRuleFormFieldModify);
381
        swingManager.translate(this.btnRuleFormFieldAccept);
382
        swingManager.translate(this.btnRuleFormFieldDiscard);
383
        swingManager.translate(this.btnRuleValidation);
384
        swingManager.translate(this.btnRuleValidationBookmarks);
385
        swingManager.translate(this.btnRuleValidationHistory);
386
        swingManager.translate(this.lblTagsItemName);
387
        swingManager.translate(this.lblTagsItemValue);
388
        swingManager.translate(this.lblTagsItemNotes);
389
                
390
        this.tableModel = new FeatureTypeTableModel();
391
        this.tblFields.setModel(this.tableModel);
392
        this.tblFields.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
393
            @Override
394
            public void valueChanged(ListSelectionEvent e) {
395
                if( e.getValueIsAdjusting() ) {
396
                    return;
397
                }
398
                doChangeFieldSelection();
399
            }
400
        });
401
        this.descriptorPanel = new DefaultFeatureAttributePanel();
402
        this.descriptorPanel.setDefaultProjection(this.defaultProjection);
403
        this.pnlField.setLayout(new BorderLayout());
404
        this.pnlField.add(this.descriptorPanel, BorderLayout.CENTER);
405
        this.descriptorPanel.setEnabled(false);
406

    
407
        this.btnFormFieldModify.addActionListener(new ActionListener() {
408
            @Override
409
            public void actionPerformed(ActionEvent e) {
410
                doFormFieldModify();
411
            }
412
        });
413
        this.btnFormFieldDiscard.addActionListener(new ActionListener() {
414
            @Override
415
            public void actionPerformed(ActionEvent e) {
416
                doFormFieldDiscard();
417
            }
418
        });
419
        this.btnFormFieldAccept.addActionListener(new ActionListener() {
420
            @Override
421
            public void actionPerformed(ActionEvent e) {
422
                doFormFieldAccept();
423
            }
424
        });
425
        this.btnNew.addActionListener(new ActionListener() {
426
            @Override
427
            public void actionPerformed(ActionEvent e) {
428
                doNewField();
429
            }
430
        });
431
        this.btnDelete.addActionListener(new ActionListener() {
432
            @Override
433
            public void actionPerformed(ActionEvent e) {
434
                doDeleteField();
435
            }
436
        });
437
        
438
        this.tagsController = new DefaultAggregateController<>(
439
                this.tblTagsItems,
440
                this.btnTagsModify,
441
                this.btnTagsDiscard,
442
                this.btnTagsAccept,
443
                this.btnTagsNew,
444
                this.btnTagsDelete,
445
                new TagController(
446
                        this.cboTagsItemName,
447
                        this.cboTagsItemValue,
448
                        this.lblTagsItemNotesValue
449
                )
450
        );
451

    
452
        this.ruleController = new FeatureRuleController(
453
                txtRuleName,
454
                txtRuleDescription,
455
                chkRuleCheckAtFinishEditing,
456
                chkRuleCheckAtUpdate,
457
                chkRuleCheckAtEditFeature,
458
                txtRuleValidation,
459
                btnRuleValidation,
460
                btnRuleValidationBookmarks, 
461
                btnRuleValidationHistory
462
        );
463
                
464
        this.rulesController = new DefaultAggregateController<>(
465
                this.tblRules, 
466
                this.btnRuleFormFieldModify, 
467
                this.btnRuleFormFieldDiscard, 
468
                this.btnRuleFormFieldAccept, 
469
                this.btnRulesNew, 
470
                this.btnRulesDelete,
471
                ruleController
472
        );
473

    
474
        if( this.tblFields.getRowCount()>0 ) {
475
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
476
            doFormFieldPut();
477
        }
478
        this.tabFeatureType.setSelectedIndex(1);
479
        ToolsSwingUtils.ensureRowsCols(this, 30, 120, 45, 150);
480
        SwingUtilities.invokeLater( () -> {
481
                splAttributes.setDividerLocation(0.3);
482
            }
483
        );
484
        
485
    }
486
       
487
    private boolean doFormFieldFetch() {
488
        int row = this.tblFields.getSelectedRow();
489
        if (row < 0) {
490
            return true;
491
        }
492
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
493
        int previousType = descriptor.getType();
494
        if (descriptor instanceof EditableFeatureAttributeDescriptor) {
495
            if (this.descriptorPanel.fetch((EditableFeatureAttributeDescriptor) descriptor) == null) {
496
                return false;
497
            }
498
            this.tableModel.fireUpdateEvent();
499
        }
500
        FeatureAttributeDescriptor oldDescriptor = null;
501
        if (this.originalFeatureType != null) {
502
            oldDescriptor = this.originalFeatureType.getAttributeDescriptor(descriptor.getName());
503
        }
504
        if (oldDescriptor != null
505
                && oldDescriptor.getDataType() != descriptor.getDataType()
506
                && previousType != descriptor.getType()) {
507
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
508
            I18nManager i18manager = ToolsLocator.getI18nManager();
509
            StringBuilder message = new StringBuilder();
510

    
511
            String[] messageArgs = new String[]{oldDescriptor.getName()};
512
            message.append(i18manager.getTranslation("_Already_existed_a_field_named_XfieldnameX_but_with_different_data_type", messageArgs));
513
            message.append(".\n");
514
            message.append(i18manager.getTranslation("_Values_of_data_will_try_to_coerce_to_this_type"));
515
            dialogs.messageDialog(
516
                    message.toString(),
517
                    null,
518
                    i18manager.getTranslation("_Values_will_change"),
519
                    JOptionPane.INFORMATION_MESSAGE,
520
                    "feature-type-manager-field-already-exist-in-previous-schema");
521
        }
522

    
523
        return true;
524
    }
525
    
526
    private void doFormFieldPut() {
527
        int row = this.tblFields.getSelectedRow();
528
        if( row<0 ) {
529
            return;
530
        }
531
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
532
        this.currentRow = row;
533
        this.descriptorPanel.put(descriptor);
534
        updateButtonState();
535
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
536
            this.btnFormFieldModify.setEnabled((this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA) && this.tblFields.getSelectedRowCount()==1);
537
        } else {
538
            this.btnFormFieldModify.setEnabled(false);
539
        }
540
    }
541
    
542
    private void updateButtonState() {
543
        this.descriptorPanel.setEnabled(true);
544
        this.descriptorPanel.setMode(MODE_SHOW_ONLY);
545
        this.btnFormFieldAccept.setEnabled(false);
546
        this.btnFormFieldDiscard.setEnabled(false);
547
        
548
        switch(this.mode) {
549
            case MODE_EDIT_ALL:
550
                this.btnDelete.setEnabled(true);
551
                this.btnFormFieldModify.setEnabled(true);
552
                this.btnNew.setEnabled(true);
553
                this.tagsController.setEnabled(true);
554
                this.rulesController.setEnabled(true);
555
                this.txtLabel.setEditable(true);
556
                this.txtDescription.setEditable(true);
557
                break;
558
            case MODE_EDIT_ONLY_METADATA:
559
                this.btnDelete.setEnabled(this.descriptorPanel.isVirtualField());
560
                this.btnFormFieldModify.setEnabled(true);
561
                this.btnNew.setEnabled(true);
562
                this.tagsController.setEnabled(true);
563
                this.rulesController.setEnabled(true);
564
                this.txtLabel.setEditable(true);
565
                this.txtDescription.setEditable(true);
566
                break;
567
            case MODE_SHOW_ONLY:
568
                this.btnDelete.setEnabled(false);
569
                this.btnFormFieldModify.setEnabled(false);
570
                this.btnNew.setEnabled(false);
571
                this.tagsController.setEnabled(false);
572
                this.rulesController.setEnabled(false);
573
                this.txtLabel.setEditable(false);
574
                this.txtDescription.setEditable(false);
575
                break;
576
        }
577
    }
578
    
579
    private void doFormFieldModify() {
580
        int row = this.tblFields.getSelectedRow();
581
        if( row<0 ) {
582
            return;
583
        }
584
        FeatureAttributeDescriptor descriptor = this.featureType.getAttributeDescriptor(row);
585
        this.descriptorPanel.put(descriptor);
586
        this.descriptorPanel.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
587
        this.btnFormFieldAccept.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
588
        this.btnFormFieldDiscard.setEnabled(this.mode==MODE_EDIT_ALL || this.mode==MODE_EDIT_ONLY_METADATA);
589
        this.btnFormFieldModify.setEnabled(false);
590
        this.btnNew.setEnabled(false);
591
        this.btnDelete.setEnabled(false);
592
        if( descriptor instanceof EditableFeatureAttributeDescriptor ) {
593
            this.descriptorPanel.setMode(this.mode);
594
        } else {
595
            this.descriptorPanel.setMode(MODE_SHOW_ONLY);
596
        }
597
        this.fieldSelectionAllowed = false;
598
        this.changeListenerHelper.fireEvent();
599
    }
600
    
601
    @Override
602
    public boolean isEditing() {
603
        return btnFormFieldAccept.isEnabled() || this.rulesController.isEditing();
604
    }
605
    
606
    private void doFormFieldAccept() {
607
        int row = this.tblFields.getSelectedRow();
608
        if( row<0 ) {
609
            return;
610
        }
611
        if( doFormFieldFetch() ) {
612
            this.updateButtonState();
613
            this.tblFields.getSelectionModel().setSelectionInterval(row, row);
614
            this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
615
            this.fieldSelectionAllowed = true;
616
        }
617
        this.changeListenerHelper.fireEvent();
618
    }
619
    
620
    private void doFormFieldDiscard() {
621
        doFormFieldPut();
622
        this.updateButtonState();
623
        this.fieldSelectionAllowed = true;
624
        this.changeListenerHelper.fireEvent();
625
    }
626

    
627
    private void doChangeFieldSelection() {
628
        int row = this.tblFields.getSelectedRow();
629
        if( row<0 ) {
630
            return;
631
        }
632
        if( !this.fieldSelectionAllowed ) {
633
            if( row !=this.currentRow ) {
634
                I18nManager i18n = ToolsLocator.getI18nManager();
635
                JOptionPane.showMessageDialog(
636
                    this, 
637
                    i18n.getTranslation("_Before_changing_field_accept_or_discard_the_changes"), 
638
                    i18n.getTranslation("_Warning"), 
639
                    JOptionPane.WARNING_MESSAGE
640
                );
641
                this.tblFields.getSelectionModel().setSelectionInterval(
642
                        this.currentRow, 
643
                        this.currentRow
644
                );
645
            }
646
            return;
647
        }
648
        doFormFieldPut();   
649
    }
650
    
651
    @Override
652
    public JComponent asJComponent() {
653
        return this;
654
    }
655

    
656
    @Override
657
    public int getMode() {
658
        return this.mode;
659
    }
660
    
661
    @Override
662
    public void setMode(int mode) {
663
        this.mode = mode;
664
        updateButtonState();
665
    }
666

    
667
    @Override
668
    public EditableFeatureType fetch(EditableFeatureType type) {
669
        if( type == null ) {
670
            type = (EditableFeatureType) this.featureType.getCopy();
671
        } else {
672
            type.removeAll();
673
            type.copyFrom(this.featureType);
674
        }
675
        type.setLabel(
676
            StringUtils.defaultIfBlank(this.txtLabel.getText(), null)
677
        );
678
        type.setDescription(
679
            StringUtils.defaultIfBlank(this.txtDescription.getText(), null)
680
        );
681
        this.tagsController.getModel().fetch(type.getTags());
682
        type.setCheckFeaturesAtInsert(this.chkRulesValidateFeatureBeforeInsert.isSelected());
683
        type.setCheckFeaturesAtFinishEditing(this.chkRulesValidateFeaturesAtFinishEditing.isSelected());
684
        type.setDefaultGeometryAttributeName(this.defaultGeometryController.getName());
685
        return type;
686
    }
687

    
688
    @Override
689
    public void put(FeatureType type) {
690
        this.featureType = null;
691
        this.originalFeatureType = null;
692
        if (type == null) {
693
            this.store = null;
694
            this.rulesController.clean();
695
            this.tagsController.clean();
696
            this.chkRulesValidateFeatureBeforeInsert.setSelected(true);
697
            this.chkRulesValidateFeaturesAtFinishEditing.setSelected(false);
698
        } else {
699
            FeatureType ftypeToCompare = type.getOriginalFeatureType();
700
            if (ftypeToCompare == null) {
701
                ftypeToCompare = type;
702
            }
703
            this.originalFeatureType = ftypeToCompare.getCopy();
704
            this.featureType = (EditableFeatureType) type.getCopy();
705
            this.rulesController.setModel(new FeatureRulesModel(this.featureType.getRules()));
706
            this.chkRulesValidateFeatureBeforeInsert.setSelected(type.isCheckFeaturesAtInsert());
707
            this.chkRulesValidateFeaturesAtFinishEditing.setSelected(type.isCheckFeaturesAtFinishEditing());
708
            // Nos quedamos una referencia para evitar que se destruya, ya que
709
            // el featureType se guarda solo una WeakReference.
710
            this.store = type.getStore();
711
            this.ruleController.setFeatureStore(this.store);
712
            this.txtLabel.setText(
713
                    StringUtils.defaultIfBlank(((DynStruct_v2) type).getLabel(), "")
714
            );
715
            this.txtDescription.setText(
716
                    StringUtils.defaultIfBlank(((DynStruct_v2) type).getDescription(), "")
717
            );
718
            this.tagsController.setModel( new TagsModel(((DynStruct_v2) type).getTags()));
719
        }
720
        if( !(type instanceof EditableFeatureType) ) {
721
            this.setMode(MODE_SHOW_ONLY);
722
        }
723
        this.tableModel = new FeatureTypeTableModel(this.featureType);
724
        this.tblFields.setModel(this.tableModel);
725
        if( type!=null && !type.isEmpty() ) {
726
            this.tblFields.getSelectionModel().setSelectionInterval(0, 0);
727
        }
728
        SwingUtilities.invokeLater(() -> {
729
            this.splAttributes.setDividerLocation(0.3);
730
        });
731
        this.defaultGeometryController = DALSwingLocator.getDataSwingManager().createAttributeDescriptorPickerController(cboDefaultGeometry, new Predicate<FeatureAttributeDescriptor>() {
732
            @Override
733
            public boolean test(FeatureAttributeDescriptor t) {
734
                return t.getType() == DataTypes.GEOMETRY;
735
            }
736
        });
737
        this.defaultGeometryController.setFeatureType(this.featureType);
738
        this.defaultGeometryController.set(this.featureType.getDefaultGeometryAttributeName());
739
        updateButtonState();
740
        doFormFieldPut();       
741
    }
742

    
743
    private void doNewField() {
744
        EditableFeatureType eft = (EditableFeatureType)this.featureType;
745
        EditableFeatureAttributeDescriptor descriptor = eft.add(
746
                this.featureType.getNewFieldName(), 
747
                DataTypes.STRING,
748
                50
749
        );
750
        if( this.mode == MODE_EDIT_ONLY_METADATA ) {
751
            descriptor.setFeatureAttributeEmulator(ExpressionUtils.createExpression("NULL"));
752
        }
753
        this.tableModel.fireUpdateEvent();
754
        int row = descriptor.getIndex();
755
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
756
        this.tblFields.scrollRectToVisible(this.tblFields.getCellRect(row, 0, true));
757
        updateButtonState();
758

    
759
        this.descriptorPanel.put(descriptor);
760
        this.descriptorPanel.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
761
        this.btnFormFieldAccept.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
762
        this.btnFormFieldDiscard.setEnabled(this.mode == MODE_EDIT_ALL || this.mode == MODE_EDIT_ONLY_METADATA);
763
        this.btnFormFieldModify.setEnabled(false);
764
        this.btnNew.setEnabled(false);
765
        this.btnDelete.setEnabled(false);
766
        if (descriptor instanceof EditableFeatureAttributeDescriptor) {
767
            if(this.mode == MODE_EDIT_ONLY_METADATA) {
768
                this.descriptorPanel.setMode(FeatureTypeAttributePanel.MODE_VIRTUAL_FIELD);
769
            } else {
770
                this.descriptorPanel.setMode(this.mode);
771
            }
772
        } else {
773
            this.descriptorPanel.setMode(MODE_SHOW_ONLY);
774
        }
775
        this.fieldSelectionAllowed = false;
776

    
777
        this.changeListenerHelper.fireEvent();
778
    }
779
    
780
    private void doDeleteField() {
781
        int row = this.tblFields.getSelectedRow();
782
        int[] rows = this.tblFields.getSelectedRows();
783
        ArrayList FeatureAttributeDescriptor;
784
        ArrayList<String> descriptors = new ArrayList<>();
785
        for (int rowDescriptor : rows) {
786
            if (rowDescriptor < 0) {
787
                continue;
788
            }
789
            descriptors.add(this.featureType.getAttributeDescriptor(rowDescriptor).getName());
790
        }
791
        for (String descriptor : descriptors) {
792
            ((EditableFeatureType)this.featureType).remove(descriptor);
793
        }
794
        this.tableModel.fireUpdateEvent();
795
        if( row >= this.tblFields.getRowCount()) {
796
            row = this.tblFields.getRowCount()-1;
797
        }
798
        this.tblFields.getSelectionModel().addSelectionInterval(row,row);
799
        updateButtonState();
800
        doFormFieldPut();       
801
        this.changeListenerHelper.fireEvent();
802
    }
803

    
804
    @Override
805
    public void addChangeListener(ChangeListener listener) {
806
        this.changeListenerHelper.addChangeListener(listener);
807
    }
808

    
809
    @Override
810
    public ChangeListener[] getChangeListeners() {
811
        return this.changeListenerHelper.getChangeListeners();
812
    }
813

    
814
    @Override
815
    public void removeChangeListener(ChangeListener listener) {
816
        this.changeListenerHelper.removeChangeListener(listener);
817
    }
818

    
819
    @Override
820
    public void removeAllChangeListener() {
821
        this.changeListenerHelper.removeAllChangeListener();
822
    }
823

    
824
    @Override
825
    public boolean hasChangeListeners() {
826
        return this.changeListenerHelper.hasChangeListeners();
827
    }
828
    
829
  public static void selfRegister() {
830
        ConfigurableActionsMamager cfgActionsManager;
831
        try {
832
            cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
833
        } catch(ReferenceNotRegisteredException ex) {
834
            return;
835
        }
836
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new ViewAsJsonAction());
837
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new PreviewFormAction());
838
        cfgActionsManager.addConfigurableAction(CONFIGURABLE_PANEL_ID, new ForceSynchronizeAction());        
839
  }
840

    
841
    @Override
842
    public void setDefaultProjection(IProjection projection) {
843
        this.defaultProjection = projection;
844
        if( this.descriptorPanel!=null ) {
845
            this.descriptorPanel.setDefaultProjection(projection);
846
        }
847
    }
848
  
849
  
850
}