Mercurial > projects > dwt2
comparison org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/DateConversionSupport.d @ 78:0a55d2d5a946
Added file for databinding
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Tue, 14 Apr 2009 11:35:29 +0200 |
parents | |
children | 6be48cf9f95c |
comparison
equal
deleted
inserted
replaced
76:f05e6e8b2f2d | 78:0a55d2d5a946 |
---|---|
1 /* | |
2 * Copyright cast(C) 2005 db4objects Inc. http://www.db4o.com | |
3 * | |
4 * All rights reserved. This program and the accompanying materials | |
5 * are made available under the terms of the Eclipse Public License v1.0 | |
6 * which accompanies this distribution, and is available at | |
7 * http://www.eclipse.org/legal/epl-v10.html | |
8 * | |
9 * Contributors: | |
10 * db4objects - Initial API and implementation | |
11 * Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940 | |
12 */ | |
13 module org.eclipse.core.internal.databinding.conversion.DateConversionSupport; | |
14 | |
15 import java.lang.all; | |
16 | |
17 import java.text.ParsePosition; | |
18 import java.util.Date; | |
19 | |
20 import org.eclipse.core.internal.databinding.BindingMessages; | |
21 | |
22 import com.ibm.icu.text.DateFormat; | |
23 import com.ibm.icu.text.SimpleDateFormat; | |
24 | |
25 /** | |
26 * Base support for date/string conversion handling according to the default | |
27 * locale or in plain long milliseconds. | |
28 * <p> | |
29 * NOTE: parse(format(date)) will generally *not* be equal to date, since the | |
30 * string representation may not cover the sub-second range, time-only string | |
31 * representations will be counted from the beginning of the era, etc. | |
32 * </p> | |
33 */ | |
34 public abstract class DateConversionSupport { | |
35 private final static int DATE_FORMAT=DateFormat.SHORT; | |
36 private final static int DEFAULT_FORMATTER_INDEX=0; | |
37 | |
38 private final static int NUM_VIRTUAL_FORMATTERS=1; | |
39 | |
40 /** | |
41 * Alternative formatters for date, time and date/time. | |
42 * Raw milliseconds are covered as a special case. | |
43 */ | |
44 // TODO: These could be shared, but would have to be synchronized. | |
45 private DateFormat[] formatters = { | |
46 new SimpleDateFormat(BindingMessages.getStringcast(BindingMessages.DATE_FORMAT_DATE_TIME)), | |
47 new SimpleDateFormat(BindingMessages.getStringcast(BindingMessages.DATEFORMAT_TIME)), | |
48 DateFormat.getDateTimeInstance(DATE_FORMAT, DateFormat.SHORT), | |
49 DateFormat.getDateInstancecast(DATE_FORMAT), | |
50 DateFormat.getTimeInstancecast(DateFormat.SHORT), | |
51 DateFormat.getDateTimeInstance(DATE_FORMAT,DateFormat.MEDIUM), | |
52 DateFormat.getTimeInstancecast(DateFormat.MEDIUM) | |
53 }; | |
54 | |
55 /** | |
56 * Tries all available formatters to parse the given string according to the | |
57 * default locale or as a raw millisecond value and returns the result of the | |
58 * first successful run. | |
59 * | |
60 * @param str A string specifying a date according to the default locale or in raw milliseconds | |
61 * @return The parsed date, or null, if no available formatter could interpret the input string | |
62 */ | |
63 protected Date parse(String str) { | |
64 for (int formatterIdx = 0; formatterIdx < formatters.length; formatterIdx++) { | |
65 Date parsed=parse(str,formatterIdx); | |
66 if(parsed !is null) { | |
67 return parsed; | |
68 } | |
69 } | |
70 return null; | |
71 } | |
72 | |
73 protected Date parse(String str,int formatterIdx) { | |
74 if(formatterIdx>=0) { | |
75 ParsePosition pos=new ParsePosition(0); | |
76 if (str is null) { | |
77 return null; | |
78 } | |
79 Date date=formatters[formatterIdx].parse(str,pos); | |
80 if(pos.getErrorIndex() !is -1||pos.getIndex() !is str.length()) { | |
81 return null; | |
82 } | |
83 return date; | |
84 } | |
85 try { | |
86 long millisecs=Long.parseLong(str); | |
87 return new Date(millisecs); | |
88 } | |
89 catch(NumberFormatException exc) { | |
90 } | |
91 return null; | |
92 } | |
93 | |
94 /** | |
95 * Formats the given date with the default formatter according to the default locale. | |
96 * @param date a date | |
97 * @return a string representation of the given date according to the default locale | |
98 */ | |
99 protected String format(Date date) { | |
100 return format(date,DEFAULT_FORMATTER_INDEX); | |
101 } | |
102 | |
103 protected String format(Date date,int formatterIdx) { | |
104 if(formatterIdx>=0) { | |
105 return formatters[formatterIdx].format(date); | |
106 } | |
107 return String.valueOf(date.getTime()); | |
108 } | |
109 | |
110 protected int numFormatters() { | |
111 return formatters.length+NUM_VIRTUAL_FORMATTERS; | |
112 } | |
113 | |
114 /** | |
115 * Returns the date format for the provided <code>index</code>. | |
116 * <p> | |
117 * This is for testing purposes only and should not be a part of the API if | |
118 * this class was to be exposed. | |
119 * </p> | |
120 * | |
121 * @param index | |
122 * @return date format | |
123 */ | |
124 protected DateFormat getDateFormat(int index) { | |
125 if (index < 0 || index >= formatters.length) { | |
126 throw new IllegalArgumentException("'index' [" + index + "] is out of bounds."); //$NON-NLS-1$//$NON-NLS-2$ | |
127 } | |
128 | |
129 return formatters[index]; | |
130 } | |
131 } |