gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.dynform / org.gvsig.tools.dynform.spi / src / main / java / org / gvsig / tools / dynform / spi / AbstractJDynForm.java @ 1862
History | View | Annotate | Download (12 KB)
1 |
package org.gvsig.tools.dynform.spi; |
---|---|
2 |
|
3 |
import java.awt.BorderLayout; |
4 |
import java.awt.Color; |
5 |
import java.awt.Component; |
6 |
import java.awt.Dimension; |
7 |
import java.awt.event.MouseAdapter; |
8 |
import java.awt.event.MouseEvent; |
9 |
import java.util.ArrayList; |
10 |
import java.util.HashMap; |
11 |
import java.util.HashSet; |
12 |
import java.util.Iterator; |
13 |
import java.util.List; |
14 |
import java.util.Map; |
15 |
import java.util.Set; |
16 |
import javax.swing.Action; |
17 |
import javax.swing.BorderFactory; |
18 |
import javax.swing.JComponent; |
19 |
import javax.swing.JLabel; |
20 |
import javax.swing.JOptionPane; |
21 |
import javax.swing.JPanel; |
22 |
import javax.swing.JScrollPane; |
23 |
import javax.swing.JViewport; |
24 |
import org.apache.commons.lang3.StringUtils; |
25 |
import org.gvsig.tools.dataTypes.CoercionException; |
26 |
import org.gvsig.tools.dataTypes.DataType; |
27 |
import org.gvsig.tools.dynform.DynFormDefinition; |
28 |
import org.gvsig.tools.dynform.DynFormManager; |
29 |
import org.gvsig.tools.dynform.JDynForm; |
30 |
import org.gvsig.tools.dynform.JDynFormField; |
31 |
import org.gvsig.tools.dynform.JDynFormSet; |
32 |
import org.gvsig.tools.dynobject.DynObject; |
33 |
import org.gvsig.tools.dynobject.Tags; |
34 |
import org.gvsig.tools.service.ServiceException; |
35 |
import org.gvsig.tools.util.PropertiesSupportHelper; |
36 |
import org.slf4j.Logger; |
37 |
import org.slf4j.LoggerFactory; |
38 |
|
39 |
|
40 |
public abstract class AbstractJDynForm implements JDynForm { |
41 |
|
42 |
protected static final Logger logger = LoggerFactory.getLogger(AbstractJDynForm.class); |
43 |
private int formWidth = 320; |
44 |
private int formHeight = 540; |
45 |
private DynFormManager manager = null; |
46 |
private DynFormDefinition definition = null; |
47 |
private int layoutMode = USE_PLAIN; |
48 |
private JLabel jlabel_messages = null; |
49 |
private boolean readOnly = true; |
50 |
private Set listeners = null; |
51 |
private boolean useScrollBars = true; |
52 |
private final Map<String, List<Action>> customActions; |
53 |
private JComponent contents = null; |
54 |
protected DynObject values = null; |
55 |
private boolean border; |
56 |
private DynFormSPIManager serviceManager;
|
57 |
private final PropertiesSupportHelper propertiesHelper = new PropertiesSupportHelper(); |
58 |
private DynFormContext context = null; |
59 |
|
60 |
@SuppressWarnings("OverridableMethodCallInConstructor") |
61 |
public AbstractJDynForm(
|
62 |
DynFormManager manager, |
63 |
DynFormDefinition definition, |
64 |
DynFormContext context |
65 |
) throws ServiceException {
|
66 |
this.manager = manager;
|
67 |
this.definition = definition;
|
68 |
this.context = context;
|
69 |
this.listeners = new HashSet(); |
70 |
this.customActions = new HashMap(); |
71 |
if(definition != null){ |
72 |
this.loadDefaultValuesFromTags(definition.getTags());
|
73 |
} |
74 |
} |
75 |
|
76 |
public static int getLayoutFromTags(Tags tags) { |
77 |
String layoutMode = (String) tags.get(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE); |
78 |
if( !StringUtils.isEmpty(layoutMode) ) {
|
79 |
if( layoutMode.equalsIgnoreCase("0") || |
80 |
layoutMode.equalsIgnoreCase(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE_VALUE_PLAIN) ) { |
81 |
return JDynFormSet.USE_PLAIN;
|
82 |
} else if( layoutMode.equalsIgnoreCase("1") || |
83 |
layoutMode.equalsIgnoreCase(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE_VALUE_TABS) ) { |
84 |
return JDynFormSet.USE_TABS;
|
85 |
} else if( layoutMode.equalsIgnoreCase("2") || |
86 |
layoutMode.equalsIgnoreCase(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE_VALUE_SEPARATORS) ) { |
87 |
return JDynFormSet.USE_SEPARATORS;
|
88 |
} |
89 |
} |
90 |
return JDynFormSet.USE_PLAIN;
|
91 |
} |
92 |
|
93 |
public void loadDefaultValuesFromTags(Tags tags) { |
94 |
this.setLayoutMode(getLayoutFromTags(tags));
|
95 |
|
96 |
try {
|
97 |
this.formWidth = tags.getInt(DynFormSPIManager.TAG_DYNFORM_WIDTH);
|
98 |
} catch (CoercionException ex) {
|
99 |
} |
100 |
try {
|
101 |
this.formHeight = tags.getInt(DynFormSPIManager.TAG_DYNFORM_HEIGHT);
|
102 |
} catch (CoercionException ex) {
|
103 |
} |
104 |
try {
|
105 |
this.border = tags.getBoolean(DynFormSPIManager.TAG_DYNFORM_BORDER);
|
106 |
} catch (CoercionException ex) {
|
107 |
} |
108 |
try {
|
109 |
this.useScrollBars = tags.getBoolean(DynFormSPIManager.TAG_DYNFORM_USESCROLLBARS);
|
110 |
} catch (CoercionException ex) {
|
111 |
} |
112 |
try {
|
113 |
this.readOnly = tags.getBoolean(DynFormSPIManager.TAG_DYNFORM_READONLY);
|
114 |
} catch (CoercionException ex) {
|
115 |
} |
116 |
} |
117 |
|
118 |
public DynFormSPIManager getServiceManager() {
|
119 |
if ( serviceManager == null ) { |
120 |
serviceManager = DynFormSPILocator.getDynFormSPIManager(); |
121 |
} |
122 |
return serviceManager;
|
123 |
} |
124 |
|
125 |
|
126 |
@Override
|
127 |
public JComponent asJComponent() { |
128 |
if (this.contents == null) { |
129 |
this.initComponents();
|
130 |
} |
131 |
return this.contents; |
132 |
} |
133 |
|
134 |
protected void initComponents() { |
135 |
if( this.contents == null ) { |
136 |
this.contents = addScrollsAndMessageBar(this.getFieldsContainer()); |
137 |
if (this.values != null) { |
138 |
this.setValues(values);
|
139 |
} |
140 |
if( this.border ) { |
141 |
this.contents.setBorder(BorderFactory.createLineBorder(Color.GRAY)); |
142 |
} |
143 |
message(); |
144 |
} |
145 |
} |
146 |
|
147 |
protected boolean isContentsInitialized() { |
148 |
return this.contents != null; |
149 |
} |
150 |
|
151 |
@Override
|
152 |
public void addListener(JDynFormListener listener) { |
153 |
this.listeners.add(listener);
|
154 |
} |
155 |
|
156 |
@Override
|
157 |
public void removeListener(JDynFormListener listener) { |
158 |
this.listeners.remove(listener);
|
159 |
} |
160 |
|
161 |
public JLabel getMessagesJLabel() { |
162 |
if (this.jlabel_messages == null) { |
163 |
this.jlabel_messages = new JLabel(); |
164 |
this.jlabel_messages.addMouseListener(new MouseAdapter() { |
165 |
@Override
|
166 |
public void mouseClicked(MouseEvent evt) { |
167 |
int count = evt.getClickCount();
|
168 |
if (count == 2) { |
169 |
JOptionPane.showMessageDialog(contents, jlabel_messages.getText(), "Status", JOptionPane.INFORMATION_MESSAGE); |
170 |
} |
171 |
} |
172 |
}); |
173 |
} |
174 |
return this.jlabel_messages; |
175 |
} |
176 |
|
177 |
@Override
|
178 |
public void setShowMessageStatus(boolean showMessageStatus) { |
179 |
this.getMessagesJLabel().setVisible(showMessageStatus);
|
180 |
} |
181 |
|
182 |
@Override
|
183 |
public boolean isShowMessageStatus() { |
184 |
return this.getMessagesJLabel().isVisible(); |
185 |
} |
186 |
|
187 |
@Override
|
188 |
public void message() { |
189 |
this.getMessagesJLabel().setText(" "); |
190 |
} |
191 |
|
192 |
@Override
|
193 |
public void message(String msg) { |
194 |
this.getMessagesJLabel().setText(msg);
|
195 |
fireMessageEvent(msg); |
196 |
} |
197 |
|
198 |
protected void fireMessageEvent(String message) { |
199 |
Iterator it = this.listeners.iterator(); |
200 |
while (it.hasNext()) {
|
201 |
JDynFormListener listener = (JDynFormListener) it.next(); |
202 |
try {
|
203 |
listener.message(message); |
204 |
} catch (Exception ex) { |
205 |
logger.info("Error calling listener " + listener.toString()
|
206 |
+ "(" + listener.getClass().getName() + ") from " |
207 |
+ this.toString() + "(" + this.getClass().getName() |
208 |
+ ").", ex);
|
209 |
} |
210 |
} |
211 |
} |
212 |
|
213 |
protected void fireFieldChangeEvent(JDynFormField field) { |
214 |
Iterator it = this.listeners.iterator(); |
215 |
while (it.hasNext()) {
|
216 |
JDynFormListener listener = (JDynFormListener) it.next(); |
217 |
try {
|
218 |
listener.fieldChanged(field); |
219 |
} catch (Exception ex) { |
220 |
logger.info("Error calling listener " + listener.toString()
|
221 |
+ "(" + listener.getClass().getName() + ") from " |
222 |
+ this.toString() + "(" + this.getClass().getName() |
223 |
+ ").", ex);
|
224 |
} |
225 |
} |
226 |
} |
227 |
|
228 |
protected JPanel addScrollsAndMessageBar(JComponent formPanel) { |
229 |
formPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); |
230 |
JScrollPane scroll = new JScrollPane(formPanel); |
231 |
if (useScrollBars) {
|
232 |
scroll.setPreferredSize(new Dimension(formWidth, formHeight)); |
233 |
} else {
|
234 |
scroll.setPreferredSize(formPanel.getPreferredSize()); |
235 |
} |
236 |
scroll.setBorder(BorderFactory.createEmptyBorder());
|
237 |
JPanel jpanel = new JPanel(); |
238 |
jpanel.setLayout(new BorderLayout()); |
239 |
jpanel.add(scroll, BorderLayout.CENTER);
|
240 |
jpanel.add(getMessagesJLabel(), BorderLayout.PAGE_END);
|
241 |
return jpanel;
|
242 |
} |
243 |
|
244 |
@Override
|
245 |
public int getLayoutMode() { |
246 |
return this.layoutMode; |
247 |
} |
248 |
|
249 |
@Override
|
250 |
public void setLayoutMode(int layoutMode) { |
251 |
if (layoutMode < 0 || layoutMode > USE_SEPARATORS) { |
252 |
throw new IllegalArgumentException("layoutMode (" + layoutMode + ") out of range. Valid values are 0 .. " + USE_SEPARATORS + "."); |
253 |
} |
254 |
this.layoutMode = layoutMode;
|
255 |
} |
256 |
|
257 |
@Override
|
258 |
public boolean isReadOnly() { |
259 |
return readOnly;
|
260 |
} |
261 |
|
262 |
@Override
|
263 |
public void setReadOnly(boolean readOnly) { |
264 |
this.readOnly = readOnly;
|
265 |
} |
266 |
|
267 |
@Override
|
268 |
public int getFormWidth() { |
269 |
if (this.contents == null) { |
270 |
return this.formWidth; |
271 |
} else {
|
272 |
JViewport port = ((JScrollPane) this.asJComponent()).getViewport(); |
273 |
Component comp = (Component) port.getView(); |
274 |
return comp.getWidth();
|
275 |
} |
276 |
} |
277 |
|
278 |
@Override
|
279 |
public int getFormHeight() { |
280 |
if (this.contents == null) { |
281 |
return this.formHeight; |
282 |
} else {
|
283 |
JViewport port = ((JScrollPane) this.asJComponent()).getViewport(); |
284 |
Component comp = (Component) port.getView(); |
285 |
return comp.getHeight();
|
286 |
} |
287 |
} |
288 |
|
289 |
@Override
|
290 |
public void setFormSize(int width, int height) { |
291 |
this.formHeight = height;
|
292 |
this.formWidth = width;
|
293 |
if (this.contents != null) { |
294 |
this.asJComponent().setPreferredSize(new Dimension(width, height)); |
295 |
} |
296 |
} |
297 |
|
298 |
protected List<Action> getCustomFields(DataType dataType) { |
299 |
return (List<Action>) customActions.get(dataType.getName()); |
300 |
} |
301 |
|
302 |
@Override
|
303 |
public void addActionToPopupMenu(DataType tipo, String name, Action action) { |
304 |
List<Action> acts = this.getCustomFields(tipo); |
305 |
action.putValue(Action.NAME, name);
|
306 |
if (acts == null) { |
307 |
List<Action> aux = new ArrayList<>(); |
308 |
aux.add(action); |
309 |
customActions.put(tipo.getName(), aux); |
310 |
} else {
|
311 |
acts.add(action); |
312 |
} |
313 |
} |
314 |
|
315 |
@Override
|
316 |
public void addSeparatorToPopupMenu(DataType tipo) { |
317 |
List<Action> acts = this.getCustomFields(tipo); |
318 |
if (acts == null) { |
319 |
List<Action> aux = new ArrayList<>(); |
320 |
aux.add(null);
|
321 |
customActions.put(tipo.getName(), aux); |
322 |
} else {
|
323 |
acts.add(null);
|
324 |
} |
325 |
} |
326 |
|
327 |
@Override
|
328 |
public DynFormDefinition getDefinition() {
|
329 |
return this.definition; |
330 |
} |
331 |
|
332 |
@Override
|
333 |
public boolean getUseScrollBars() { |
334 |
return useScrollBars;
|
335 |
} |
336 |
|
337 |
|
338 |
@Override
|
339 |
public void setUseScrollBars(boolean usesScrolls) { |
340 |
this.useScrollBars = usesScrolls;
|
341 |
} |
342 |
|
343 |
public void setBorder(boolean border) { |
344 |
this.border = border;
|
345 |
if( this.isContentsInitialized() && border ) { |
346 |
this.asJComponent().setBorder(BorderFactory.createLineBorder(Color.GRAY)); |
347 |
} |
348 |
} |
349 |
|
350 |
@Override
|
351 |
public JDynFormField getField(String fieldName) { |
352 |
return null; |
353 |
} |
354 |
|
355 |
@Override
|
356 |
public Object getProperty(String key) { |
357 |
return this.propertiesHelper.getProperty(key); |
358 |
} |
359 |
|
360 |
@Override
|
361 |
public void setProperty(String key, Object obj) { |
362 |
this.propertiesHelper.setProperty(key, obj);
|
363 |
} |
364 |
|
365 |
@Override
|
366 |
public Map<String,Object> getProperties() { |
367 |
return this.propertiesHelper.getProperties(); |
368 |
} |
369 |
|
370 |
|
371 |
@Override
|
372 |
public DynFormContext getContext() {
|
373 |
return this.context; |
374 |
} |
375 |
|
376 |
@Override
|
377 |
public void setContext(DynFormContext context) { |
378 |
this.context = context;
|
379 |
} |
380 |
|
381 |
protected abstract JComponent getFieldsContainer(); |
382 |
} |