001 /*
002 * Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation. Sun designates this
008 * particular file as subject to the "Classpath" exception as provided
009 * by Sun in the LICENSE file that accompanied this code.
010 *
011 * This code is distributed in the hope that it will be useful, but WITHOUT
012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014 * version 2 for more details (a copy is included in the LICENSE file that
015 * accompanied this code).
016 *
017 * You should have received a copy of the GNU General Public License version
018 * 2 along with this work; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020 *
021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022 * CA 95054 USA or visit www.sun.com if you need additional information or
023 * have any questions.
024 */
025 package javax.swing.text;
026
027 import java.awt.event.*;
028 import java.text.*;
029 import java.util.*;
030 import javax.swing.*;
031 import javax.swing.text.*;
032
033 /**
034 * DateFormatter is an <code>InternationalFormatter</code> that does its
035 * formatting by way of an instance of <code>java.text.DateFormat</code>.
036 * <p>
037 * <strong>Warning:</strong>
038 * Serialized objects of this class will not be compatible with
039 * future Swing releases. The current serialization support is
040 * appropriate for short term storage or RMI between applications running
041 * the same version of Swing. As of 1.4, support for long term storage
042 * of all JavaBeans<sup><font size="-2">TM</font></sup>
043 * has been added to the <code>java.beans</code> package.
044 * Please see {@link java.beans.XMLEncoder}.
045 *
046 * @see java.text.DateFormat
047 *
048 * @version 1.5 04/09/01
049 * @since 1.4
050 */
051 public class DateFormatter extends InternationalFormatter {
052 /**
053 * This is shorthand for
054 * <code>new DateFormatter(DateFormat.getDateInstance())</code>.
055 */
056 public DateFormatter() {
057 this (DateFormat.getDateInstance());
058 }
059
060 /**
061 * Returns a DateFormatter configured with the specified
062 * <code>Format</code> instance.
063 *
064 * @param format Format used to dictate legal values
065 */
066 public DateFormatter(DateFormat format) {
067 super (format);
068 setFormat(format);
069 }
070
071 /**
072 * Sets the format that dictates the legal values that can be edited
073 * and displayed.
074 * <p>
075 * If you have used the nullary constructor the value of this property
076 * will be determined for the current locale by way of the
077 * <code>Dateformat.getDateInstance()</code> method.
078 *
079 * @param format DateFormat instance used for converting from/to Strings
080 */
081 public void setFormat(DateFormat format) {
082 super .setFormat(format);
083 }
084
085 /**
086 * Returns the Calendar that <code>DateFormat</code> is associated with,
087 * or if the <code>Format</code> is not a <code>DateFormat</code>
088 * <code>Calendar.getInstance</code> is returned.
089 */
090 private Calendar getCalendar() {
091 Format f = getFormat();
092
093 if (f instanceof DateFormat) {
094 return ((DateFormat) f).getCalendar();
095 }
096 return Calendar.getInstance();
097 }
098
099 /**
100 * Returns true, as DateFormatterFilter will support
101 * incrementing/decrementing of the value.
102 */
103 boolean getSupportsIncrement() {
104 return true;
105 }
106
107 /**
108 * Returns the field that will be adjusted by adjustValue.
109 */
110 Object getAdjustField(int start, Map attributes) {
111 Iterator attrs = attributes.keySet().iterator();
112
113 while (attrs.hasNext()) {
114 Object key = attrs.next();
115
116 if ((key instanceof DateFormat.Field)
117 && (key == DateFormat.Field.HOUR1 || ((DateFormat.Field) key)
118 .getCalendarField() != -1)) {
119 return key;
120 }
121 }
122 return null;
123 }
124
125 /**
126 * Adjusts the Date if FieldPosition identifies a known calendar
127 * field.
128 */
129 Object adjustValue(Object value, Map attributes, Object key,
130 int direction) throws BadLocationException, ParseException {
131 if (key != null) {
132 int field;
133
134 // HOUR1 has no corresponding calendar field, thus, map
135 // it to HOUR0 which will give the correct behavior.
136 if (key == DateFormat.Field.HOUR1) {
137 key = DateFormat.Field.HOUR0;
138 }
139 field = ((DateFormat.Field) key).getCalendarField();
140
141 Calendar calendar = getCalendar();
142
143 if (calendar != null) {
144 calendar.setTime((Date) value);
145
146 int fieldValue = calendar.get(field);
147
148 try {
149 calendar.add(field, direction);
150 value = calendar.getTime();
151 } catch (Throwable th) {
152 value = null;
153 }
154 return value;
155 }
156 }
157 return null;
158 }
159 }
|