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 | 45788 | jjdelcerro | 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 | 45790 | jjdelcerro | import org.gvsig.fmap.dal.feature.FeatureStoreNotification; |
30 | 45889 | fdiaz | import static org.gvsig.fmap.dal.feature.FeatureStoreNotification.AFTER_CANCELEDITING; |
31 | 45790 | jjdelcerro | import static org.gvsig.fmap.dal.feature.FeatureStoreNotification.AFTER_FINISHEDITING; |
32 | 45788 | jjdelcerro | 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 | 45790 | jjdelcerro | import org.gvsig.tools.observer.Observable; |
44 | import org.gvsig.tools.observer.Observer; |
||
45 | 45788 | jjdelcerro | import org.gvsig.tools.swing.api.Component; |
46 | 45806 | fdiaz | import org.gvsig.tools.swing.api.TableColumnAdjuster; |
47 | 45788 | jjdelcerro | 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 | 45806 | fdiaz | private TableColumnAdjuster columnAdjuster;
|
63 | 45788 | jjdelcerro | |
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 | 45790 | jjdelcerro | try {
|
108 | if (references == null) { |
||
109 | return 0; |
||
110 | } |
||
111 | return references.size();
|
||
112 | } catch(Exception ex) { |
||
113 | 45788 | jjdelcerro | return 0; |
114 | } |
||
115 | } |
||
116 | |||
117 | @Override
|
||
118 | public int getColumnCount() { |
||
119 | 45790 | jjdelcerro | try {
|
120 | if (featureType == null) { |
||
121 | return 0; |
||
122 | } |
||
123 | return featureType.size();
|
||
124 | } catch(Exception ex) { |
||
125 | 45788 | jjdelcerro | 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 | 45889 | fdiaz | } catch (Exception ex) { |
138 | 45788 | jjdelcerro | 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 | 45790 | jjdelcerro | private Observer storeObserver; |
152 | 45788 | jjdelcerro | |
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 | 45846 | jjdelcerro | 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 | 45788 | jjdelcerro | 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 | 45790 | jjdelcerro | |
182 | this.storeObserver = (Observable observable, Object notification) -> { |
||
183 | 45889 | fdiaz | if( notification instanceof FeatureStoreNotification && ( |
184 | ((FeatureStoreNotification)notification).getType().equals(AFTER_FINISHEDITING) || |
||
185 | ((FeatureStoreNotification)notification).getType().equals(AFTER_CANCELEDITING)) |
||
186 | ) { |
||
187 | 45846 | jjdelcerro | executeQuietly(()-> store.deleteObserver(storeObserver)); |
188 | executeQuietly(()-> form.asJComponent().setVisible(false));
|
||
189 | executeQuietly(()-> setVisible(false));
|
||
190 | 45790 | jjdelcerro | } |
191 | }; |
||
192 | this.store.addObserver(storeObserver);
|
||
193 | 45788 | jjdelcerro | |
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 | 45804 | fdiaz | this.tblFeatures.setAutoCreateColumnsFromModel(false); |
204 | 45788 | jjdelcerro | 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 | 45806 | fdiaz | if(this.columnAdjuster == null){ |
264 | this.columnAdjuster = toolsSwingManager.createTableColumnAdjuster(this.tblFeatures); |
||
265 | } else {
|
||
266 | this.columnAdjuster.restoreColumns();
|
||
267 | } |
||
268 | 45788 | jjdelcerro | 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 | 47392 | fdiaz | |
314 | String title = ToolsSwingUtils.makeTitle("_Edited_features", this.store.getName(), null); |
||
315 | 45788 | jjdelcerro | 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 | } |