Revision 496

View differences:

org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/usability/button/JStandardizedToolButton.java
152 152

  
153 153
        // figure out the suitable width
154 154
        for (int i = buttonSizes.length - 1; i >= 0; i--) {
155
            if (oldWidth < buttonSizes[i][0]) {
155
            if (oldWidth <= buttonSizes[i][0]) {
156 156
                newWidth = buttonSizes[i][0];
157 157
            }
158 158
        }
159 159

  
160 160
        // figure out the suitable height
161 161
        for (int i = buttonSizes.length - 1; i >= 0; i--) {
162
            if (oldHeight < buttonSizes[i][1]) {
162
            if (oldHeight <= buttonSizes[i][1]) {
163 163
                newHeight = buttonSizes[i][1];
164 164
            }
165 165
        }
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/usability/DefaultUsabilitySwingManager.java
26 26
 */
27 27
package org.gvsig.tools.swing.impl.usability;
28 28

  
29
import java.awt.Color;
29 30
import java.awt.Component;
30 31
import java.awt.GridBagConstraints;
31 32
import java.awt.GridBagLayout;
32 33
import java.awt.Insets;
33 34

  
34 35
import javax.swing.Action;
36
import javax.swing.BorderFactory;
35 37
import javax.swing.Icon;
36 38
import javax.swing.JButton;
39
import javax.swing.JComponent;
37 40
import javax.swing.JPanel;
41
import javax.swing.JSpinner;
42
import javax.swing.JTextArea;
43
import javax.swing.border.Border;
38 44

  
39 45
import org.gvsig.tools.swing.api.usability.UsabilitySwingManager;
40 46
import org.gvsig.tools.swing.impl.usability.button.JStandardizedButton;
41 47
import org.gvsig.tools.swing.impl.usability.button.JStandardizedToolButton;
48
import org.gvsig.tools.swing.impl.usability.spinner.JNullSpinner;
49
import org.gvsig.tools.swing.impl.usability.text.JStandardizedTextArea;
42 50

  
43 51
/**
44 52
 * Default implementation for the {@link UsabilitySwingManager}.
......
58 66
    public JPanel createGridBagRowPanel(JPanel gridBagPanel,
59 67
        Component labelComponent, Component fieldComponent,
60 68
        Integer labelMargin, Integer fieldMargin) {
61
        // Create a panel that uses BoxLayout.
69
        // Creates a panel that uses BoxLayout.
62 70
        JPanel panel;
63 71
        if (gridBagPanel == null) {
64 72
            panel = new JPanel();
......
74 82
        constr.weighty = 0;
75 83

  
76 84
        if (labelComponent != null) {
77
            // constr.weightx = 0;
78
            // int width = labelComponent.getSize().width;
79

  
80 85
            if (labelMargin != null) {
81 86
                constr.weightx = labelMargin;
82 87
            }
......
131 136
        return constr;
132 137
    }
133 138

  
139
    /**
140
     * Sets a new marked border returning the older border settings.
141
     * 
142
     * @param component
143
     * @return
144
     */
145
    public Border setLightMarkedBorder(JComponent component){
146
        return setLightMarkedBorder(component, 1, Color.red);
147
    }
148
    
149
    /**
150
     * Sets a new marked border returning the older border settings.
151
     * 
152
     * @param component
153
     * @return
154
     */
155
    public Border setLightMarkedBorder(JComponent component, int thickness, Color color){
156
        Border oldBorder = component.getBorder();
157
        Border one = BorderFactory.createEtchedBorder();
158
        Border two = BorderFactory.createMatteBorder(thickness,thickness,thickness,thickness, color);
159
        component.setBorder(BorderFactory.createCompoundBorder(one, two));
160
        return oldBorder;
161
    }
162
    public JTextArea createJTextArea(String text) {
163
        return new JStandardizedTextArea(text);
164
    }
165

  
166
    public JTextArea createJTextArea(String text, int maxWidth) {
167
        JStandardizedTextArea ta = new JStandardizedTextArea(text);
168
        ta.setFill(maxWidth);
169
        return ta;
170
    }
171

  
172
    public JSpinner createJNullSpinner(int dataType, Object value, int defaultMaximumWidth) {
173
        JNullSpinner spinner = new JNullSpinner(dataType, value, defaultMaximumWidth);
174
        return spinner;
175
    }
176

  
177

  
178
    public JSpinner createJNullSpinner(int dataType, Object value) {
179
        JNullSpinner spinner = new JNullSpinner(dataType, value);
180
        return spinner;
181
    }
134 182
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/usability/spinner/JNullSpinner.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 * 
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 * 
11
 * 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
 * 
16
 * 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
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
 * MA  02110-1301, USA.
20
 * 
21
 */
22
/*
23
 * AUTHORS (In addition to CIT):
24
 * 2010 Institute of New Imaging Technologies (INIT): 
25
 *   http://www.init.uji.es
26
 * Geographic Information research group: 
27
 *   http://www.geoinfo.uji.es
28
 * Universitat Jaume I, Spain
29
 */
30
package org.gvsig.tools.swing.impl.usability.spinner;
31

  
32
import java.awt.Dimension;
33
import java.util.Locale;
34
import java.util.regex.Matcher;
35
import java.util.regex.Pattern;
36

  
37
import javax.swing.Icon;
38
import javax.swing.JLabel;
39
import javax.swing.JSpinner;
40

  
41
import org.gvsig.tools.dataTypes.DataTypes;
42
import org.gvsig.tools.swing.impl.usability.spinner.model.NullSpinnerHandler;
43

  
44
public class JNullSpinner extends JSpinner {
45

  
46
    private int type;
47
    private Pattern pattern;
48

  
49
    private String enableText;
50
    private String toolTip;
51

  
52
    private JLabel iconLabel;
53

  
54
    private int filled = 0;
55
    private String subType;    
56

  
57
    private static int[][] spinnerSizes = new int[][] { new int[] { 22, 25 },
58
        new int[] { 44, 25 }, new int[] { 66, 25 }, new int[] { 88, 25 },
59
        new int[] { 110, 25 }, new int[] { 132, 25 }, new int[] { 154, 25 } };
60

  
61

  
62

  
63
    /**
64
     * Creates a new empty instance of org.gvsig.gui.beans.swing.Jspinner.
65
     */
66
    public JNullSpinner(int dataType, String subType, Locale loc,
67
        String initialValue) {
68
        super();
69
        initSettings(dataType, subType, loc, initialValue);
70
//        this.repaint();
71
    }
72

  
73
    public JNullSpinner(int dataType, Object value, int defaultMaximumWidth) {
74
        this(dataType, value);
75
        this.filled = defaultMaximumWidth;
76
//        this.repaint();
77
    }
78

  
79
    private void initSettings(int dataType, String subType, Locale loc,
80
        Object value) {
81
//        Border border = BorderFactory.
82
//        border.
83
//        setBorder(BorderFactory.createEtchedBorder());
84

  
85
        this.type = dataType;
86
        this.subType = subType;
87

  
88
        this.pattern = setMatcher(dataType, subType);
89
        setModel(this.type, this.subType, loc);
90

  
91
        setValue(value);
92
    }
93
     
94
    private void setModel(int type, String subType, Locale locale) {
95
        NullSpinnerHandler handler =
96
            new NullSpinnerHandler(type,subType, locale);
97
        this.setModel(handler.getModel());
98
    }
99

  
100
    /**
101
     * Creates a new instance of org.gvsig.gui.beans.swing.Jspinner containing
102
     * an
103
     * image.
104
     */
105
    public JNullSpinner(Icon icon) {
106
        this(DataTypes.STRING, null);
107
        iconLabel = new JLabel(icon);
108
    }
109

  
110
    /**
111
     * Creates a new instance of org.gvsig.gui.beans.swing.Jspinner containing a
112
     * text.
113
     * 
114
     * @param text
115
     */
116
    public JNullSpinner(String text) {
117
        this(DataTypes.STRING, text);
118
    }
119

  
120
    /**
121
     * Creates a new instance of org.gvsig.gui.beans.swing.Jspinner containing
122
     * an
123
     * image and a text.
124
     * 
125
     * @param text
126
     * @param icon
127
     */
128
    public JNullSpinner(String text, Icon icon) {
129
        this(text);
130
        iconLabel = new JLabel(icon);
131
    }
132

  
133
    // /**
134
    // * Creates a new instance of org.gvsig.gui.beans.swing.Jspinner from an
135
    // * {@link Action}.
136
    // */
137
    // public JStandardizedspinner(Action action) {
138
    // super(action);
139
    // }
140

  
141
    /**
142
     * Gets the text that appears in the tooltip when the spinner is disabled.
143
     * 
144
     * @return String
145
     */
146
    public String getEnableText() {
147
        return enableText;
148
    }
149

  
150
//    @Override
151
//    public Dimension getMaximumSize() {
152
//        return getPreferredSize();
153
//    }
154
//
155
//    @Override
156
//    public Dimension getMinimumSize() {
157
//        return getPreferredSize();
158
//    }
159

  
160
//    @Override
161
//    public Dimension getPreferredSize() {
162
//        Dimension d = null;
163
//        if (this.getParent()!=null){
164
//            try{
165
//                d= this.getParent().getMaximumSize(); 
166
//            }catch(NullPointerException e){
167
//                d = super.getMaximumSize();  
168
//                if (d == null){
169
//                    int index = spinnerSizes.length-1;
170
//                    d = new Dimension(spinnerSizes[index][0],spinnerSizes[index][1]);                    
171
//                }                
172
//            }
173
//        }
174
//        Dimension pref = super.getPreferredSize();
175
//        if ((pref!=null)&&(pref.getWidth()<=spinnerSizes[0][0])){
176
//            pref.width = spinnerSizes[0][0];
177
//            return pref;
178
//        }
179
//        if ((filled<0)&&(d!=null)){
180
//            return d;
181
//        }
182
//        return pref;
183
////        return super.getPreferredSize();
184
////        int textSize = 0;
185
////        if (this.getValue() != null) {
186
////            textSize = this.getValue().toString().length();
187
////        }
188
////
189
////        if (d == null) {
190
////            return new Dimension(spinnerSizes[0][0], spinnerSizes[0][1]);
191
////        }
192
////        int oldWidth = (int) d.getWidth(), newWidth = oldWidth;
193
////        int oldHeight = (int) d.getHeight(), newHeight = oldHeight;
194
////
195
////        // figure out the suitable width
196
////        for (int i = spinnerSizes.length - 1; i >= 0; i--) {
197
////            if (oldWidth <= spinnerSizes[i][0]) {
198
////                newWidth = spinnerSizes[i][0];
199
////            } else
200
////                if (textSize > newWidth) {
201
////                    newWidth = spinnerSizes[i][0];
202
////                }
203
////
204
////        }
205
////
206
////        // figure out the suitable height
207
////        for (int i = spinnerSizes.length - 1; i >= 0; i--) {
208
////            if (oldHeight <= spinnerSizes[i][1]) {
209
////                newHeight = spinnerSizes[i][1];
210
////            }
211
////        }
212
////
213
////        if (filled < 0) {
214
////
215
////            d = getUI().getMaximumSize(this);
216
////            newWidth = (int) (d.getWidth() - 6);
217
////        } else
218
////            if (filled > 0) {
219
////                if (oldWidth < filled) {
220
////                    newWidth = filled;
221
////                } else {
222
////                    newWidth = oldWidth;
223
////                }
224
////            }
225
////
226
////        return new Dimension(newWidth, newHeight);
227
//    }
228

  
229
    public void setValue(String text) {
230
//        super.setValue(text);
231
////        Dimension d = getUI().getMinimumSize(this);
232
////        int oldWidth = (int) d.getWidth(), newWidth = oldWidth;
233
////        int oldHeight = (int) d.getHeight(), newHeight = oldHeight;
234
////        this.getParent().repaint();
235
////        // figure out the suitable width
236
////        for (int i = spinnerSizes.length - 1; i >= 0; i--)
237
////            if (oldWidth <= spinnerSizes[i][0])
238
////                newWidth = spinnerSizes[i][0];
239
////
240
////        // figure out the suitable height
241
////        for (int i = spinnerSizes.length - 1; i >= 0; i--)
242
////            if (oldHeight <= spinnerSizes[i][1])
243
////                newHeight = spinnerSizes[i][1];
244
////
245
//        Dimension sz = new Dimension(newWidth, newHeight);
246
//        super.setSize(sz);
247
//        super.setPreferredSize(sz);
248
        super.setValue(text);
249
        Dimension sz = getNewDimension();
250
        super.setSize(sz);
251
        super.setPreferredSize(sz);
252
    }
253
    
254
    private Dimension getNewDimension() {
255
        Dimension d = getUI().getMinimumSize(this);
256
        int oldWidth = (int) d.getWidth(), newWidth = oldWidth;
257
        int oldHeight = (int) d.getHeight(), newHeight = oldHeight;
258

  
259
        // figure out the suitable height
260
        for (int i = spinnerSizes.length - 1; i >= 0; i--)
261
            if (oldHeight <= spinnerSizes[i][1])
262
                newHeight = spinnerSizes[i][1];
263
       
264
        
265

  
266
       
267
        int textSize = this.getText().trim().length();
268
        
269
        if (textSize<2){
270
            newHeight = spinnerSizes[0][1];
271
        }
272
        newWidth = getSuitableTextWidth(textSize, newWidth);
273
    
274
        return new Dimension(newWidth, newHeight);
275
    }
276

  
277
    private int getSuitableTextWidth(int textWidth, int oldWidth) {
278
        int newWidth = spinnerSizes[0][0];
279
        if (oldWidth<1){
280
            return newWidth;
281
        }
282
        for (int i = spinnerSizes.length - 1; i >= 0; i--)
283
            if ((textWidth <= spinnerSizes[i][0])||(oldWidth<=spinnerSizes[i][0]))
284
                newWidth  = spinnerSizes[i][0];
285
        return newWidth;
286
    }
287

  
288
    private String getText() {
289
        Object value = getValue();
290
        if (value == null){
291
            return "";
292
        }
293
        return value.toString();
294
        
295
    }
296

  
297
    @Override
298
    public void setEnabled(boolean aFlag) {
299
        super.setEnabled(aFlag);
300
        if (aFlag) {
301
            setToolTipText(toolTip);
302
        } else {
303
            setToolTipText(enableText);
304
        }
305
    }
306

  
307
    /**
308
     * Sets the text that appears in the tooltip when the spinner is disabled.
309
     * 
310
     * @param enableText
311
     *            The enableText to set.
312
     */
313
    public void setEnableText(String enableText) {
314
        this.enableText = enableText;
315
    }
316

  
317
    /**
318
     * Sets the text that appears in the tooltip when the spinner is enabled.
319
     */
320
    public void setToolTip(String text) {
321
        toolTip = text;
322
    }
323

  
324
    public void setFill(int filledMaximumWidth) {
325
        this.filled = filledMaximumWidth;
326
    }
327

  
328
    @Override
329
    public Object getValue() {
330
        return this.getModel().getValue();
331
    }
332

  
333
    @Override
334
    public void setValue(Object value) {
335
        if (value == null) {
336
            value = "";
337
        }
338
        this.getModel().setValue(value);
339
    }
340
    
341
    public JNullSpinner(int dataType, Object value) {
342
        super();
343
        this.initSettings(dataType, null, null, value);
344
    }
345

  
346
    private Pattern setMatcher(int dataType, String subType) {
347

  
348
        Pattern p = Pattern.compile(".*?");
349

  
350
        switch (dataType) {
351

  
352
        case DataTypes.FLOAT:
353
            Pattern.compile("([0-9]*)\\.[0]");
354
            break;
355
        case DataTypes.DOUBLE:
356
            Pattern.compile("([0-9]*)\\.[0]");
357
            break;
358
        case DataTypes.INT:
359
            Pattern.compile("([0-9]*)");
360
            break;
361
        case DataTypes.BOOLEAN:
362
            Pattern.compile("[t|T]rue|[f|F]alse|[u|U]nknown");
363
            break;
364
        case DataTypes.LONG:
365
            Pattern.compile("([0-9]*)");
366
            break;
367

  
368
        }
369

  
370
        return p;
371
    }
372

  
373
    public boolean matches(String value) {
374
        Matcher m = pattern.matcher(value);
375
        return m.matches();
376
    }
377
    
378
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/usability/spinner/model/DataTypesFormatter.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 * 
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 * 
11
 * 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
 * 
16
 * 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
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
 * MA  02110-1301, USA.
20
 * 
21
 */
22
/*
23
 * AUTHORS (In addition to CIT):
24
 * 2010 Institute of New Imaging Technologies (INIT): 
25
 *   http://www.init.uji.es
26
 * Geographic Information research group: 
27
 *   http://www.geoinfo.uji.es
28
 * Universitat Jaume I, Spain
29
 */
30
package org.gvsig.tools.swing.impl.usability.spinner.model;
31

  
32
import java.text.DateFormat;
33
import java.text.DecimalFormat;
34
import java.text.Format;
35
import java.text.NumberFormat;
36
import java.text.ParseException;
37
import java.text.SimpleDateFormat;
38
import java.util.Calendar;
39
import java.util.Date;
40
import java.util.Locale;
41

  
42
import org.gvsig.tools.dataTypes.DataTypes;
43

  
44
public class DataTypesFormatter {
45

  
46
    public class DateFormatter extends SimpleDateFormat {
47

  
48
        /**
49
         * 
50
         */
51
        private static final long serialVersionUID = -1744865595768091192L;
52
        private DataTypesFormatter df;
53

  
54
        public DateFormatter(DataTypesFormatter df) {
55
            this.df = df;
56
        }
57

  
58
        public String formatDate(Object obj) throws ParseException {
59
            return df.format(obj);
60
        }
61

  
62
        @Override
63
        public Date parse(String value) {
64
            try {
65
                return parseDate(value);
66
            } catch (ParseException e) {
67
                return null;
68
            }
69
        }
70

  
71
        public Date parseDate(String time) throws ParseException {
72
            return (Date) df.parse(time);
73
        }
74
    }
75

  
76
    public static DataTypesFormatter getInstance(int dataType, String subType,
77
        Locale loc) {
78
        return new DataTypesFormatter(dataType, subType, loc);
79
    }
80

  
81
    private Locale loc;
82
    private int calendarField = Calendar.DAY_OF_MONTH;
83
    private SimpleDateFormat df;
84
    private boolean isDate = false;
85

  
86
    private boolean isNumber = false;
87

  
88
    private DecimalFormat f;
89
    private int dataType;
90
    private String subType;
91

  
92
    private DataTypesFormatter(int dataType, String subType, Locale loc) {
93
        super();
94
        this.loc = loc;
95
        this.dataType = dataType;
96
        this.subType = subType;
97
        if (this.subType == null) {
98
            this.subType = "";
99
        }
100
        refresh();
101
    }
102

  
103
    /**
104
     * @param value
105
     * @return
106
     */
107
    public String format(Object value) {
108
        System.out.println(value);
109
        refresh();
110
        if ((value == null) || (value.equals(""))) {
111
            return "";
112
        }
113

  
114
        if (isDate()) {
115
            if (value instanceof Date) {
116
                return this.df.format(value);
117
            } else {
118
                return "0";
119
            }
120

  
121
        }
122
        if (isNumber()) {
123
            if (value instanceof Number) {
124
                return this.f.format(value);
125
            }
126
        }
127
        return "";
128
    }
129

  
130
    public Date formatDate(Date date) {
131
        return this.getCalendar(date).getTime();
132
    }
133

  
134
    /**
135
     * Output example for FULL date format
136
     * For the United States: Thursday, September 23, 2010
137
     * For France: jeudi 23 septembre 2010
138
     * For Spain: jueves 23 de septiembre de 2010
139
     */
140
    public String formatDateFull(Date date) {
141
        DateFormat df =
142
            DateFormat.getDateInstance(DateFormat.FULL, getLocale());
143
        return df.format(date);
144
    }
145

  
146
    /**
147
     * Output example for LONG date format
148
     * For the United Kingdom: 23 September 2010
149
     * For France: 23 septembre 2010
150
     * For Spain: 23 de septiembre de 2010
151
     */
152
    public String formatDateLong(Date date) {
153
        DateFormat df =
154
            DateFormat.getDateInstance(DateFormat.LONG, getLocale());
155
        return df.format(date);
156
    }
157

  
158
    /**
159
     * Output example for MEDIUM date format
160
     * For Korea: 2010. 9. 23
161
     * For Spain: 23-sep-2010
162
     */
163
    public String formatDateMedium(Date date) {
164
        DateFormat df =
165
            DateFormat.getDateInstance(DateFormat.MEDIUM, getLocale());
166
        return df.format(date);
167
    }
168

  
169
    /**
170
     * Output example for SHORT date format
171
     * For Japan: 10/09/23 (YY/MM/DD)
172
     * For Spain: 23/09/10 (DD/MM/YY)
173
     */
174
    public String formatDateShort(Date date) {
175
        DateFormat df =
176
            DateFormat.getDateInstance(DateFormat.SHORT, getLocale());
177
        return df.format(date);
178
    }
179

  
180
    /**
181
     * @param i
182
     * @return
183
     */
184
    private Number formatNumber(Number value) {
185
        try {
186
            return this.f.parse(f.format(value));
187
        } catch (ParseException e) {
188
            return null;
189
        }
190
    }
191

  
192
    public Calendar getCalendar() {
193
        return this.getDateFormatter().getCalendar();
194
    }
195

  
196
    public Calendar getCalendar(Date date) {
197
        if (date == null) {
198
            date = new Date();
199
        }
200
        getCalendar().setTime(date);
201
        return getCalendar();
202
    }
203

  
204
    public int getCalendarField() {
205
        return this.calendarField;
206
    }
207

  
208
    public DateFormatter getDateFormatter() {
209
        if (this.df == null) {
210
            this.df =
211
                (SimpleDateFormat) DateFormat.getDateInstance(
212
                    DateFormat.MEDIUM, getLocale());
213
        }
214
        return new DateFormatter(this);
215
    }
216

  
217
    public Locale getLocale() {
218
        if (this.loc == null) {
219
            this.loc = Locale.getDefault();
220
        }
221
        return this.loc;
222
    }
223

  
224
    /**
225
     * @param value
226
     * @return
227
     */
228
    public Object getNextValue(Object value) {
229
        if (isDate()) {
230
            if (value == null) {
231
                value = new Date();
232
            }
233
            Calendar cal = getCalendar();
234
            cal.setTime((Date) value);
235
            cal.add(getCalendarField(), 1);
236
            return cal.getTime();
237
        }
238
        if (isNumber()) {
239
            if (value != null) {
240
                String strValue = value.toString();
241
                switch (getType()) {
242
                case DataTypes.DOUBLE:
243
                    return formatNumber(Double.valueOf(strValue) + 1);
244
                case DataTypes.FLOAT:
245
                    return formatNumber(Float.valueOf(strValue) + 1);
246
                case DataTypes.LONG:
247
                    return formatNumber(Long.valueOf(strValue) + 1);
248
                case DataTypes.INT:
249
                    return formatNumber(Integer.valueOf(strValue) + 1);
250
                case DataTypes.BYTE:
251
                    return formatNumber(Byte.valueOf(strValue) + 1);
252
                }
253
            }
254
            return 0;
255
        }
256
        return null;
257
    }
258

  
259
    public NumberFormat getNumberFormatter() {
260
        if (this.f == null) {
261
            if (this.df == null) {
262
                this.f =
263
                    (DecimalFormat) NumberFormat.getNumberInstance(getLocale());
264
            } else {
265
                return this.df.getNumberFormat();
266
            }
267
        }
268
        return this.f;
269
    }
270

  
271
    /**
272
     * @param value
273
     * @return
274
     */
275
    public Object getPreviousValue(Object value) {
276
        if (isDate()) {
277
            if (value != null) {
278
                Calendar cal = getCalendar();
279
                cal.setTime((Date) value);
280
                cal.add(getCalendarField(), -1);
281
                return cal.getTime();
282
            }
283
            return null;
284
        }
285
        if (isNumber()) {
286
            if (value != null) {
287
                String strValue = value.toString();
288
                switch (getType()) {
289
                case DataTypes.DOUBLE:
290
                    return formatNumber(Double.valueOf(strValue) - 1);
291
                case DataTypes.FLOAT:
292
                    return formatNumber(Float.valueOf(strValue) - 1);
293
                case DataTypes.LONG:
294
                    return formatNumber(Long.valueOf(strValue) - 1);
295
                case DataTypes.INT:
296
                    return formatNumber(Integer.valueOf(strValue) - 1);
297
                case DataTypes.BYTE:
298
                    return formatNumber(Byte.valueOf(strValue) - 1);
299
                }
300
            }
301
            return null;
302
        }
303
        return null;
304
    }
305

  
306
    private String getSubType() {
307
        return subType;
308
    }
309

  
310
    private int getType() {
311
        return dataType;
312
    }
313

  
314
    public boolean isDate() {
315
        return this.isDate;
316
    }
317

  
318
    /**
319
     * @return
320
     */
321
    boolean isNumber() {
322
        return this.isNumber;
323
    }
324

  
325
    /**
326
     * @param value
327
     */
328
    public boolean isValidType(Object value) {
329
        if (value == null) {
330
            return true;
331
        }
332
        if ((isDate()) && (!(value instanceof Date))) {
333
            return false;
334
        }
335
        if ((isNumber()) && (!(value instanceof Number))) {
336
            try {
337
                this.parse(value.toString());
338
                return true;
339
            } catch (ParseException e) {
340
                return false;
341
            }
342
        }
343
        return true;
344
    }
345

  
346
    //
347
    // public String formatByType(int dynType, Date date) {
348
    // return setDynTypeFormatParametters(dynType).format(date);
349
    // }
350
    //
351
    // public String formatByType(int dynType, Date date, int style) {
352
    // this.setDynTypeFormatParametters(dynType);
353
    // this.getDateFormatter().getCalendar();
354
    // return format(date);
355
    // }
356

  
357
    /**
358
     * @param obj
359
     * @return
360
     * @throws ParseException
361
     */
362
    public Object parse(String value) throws ParseException {
363
        if ((value == null)||(value.equals(""))){
364
            return null;
365
        }
366
        
367
        if (isDate()) {
368
            return this.df.parse(value);
369
        }
370
        if (isNumber()) {
371

  
372
         
373
            return this.f.parse(value);
374
        }
375
        return value;
376
    }
377

  
378
    public Object parse(Object value) {
379
        try {
380
            if (value == null) {
381
                return parse("");
382
            }
383
            if ((isDate())&&(value instanceof Date)){
384
                return value;
385
            }
386
            return parse(value.toString());
387
        } catch (ParseException e) {
388
            return null;
389
        }
390
    }
391

  
392
    public Date parseDate(String date) throws ParseException {
393
        return this.getDateFormatter().parse(date);
394
    }
395

  
396
    /**
397
	 * 
398
	 */
399
    private void refresh() {
400
        this.isDate = false;
401
        this.isNumber = false;
402

  
403
        switch (getType()) {
404
        case DataTypes.TIME:
405
            this.isDate = true;
406
            this.calendarField = Calendar.MINUTE;
407
            this.df =
408
                (SimpleDateFormat) DateFormat.getTimeInstance(
409
                    DateFormat.MEDIUM, getLocale());
410
            break;
411
        case DataTypes.TIMESTAMP:
412
            this.isDate = true;
413
            this.calendarField = Calendar.SECOND;
414
            this.df =
415
                (SimpleDateFormat) DateFormat.getTimeInstance(
416
                    DateFormat.MEDIUM, getLocale());
417
            break;
418
        case DataTypes.DATE:
419
            this.isDate = true;
420
            this.calendarField = Calendar.DAY_OF_MONTH;
421
            if (!getSubType().equals(DataTypes.SUBTYPE_DATE)) {
422
                this.df =
423
                    (SimpleDateFormat) DateFormat.getDateTimeInstance(
424
                        DateFormat.FULL, DateFormat.FULL, getLocale());
425
            } else {
426
                this.df =
427
                    (SimpleDateFormat) DateFormat.getDateInstance(
428
                        DateFormat.LONG, getLocale());
429
            }
430
            break;
431
        case DataTypes.DOUBLE:
432
            isNumber = true;
433
            f = (DecimalFormat) NumberFormat.getNumberInstance(getLocale());
434
            f.setMaximumFractionDigits(2);
435
            f.setMinimumFractionDigits(2);
436
            break;
437
        case DataTypes.FLOAT:
438
            isNumber = true;
439
            f = (DecimalFormat) NumberFormat.getNumberInstance(getLocale());
440
            f.setMaximumFractionDigits(2);
441
            f.setMinimumFractionDigits(2);
442
            break;
443
        case DataTypes.LONG:
444
            isNumber = true;
445
            f = (DecimalFormat) NumberFormat.getNumberInstance(getLocale());
446
            break;
447
        case DataTypes.INT:
448
            isNumber = true;
449
            f = (DecimalFormat) NumberFormat.getIntegerInstance(getLocale());
450
            break;
451
        case DataTypes.BYTE:
452
            isNumber = true;
453
            f = (DecimalFormat) NumberFormat.getIntegerInstance(getLocale());
454
            break;
455
        }
456
    }
457

  
458
    public void setCalendarField(int calendarField) {
459
        this.calendarField = calendarField;
460
    }
461

  
462
    public void setLocale(Locale loc) {
463
        this.loc = loc;
464
        refresh();
465
    }
466

  
467
    private SimpleDateFormat toDateFormat() {
468
        return df;
469
    }
470

  
471
    public Format toFormat() {
472
        if (isDate()) {
473
            return df;
474
        } else
475
            if (isNumber()) {
476
                return f;
477
            }
478
        return null;
479
    }
480

  
481
    public String toLocalizedPattern() {
482
        if (isDate()) {
483
            return this.df.toLocalizedPattern();
484
        } else {
485
            return this.f.toLocalizedPattern();
486
        }
487
    }
488

  
489
    // /**
490
    // * @param textField
491
    // * @param value
492
    // * @return
493
    // */
494
    // public void setFormattedValue(JFormattedTextField textField, Object
495
    // value) {
496
    // String text = null;
497
    // if (textField == null) return;
498
    // if ((value==null)||value.equals("")){
499
    // text = "";
500
    // }else if (isDate()){
501
    // text = df.format(value);
502
    // }else if(isNumber()){
503
    // text = f.format(value);
504
    // }
505
    // textField.setText(text);
506
    // textField.validate();
507
    //
508
    // }
509

  
510
    // /**
511
    // * @param time
512
    // * @return
513
    // */
514
    // private Date parseDate(String time) {
515
    // try {
516
    // return this.df.parse(this.df.format(time));
517
    // } catch (ParseException e) {
518
    // return null;
519
    // }
520
    // }
521
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/usability/spinner/model/NullSpinnerHandler.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * 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
 *
16
 * 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
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
/*
23
 * AUTHORS (In addition to CIT):
24
 * 2010 Institute of New Imaging Technologies (INIT): 
25
 *   http://www.init.uji.es
26
 * Geographic Information research group: 
27
 *   http://www.geoinfo.uji.es
28
 * Universitat Jaume I, Spain
29
 */
30
package org.gvsig.tools.swing.impl.usability.spinner.model;
31

  
32
import java.awt.Component;
33
import java.text.NumberFormat;
34
import java.text.ParseException;
35
import java.text.SimpleDateFormat;
36
import java.util.Date;
37
import java.util.Locale;
38

  
39
import javax.swing.JFormattedTextField;
40
import javax.swing.JSpinner;
41
import javax.swing.SpinnerDateModel;
42
import javax.swing.SpinnerListModel;
43
import javax.swing.SpinnerModel;
44
import javax.swing.SpinnerNumberModel;
45

  
46
import org.slf4j.Logger;
47
import org.slf4j.LoggerFactory;
48

  
49
import org.gvsig.tools.dynobject.DynField;
50
import org.gvsig.tools.dynobject.DynObjectValueItem;
51

  
52
/**
53
 * @author 2010 - <a href="cordinyana@gvsig.org">C?sar Ordi?ana</a> - gvSIG Team
54
 * @author 2010 - <a href="mailto:reinhold@uji.es">Cristian Mart?n&nbsp;</a> -
55
 *         gvSIG Team
56
 * @version $Id$
57
 * 
58
 */
59
public class NullSpinnerHandler {
60

  
61
    private Component txtField = null;
62
    
63
    private final Logger LOG = LoggerFactory
64
    .getLogger(NullSpinnerHandler.class);
65

  
66

  
67
    public class NullSpinnerDateModel extends SpinnerDateModel {
68

  
69
        /**
70
         * 
71
         */
72
        private static final long serialVersionUID = -400734052278449520L;
73
        private NullSpinnerHandler handler;
74

  
75
        public NullSpinnerDateModel(NullSpinnerHandler handler,
76
            Comparable start, Comparable end) {
77
            super(new Date(), start, end,handler.getFormatter().getCalendarField());
78
            this.handler = handler;
79
            this.setValue(null);
80
        }
81

  
82
        public Object format(Object value) {
83
            return handler.getFormatter().format(value);
84
        }
85

  
86
        @Override
87
        public int getCalendarField() {
88
            return super.getCalendarField();
89
        }
90

  
91
        /**
92
         * @return
93
         */
94
        public SimpleDateFormat getFormat() {
95
            return getFormatter().getDateFormatter();
96
        }
97

  
98
        @Override
99
        public Object getNextValue() {
100
            Object next = handler.getNextValue();
101
            // fireStateChanged();
102
            return next;
103
        }
104

  
105
        @Override
106
        public Object getPreviousValue() {
107
            Object prev = handler.getPreviousValue();
108
            // fireStateChanged();
109
            return prev;
110
        }
111

  
112
        @Override
113
        public Object getValue() {
114
            return handler.getValue();
115
        }
116

  
117
        @Override
118
        public void setCalendarField(int calendarField) {
119
            try {
120
                super.setCalendarField(calendarField);
121
            } catch (IllegalArgumentException e) {
122
                if (getValue() != null) {
123
                    throw new IllegalArgumentException(e);
124
                }
125
                this.fireStateChanged();
126
            }
127
            handler.getFormatter().setCalendarField(getCalendarField());
128
        }
129

  
130
        @Override
131
        public void setValue(Object value) {
132
            Object oldValue = getValue();
133
            handler.setValue(value);
134
            if (value != null) {
135
                super.setValue(handler.getValue());
136
            } else
137
                if (oldValue == null) {
138
                    if (value != null) {
139
                        fireStateChanged();
140
                    }
141
                } else
142
                    if (!oldValue.equals(value)) {
143
                        fireStateChanged();
144
                    }
145
        }
146
    }
147

  
148
    public class NullSpinnerNumberModel extends javax.swing.SpinnerNumberModel {
149

  
150
        /**
151
         * 
152
         */
153
        private static final long serialVersionUID = -3645717385964526394L;
154
        private NullSpinnerHandler handler;
155

  
156
        public NullSpinnerNumberModel(NullSpinnerHandler handler,
157
            Comparable minimum, Comparable maximum) {
158
            super(0, minimum, maximum, 1);
159
            this.handler = handler;
160
        }
161
        
162

  
163
        /**
164
         * @param value
165
         * @return
166
         */
167
        public Object format(Object value) {
168
            return getFormatter().format(value);
169
        }
170
        
171
        public DataTypesFormatter getFormatter(){
172
            return handler.getFormatter();
173
        }
174

  
175
        /**
176
         * @return
177
         */
178
        public NumberFormat getFormat() {
179
            return getFormatter().getNumberFormatter();
180
        }
181

  
182
        @Override
183
        public Object getNextValue() {
184
            return handler.getNextValue();
185
        }
186

  
187
        @Override
188
        public Object getPreviousValue() {
189
            // TODO Auto-generated method stub
190
            return handler.getPreviousValue();
191
        }
192

  
193
        @Override
194
        public Object getValue() {
195
            return handler.getValue();
196
        }
197

  
198
        @Override
199
        public void setValue(Object value) {
200
            handler.setValue(value); 
201
            value = handler.getValue();
202
            if (value != null) {
203
                super.setValue(value);
204
            }
205
            if (!isFirstTime()) {
206
                this.fireStateChanged();
207
            }
208
           
209
        }
210
    }
211

  
212
    /**
213
     * @return
214
     */
215
    private static int getInitialCalendarField(DynField dynField, Locale loc) {
216
        DataTypesFormatter formatter =
217
            DataTypesFormatter.getInstance(dynField.getType(),
218
                dynField.getSubtype(), loc);
219
        return formatter.getCalendarField();
220
    }
221

  
222
    private DataTypesFormatter formatter = null;
223
    private Object curValue = null;
224
    private Comparable start = null;
225
    private Comparable end = null;
226

  
227
    private SpinnerModel model = null;
228

  
229
    private boolean isNotFirstTime;
230

  
231
    private boolean valid = true;
232

  
233
    /**
234
     * @param field
235
     * @param value
236
     */
237
    public NullSpinnerHandler(DynField field) {
238
        this(field, Locale.getDefault());
239
    }
240

  
241
    /**
242
     * @param field
243
     * @param value
244
     */
245
    public NullSpinnerHandler(DynField dynField, Locale loc) {
246
        super();
247
        init(dynField.getType(), dynField.getSubtype(), loc,
248
            (Comparable) dynField.getMinValue(),
249
            (Comparable) dynField.getMaxValue());
250
    }
251

  
252
    public NullSpinnerHandler(int type, String subType, Locale loc) {
253
        super();
254
        init(type, subType, new Locale("en"), null, null);
255
    }
256

  
257
    public Date getDate() {
258
        if (formatter.isDate()) {
259
            return (Date) getValue();
260
        }
261
        return null;
262
    }
263

  
264
    /**
265
     * @return
266
     */
267
    public NullSpinnerDateModel getDateModel() {
268
        if (model == null) {
269
            this.model = new NullSpinnerDateModel(this, this.start, this.end);
270
        }
271
        return (NullSpinnerDateModel) model;
272
    }
273

  
274
    public DataTypesFormatter getDynFieldFormatter() {
275
        return this.formatter;
276
    }
277

  
278
    /**
279
     * @return
280
     */
281
    private Comparable getEnd() {
282
        return this.end;
283
    }
284

  
285
    /**
286
     * @return
287
     */
288
    public DataTypesFormatter getFormatter() {
289
        return this.formatter;
290
    }
291

  
292
    public void initDefaultModel() {
293
        if (model == null) {
294
            this.model = getModel();
295
        }
296
    }
297

  
298
    public Object getNextValue() {
299
        Object next = formatter.getNextValue(getValue());
300
        return ((this.getEnd() == null) || (this.getEnd().compareTo(next) >= 0))
301
            ? next : null;
302
    }
303

  
304
    /**
305
     * @return
306
     */
307
    public NullSpinnerNumberModel getNumberModel() {
308
        if (model == null) {
309
            this.model = new NullSpinnerNumberModel(this, this.start, this.end);
310
        }
311
        return (NullSpinnerNumberModel) model;
312
    }
313

  
314
    public Object getPreviousValue() {
315
        Object prev = formatter.getPreviousValue(getValue());
316
        return ((this.getStart() == null) || (this.getStart().compareTo(prev) <= 0))
317
            ? prev : null;
318

  
319
    }
320

  
321
    /**
322
     * @return
323
     */
324
    private Comparable getStart() {
325
        return start;
326
    }
327

  
328
    public Object getValue() {
329
        if ((isFirstTime()) && (this.curValue == null)) {
330
            if (formatter.isDate()) {
331
                return new Date();
332
            } else
333
                if (isNumber()) {
334
                    return 0;
335
                }
336
            return null;
337
        }
338
        return formatter.parse(this.curValue);
339
    }
340

  
341
    /**
342
     * @param textField
343
     * @return
344
     */
345
    public Object getValueFromTexField(JFormattedTextField textField) {
346
        String txt = textField.getText();
347
        return parseOrNull(txt);
348
    }
349

  
350
    /**
351
     * @param dynField
352
     * @param loc
353
     * @param value
354
     */
355
    protected void init(int dataType, String subType, Locale loc,
356
        Comparable start, Comparable end) {
357
        this.model = getModel(dataType,subType, loc, start, end);
358
    }
359
    /**
360
     * @param dynField
361
     * @param loc
362
     * @param value
363
     * @return 
364
     */
365
    protected SpinnerModel getModel(int dataType, String subType, Locale loc,
366
        Comparable start, Comparable end) {
367
        this.start = start;
368
        this.end = end;
369
        this.formatter = DataTypesFormatter.getInstance(dataType, subType, loc);
370
        return getModel();
371
    }
372
    
373
    public SpinnerModel getModel(DynField dynField){
374
        if (formatter.isDate()) {
375
            SpinnerDateModel dateModel = new SpinnerDateModel();
376
            dateModel.setStart((Comparable) dynField.getMinValue());
377
            dateModel.setEnd((Comparable) dynField.getMaxValue());
378
            return dateModel;
379
        } else
380
            if (formatter.isNumber()) {
381
                SpinnerNumberModel numModel = new SpinnerNumberModel();
382
                numModel.setMinimum((Comparable) dynField.getMinValue());
383
                numModel.setMaximum((Comparable) dynField.getMaxValue());
384
                numModel.setStepSize(1);
385
                return numModel;
386
            }
387

  
388
        SpinnerModel model = new SpinnerListModel(getLabelValues(dynField));
389
        return model;
390
    }
391

  
392
    public String[] getLabelValues(DynField dynField) {
393
        DynObjectValueItem[] items = dynField.getAvailableValues();
394

  
395
        if ((items == null) || (items.length < 1)) {
396
            return new String[0];
397
        }
398

  
399
        String[] strValues = new String[items.length];
400
        for (int i = 0; i < strValues.length; i++) {
401
            strValues[i] = items[i].getLabel();
402
        }
403
        return strValues;
404
    }
405

  
406
    /**
407
     * @return 
408
	 * 
409
	 */
410
    public SpinnerModel getModel() {
411
        if (this.model == null){
412
            if (formatter.isDate()) {
413
                model = new NullSpinnerDateModel(this, this.start, this.end);
414
            } else
415
                if (formatter.isNumber()) {
416
                    model =
417
                        new NullSpinnerNumberModel(this, this.start, this.end);
418
                } else {
419
                    model = new SpinnerListModel();
420
                }
421
            
422
        }
423
        return model;
424

  
425
    }
426

  
427
    /**
428
     * @return
429
     */
430
    public boolean isDate() {
431
        return formatter.isDate();
432
    }
433

  
434
    private boolean isFirstTime() {
435
        return !isNotFirstTime;
436
    }
437

  
438
    /**
439
     * @return
440
     */
441
    public boolean isNumber() {
442
        return this.formatter.isNumber();
443
    }
444

  
445
    /**
446
     * @param txt
447
     * @return
448
     */
449
    public Object parseOrNull(String txt) {
450
        try {
451
            return formatter.parse(txt);
452
        } catch (ParseException e) {
453
            return null;
454
        }
455
    }
456

  
457
    public void setDefaultValueOn(boolean isSet) {
458
        this.isNotFirstTime = !isSet;
459
    }
460

  
461
    public void setValue(Object value) {
462
        LOG.info("Trying to set Value " + value + " to spinner");           
463
        
464
        if (value!=null){
465
            LOG.info("Trying to set Value " + value + " to spinner with " + this.getModel().toString());            
466
        }
467
        else{
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff