001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.wicket.datetime;
018:
019: import org.apache.wicket.datetime.markup.html.form.DateTextField;
020: import org.joda.time.DateTime;
021: import org.joda.time.DateTimeZone;
022: import org.joda.time.format.DateTimeFormat;
023: import org.joda.time.format.DateTimeFormatter;
024:
025: /**
026: * Date converter that uses Joda Time and can be configured to take the time
027: * zone difference between clients and server into account, and that is
028: * configured for a certain date style. The pattern will always be locale
029: * specific.
030: * <p>
031: * This converter is especially suited on a per-component base.
032: * </p>
033: *
034: * @see DateTextField
035: * @see DateTime
036: * @see DateTimeFormat
037: * @see DateTimeZone
038: *
039: * @author eelcohillenius
040: */
041: public class StyleDateConverter extends DateConverter {
042:
043: private static final long serialVersionUID = 1L;
044:
045: /**
046: * Date style to use. See {@link DateTimeFormat#forStyle(String)}.
047: */
048: private final String dateStyle;
049:
050: /**
051: * Construct. The dateStyle 'S-' (which is the same as
052: * {@link DateTimeFormat#shortDate()}) will be used for constructing the
053: * date format for the current locale.
054: * </p>
055: * When applyTimeZoneDifference is true, the current time is applied on the
056: * parsed date, and the date will be corrected for the time zone difference
057: * between the server and the client. For instance, if I'm in Seattle and
058: * the server I'm working on is in Amsterdam, the server is 9 hours ahead.
059: * So, if I'm inputting say 12/24 at a couple of hours before midnight, at
060: * the server it is already 12/25. If this boolean is true, it will be
061: * transformed to 12/25, while the client sees 12/24.
062: * </p>
063: *
064: * @param applyTimeZoneDifference
065: * whether to apply the difference in time zones between client
066: * and server
067: */
068: public StyleDateConverter(boolean applyTimeZoneDifference) {
069: this ("S-", applyTimeZoneDifference);
070: }
071:
072: /**
073: * Construct. The provided pattern will be used as the base format (but they
074: * will be localized for the current locale) and if null,
075: * {@link DateTimeFormat#shortDate()} will be used.
076: * </p>
077: * When applyTimeZoneDifference is true, the current time is applied on the
078: * parsed date, and the date will be corrected for the time zone difference
079: * between the server and the client. For instance, if I'm in Seattle and
080: * the server I'm working on is in Amsterdam, the server is 9 hours ahead.
081: * So, if I'm inputting say 12/24 at a couple of hours before midnight, at
082: * the server it is already 12/25. If this boolean is true, it will be
083: * transformed to 12/25, while the client sees 12/24.
084: * </p>
085: *
086: * @param dateStyle
087: * Date style to use. The first character is the date style, and
088: * the second character is the time style. Specify a character of
089: * 'S' for short style, 'M' for medium, 'L' for long, and 'F' for
090: * full. A date or time may be ommitted by specifying a style
091: * character '-'. See {@link DateTimeFormat#forStyle(String)}.
092: * @param applyTimeZoneDifference
093: * whether to apply the difference in time zones between client
094: * and server
095: * @throws IllegalArgumentException
096: * in case dateStyle is null
097: */
098: public StyleDateConverter(String dateStyle,
099: boolean applyTimeZoneDifference) {
100: super (applyTimeZoneDifference);
101: if (dateStyle == null) {
102: throw new IllegalArgumentException(
103: "dateStyle must be not null");
104: }
105: this .dateStyle = dateStyle;
106: }
107:
108: /**
109: * Gets the optional date pattern.
110: *
111: * @return datePattern
112: */
113: public final String getDatePattern() {
114: return DateTimeFormat.patternForStyle(dateStyle, getLocale());
115: }
116:
117: /**
118: * @return formatter The formatter for the current conversion
119: */
120: protected DateTimeFormatter getFormat() {
121: DateTimeFormatter dtf = DateTimeFormat.forPattern(
122: getDatePattern()).withPivotYear(2000);
123: return dtf;
124: }
125: }
|