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

History | View | Annotate | Download (12.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.DefaultListCellRenderer;
30
import javax.swing.JComponent;
31
import javax.swing.JLabel;
32
import javax.swing.JList;
33
import javax.swing.JTree;
34
import javax.swing.ListSelectionModel;
35
import javax.swing.event.ChangeEvent;
36
import javax.swing.event.ChangeListener;
37
import javax.swing.event.DocumentEvent;
38
import javax.swing.event.DocumentListener;
39
import javax.swing.event.ListSelectionEvent;
40
import javax.swing.event.TreeSelectionEvent;
41
import javax.swing.tree.DefaultTreeCellRenderer;
42
import javax.swing.tree.TreePath;
43
import javax.swing.tree.TreeSelectionModel;
44
import org.apache.commons.lang3.StringUtils;
45
import org.gvsig.fmap.dal.DataTypes;
46
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
47
import org.gvsig.fmap.dal.feature.FeatureStore;
48
import org.gvsig.fmap.dal.swing.DALSwingLocator;
49
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
50
import org.gvsig.tools.swing.api.Component;
51
import org.gvsig.tools.swing.api.ToolsSwingLocator;
52
import org.gvsig.tools.swing.api.ToolsSwingManager;
53
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
54
import org.gvsig.tools.swing.api.windowmanager.Dialog;
55
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
56
import org.gvsig.tools.util.LabeledValue;
57
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_OK;
58
import org.gvsig.vcsgis.lib.workspace.VCSGisWorkspace;
59
import org.gvsig.vcsgis.swing.VCSGisJAddToWorkspace;
60
import org.gvsig.vcsgis.swing.VCSGisSwingLocator;
61
import org.gvsig.vcsgis.swing.VCSGisSwingManager;
62
import org.gvsig.vcsgis.swing.VCSGisSwingServices;
63
import org.slf4j.LoggerFactory;
64

    
65
/**
66
 *
67
 * @author gvSIG Team
68
 */
69
public class VCSGisJAddToWorkspaceImpl extends VCSGisJAddToWorkspaceView
70
        implements Component, VCSGisJAddToWorkspace {
71

    
72
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(VCSGisJAddToWorkspaceImpl.class);
73
    
74
    private static final int TAB_LAYERS_INDEX = 0;
75
    private static final int TAB_TABLES_INDEX = 1;
76

    
77
    private PickerController<VCSGisWorkspace> workspacePicker;
78

    
79
    private Dialog dialog;
80
    private AttributeDescriptorPickerController fieldForLabelPicker;
81

    
82
    public VCSGisJAddToWorkspaceImpl() {
83
        initializeComponents();
84
    }
85

    
86
    private void initializeComponents() {
87
        translate();
88
        VCSGisSwingManager swingManager = VCSGisSwingLocator.getVCSGisSwingManager();
89
        this.workspacePicker = swingManager.createWorkspacePickerController(
90
                cboWorkspace,
91
                btnWorkspace
92
        );
93

    
94
        this.workspacePicker.addChangeListener((ChangeEvent e) -> {
95
            doUpdateEnableComponents();
96
        });
97
        
98
        this.setPreferredSize(new Dimension(520, 260));
99

    
100
        tabAddToWorkspace.addChangeListener((ChangeEvent e) -> {
101
            updateTextName();
102
            updateFieldsForLabel();
103
            doUpdateEnableComponents();
104
        });
105
        
106
        VCSGisSwingServices services = swingManager.getDefaultServices();
107
        
108
        ComboBoxModel<LabeledValue> viewDocumentsModel = services.getViewDocumentsComboBoxModel();
109
                
110
        cboView.setModel(viewDocumentsModel);
111
        
112
        cboView.addActionListener((ActionEvent e) -> {
113
            doUpdateEnableComponents();
114
        });
115
        
116
        chkAddLayerToView.addChangeListener((ChangeEvent e) -> {
117
            doUpdateEnableComponents();
118
        });
119
        
120
        treeLayers.setModel(services.getFeatureStoresTreeModel());
121

    
122
        treeLayers.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
123

    
124
        treeLayers.getSelectionModel().addTreeSelectionListener((TreeSelectionEvent e) -> {
125
            updateTextName();
126
            updateFieldsForLabel();
127
            doUpdateEnableComponents();
128
        });
129

    
130
        treeLayers.setCellRenderer(new DefaultTreeCellRenderer() {
131
            @Override
132
            public java.awt.Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
133
                JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); //To change body of generated methods, choose Tools | Templates.
134
                if (value instanceof FeatureStore) {
135
                    label.setText(((FeatureStore) value).getName());
136
                }
137
                return label;
138
            }
139

    
140
        });
141
        
142
        lstTables.setModel(services.getFeatureStoresListModel());
143

    
144
        lstTables.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
145
        lstTables.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
146
            updateTextName();
147
            updateFieldsForLabel();
148
            doUpdateEnableComponents();
149
        });
