Statistics
| Revision:

gvsig-projects-pool / org.gvsig.vcsgis / trunk / org.gvsig.vcsgis / org.gvsig.vcsgis.swing / org.gvsig.vcsgis.swing.impl / src / main / java / org / gvsig / vcsgis / swing / impl / importhistory / ImportHistoryImpl.java @ 3628

History | View | Annotate | Download (18.7 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (c) 2007-2020 gvSIG Association
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.vcsgis.swing.impl.importhistory;
25

    
26
import java.awt.Dimension;
27
import java.awt.event.ActionEvent;
28
import javax.swing.ComboBoxModel;
29
import javax.swing.DefaultComboBoxModel;
30
import javax.swing.DefaultListCellRenderer;
31
import javax.swing.JComponent;
32
import javax.swing.JLabel;
33
import javax.swing.JList;
34
import javax.swing.JTree;
35
import javax.swing.ListSelectionModel;
36
import javax.swing.SwingUtilities;
37
import javax.swing.event.ChangeEvent;
38
import javax.swing.event.DocumentEvent;
39
import javax.swing.event.DocumentListener;
40
import javax.swing.event.ListSelectionEvent;
41
import javax.swing.event.TreeSelectionEvent;
42
import javax.swing.tree.DefaultTreeCellRenderer;
43
import javax.swing.tree.TreePath;
44
import javax.swing.tree.TreeSelectionModel;
45
import org.apache.commons.lang3.StringUtils;
46
import org.gvsig.fmap.dal.DataTypes;
47
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
48
import org.gvsig.fmap.dal.feature.FeatureStore;
49
import org.gvsig.fmap.dal.feature.FeatureType;
50
import org.gvsig.fmap.dal.swing.DALSwingLocator;
51
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
52
import org.gvsig.tools.ToolsLocator;
53
import org.gvsig.tools.swing.api.Component;
54
import org.gvsig.tools.swing.api.ToolsSwingLocator;
55
import org.gvsig.tools.swing.api.ToolsSwingManager;
56
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
57
import org.gvsig.tools.swing.api.task.TaskStatusController;
58
import org.gvsig.tools.swing.api.task.TaskStatusSwingManager;
59
import org.gvsig.tools.swing.api.windowmanager.Dialog;
60
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
61
import org.gvsig.tools.util.LabeledValue;
62
import org.gvsig.vcsgis.lib.VCSGisManager;
63
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_OK;
64
import org.gvsig.vcsgis.lib.workspace.VCSGisWorkspace;
65
import org.gvsig.vcsgis.swing.VCSGisJImportHistory;
66
import org.gvsig.vcsgis.swing.VCSGisSwingLocator;
67
import org.gvsig.vcsgis.swing.VCSGisSwingManager;
68
import org.gvsig.vcsgis.swing.VCSGisSwingServices;
69
import static org.gvsig.vcsgis.swing.impl.VCSGisSwingCommons.notInSwingThreadInvokeLater;
70
import org.slf4j.LoggerFactory;
71

    
72
/**
73
 *
74
 * @author gvSIG Team
75
 */
76
public class ImportHistoryImpl extends ImportHistoryView
77
        implements Component, VCSGisJImportHistory {
78

    
79
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(ImportHistoryImpl.class);
80
    
81
    private static final int TAB_LAYERS_INDEX = 0;
82
    private static final int TAB_TABLES_INDEX = 1;
83

    
84
    private PickerController<VCSGisWorkspace> workspacePicker;
85

    
86
    private Dialog dialog;
87
    private AttributeDescriptorPickerController fieldForLabelPicker;
88
    private boolean processing;
89
    private TaskStatusController taskStatusController;
90
    private AttributeDescriptorPickerController identifierFieldPicker;
91
    private AttributeDescriptorPickerController sortFieldPicker;
92
    private AttributeDescriptorPickerController revisionDateFieldPicker;
93

    
94
    public ImportHistoryImpl() {
95
        processing = false;
96
        initializeComponents();
97
    }
98

    
99
    private void initializeComponents() {
100
        VCSGisSwingManager swingManager = VCSGisSwingLocator.getVCSGisSwingManager();
101
        TaskStatusSwingManager taskStatusManager = ToolsSwingLocator.getTaskStatusSwingManager();
102

    
103
        translate();
104
        this.taskStatusController = taskStatusManager.createTaskStatusController(
105
                this.lblStatusTitle,
106
                this.lblStatusMessages,
107
                this.pbStatus
108
        );
109
        this.taskStatusController.setShowCancelButton(false);
110
        this.taskStatusController.setShowRemoveTaskButton(false);
111
        this.taskStatusController.bind(ToolsLocator.getTaskStatusManager());
112
        SwingUtilities.invokeLater(() -> {this.setVisibleStatus(false); });
113

    
114
        this.workspacePicker = swingManager.createWorkspacePickerController(
115
                cboWorkspace,
116
                btnWorkspace
117
        );
118

    
119
        this.workspacePicker.addChangeListener((ChangeEvent e) -> {
120
            doChangeWorkspace();
121
        });
122
        
123
        this.setPreferredSize(new Dimension(520, 475));
124

    
125
        tabAddToWorkspace.addChangeListener((ChangeEvent e) -> {
126
            updateTextName();
127
            updateFieldsForLabel();
128
            doUpdateComponents();
129
        });
130
        
131
        VCSGisSwingServices services = swingManager.getDefaultServices();
132
        
133
        ComboBoxModel<LabeledValue> viewDocumentsModel = services.getViewDocumentsComboBoxModel();
134
                
135
        cboView.setModel(viewDocumentsModel);
136
        
137
        cboView.addActionListener((ActionEvent e) -> {
138
            doUpdateComponents();
139
        });
140
        
141
        chkAddLayerToView.addChangeListener((ChangeEvent e) -> {
142
            doUpdateComponents();
143
        });
144
        
145
        treeLayers.setModel(services.getFeatureStoresTreeModel());
146

    
147
        treeLayers.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
148

    
149
        treeLayers.getSelectionModel().addTreeSelectionListener((TreeSelectionEvent e) -> {
150
            updateTextName();
151
            updateFieldsForLabel();
152
            doUpdateComponents();
153
        });
154

    
155
        treeLayers.setCellRenderer(new DefaultTreeCellRenderer() {
156
            @Override
157
            public java.awt.Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
158
                JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); //To change body of generated methods, choose Tools | Templates.
159
                if (value instanceof FeatureStore) {
160
                    label.setText(((FeatureStore) value).getName());
161
                }
162
                return label;
163
            }
164

    
165
        });
166
        
167
        lstTables.setModel(services.getFeatureStoresListModel());
168

    
169
        lstTables.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
170
        lstTables.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
171
            updateTextName();
172
            updateFieldsForLabel();
173
            doUpdateComponents();
174
        });
