Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / extension / editedfeatures / EditedFeaturesPanel.java @ 47392

History | View | Annotate | Download (12.6 KB)

1
package org.gvsig.app.extension.editedfeatures;
2

    
3
import java.awt.Color;
4
import java.awt.event.ActionEvent;
5
import java.awt.event.ComponentAdapter;
6
import java.awt.event.ComponentEvent;
7
import java.awt.event.MouseAdapter;
8
import java.awt.event.MouseEvent;
9
import java.util.List;
10
import javax.swing.ImageIcon;
11
import javax.swing.JComponent;
12
import javax.swing.JTable;
13
import javax.swing.ListSelectionModel;
14
import javax.swing.event.ListSelectionEvent;
15
import javax.swing.table.AbstractTableModel;
16
import javax.swing.table.DefaultTableCellRenderer;
17
import javax.swing.table.DefaultTableColumnModel;
18
import javax.swing.table.TableColumn;
19
import org.gvsig.featureform.swing.CreateJFeatureFormException;
20
import org.gvsig.featureform.swing.JFeatureReferencesForm;
21
import org.gvsig.fmap.dal.exception.DataException;
22
import org.gvsig.fmap.dal.feature.Feature;
23
import static org.gvsig.fmap.dal.feature.Feature.CHECK_BASIC;
24
import static org.gvsig.fmap.dal.feature.Feature.CHECK_REQUIREDS;
25
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
26
import org.gvsig.fmap.dal.feature.FeatureReference;
27
import org.gvsig.fmap.dal.feature.FeatureSelection;
28
import org.gvsig.fmap.dal.feature.FeatureStore;
29
import org.gvsig.fmap.dal.feature.FeatureStoreNotification;
30
import static org.gvsig.fmap.dal.feature.FeatureStoreNotification.AFTER_CANCELEDITING;
31
import static org.gvsig.fmap.dal.feature.FeatureStoreNotification.AFTER_FINISHEDITING;
32
import org.gvsig.fmap.dal.feature.FeatureType;
33
import org.gvsig.fmap.dal.swing.DALSwingLocator;
34
import org.gvsig.fmap.dal.swing.DataSwingManager;
35
import org.gvsig.tools.ToolsLocator;
36
import org.gvsig.tools.dataTypes.Coercion;
37
import org.gvsig.tools.dataTypes.CoercionException;
38
import org.gvsig.tools.dataTypes.DataTypes;
39
import org.gvsig.tools.dynform.AbortActionException;
40
import org.gvsig.tools.dynform.JDynFormSet;
41
import org.gvsig.tools.dynform.JDynFormSetAdapter;
42
import org.gvsig.tools.i18n.I18nManager;
43
import org.gvsig.tools.observer.Observable;
44
import org.gvsig.tools.observer.Observer;
45
import org.gvsig.tools.swing.api.Component;
46
import org.gvsig.tools.swing.api.TableColumnAdjuster;
47
import org.gvsig.tools.swing.api.ToolsSwingLocator;
48
import org.gvsig.tools.swing.api.ToolsSwingManager;
49
import org.gvsig.tools.swing.api.ToolsSwingUtils;
50
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
51
import org.slf4j.Logger;
52
import org.slf4j.LoggerFactory;
53

    
54
/**
55
 *
56
 * @author gvSIG Team
57
 */
58
@SuppressWarnings("UseSpecificCatch")
59
public class EditedFeaturesPanel extends EditedFeaturesPanelView implements Component {
60

    
61
    private static final Logger LOGGER = LoggerFactory.getLogger(EditedFeaturesPanel.class);
62
    private TableColumnAdjuster columnAdjuster;
63

    
64
    private class FeatureAttributeCellRenderer extends DefaultTableCellRenderer {
65

    
66
        private final FeatureAttributeDescriptor descriptor;
67

    
68
        public FeatureAttributeCellRenderer(FeatureAttributeDescriptor descriptor) {
69
            this.descriptor = descriptor;
70
        }
71

    
72
        @Override
73
        public java.awt.Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
74
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
75
            if (value == null) {
76
                setText("");
77
            } else {
78
                try {
79
                    value = toString.coerce(value);
80
                } catch (CoercionException ex) {
81
                    LOGGER.debug("Can't coerce value to string.", ex);
82
                }
83
                setText((String) value);
84
            }
85
            if (!isSelected) {
86
                this.setBackground(table.getBackground());
87
                try {
88
                    Feature feature = references.get(row).getFeature();
89
                    feature.validate(Feature.CHECK_RULES_AT_FINISH | CHECK_REQUIREDS | CHECK_BASIC);
90
                } catch (Exception ex) {
91
                    this.setBackground(backgroundColorWarning);
92
                }
93
            }
94
            return this;
95
        }
96

    
97
    }
