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 |
} |