175

    
176
        lstTables.setCellRenderer(new DefaultListCellRenderer(){
177
            @Override
178
            public java.awt.Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
179
                JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
180
                if (value instanceof FeatureStore) {
181
                    label.setText(((FeatureStore) value).getName());
182
                }
183
                return label;
184
            }
185
        });
186
        
187
        txtName.getDocument().addDocumentListener(new DocumentListener() {
188
            @Override
189
            public void insertUpdate(DocumentEvent e) {
190
                doUpdateComponents();
191
            }
192

    
193
            @Override
194
            public void removeUpdate(DocumentEvent e) {
195
                doUpdateComponents();
196
            }
197

    
198
            @Override
199
            public void changedUpdate(DocumentEvent e) {
200
                doUpdateComponents();
201
            }
202
        });
203
        
204
        this.fieldForLabelPicker = DALSwingLocator.getDataSwingManager().createAttributeDescriptorPickerController(
205
                cboFieldForLabel, 
206
                (FeatureAttributeDescriptor t) -> {
207
            if (t.getType() == DataTypes.GEOMETRY) {
208
                return false;
209
            }
210
            return !t.isComputed();
211
        });
212
        
213
        this.identifierFieldPicker = DALSwingLocator.getDataSwingManager().createAttributeDescriptorPickerController(
214
                cboIdentifierField, 
215
                (FeatureAttributeDescriptor t) -> {
216
            if (t.getType() == DataTypes.GEOMETRY) {
217
                return false;
218
            }
219
            return !t.isComputed();
220
        });
221
        
222
        this.sortFieldPicker = DALSwingLocator.getDataSwingManager().createAttributeDescriptorPickerController(
223
                cboSortField, 
224
                (FeatureAttributeDescriptor t) -> {
225
            if (t.getType() == DataTypes.GEOMETRY) {
226
                return false;
227
            }
228
            return !t.isComputed();
229
        });
230
        
231
        this.revisionDateFieldPicker = DALSwingLocator.getDataSwingManager().createAttributeDescriptorPickerController(
232
                cboRevisionDateField, 
233
                (FeatureAttributeDescriptor t) -> {
234
            if (t.getType() == DataTypes.GEOMETRY) {
235
                return false;
236
            }
237
            return !t.isComputed();
238
        });
239
       
240
        
241
        this.fieldForLabelPicker.addChangeListener((ChangeEvent e) -> {
242
            doUpdateComponents();
243
        });
244
        
245
        updateFieldsForLabel();
246
        
247
        if(this.cboView.getModel().getSize() > 0){
248
            this.cboView.setEnabled(true);
249
            if(this.cboView.getModel().getSize() == 2){
250
                this.cboView.setSelectedIndex(1);
251
            } else {
252
                this.cboView.setSelectedIndex(0);
253
            }
254
            this.chkAddLayerToView.setSelected(true);
255
        } else {
256
            this.cboView.setEnabled(false);
257
            this.chkAddLayerToView.setSelected(false);
258
        }
