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 / addToWorkspace / VCSGisJAddToWorkspaceImpl.java @ 3460

History | View | Annotate | Download (16.5 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.addToWorkspace;
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.swing.DALSwingLocator;
50
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
51
import org.gvsig.tools.ToolsLocator;
52
import org.gvsig.tools.swing.api.Component;
53
import org.gvsig.tools.swing.api.ToolsSwingLocator;
54
import org.gvsig.tools.swing.api.ToolsSwingManager;
55
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
56
import org.gvsig.tools.swing.api.task.TaskStatusController;
57
import org.gvsig.tools.swing.api.task.TaskStatusSwingManager;
58
import org.gvsig.tools.swing.api.windowmanager.Dialog;
59
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
60
import org.gvsig.tools.util.LabeledValue;
61
import org.gvsig.vcsgis.lib.VCSGisManager;
62
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_OK;
63
import org.gvsig.vcsgis.lib.VCSGisRuntimeException;
64
import org.gvsig.vcsgis.lib.workspace.VCSGisWorkspace;
65
import org.gvsig.vcsgis.swing.VCSGisJAddToWorkspace;
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
import static org.gvsig.vcsgis.swing.impl.VCSGisSwingCommons.showAuthenticationErrors;
72
import static org.gvsig.vcsgis.swing.impl.VCSGisSwingCommons.showAuthenticationErrors;
73
import static org.gvsig.vcsgis.swing.impl.VCSGisSwingCommons.showAuthenticationErrors;
74

    
75
/**
76
 *
77
 * @author gvSIG Team
78
 */
79
public class VCSGisJAddToWorkspaceImpl extends VCSGisJAddToWorkspaceView
80
        implements Component, VCSGisJAddToWorkspace {
81

    
82
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(VCSGisJAddToWorkspaceImpl.class);
83
    
84
    private static final int TAB_LAYERS_INDEX = 0;
85
    private static final int TAB_TABLES_INDEX = 1;
86

    
87
    private PickerController<VCSGisWorkspace> workspacePicker;
88

    
89
    private Dialog dialog;
90
    private AttributeDescriptorPickerController fieldForLabelPicker;
91
    private boolean processing;
92
    private TaskStatusController taskStatusController;
93

    
94
    public VCSGisJAddToWorkspaceImpl() {
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, 340));
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.fieldForLabelPicker.addChangeListener((ChangeEvent e) -> {
214
            doUpdateComponents();
215
        });
216
        
217
        if(this.cboView.getModel().getSize() > 0){
218
            this.cboView.setEnabled(true);
219
            this.cboView.setSelectedIndex(0);
220
            this.chkAddLayerToView.setSelected(true);
221
        } else {
222
            this.cboView.setEnabled(false);
223
            this.chkAddLayerToView.setSelected(false);
224
        }
225
        this.chkAddTableToProject.setSelected(true);
226
        
227
    }
228

    
229
    @Override
230
    public JComponent asJComponent() {
231
        return this;
232
    }
233

    
234
    @Override
235
    public void setDialog(Dialog dialog) {
236
        this.dialog = dialog;
237
        this.doUpdateComponents();
238
    }
239

    
240
    private void updateTextName() {
241
        FeatureStore value = getFeatureStore();
242
        if (value != null) {
243
            txtName.setText(value.getName());
244
        } else {
245
            txtName.setText("");
246
        }
247
    }
248
    
249
    private void updateFieldsForLabel() {
250
        FeatureStore store = getFeatureStore();
251
        if (store != null){
252
            this.fieldForLabelPicker.setFeatureType(store.getDefaultFeatureTypeQuietly());
253
        }
254
    }
255

    
256
    private void doUpdateComponents() {
257
        try {
258
            VCSGisWorkspace workspace = getWorkspace();
259
            LabeledValue selectedView = (LabeledValue)cboView.getSelectedItem();
260
            boolean enableComponents = !processing && workspace != null ;
261
            boolean enableInit = enableComponents && 
262
                    getFeatureStore() != null &&
263
                    StringUtils.isNotBlank(txtName.getText()) &&
264
                    workspace.getEntity(txtName.getText())==null ;
265
            
266
            if (tabAddToWorkspace.getSelectedIndex() == TAB_LAYERS_INDEX) {
267
                enableInit = enableInit && (!chkAddLayerToView.isSelected()
268
                        || (chkAddLayerToView.isSelected() && selectedView != null && selectedView.getValue() != null));
269
            }
270

    
271
            this.workspacePicker.setEnabled( !processing );
272
            this.tabAddToWorkspace.setEnabled(enableComponents);
273
            this.txtName.setEnabled(enableComponents);
274
            this.cboFieldForLabel.setEnabled(enableComponents);
275
            this.txtLabel.setEnabled(enableComponents);
276
            this.cboCategory.setEnabled(enableComponents);
277

    
278
            this.cboView.setEnabled(enableComponents);
279
            this.chkAddLayerToView.setEnabled(enableComponents);
280
            this.chkAddTableToProject.setEnabled(enableComponents);
281

    
282
            if (dialog != null) {
283
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK,
284
                        enableInit
285
                );
286
            }
287
            this.pbStatus.setVisible(processing);
288
            this.lblStatusTitle.setVisible(processing);
289
        } catch(VCSGisRuntimeException e1) {
290
            LOGGER.warn("Can't updating components.",e1);
291
            if( showAuthenticationErrors("_VCS_Add_to_workspace",e1) ) {
292
                this.workspacePicker.set(null);
293
                doChangeWorkspace();
294
            }
295
        } catch(Exception e2) {
296
            LOGGER.warn("Can't updating components.",e2);
297
        }
