001 // Copyright Jun 10, 2006 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014 package org.apache.tapestry.dojo.form;
015
016 import org.apache.tapestry.IMarkupWriter;
017 import org.apache.tapestry.IRequestCycle;
018 import org.apache.tapestry.IScript;
019 import org.apache.tapestry.TapestryUtils;
020 import org.apache.tapestry.form.TranslatedField;
021 import org.apache.tapestry.form.TranslatedFieldSupport;
022 import org.apache.tapestry.form.ValidatableFieldSupport;
023 import org.apache.tapestry.form.translator.DateTranslator;
024 import org.apache.tapestry.json.JSONObject;
025 import org.apache.tapestry.valid.ValidatorException;
026
027 import java.util.HashMap;
028 import java.util.Map;
029
030 /**
031 * Implementation of the dojo DropdownDatePicker widget as a tapestry
032 * component. Wraps a form input field with a date picker icon next to it
033 * that when clicked on reveals a calendar to choose date values from.
034 *
035 * @author jkuhnert
036 */
037 public abstract class DropdownDatePicker extends AbstractFormWidget implements TranslatedField
038 {
039
040 /** parameter. */
041 public abstract Object getValue();
042
043 public abstract void setValue(Object value);
044
045 public abstract boolean isDisabled();
046
047 /** Alt html text for the date icon, what is displayed when mouse hovers over icon. */
048 public abstract String getIconAlt();
049
050 public abstract int getDisplayWeeks();
051
052 public abstract boolean isAdjustWeeks();
053
054 public abstract Object getStartDate();
055
056 public abstract Object getEndDate();
057
058 public abstract int getWeekStartsOn();
059
060 public abstract boolean isStaticDisplay();
061
062 /**
063 * {@inheritDoc}
064 */
065 protected void renderFormWidget(IMarkupWriter writer, IRequestCycle cycle)
066 {
067 // dojo dates are in POSIX style formats so we format the value manually
068 DateTranslator translator = (DateTranslator) getTranslator();
069
070 renderDelegatePrefix(writer, cycle);
071
072 // the html output doesn't matter very much as dojo
073 // will create an inline input field for us anyways, but we do need
074 // a node to reference
075 writer.begin(getTemplateTagName());
076 renderIdAttribute(writer, cycle);
077
078 renderDelegateAttributes(writer, cycle);
079
080 getValidatableFieldSupport().renderContributions(this, writer, cycle);
081
082 renderInformalParameters(writer, cycle);
083
084 writer.print(" ");
085
086 writer.end();
087 renderDelegateSuffix(writer, cycle);
088
089 // now create widget parms
090 JSONObject json = new JSONObject();
091 json.put("inputId", getClientId());
092 json.put("inputName", getName());
093 json.put("iconAlt", getIconAlt());
094 json.put("displayFormat", translator.getPattern(getPage().getLocale()));
095 json.put("saveFormat", translator.getPattern(getPage().getLocale()));
096
097 if (getValue() != null) {
098 json.put("value", translator.formatRfc3339(getValue()));
099 }
100
101 json.put("disabled", isDisabled());
102 if (getDisplayWeeks() > 0)
103 json.put("displayWeeks", getDisplayWeeks());
104 if (isAdjustWeeks())
105 json.put("adjustWeeks", isAdjustWeeks());
106 if (getStartDate() != null)
107 json.put("startDate", translator.formatRfc3339(getStartDate()));
108 if (getEndDate() != null)
109 json.put("endDate", translator.formatRfc3339(getEndDate()));
110 if (getWeekStartsOn() > -1)
111 json.put("weekStartsOn", getWeekStartsOn());
112 if (isStaticDisplay())
113 json.put("staticDisplay", isStaticDisplay());
114
115 Map parms = new HashMap();
116 parms.put("clientId", getClientId());
117 parms.put("props", json.toString());
118 parms.put("widget", this);
119
120 getScript().execute(this, cycle, TapestryUtils.getPageRenderSupport(cycle, this), parms);
121 }
122
123 /**
124 * @see org.apache.tapestry.form.AbstractFormComponent#rewindFormComponent(org.apache.tapestry.IMarkupWriter, org.apache.tapestry.IRequestCycle)
125 */
126 protected void rewindFormWidget(IMarkupWriter writer, IRequestCycle cycle)
127 {
128 String value = cycle.getParameter(getName());
129
130 try
131 {
132 Object translated = getTranslatedFieldSupport().parse(this, value);
133
134 getValidatableFieldSupport().validate(this, writer, cycle, translated);
135
136 setValue(translated);
137 }
138 catch (ValidatorException e)
139 {
140 getForm().getDelegate().record(e);
141 }
142 }
143
144 /**
145 * @see org.apache.tapestry.form.AbstractFormComponent#isRequired()
146 */
147 public boolean isRequired()
148 {
149 return getValidatableFieldSupport().isRequired(this);
150 }
151
152 /** Injected. */
153 public abstract IScript getScript();
154
155 /** Injected. */
156 public abstract TranslatedFieldSupport getTranslatedFieldSupport();
157
158 /** Injected. */
159 public abstract ValidatableFieldSupport getValidatableFieldSupport();
160
161 }