svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.swing / org.gvsig.fmap.dal.swing.impl / src / main / java / org / gvsig / fmap / dal / swing / impl / featuretable / table / editors / GeometryWKTCellEditor.java @ 42806
History | View | Annotate | Download (7.02 KB)
1 | 40559 | jjdelcerro | /**
|
---|---|---|---|
2 | * gvSIG. Desktop Geographic Information System.
|
||
3 | 40435 | jjdelcerro | *
|
4 | 40559 | jjdelcerro | * Copyright (C) 2007-2013 gvSIG Association.
|
5 | *
|
||
6 | 40435 | jjdelcerro | * This program is free software; you can redistribute it and/or
|
7 | * modify it under the terms of the GNU General Public License
|
||
8 | 40559 | jjdelcerro | * as published by the Free Software Foundation; either version 3
|
9 | 40435 | jjdelcerro | * of the License, or (at your option) any later version.
|
10 | 40559 | jjdelcerro | *
|
11 | 40435 | jjdelcerro | * 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 | 40559 | jjdelcerro | *
|
16 | 40435 | jjdelcerro | * 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 | 40559 | jjdelcerro | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19 | 40435 | jjdelcerro | * MA 02110-1301, USA.
|
20 | 40559 | jjdelcerro | *
|
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 | 40435 | jjdelcerro | */
|
24 | /*
|
||
25 | * AUTHORS (In addition to CIT):
|
||
26 | * 2008 {DiSiD Technologies} {{Task}}
|
||
27 | */
|
||
28 | 42775 | jjdelcerro | package org.gvsig.fmap.dal.swing.impl.featuretable.table.editors; |
29 | 40435 | jjdelcerro | |
30 | import java.awt.Component; |
||
31 | import java.awt.event.ActionEvent; |
||
32 | import java.awt.event.ItemEvent; |
||
33 | import java.util.EventObject; |
||
34 | |||
35 | import javax.swing.DefaultCellEditor; |
||
36 | import javax.swing.JOptionPane; |
||
37 | import javax.swing.JTable; |
||
38 | 42806 | fdiaz | |
39 | 42692 | jjdelcerro | import org.apache.commons.lang3.StringUtils; |
40 | 42806 | fdiaz | import org.slf4j.Logger; |
41 | import org.slf4j.LoggerFactory; |
||
42 | 40435 | jjdelcerro | |
43 | 42806 | fdiaz | import org.gvsig.fmap.dal.swing.impl.featuretable.table.renders.GeometryToWKTException; |
44 | 40435 | jjdelcerro | import org.gvsig.fmap.geom.Geometry; |
45 | import org.gvsig.fmap.geom.GeometryLocator; |
||
46 | import org.gvsig.fmap.geom.GeometryManager; |
||
47 | import org.gvsig.i18n.Messages; |
||
48 | |||
49 | /**
|
||
50 | * Editor for cells of type Geometry in WKT format.
|
||
51 | * <p>
|
||
52 | * If the WKT to represent a Geometry is too big, editing is not allowed, as the
|
||
53 | * rendering of that big text is too slow.
|
||
54 | * </p>
|
||
55 | 42806 | fdiaz | *
|
56 | 40435 | jjdelcerro | * @author <a href="mailto:cordin@disid.com">C�sar Ordi�ana</a>
|
57 | */
|
||
58 | public class GeometryWKTCellEditor extends TextAreaCellEditor { |
||
59 | private static final GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
||
60 | private static final Logger logger = LoggerFactory.getLogger(GeometryWKTCellEditor.class); |
||
61 | public static final int DEFAULT_MAX_WKT_LENGTH = 10000; |
||
62 | |||
63 | private static final long serialVersionUID = -2296004227902843851L; |
||
64 | 42806 | fdiaz | |
65 | 40435 | jjdelcerro | private int maxRowHeight; |
66 | |||
67 | /**
|
||
68 | * Creates a new editor for Geometries in WKT format.
|
||
69 | */
|
||
70 | public GeometryWKTCellEditor() {
|
||
71 | this(DEFAULT_MAX_WKT_LENGTH, 160); |
||
72 | } |
||
73 | |||
74 | /**
|
||
75 | * Creates a new editor for Geometries in WKT format.
|
||
76 | 42806 | fdiaz | *
|
77 | 40435 | jjdelcerro | * @param maxWKTLength
|
78 | * the maximum WTK length allowed to be edited.
|
||
79 | * @param maxRowHeight
|
||
80 | * the maximum row height for the rows with cells rendered with
|
||
81 | * this component
|
||
82 | */
|
||
83 | public GeometryWKTCellEditor(int maxWKTLength, int maxRowHeight) { |
||
84 | super();
|
||
85 | delegate = new GeometryToWKTDelegate(delegate, maxWKTLength);
|
||
86 | this.maxRowHeight = maxRowHeight;
|
||
87 | } |
||
88 | |||
89 | @Override
|
||
90 | public Object getCellEditorValue() { |
||
91 | String wkt = (String) super.getCellEditorValue(); |
||
92 | try {
|
||
93 | 42692 | jjdelcerro | if( wkt==null || StringUtils.isEmpty(wkt.trim()) ) { |
94 | return null; |
||
95 | } |
||
96 | return geomManager.createFrom(wkt);
|
||
97 | 40435 | jjdelcerro | } catch (Exception ex) { |
98 | throw new WKTToGeometryException(wkt, ex); |
||
99 | } |
||
100 | } |
||
101 | |||
102 | @Override
|
||
103 | public Component getTableCellEditorComponent(JTable table, Object value, |
||
104 | boolean isSelected, int row, int column) { |
||
105 | delegate.setValue(value); |
||
106 | if (((GeometryToWKTDelegate) delegate).isWtkTextTooLong()) {
|
||
107 | JOptionPane
|
||
108 | .showMessageDialog( |
||
109 | table.getParent(), |
||
110 | Messages |
||
111 | .getText("Geometria_no_editable_WKT"), Messages
|
||
112 | .getText("Error_editar_geometria"),
|
||
113 | JOptionPane.ERROR_MESSAGE);
|
||
114 | |||
115 | return null; |
||
116 | } else {
|
||
117 | int height_wanted = (int) getTextArea().getPreferredSize() |
||
118 | .getHeight(); |
||
119 | |||
120 | height_wanted = height_wanted > maxRowHeight ? maxRowHeight |
||
121 | : height_wanted; |
||
122 | |||
123 | if (height_wanted > table.getRowHeight(row)) {
|
||
124 | 41621 | jjdelcerro | int previousRowHeight = table.getRowHeight();
|
125 | 40435 | jjdelcerro | table.setRowHeight(row, height_wanted); |
126 | 41621 | jjdelcerro | table.firePropertyChange("rowheight", previousRowHeight, height_wanted);
|
127 | 40435 | jjdelcerro | } |
128 | |||
129 | return editorComponent;
|
||
130 | } |
||
131 | } |
||
132 | |||
133 | @SuppressWarnings("serial") |
||
134 | private class GeometryToWKTDelegate extends |
||
135 | DefaultCellEditor.EditorDelegate {
|
||
136 | private DefaultCellEditor.EditorDelegate delegate; |
||
137 | |||
138 | private boolean wtkTextTooLong = false; |
||
139 | |||
140 | private int maxWKTLength; |
||
141 | |||
142 | public GeometryToWKTDelegate(DefaultCellEditor.EditorDelegate delegate, |
||
143 | int maxWKTLength) {
|
||
144 | this.delegate = delegate;
|
||
145 | this.maxWKTLength = maxWKTLength;
|
||
146 | } |
||
147 | |||
148 | /**
|
||
149 | * @return the wtkTextTooLong
|
||
150 | */
|
||
151 | public boolean isWtkTextTooLong() { |
||
152 | return wtkTextTooLong;
|
||
153 | } |
||
154 | |||
155 | public void setValue(Object value) { |
||
156 | wtkTextTooLong = false;
|
||
157 | String strValue = ""; |
||
158 | |||
159 | if (value != null) { |
||
160 | try {
|
||
161 | Geometry geometry = (Geometry) value; |
||
162 | strValue = geometry.convertToWKT(); |
||
163 | |||
164 | if (strValue.length() > maxWKTLength) {
|
||
165 | wtkTextTooLong = true;
|
||
166 | delegate.setValue(null);
|
||
167 | } else {
|
||
168 | delegate.setValue(strValue); |
||
169 | } |
||
170 | } catch (Exception ex) { |
||
171 | throw new GeometryToWKTException(ex); |
||
172 | } |
||
173 | } |
||
174 | } |
||
175 | |||
176 | public Object getCellEditorValue() { |
||
177 | if (wtkTextTooLong) {
|
||
178 | return null; |
||
179 | } else {
|
||
180 | return delegate.getCellEditorValue();
|
||
181 | } |
||
182 | } |
||
183 | |||
184 | public void actionPerformed(ActionEvent e) { |
||
185 | delegate.actionPerformed(e); |
||
186 | } |
||
187 | |||
188 | public void cancelCellEditing() { |
||
189 | delegate.cancelCellEditing(); |
||
190 | } |
||
191 | |||
192 | public boolean equals(Object obj) { |
||
193 | return delegate.equals(obj);
|
||
194 | } |
||
195 | |||
196 | public int hashCode() { |
||
197 | return delegate.hashCode();
|
||
198 | } |
||
199 | |||
200 | public boolean isCellEditable(EventObject anEvent) { |
||
201 | return delegate.isCellEditable(anEvent);
|
||
202 | } |
||
203 | |||
204 | public void itemStateChanged(ItemEvent e) { |
||
205 | delegate.itemStateChanged(e); |
||
206 | } |
||
207 | |||
208 | public boolean shouldSelectCell(EventObject anEvent) { |
||
209 | return delegate.shouldSelectCell(anEvent);
|
||
210 | } |
||
211 | |||
212 | public boolean startCellEditing(EventObject anEvent) { |
||
213 | return delegate.startCellEditing(anEvent);
|
||
214 | } |
||
215 | |||
216 | public boolean stopCellEditing() { |
||
217 | return delegate.stopCellEditing();
|
||
218 | } |
||
219 | |||
220 | public String toString() { |
||
221 | return delegate.toString();
|
||
222 | } |
||
223 | } |
||
224 | } |