298
    }
299

    
300
    private void translate() {
301
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
302
        toolsSwingManager.translate(this.lblWorkspace);
303
        toolsSwingManager.translate(this.lblName);
304
        toolsSwingManager.translate(this.tabAddToWorkspace);
305
        toolsSwingManager.translate(this.lblFieldForLabel);
306
        toolsSwingManager.translate(this.chkAddLayerToView);
307
        toolsSwingManager.translate(this.chkAddTableToProject);
308
        toolsSwingManager.translate(this.lblCategory);
309
        toolsSwingManager.translate(this.lblLabel);
310
    }
311

    
312
    @Override
313
    public VCSGisWorkspace getWorkspace() {
314
        VCSGisWorkspace workspace = this.workspacePicker.get();
315
        return workspace;
316
    }
317

    
318
    @Override
319
    public FeatureStore getFeatureStore() {
320
        switch (tabAddToWorkspace.getSelectedIndex()) {
321
            case TAB_LAYERS_INDEX:
322
                TreePath selection = treeLayers.getSelectionModel().getSelectionPath();
323
                if(selection != null) {
324
                    Object[] path = selection.getPath();
325
                    boolean isLeaf = treeLayers.getModel().isLeaf(path[path.length - 1]);
326
                    Object obj = path[path.length - 1];
327
                    if (isLeaf && obj instanceof FeatureStore) {
328
                        return (FeatureStore) obj;
329
                    }
330
                }
331
            case TAB_TABLES_INDEX:
332
                Object selected = lstTables.getSelectedValue();
333
                if(selected instanceof FeatureStore) {
334
                    return (FeatureStore) selected;
335
                }
336
        }
337
        return null;
338
    }
339

    
340
    @Override
341
    public String getTabletName() {
342
        return this.txtName.getText();
343
    }
344
    
345
    
346

    
347
    @Override
348
    public int add() {
349
        VCSGisWorkspace workspace = getWorkspace();        
350
        if (workspace == null) {
351
            return VCSGisManager.ERR_CANT_ADD_TABLE;
352
        }
353
        FeatureStore featureStore = getFeatureStore();
354
        if (featureStore == null) {
355
            return VCSGisManager.ERR_CANT_ADD_TABLE;
356
        }
357
        try {
358
            processing = true;
359
            this.doUpdateComponents();
360
            String label = StringUtils.defaultIfBlank(this.txtLabel.getText(), null);
361
            String category = StringUtils.defaultIfBlank((String)(this.cboCategory.getSelectedItem()), null);
362
            FeatureAttributeDescriptor descriptor = this.fieldForLabelPicker.get();
363
            String attrNameForLabel = descriptor == null ? null : descriptor.getName();
364
            //TODO: Adicionamos pkName si hace falta
365
            int result = workspace.add(txtName.getText(), featureStore, attrNameForLabel, category, label);
366
            this.postAdd(result, workspace);
367
            return result;
368
        } finally {
369
            processing = false;
370
            this.doUpdateComponents();
371
        }
372
    }
373
    
374
    private void postAdd(int addStatus, VCSGisWorkspace workspace) {
375
        if( notInSwingThreadInvokeLater(() -> {postAdd(addStatus, workspace);}) ) {
376
            return;
377
        }
378
        VCSGisSwingManager swingManager = VCSGisSwingLocator.getVCSGisSwingManager();
379
        VCSGisSwingServices services = swingManager.getDefaultServices();
380

    
381
        if(addStatus == ERR_OK){
382
            switch (tabAddToWorkspace.getSelectedIndex()) {
383
                case TAB_LAYERS_INDEX:
384
                    if(chkAddLayerToView.isSelected()){
385
                        FeatureStore store = workspace.getFeatureStore(txtName.getText());
386
                        String layerName = store.getName();
387
                        services.addLayerToView(store, (LabeledValue)cboView.getSelectedItem(), layerName);
388
                    }
389
                    break;
390

    
391
                case TAB_TABLES_INDEX:
392
                    if(chkAddTableToProject.isSelected()){
393
                        FeatureStore store = workspace.getFeatureStore(txtName.getText());
394
                        services.addTableToProject(workspace, store);
395
                    }
396
                    break;
397
            }
398
        }
399
    }
400

    
401
    public void setVisibleStatus(boolean visible) {
402
        if( notInSwingThreadInvokeLater(() -> {setVisibleStatus(visible);}) ) {
403
            return;
404
        }
405
        this.lblStatusTitle.setVisible(visible);
406
        this.pbStatus.setVisible(visible);
407
        this.lblStatusMessages.setVisible(true);
408
    }
409

    
410
    @Override
411
    public boolean isProcessing() {
412
        return processing;
413
    }
414

    
415
    private void message(String message) {
416
        if( notInSwingThreadInvokeLater(() -> {message(message);}) ) {
417
            return;
418
        }
419
        this.lblStatusMessages.setText(message);
420
    }
421

    
422
    private void doChangeWorkspace() {
423
        VCSGisWorkspace ws = this.workspacePicker.get();
424
        DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
425
        if( ws!=null ) {
426
            for (String category : ws.getEntityCategories()) {
427
                model.addElement(category);
428
            }
429
        }
430
        this.cboCategory.setModel(model);
431
        doUpdateComponents();
432
    }
433

    
434
}