259
        this.chkAddTableToProject.setSelected(true);
260
        
261
        
262
        
263
    }
264

    
265
    @Override
266
    public JComponent asJComponent() {
267
        return this;
268
    }
269

    
270
    @Override
271
    public void setDialog(Dialog dialog) {
272
        this.dialog = dialog;
273
        this.doUpdateComponents();
274
    }
275

    
276
    private void updateTextName() {
277
        FeatureStore value = getFeatureStore();
278
        if (value != null) {
279
            txtName.setText(value.getName());
280
        } else {
281
            txtName.setText("");
282
        }
283
    }
284
    
285
    private void updateFieldsForLabel() {
286
        FeatureStore store = getFeatureStore();
287
        if (store != null){
288
            FeatureType ft = store.getDefaultFeatureTypeQuietly();
289
            this.fieldForLabelPicker.setFeatureType(ft);
290
            this.identifierFieldPicker.setFeatureType(ft);
291
            this.sortFieldPicker.setFeatureType(ft);
292
            this.revisionDateFieldPicker.setFeatureType(ft);
293
        }
294
    }
295

    
296
    private void doUpdateComponents() {
297
        FeatureAttributeDescriptor identifierField = identifierFieldPicker.get();
298
        FeatureAttributeDescriptor sortField = sortFieldPicker.get();
299
        FeatureAttributeDescriptor revisionDateField = revisionDateFieldPicker.get();
300

    
301
        VCSGisWorkspace workspace = getWorkspace();
302
        LabeledValue selectedView = (LabeledValue)cboView.getSelectedItem();
303
        boolean enableImport = !processing && workspace != null && 
304
                getFeatureStore() != null &&
305
                StringUtils.isNotBlank(txtName.getText()) &&
306
                workspace.getEntity(txtName.getText())==null &&
307
                sortField != null &&
308
                revisionDateField != null &&
309
                identifierField != null;
310
        
311
        if (tabAddToWorkspace.getSelectedIndex() == TAB_LAYERS_INDEX) {
312
            enableImport = enableImport && (!chkAddLayerToView.isSelected()
313
                    || (chkAddLayerToView.isSelected() && selectedView != null && selectedView.getValue() != null));
314
        }
315
        
316
        this.tabAddToWorkspace.setEnabled(!processing);
317
        this.workspacePicker.setEnabled(!processing);
318
        this.txtName.setEnabled(!processing);
319
        this.cboFieldForLabel.setEnabled(!processing);
320
        this.txtLabel.setEnabled(!processing);
321
        this.cboCategory.setEnabled(!processing);
322
        
323
        this.cboView.setEnabled(!processing);
324
        this.chkAddLayerToView.setEnabled(!processing);
325
        this.chkAddTableToProject.setEnabled(!processing);
326
        
327
        if (dialog != null) {
328
            this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK,
329
                    enableImport
330
            );
331
        }
332
        this.pbStatus.setVisible(processing);
333
        this.lblStatusTitle.setVisible(processing);
334
        
335
    }
336

    
337
    private void translate() {
338
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
339
        toolsSwingManager.translate(this.lblWorkspace);
340
        toolsSwingManager.translate(this.lblName);
341
        toolsSwingManager.translate(this.tabAddToWorkspace);
342
        toolsSwingManager.translate(this.lblFieldForLabel);
343
        toolsSwingManager.translate(this.chkAddLayerToView);
344
        toolsSwingManager.translate(this.chkAddTableToProject);
345
        toolsSwingManager.translate(this.lblCategory);
346
        toolsSwingManager.translate(this.lblLabel);
347
        toolsSwingManager.translate(this.lblIdentifierField);
348
        toolsSwingManager.translate(this.lblSortField);
349
        toolsSwingManager.translate(this.lblRevisionDateField);
350
        toolsSwingManager.translate(this.lblRevisionCodeField);
351
        toolsSwingManager.translate(this.lblTimeInterval);
352
        toolsSwingManager.translate(this.rdbUseRevisionCode);
353
        toolsSwingManager.translate(this.rdbUseRevisionDate);
354
    }
355

    
356
    @Override
357
    public VCSGisWorkspace getWorkspace() {
358
        VCSGisWorkspace workspace = this.workspacePicker.get();
359
        return workspace;
360
    }
361

    
362
    @Override