98

    
99
    private class MyTableModel extends AbstractTableModel {
100

    
101
        public MyTableModel() {
102

    
103
        }
104

    
105
        @Override
106
        public int getRowCount() {
107
            try {
108
                if (references == null) {
109
                    return 0;
110
                }
111
                return references.size();
112
            } catch(Exception ex) {
113
                return 0;
114
            }
115
        }
116

    
117
        @Override
118
        public int getColumnCount() {
119
            try {
120
                if (featureType == null) {
121
                    return 0;
122
                }
123
                return featureType.size();
124
            } catch(Exception ex) {
125
                return 0;
126
            }
127
        }
128

    
129
        @Override
130
        public Object getValueAt(int rowIndex, int columnIndex) {
131
            try {
132
                if (references == null) {
133
                    return "";
134
                }
135
                Feature feature = references.get(rowIndex).getFeature();
136
                return feature.get(columnIndex);
137
            } catch (Exception ex) {
138
                return "";
139
            }
140
        }
141

    
142
    }
143

    
144
    private final FeatureStore store;
145
    private final Coercion toString;
146
    private final FeatureType featureType;
147
    private List<FeatureReference> references;
148
    private JFeatureReferencesForm form;
149
    private Color backgroundColorWarning;
150
    private DefaultTableColumnModel columnModel;
151
    private Observer storeObserver;
152

    
153
    public EditedFeaturesPanel(FeatureStore store) {
154
        this.store = store;
155
        this.featureType = this.store.getDefaultFeatureTypeQuietly();
156
        this.toString = ToolsLocator.getDataTypesManager().get(DataTypes.STRING).getCoercion();
157
        this.initComponents();
158
    }
159

    
160
    private void executeQuietly(Runnable r) {
161
        try {
162
            r.run();
163
        } catch(Exception ex) {
164
            LOGGER.debug("Can't execute", ex);
165
        }
166
    }
167
    
168
    private void initComponents() {
169
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
170

    
171
        this.backgroundColorWarning = toolsSwingManager.getWarningBackgroundColor();
172

    
173
        this.addComponentListener(new ComponentAdapter() {
174
            @Override
175
            public void componentHidden(ComponentEvent e) {
176
                if (form != null && form.asJComponent().isVisible()) {
177
                    form.asJComponent().setVisible(false);
178
                }
179
            }
180
        });
181
        
182
        this.storeObserver = (Observable observable, Object notification) -> {
183
            if( notification instanceof FeatureStoreNotification && (
184
                    ((FeatureStoreNotification)notification).getType().equals(AFTER_FINISHEDITING) ||
185
                    ((FeatureStoreNotification)notification).getType().equals(AFTER_CANCELEDITING))
186
                    ) {
187
                executeQuietly(()-> store.deleteObserver(storeObserver));
188
                executeQuietly(()-> form.asJComponent().setVisible(false));
189
                executeQuietly(()-> setVisible(false));
190
            }
191
        };
192
        this.store.addObserver(storeObserver);
193

    
194
        toolsSwingManager.translate(this.chkOnlyNotValidatedFeatures);
195
        this.chkOnlyNotValidatedFeatures.addActionListener((ActionEvent e) -> {
196
            doOnlyNotValidatedFeaturesChange();
197
        });
198

    
199
        this.btnShowForm.addActionListener((ActionEvent e) -> {
200
            doShowForm();
201
        });
202

    
203
        this.tblFeatures.setAutoCreateColumnsFromModel(false);
204
        this.tblFeatures.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
205
        this.tblFeatures.addMouseListener(new MouseAdapter() {
206
            @Override
207
            public void mouseClicked(MouseEvent e) {
208
                if (e.getClickCount() == 2) {
209
                    int x = tblFeatures.rowAtPoint(e.getPoint());
210
                    tblFeatures.getSelectionModel().setSelectionInterval(x, x);
211
                    doShowForm();
212
                }
213
            }
214

    
215
        });
216
        this.tblFeatures.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
217
            if (e.getValueIsAdjusting()) {
218
                return;
219
            }
220
            doSelectCurrentFeature();
221
        });
222
        this.columnModel = new DefaultTableColumnModel();
223
        FeatureType ftype = store.getDefaultFeatureTypeQuietly();
