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.extensions.yui.calendar;
018:
019: import java.util.Date;
020:
021: import org.apache.wicket.datetime.markup.html.form.DateTextField;
022: import org.apache.wicket.markup.html.form.FormComponentPanel;
023: import org.apache.wicket.model.IModel;
024: import org.apache.wicket.model.PropertyModel;
025: import org.joda.time.MutableDateTime;
026:
027: /**
028: * Works on a {@link java.util.Date} object. Displays a date field and a
029: * {@link CalendarPopup calendar popup}.
030: *
031: * @author eelcohillenius
032: */
033: public class DateField extends FormComponentPanel {
034: private static final long serialVersionUID = 1L;
035:
036: private MutableDateTime date;
037:
038: private DateTextField dateField;
039:
040: /**
041: * Construct.
042: *
043: * @param id
044: */
045: public DateField(String id) {
046: super (id);
047: init();
048: }
049:
050: /**
051: * Construct.
052: *
053: * @param id
054: * @param model
055: */
056: public DateField(String id, IModel model) {
057: super (id, model);
058: init();
059: }
060:
061: /**
062: * Gets date.
063: *
064: * @return date
065: */
066: public Date getDate() {
067: return (date != null) ? date.toDate() : null;
068: }
069:
070: /**
071: * @see org.apache.wicket.markup.html.form.FormComponent#getInput()
072: */
073: public String getInput() {
074: // since we override convertInput, we can let this method return a value
075: // that is just suitable for error reporting
076: return dateField.getInput();
077: }
078:
079: /**
080: * Sets date.
081: *
082: * @param date
083: * date
084: */
085: public void setDate(Date date) {
086: this .date = (date != null) ? new MutableDateTime(date) : null;
087: setModelObject(date);
088: }
089:
090: /**
091: * Initialize.
092: */
093: private void init() {
094: setType(Date.class);
095: PropertyModel dateFieldModel = new PropertyModel(this , "date");
096: add(dateField = newDateTextField("date", dateFieldModel));
097: dateField.add(new DatePicker());
098: }
099:
100: /**
101: * Sets the converted input. In this case, we're really just interested in
102: * the nested date field, as that is the element that receives the real user
103: * input. So we're just passing that on.
104: * <p>
105: * Note that overriding this method is a better option than overriding
106: * {@link #updateModel()} like the first versions of this class did. The
107: * reason for that is that this method can be used by form validators
108: * without having to depend on the actual model being updated, and this
109: * method is called by the default implementation of {@link #updateModel()}
110: * anyway (so we don't have to override that anymore).
111: * </p>
112: *
113: * @return instance of {@link Date}, possibly null
114: *
115: * @see org.apache.wicket.markup.html.form.FormComponent#convertInput()
116: */
117: protected void convertInput() {
118: setConvertedInput(dateField.getConvertedInput());
119: }
120:
121: /**
122: * @deprecated replaced by {@link #newDateTextField(String, PropertyModel)}
123: */
124: // TODO remove after deprecation release
125: protected final DateTextField newDateTextField(
126: PropertyModel dateFieldModel) {
127: throw new UnsupportedOperationException();
128: }
129:
130: /**
131: * create a new {@link DateTextField} instance to be added to this panel.
132: *
133: * @param the
134: * id to be used when creating the component
135: * @param dateFieldModel
136: * model that should be used by the {@link DateTextField}
137: * @return a new date text field instance
138: */
139: protected DateTextField newDateTextField(String id,
140: PropertyModel dateFieldModel) {
141: return DateTextField.forShortStyle(id, dateFieldModel);
142: }
143:
144: /**
145: * @see org.apache.wicket.Component#onBeforeRender()
146: */
147: protected void onBeforeRender() {
148: dateField.setRequired(isRequired());
149:
150: Date d = (Date) getModelObject();
151: if (d != null) {
152: date = new MutableDateTime(d);
153: } else {
154: date = null;
155: }
156:
157: super.onBeforeRender();
158: }
159: }
|