Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.serv / org.gvsig.tools.swing.serv.field / src / main / java / org / gvsig / tools / swing / serv / field / component / spinner / DynFieldFormatter.java @ 298

History | View | Annotate | Download (13 KB)

1
package org.gvsig.tools.swing.serv.field.component.spinner;
2

    
3
import java.text.DateFormat;
4
import java.text.DecimalFormat;
5
import java.text.Format;
6
import java.text.NumberFormat;
7
import java.text.ParseException;
8
import java.text.SimpleDateFormat;
9
import java.util.Calendar;
10
import java.util.Date;
11
import java.util.Locale;
12

    
13
import org.gvsig.tools.dataTypes.DataTypes;
14
import org.gvsig.tools.dynobject.DynField;
15

    
16
public class DynFieldFormatter {
17

    
18
    public class DateFormatter extends SimpleDateFormat {
19

    
20
        /**
21
         * 
22
         */
23
        private static final long serialVersionUID = -1744865595768091192L;
24
        private DynFieldFormatter df;
25

    
26
        public DateFormatter(DynFieldFormatter df) {
27
            this.df = df;
28
        }
29

    
30
        public String formatDate(Object obj) throws ParseException {
31
            return df.format(obj);
32
        }
33

    
34
        @Override
35
        public Date parse(String value) {
36
            try {
37
                return parseDate(value);
38
            } catch (ParseException e) {
39
                return null;
40
            }
41
        }
42

    
43
        public Date parseDate(String time) throws ParseException {
44
            return (Date) df.parse(time);
45
        }
46
    }
47

    
48
    public static DynFieldFormatter getInstance(DynField field, Locale loc) {
49
        return new DynFieldFormatter(field, loc);
50
    }
51

    
52
    private Locale loc;
53
    private int calendarField = Calendar.DAY_OF_MONTH;
54
    private SimpleDateFormat df;
55
    private DynField dynField;
56
    private boolean isDate = false;
57

    
58
    private boolean isNumber = false;
59

    
60
    private DecimalFormat f;
61

    
62
    private DynFieldFormatter(DynField field, Locale loc) {
63
        super();
64
        this.loc = loc;
65
        this.dynField = field;
66
        refresh();
67
    }
68

    
69
    /**
70
     * @param value
71
     * @return
72
     */
73
    public String format(Object value) {
74
        System.out.println(value);
75
        refresh();
76
        if ((value == null) || (value.equals(""))) {
77
            return "";
78
        }
79

    
80
        if (isDate()) {
81
            if (value instanceof Date) {
82
                return this.df.format(value);
83
            } else {
84
                return "0";
85
            }
86

    
87
        }
88
        if (isNumber()) {
89
            if (value instanceof Number) {
90
                return this.f.format(value);
91
            }
92
        }
93
        return "";
94
    }
95

    
96
    public Date formatDate(Date date) {
97
        return this.getCalendar(date).getTime();
98
    }
99

    
100
    /**
101
     * Output example for FULL date format
102
     * For the United States: Thursday, September 23, 2010
103
     * For France: jeudi 23 septembre 2010
104
     * For Spain: jueves 23 de septiembre de 2010
105
     */
106
    public String formatDateFull(Date date) {
107
        DateFormat df =
108
            DateFormat.getDateInstance(DateFormat.FULL, getLocale());
109
        return df.format(date);
110
    }
111

    
112
    /**
113
     * Output example for LONG date format
114
     * For the United Kingdom: 23 September 2010
115
     * For France: 23 septembre 2010
116
     * For Spain: 23 de septiembre de 2010
117
     */
118
    public String formatDateLong(Date date) {
119
        DateFormat df =
120
            DateFormat.getDateInstance(DateFormat.LONG, getLocale());
121
        return df.format(date);
122
    }
123

    
124
    /**
125
     * Output example for MEDIUM date format
126
     * For Korea: 2010. 9. 23
127
     * For Spain: 23-sep-2010
128
     */
129
    public String formatDateMedium(Date date) {
130
        DateFormat df =
131
            DateFormat.getDateInstance(DateFormat.MEDIUM, getLocale());
132
        return df.format(date);
133
    }
134

    
135
    /**
136
     * Output example for SHORT date format
137
     * For Japan: 10/09/23 (YY/MM/DD)
138
     * For Spain: 23/09/10 (DD/MM/YY)
139
     */
140
    public String formatDateShort(Date date) {
141
        DateFormat df =
142
            DateFormat.getDateInstance(DateFormat.SHORT, getLocale());
143
        return df.format(date);
144
    }
145

    
146
    /**
147
     * @param i
148
     * @return
149
     */
150
    private Number formatNumber(Number value) {
151
        try {
152
            return this.f.parse(f.format(value));
153
        } catch (ParseException e) {
154
            return null;
155
        }
156
    }
157

    
158
    public Calendar getCalendar() {
159
        return this.getDateFormatter().getCalendar();
160
    }
161

    
162
    public Calendar getCalendar(Date date) {
163
        if (date == null) {
164
            date = new Date();
165
        }
166
        getCalendar().setTime(date);
167
        return getCalendar();
168
    }
169

    
170
    public int getCalendarField() {
171
        return this.calendarField;
172
    }
173

    
174
    public DateFormatter getDateFormatter() {
175
        if (this.df == null) {
176
            this.df =
177
                (SimpleDateFormat) DateFormat.getDateInstance(
178
                    DateFormat.MEDIUM, getLocale());
179
        }
180
        return new DateFormatter(this);
181
    }
182

    
183
    public Locale getLocale() {
184
        if (this.loc == null) {
185
            this.loc = Locale.getDefault();
186
        }
187
        return this.loc;
188
    }
189

    
190
    /**
191
     * @param value
192
     * @return
193
     */
194
    public Object getNextValue(Object value) {
195
        if (isDate()) {
196
            if (value == null) {
197
                value = new Date();
198
            }
199
            Calendar cal = getCalendar();
200
            cal.setTime((Date) value);
201
            cal.add(getCalendarField(), 1);
202
            return cal.getTime();
203
        }
204
        if (isNumber()) {
205
            if (value != null) {
206
                String strValue = value.toString();
207
                switch (getType()) {
208
                case DataTypes.DOUBLE:
209
                    return formatNumber(Double.valueOf(strValue) + 1);
210
                case DataTypes.FLOAT:
211
                    return formatNumber(Float.valueOf(strValue) + 1);
212
                case DataTypes.LONG:
213
                    return formatNumber(Long.valueOf(strValue) + 1);
214
                case DataTypes.INT:
215
                    return formatNumber(Integer.valueOf(strValue) + 1);
216
                case DataTypes.BYTE:
217
                    return formatNumber(Byte.valueOf(strValue) + 1);
218
                }
219
            }
220
            return 0;
221
        }
222
        return null;
223
    }
224

    
225
    public NumberFormat getNumberFormatter() {
226
        if (this.f == null) {
227
            if (this.df == null) {
228
                this.f =
229
                    (DecimalFormat) NumberFormat.getNumberInstance(getLocale());
230
            } else {
231
                return this.df.getNumberFormat();
232
            }
233
        }
234
        return this.f;
235
    }
236

    
237
    /**
238
     * @param value
239
     * @return
240
     */
241
    public Object getPreviousValue(Object value) {
242
        if (isDate()) {
243
            if (value != null) {
244
                Calendar cal = getCalendar();
245
                cal.setTime((Date) value);
246
                cal.add(getCalendarField(), -1);
247
                return cal.getTime();
248
            }
249
            return null;
250
        }
251
        if (isNumber()) {
252
            if (value != null) {
253
                String strValue = value.toString();
254
                switch (getType()) {
255
                case DataTypes.DOUBLE:
256
                    return formatNumber(Double.valueOf(strValue) - 1);
257
                case DataTypes.FLOAT:
258
                    return formatNumber(Float.valueOf(strValue) - 1);
259
                case DataTypes.LONG:
260
                    return formatNumber(Long.valueOf(strValue) - 1);
261
                case DataTypes.INT:
262
                    return formatNumber(Integer.valueOf(strValue) - 1);
263
                case DataTypes.BYTE:
264
                    return formatNumber(Byte.valueOf(strValue) - 1);
265
                }
266
            }
267
            return null;
268
        }
269
        return null;
270
    }
271

    
272
    private String getSubType() {
273
        String str = dynField.getSubtype();
274
        if (str == null) {
275
            return "";
276
        }
277
        return str;
278
    }
279

    
280
    private int getType() {
281
        return dynField.getType();
282
    }
283

    
284
    public boolean isDate() {
285
        return this.isDate;
286
    }
287

    
288
    /**
289
     * @return
290
     */
291
    boolean isNumber() {
292
        return this.isNumber;
293
    }
294

    
295
    /**
296
     * @param value
297
     */
298
    public boolean isValidType(Object value) {
299
        if (value == null) {
300
            return true;
301
        }
302
        if ((isDate()) && (!(value instanceof Date))) {
303
            return false;
304
        }
305
        if ((isNumber()) && (!(value instanceof Number))) {
306
            if (value instanceof String) {
307
                try {
308
                    Number n = NumberFormat.getInstance().parse((String) value);
309
                } catch (ParseException e) {
310
                    return false;
311
                }
312
            }
313
            return false;
314
        }
315
        return true;
316
    }
317

    
318
    //
319
    // public String formatByType(int dynType, Date date) {
320
    // return setDynTypeFormatParametters(dynType).format(date);
321
    // }
322
    //
323
    // public String formatByType(int dynType, Date date, int style) {
324
    // this.setDynTypeFormatParametters(dynType);
325
    // this.getDateFormatter().getCalendar();
326
    // return format(date);
327
    // }
328

    
329
    /**
330
     * @param obj
331
     * @return
332
     * @throws ParseException
333
     */
334
    public Object parse(String value) throws ParseException {
335
        if (isDate()) {
336
            return this.df.parse(value);
337
        }
338
        if (isNumber()) {
339
            return this.f.parse(value);
340
        }
341
        return null;
342
    }
343

    
344
    public Date parseDate(String date) throws ParseException {
345
        return this.getDateFormatter().parse(date);
346
    }
347

    
348
    /**
349
         * 
350
         */
351
    private void refresh() {
352
        switch (getType()) {
353
        case DataTypes.TIME:
354
            this.isDate = true;
355
            this.calendarField = Calendar.MINUTE;
356
            this.df =
357
                (SimpleDateFormat) DateFormat.getTimeInstance(
358
                    DateFormat.MEDIUM, getLocale());
359
            break;
360
        case DataTypes.TIMESTAMP:
361
            this.isDate = true;
362
            this.calendarField = Calendar.SECOND;
363
            this.df =
364
                (SimpleDateFormat) DateFormat.getTimeInstance(
365
                    DateFormat.MEDIUM, getLocale());
366
            break;
367
        case DataTypes.DATE:
368
            this.isDate = true;
369
            this.calendarField = Calendar.DAY_OF_MONTH;
370
            if (!getSubType().equals(DataTypes.SUBTYPE_DATE)) {
371
                this.df =
372
                    (SimpleDateFormat) DateFormat.getDateTimeInstance(
373
                        DateFormat.FULL, DateFormat.FULL, getLocale());
374
            } else {
375
                this.df =
376
                    (SimpleDateFormat) DateFormat.getDateInstance(
377
                        DateFormat.LONG, getLocale());
378
            }
379
            break;
380
        case DataTypes.DOUBLE:
381
            isNumber = true;
382
            f = (DecimalFormat) NumberFormat.getNumberInstance(getLocale());
383
            f.setMaximumFractionDigits(2);
384
            f.setMinimumFractionDigits(2);
385
            break;
386
        case DataTypes.FLOAT:
387
            isNumber = true;
388
            f = (DecimalFormat) NumberFormat.getNumberInstance(getLocale());
389
            f.setMaximumFractionDigits(2);
390
            f.setMinimumFractionDigits(2);
391
            break;
392
        case DataTypes.LONG:
393
            isNumber = true;
394
            f = (DecimalFormat) NumberFormat.getNumberInstance(getLocale());
395
            break;
396
        case DataTypes.INT:
397
            isNumber = true;
398
            f = (DecimalFormat) NumberFormat.getIntegerInstance(getLocale());
399
            break;
400
        case DataTypes.BYTE:
401
            isNumber = true;
402
            f = (DecimalFormat) NumberFormat.getIntegerInstance(getLocale());
403
            break;
404
        }
405
    }
406

    
407
    public void setCalendarField(int calendarField) {
408
        this.calendarField = calendarField;
409
    }
410

    
411
    public void setLocale(Locale loc) {
412
        this.loc = loc;
413
        refresh();
414
    }
415

    
416
    private SimpleDateFormat toDateFormat() {
417
        return df;
418
    }
419

    
420
    public Format toFormat() {
421
        if (isDate()) {
422
            return df;
423
        } else
424
            if (isNumber()) {
425
                return f;
426
            }
427
        return null;
428
    }
429

    
430
    public String toLocalizedPattern() {
431
        if (isDate()) {
432
            return this.df.toLocalizedPattern();
433
        } else {
434
            return this.f.toLocalizedPattern();
435
        }
436
    }
437

    
438
    // /**
439
    // * @param textField
440
    // * @param value
441
    // * @return
442
    // */
443
    // public void setFormattedValue(JFormattedTextField textField, Object
444
    // value) {
445
    // String text = null;
446
    // if (textField == null) return;
447
    // if ((value==null)||value.equals("")){
448
    // text = "";
449
    // }else if (isDate()){
450
    // text = df.format(value);
451
    // }else if(isNumber()){
452
    // text = f.format(value);
453
    // }
454
    // textField.setText(text);
455
    // textField.validate();
456
    //                
457
    // }
458

    
459
    // /**
460
    // * @param time
461
    // * @return
462
    // */
463
    // private Date parseDate(String time) {
464
    // try {
465
    // return this.df.parse(this.df.format(time));
466
    // } catch (ParseException e) {
467
    // return null;
468
    // }
469
    // }
470
}