150

    
151
        lstTables.setCellRenderer(new DefaultListCellRenderer(){
152
            @Override
153
            public java.awt.Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
154
                JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
155
                if (value instanceof FeatureStore) {
156
                    label.setText(((FeatureStore) value).getName());
157
                }
158
                return label;
159
            }
160
        });
161
        
162
        txtName.getDocument().addDocumentListener(new DocumentListener() {
163
            @Override
164
            public void insertUpdate(DocumentEvent e) {
165
                doUpdateEnableComponents();
166
            }
167

    
168
            @Override
169
            public void removeUpdate(DocumentEvent e) {
170
                doUpdateEnableComponents();
171
            }
172

    
173
            @Override
174
            public void changedUpdate(DocumentEvent e) {
175
                doUpdateEnableComponents();
176
            }
177
        });
178
        
179
        this.fieldForLabelPicker = DALSwingLocator.getDataSwingManager().createAttributeDescriptorPickerController(
180
                cboFieldForLabel, 
181
                (FeatureAttributeDescriptor t) -> {
182
            if (t.getType() == DataTypes.GEOMETRY) {
183
                return false;
184
            }
185
            return !t.isComputed();
186
        });
187
        
188
        this.fieldForLabelPicker.addChangeListener(new ChangeListener() {
189
            @Override
190
            public void stateChanged(ChangeEvent e) {
191
                doUpdateEnableComponents();
192
            }
193
        });
194
        
195
        if(this.cboView.getModel().getSize() > 0){
196
            this.cboView.setEnabled(true);
197
            this.cboView.setSelectedIndex(0);
198
            this.chkAddLayerToView.setSelected(true);
199
        } else {
200
            this.cboView.setEnabled(false);
201
            this.chkAddLayerToView.setSelected(false);
202
        }
203
        this.chkAddTableToProject.setSelected(true);
204
        
205
    }
206

    
207
    @Override
208
    public JComponent asJComponent() {
209
        return this;
210
    }
211

    
212
    @Override
213
    public void setDialog(Dialog dialog) {
214
        this.dialog = dialog;
215
        this.doUpdateEnableComponents();
216
    }
217

    
218
    private void updateTextName() {
219
        FeatureStore value = getFeatureStore();
220
        if (value != null) {
221
            txtName.setText(value.getName());
222
        } else {
223
            txtName.setText("");
224
        }
225
    }
226
    
227
    private void updateFieldsForLabel() {
228
        FeatureStore store = getFeatureStore();
229
        if (store != null){
230
            this.fieldForLabelPicker.setFeatureType(store.getDefaultFeatureTypeQuietly());
231
        }
232
    }
