Statistics
| Revision:

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 @ 1405

History | View | Annotate | Download (11 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.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37

    
38

    
39
public abstract  class AbstractJDynForm implements JDynForm {
40

    
41
    protected static final Logger logger = LoggerFactory.getLogger(AbstractJDynForm.class);
42
    private int formWidth = 320;
43
    private int formHeight = 540;
44
    private DynFormManager manager = null;
45
    private DynFormDefinition definition = null;
46
    private int layoutMode = USE_PLAIN;
47
    private JLabel jlabel_messages = null;
48
    private boolean readOnly = false;
49
    private Set listeners = null;
50
    private boolean useScrollBars = true;
51
    private Map<String, List<Action>> customActions;
52
    private JComponent contents = null;
53
    protected DynObject values = null;
54
    private boolean border;
55
    private DynFormSPIManager serviceManager;
56

    
57
    public AbstractJDynForm(DynFormManager manager, DynFormDefinition definition) throws ServiceException {
58
        this.manager = manager;
59
        this.definition = definition;
60
        this.listeners = new HashSet();
61
        this.customActions = new HashMap();
62
        this.loadDefaultValuesFromTags(definition.getTags());
63
    }
64

    
65
    public static int getLayoutFromTags(Tags tags) {
66
        String layoutMode = (String) tags.get(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE);
67
        if( !StringUtils.isEmpty(layoutMode) ) {
68
            if( layoutMode.equalsIgnoreCase("0") || 
69
                    layoutMode.equalsIgnoreCase(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE_VALUE_PLAIN) ) {
70
                return JDynFormSet.USE_PLAIN;
71
            } else if( layoutMode.equalsIgnoreCase("1") || 
72
                    layoutMode.equalsIgnoreCase(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE_VALUE_TABS) ) {
73
                return JDynFormSet.USE_TABS;
74
            } else if( layoutMode.equalsIgnoreCase("2") || 
75
                    layoutMode.equalsIgnoreCase(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE_VALUE_SEPARATORS) ) {
76
                return JDynFormSet.USE_SEPARATORS;
77
            }
78
        }
79
        return JDynFormSet.USE_PLAIN;
80
    }
81
    
82
    public void loadDefaultValuesFromTags(Tags tags) {
83
        this.setLayoutMode(getLayoutFromTags(tags));
84
        
85
        try {
86
            this.formWidth = tags.getInt(DynFormSPIManager.TAG_DYNFORM_WIDTH);
87
        } catch (CoercionException ex) {
88
        }
89
        try {
90
            this.formHeight = tags.getInt(DynFormSPIManager.TAG_DYNFORM_HEIGHT);
91
        } catch (CoercionException ex) {
92
        }
93
        try {
94
            this.border = tags.getBoolean(DynFormSPIManager.TAG_DYNFORM_BORDER);
95
        } catch (CoercionException ex) {
96
        }
97
        try {
98
            this.useScrollBars = tags.getBoolean(DynFormSPIManager.TAG_DYNFORM_USESCROLLBARS);
99
        } catch (CoercionException ex) {
100
        }
101
        try {
102
            this.readOnly = tags.getBoolean(DynFormSPIManager.TAG_DYNFORM_READONLY);
103
        } catch (CoercionException ex) {
104
        }
105
    }
106

    
107
    public DynFormSPIManager getServiceManager() {
108
        if ( serviceManager == null ) {
109
            serviceManager = DynFormSPILocator.getDynFormSPIManager();
110
        }
111
        return serviceManager;
112
    }
113

    
114

    
115
    @Override
116
    public JComponent asJComponent() {
117
        if (this.contents == null) {
118
            this.initComponents();
119
        }
120
        return this.contents;
121
    }
122

    
123
    protected void initComponents() {
124
        if( this.contents == null ) {
125
            this.contents = addScrollsAndMessageBar(this.getFieldsContainer());
126
            if (this.values != null) {
127
                this.setValues(values);
128
            }
129
            if( this.border ) {
130
                this.contents.setBorder(BorderFactory.createLineBorder(Color.GRAY));
131
            }
132
            message();
133
        }
134
    }
135

    
136
    protected boolean isContentsInitialized() {
137
        return this.contents != null;
138
    }
139

    
140
    @Override
141
    public void addListener(JDynFormListener listener) {
142
        this.listeners.add(listener);
143
    }
144

    
145
    @Override
146
    public void removeListener(JDynFormListener listener) {
147
        this.listeners.remove(listener);
148
    }
149

    
150
    public JLabel getMessagesJLabel() {
151
        if (this.jlabel_messages == null) {
152
            this.jlabel_messages = new JLabel();
153
            this.jlabel_messages.addMouseListener(new MouseAdapter() {
154
                @Override
155
                public void mouseClicked(MouseEvent evt) {
156
                    int count = evt.getClickCount();
157
                    if (count == 2) {
158
                        JOptionPane.showMessageDialog(contents, jlabel_messages.getText(), "Status", JOptionPane.INFORMATION_MESSAGE);
159
                    }
160
                }
161
            });
162
        }
163
        return this.jlabel_messages;
164
    }
165

    
166
    @Override
167
    public void setShowMessageStatus(boolean showMessageStatus) {
168
        this.getMessagesJLabel().setVisible(showMessageStatus);
169
    }
170

    
171
    @Override
172
    public boolean isShowMessageStatus() {
173
        return this.getMessagesJLabel().isVisible();
174
    }
175

    
176
    @Override
177
    public void message() {
178
        this.getMessagesJLabel().setText(" ");
179
    }
180

    
181
    @Override
182
    public void message(String msg) {
183
        this.getMessagesJLabel().setText(msg);
184
        fireMessageEvent(msg);
185
    }
186

    
187
    protected void fireMessageEvent(String message) {
188
        Iterator it = this.listeners.iterator();
189
        while (it.hasNext()) {
190
            JDynFormListener listener = (JDynFormListener) it.next();
191
            try {
192
                listener.message(message);
193
            } catch (Exception ex) {
194
                logger.info("Error calling listener " + listener.toString()
195
                        + "(" + listener.getClass().getName() + ") from "
196
                        + this.toString() + "(" + this.getClass().getName()
197
                        + ").", ex);
198
            }
199
        }
200
    }
201

    
202
    protected void fireFieldChangeEvent(JDynFormField field) {
203
        Iterator it = this.listeners.iterator();
204
        while (it.hasNext()) {
205
            JDynFormListener listener = (JDynFormListener) it.next();
206
            try {
207
                listener.fieldChanged(field);
208
            } catch (Exception ex) {
209
                logger.info("Error calling listener " + listener.toString()
210
                        + "(" + listener.getClass().getName() + ") from "
211
                        + this.toString() + "(" + this.getClass().getName()
212
                        + ").", ex);
213
            }
214
        }
215
    }
216

    
217
    protected JPanel addScrollsAndMessageBar(JComponent formPanel) {
218
        formPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
219
        JScrollPane scroll = new JScrollPane(formPanel);
220
        if (useScrollBars) {
221
            scroll.setPreferredSize(new Dimension(formWidth, formHeight));
222
        } else {
223
            scroll.setPreferredSize(formPanel.getPreferredSize());
224
        }
225
        scroll.setBorder(BorderFactory.createEmptyBorder());
226
        JPanel jpanel = new JPanel();
227
        jpanel.setLayout(new BorderLayout());
228
        jpanel.add(scroll, BorderLayout.CENTER);
229
        jpanel.add(getMessagesJLabel(), BorderLayout.PAGE_END);
230
        return jpanel;
231
    }
232

    
233
    @Override
234
    public int getLayoutMode() {
235
        return this.layoutMode;
236
    }
237

    
238
    @Override
239
    public void setLayoutMode(int layoutMode) {
240
        if (layoutMode < 0 || layoutMode > USE_SEPARATORS) {
241
            throw new IllegalArgumentException("layoutMode (" + layoutMode + ") out of range. Valid values are 0 .. " + USE_SEPARATORS + ".");
242
        }
243
        this.layoutMode = layoutMode;
244
    }
245

    
246
    @Override
247
    public boolean isReadOnly() {
248
        return readOnly;
249
    }
250

    
251
    @Override
252
    public void setReadOnly(boolean readOnly) {
253
        this.readOnly = readOnly;
254
    }
255

    
256
    @Override
257
    public int getFormWidth() {
258
        if (this.contents == null) {
259
            return this.formWidth;
260
        } else {
261
            JViewport port = ((JScrollPane) this.asJComponent()).getViewport();
262
            Component comp = (Component) port.getView();
263
            return comp.getWidth();
264
        }
265
    }
266

    
267
    @Override
268
    public int getFormHeight() {
269
        if (this.contents == null) {
270
            return this.formHeight;
271
        } else {
272
            JViewport port = ((JScrollPane) this.asJComponent()).getViewport();
273
            Component comp = (Component) port.getView();
274
            return comp.getHeight();
275
        }
276
    }
277

    
278
    @Override
279
    public void setFormSize(int width, int height) {
280
        this.formHeight = height;
281
        this.formWidth = width;
282
        if (this.contents != null) {
283
            this.asJComponent().setPreferredSize(new Dimension(width, height));
284
        }
285
    }
286

    
287
    protected List<Action> getCustomFields(DataType dataType) {
288
        return (List<Action>) customActions.get(dataType.getName());
289
    }
290

    
291
    @Override
292
    public void addActionToPopupMenu(DataType tipo, String name, Action action) {
293
        List<Action> acts = this.getCustomFields(tipo);
294
        action.putValue(Action.NAME, name);
295
        if (acts == null) {
296
            List<Action> aux = new ArrayList<>();
297
            aux.add(action);
298
            customActions.put(tipo.getName(), aux);
299
        } else {
300
            acts.add(action);
301
        }
302
    }
303

    
304
    @Override
305
    public void addSeparatorToPopupMenu(DataType tipo) {
306
        List<Action> acts = this.getCustomFields(tipo);
307
        if (acts == null) {
308
            List<Action> aux = new ArrayList<>();
309
            aux.add(null);
310
            customActions.put(tipo.getName(), aux);
311
        } else {
312
            acts.add(null);
313
        }
314
    }
315

    
316
    @Override
317
    public DynFormDefinition getDefinition() {
318
        return this.definition;
319
    }
320

    
321
    @Override
322
    public boolean getUseScrollBars() {
323
        return useScrollBars;
324
    }
325

    
326

    
327
    @Override
328
    public void setUseScrollBars(boolean usesScrolls) {
329
        this.useScrollBars = usesScrolls;
330
    }
331

    
332
    public void setBorder(boolean border) {
333
        this.border = border;
334
        if( this.isContentsInitialized() && border ) {
335
            this.asJComponent().setBorder(BorderFactory.createLineBorder(Color.GRAY));
336
        }
337
    }
338

    
339
    @Override
340
    public JDynFormField getField(String fieldName) {
341
        return null;
342
    }
343

    
344
    protected abstract JComponent getFieldsContainer();
345
}