224
        int modelIndex = 0;
225
        for (FeatureAttributeDescriptor attr : ftype) {
226
            TableColumn column = new TableColumn();
227
            column.setHeaderValue(attr.getLabel());
228
            column.setCellRenderer(new FeatureAttributeCellRenderer(attr));
229
            column.setResizable(true);
230
            column.setModelIndex(modelIndex++);
231
            columnModel.addColumn(column);
232
        }
233

    
234
        this.references = this.store.getEditedFeatures();
235
        doOnlyNotValidatedFeaturesChange();
236

    
237
        ToolsSwingUtils.ensureRowsCols(this, 15, 90, 30, 100);
238

    
239
    }
240

    
241
    private void doSelectCurrentFeature() {
242
        int row = tblFeatures.getSelectedRow();
243
        if (row >= 0) {
244
            try {
245
                FeatureSelection selection = store.getFeatureSelection();
246
                selection.deselectAll();
247
                selection.select(references.get(row));
248
            } catch (DataException ex) {
249
            }
250
        }
251
    }
252

    
253
    private void doOnlyNotValidatedFeaturesChange() {
254
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
255

    
256
        if (this.chkOnlyNotValidatedFeatures.isSelected()) {
257
            this.references = this.store.getEditedFeaturesNotValidated();
258
        } else {
259
            this.references = this.store.getEditedFeatures();
260
        }
261
        this.tblFeatures.setModel(new MyTableModel());
262
        this.tblFeatures.setColumnModel(columnModel);
263
        if(this.columnAdjuster == null){
264
            this.columnAdjuster = toolsSwingManager.createTableColumnAdjuster(this.tblFeatures);
265
        } else {
266
            this.columnAdjuster.restoreColumns();
267
        }
268
        if (this.form != null) {
269
            if (this.form.getFormset().getForm().isModified()) {
270
                this.form.getFormset().fireEvent(JDynFormSet.ACTION_SAVE, null);
271
            }
272
            this.form.setFeatures(this.references);
273
            this.form.getFormset().addListener(new JDynFormSetAdapter() {
274
                @Override
275
                public void formMovedTo(int currentPosition) throws AbortActionException {
276
                    tblFeatures.getSelectionModel().setSelectionInterval(currentPosition, currentPosition);
277
                }
278
            });
279
        }
280
    }
281

    
282
    private void doShowForm() {
283

    
284
        if (this.references.isEmpty()) {
285
            return;
286
        }
287
        int index = this.tblFeatures.getSelectedRow();
288
        if (index < 0) {
289
            index = 0;
290
        }
291

    
292
        if (this.form == null) {
293
            try {
294
                WindowManager winmgr = ToolsSwingLocator.getWindowManager();
295
                DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
296
                I18nManager i18n = ToolsLocator.getI18nManager();
297

    
298
                this.form = dataSwingManager.createJFeatureReferencesForm(store, references);
299
                this.form.getFormset().setAutosave(false);
300

    
301
                this.form.asJComponent().addComponentListener(new ComponentAdapter() {
302
                    @Override
303
                    public void componentHidden(ComponentEvent e) {
304
                        form = null;
305
                    }
306
                });
307
                this.form.getFormset().addListener(new JDynFormSetAdapter() {
308
                    @Override
309
                    public void formMovedTo(int currentPosition) throws AbortActionException {
310
                        tblFeatures.getSelectionModel().setSelectionInterval(currentPosition, currentPosition);
311
                    }
312
                });
313
                
314
                String title = ToolsSwingUtils.makeTitle("_Edited_features", this.store.getName(), null);
315
                winmgr.showWindow(
316
                        this.form.asJComponent(),
317
                        title,
318
                        WindowManager.MODE.WINDOW
319
                );
320

    
321
            } catch (CreateJFeatureFormException ex) {
322
                // TODO: falta tratamiento de las excepciones
323
            }
324
        }
325
        JDynFormSet formset = this.form.getFormset();
326
        if (formset.getCurrentIndex() != index) {
327
            if (formset.getForm().isModified()) {
328
                formset.fireEvent(JDynFormSet.ACTION_SAVE, null);
329
            }
330
            formset.setCurrentIndex(index);
331
        }
332
    }
333

    
334
    @Override
335
    public JComponent asJComponent() {
336
        return this;
337
    }
338

    
339
    @Override
340
    public ImageIcon loadImage(String imageName) {
341
        return ToolsSwingUtils.loadImage(this, imageName);
342
    }
343

    
344
}