233

    
234
    private void doUpdateEnableComponents() {
235

    
236
        VCSGisWorkspace workspace = getWorkspace();
237
        LabeledValue selectedView = (LabeledValue)cboView.getSelectedItem();
238
        boolean enableInit = workspace != null && 
239
                getFeatureStore() != null &&
240
                StringUtils.isNotBlank(txtName.getText());
241
        
242
        if (tabAddToWorkspace.getSelectedIndex() == TAB_LAYERS_INDEX) {
243
            enableInit = enableInit && (!chkAddLayerToView.isSelected()
244
                    || (chkAddLayerToView.isSelected() && selectedView != null && selectedView.getValue() != null));
245
        }
246
                
247
        if (dialog != null) {
248
            this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK,
249
                    enableInit
250
            );
251
        }
252
    }
253

    
254
    private void translate() {
255
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
256
        toolsSwingManager.translate(this.lblWorkspace);
257
        toolsSwingManager.translate(this.lblName);
258
        toolsSwingManager.translate(this.tabAddToWorkspace);
259
        toolsSwingManager.translate(this.lblFieldForLabel);
260
        toolsSwingManager.translate(this.chkAddLayerToView);
261
        toolsSwingManager.translate(this.chkAddTableToProject);
262
    }
263

    
264
    @Override
265
    public VCSGisWorkspace getWorkspace() {
266
        VCSGisWorkspace workspace = this.workspacePicker.get();
267
        return workspace;
268
    }
269

    
270
    @Override
271
    public FeatureStore getFeatureStore() {
272
        switch (tabAddToWorkspace.getSelectedIndex()) {
273
            case TAB_LAYERS_INDEX:
274
                TreePath selection = treeLayers.getSelectionModel().getSelectionPath();
275
                if(selection != null) {
276
                    Object[] path = selection.getPath();
277
                    boolean isLeaf = treeLayers.getModel().isLeaf(path[path.length - 1]);
278
                    Object obj = path[path.length - 1];
279
                    if (isLeaf && obj instanceof FeatureStore) {
280
                        return (FeatureStore) obj;
281
                    }
282
                }
283
            case TAB_TABLES_INDEX:
284
                Object selected = lstTables.getSelectedValue();
285
                if(selected instanceof FeatureStore) {
286
                    return (FeatureStore) selected;
287
                }
288
        }
289
        return null;
290
    }
291

    
292
    @Override
293
    public String getTabletName() {
294
        return this.txtName.getText();
295
    }
296
    
297
    
298

    
299
    @Override
300
    public int add() {
301

    
302
        VCSGisSwingManager swingManager = VCSGisSwingLocator.getVCSGisSwingManager();
303
        VCSGisSwingServices services = swingManager.getDefaultServices();
304

    
305
        VCSGisWorkspace workspace = getWorkspace();
306
        if (workspace != null) {
307
            FeatureStore featureStore = getFeatureStore();
308
            if (featureStore != null) {
309
                FeatureAttributeDescriptor descriptor = this.fieldForLabelPicker.get();
310
                //TODO: Adicionamos pkName si hace falta
311
                int result = workspace.add(txtName.getText(), featureStore, descriptor == null ? null : descriptor.getName());
312
                if(result == ERR_OK){
313
                    switch (tabAddToWorkspace.getSelectedIndex()) {
314
                        case TAB_LAYERS_INDEX:
315
                            if(chkAddLayerToView.isSelected()){
316
                                FeatureStore store = workspace.getFeatureStore(txtName.getText());
317
                                String layerName = workspace.getLabel()+" - " + store.getName();
318
                                services.addLayerToView(store, (LabeledValue)cboView.getSelectedItem(), layerName);
319
                            }
320
                            break;
321

    
322
                        case TAB_TABLES_INDEX:
323
                            if(chkAddTableToProject.isSelected()){
324
                                FeatureStore store = workspace.getFeatureStore(txtName.getText());
325
                                services.addTableToProject(workspace, store);
326
                            }
327
                            break;
328
                    }
329
                }
330

    
331
                return result;
332
            }
333
        }
334
        return -1;
335
    }
336

    
337
}