363
    public FeatureStore getFeatureStore() {
364
        switch (tabAddToWorkspace.getSelectedIndex()) {
365
            case TAB_LAYERS_INDEX:
366
                TreePath selection = treeLayers.getSelectionModel().getSelectionPath();
367
                if(selection != null) {
368
                    Object[] path = selection.getPath();
369
                    boolean isLeaf = treeLayers.getModel().isLeaf(path[path.length - 1]);
370
                    Object obj = path[path.length - 1];
371
                    if (isLeaf && obj instanceof FeatureStore) {
372
                        return (FeatureStore) obj;
373
                    }
374
                }
375
            case TAB_TABLES_INDEX:
376
                Object selected = lstTables.getSelectedValue();
377
                if(selected instanceof FeatureStore) {
378
                    return (FeatureStore) selected;
379
                }
380
        }
381
        return null;
382
    }
383

    
384
    @Override
385
    public String getTabletName() {
386
        return this.txtName.getText();
387
    }
388
    
389
    @Override
390
    public int importHistory() {
391
        VCSGisWorkspace workspace = getWorkspace();        
392
        if (workspace == null) {
393
            return VCSGisManager.ERR_CANT_ADD_TABLE;
394
        }
395
        FeatureStore sourceStore = getFeatureStore();
396
        if (sourceStore == null) {
397
            return VCSGisManager.ERR_CANT_ADD_TABLE;
398
        }
399
        try {
400
            processing = true;
401
            this.doUpdateComponents();
402
            String label = StringUtils.defaultIfBlank(this.txtLabel.getText(), null);
403
            String category = StringUtils.defaultIfBlank((String)(this.cboCategory.getSelectedItem()), null);
404
            FeatureAttributeDescriptor descriptor = this.fieldForLabelPicker.get();
405
            String attrNameForLabel = descriptor == null ? null : descriptor.getName();
406
            FeatureAttributeDescriptor identifierField = identifierFieldPicker.get();
407
            FeatureAttributeDescriptor sortField = sortFieldPicker.get();
408
            FeatureAttributeDescriptor revisionDateField = revisionDateFieldPicker.get();
409
            int result = workspace.importHistory(
410
                    sourceStore,
411
                    txtName.getText(),
412
                    label,
413
                    category,
414
                    attrNameForLabel,
415
                    identifierField==null? null:identifierField.getName(),
416
                    revisionDateField==null? null:revisionDateField.getName(),
417
                    sortField==null? null:sortField.getName()
418
            );
419

    
420
            this.postAdd(result, workspace);
421
            return result;
422
        } catch (Exception ex) {
423
            LOGGER.warn("Import history canceled", ex);
424
        } finally {
425
            processing = false;
426
            this.doUpdateComponents();
427
            return 0;
428
        }
429
        
430
    }
431
    
432
    private void postAdd(int addStatus, VCSGisWorkspace workspace) {
433
        if( notInSwingThreadInvokeLater(() -> {postAdd(addStatus, workspace);}) ) {
434
            return;
435
        }
436
        VCSGisSwingManager swingManager = VCSGisSwingLocator.getVCSGisSwingManager();
437
        VCSGisSwingServices services = swingManager.getDefaultServices();
438

    
439
        if(addStatus == ERR_OK){
440
            switch (tabAddToWorkspace.getSelectedIndex()) {
441
                case TAB_LAYERS_INDEX:
442
                    if(chkAddLayerToView.isSelected()){
443
                        FeatureStore store = workspace.getFeatureStore(txtName.getText());
444
                        String layerName = store.getName();
445
                        services.addLayerToView(store, (LabeledValue)cboView.getSelectedItem(), layerName);
446
                    }
447
                    break;
448

    
449
                case TAB_TABLES_INDEX:
450
                    if(chkAddTableToProject.isSelected()){
451
                        FeatureStore store = workspace.getFeatureStore(txtName.getText());
452
                        services.addTableToProject(workspace, store);
453
                    }
454
                    break;
455
            }
456
        }
457
    }
458

    
459
    public void setVisibleStatus(boolean visible) {
460
        if( notInSwingThreadInvokeLater(() -> {setVisibleStatus(visible);}) ) {
461
            return;
462
        }
463
        this.lblStatusTitle.setVisible(visible);
464
        this.pbStatus.setVisible(visible);
465
        this.lblStatusMessages.setVisible(true);
466
    }
467

    
468
    @Override
469
    public boolean isProcessing() {
470
        return processing;
471
    }
472

    
473
    private void message(String message) {
474
        if( notInSwingThreadInvokeLater(() -> {message(message);}) ) {
475
            return;
476
        }
477
        this.lblStatusMessages.setText(message);
478
    }
479

    
480
    private void doChangeWorkspace() {
481
        VCSGisWorkspace ws = this.workspacePicker.get();
482
        DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
483
        if( ws!=null ) {
484
            for (String category : ws.getEntityCategories()) {
485
                model.addElement(category);
486
            }
487
        }
488
        this.cboCategory.setModel(model);
489
        doUpdateComponents();
490
    }
491

    
492
}