001 /**
002 * Copyright 2010 The Kuali Foundation Licensed under the
003 * Educational Community License, Version 2.0 (the "License"); you may
004 * not use this file except in compliance with the License. You may
005 * obtain a copy of the License at
006 *
007 * http://www.osedu.org/licenses/ECL-2.0
008 *
009 * Unless required by applicable law or agreed to in writing,
010 * software distributed under the License is distributed on an "AS IS"
011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
012 * or implied. See the License for the specific language governing
013 * permissions and limitations under the License.
014 */
015
016 package org.kuali.student.common.ui.client.widgets.impl;
017
018 import java.util.Date;
019
020 import org.kuali.student.common.ui.client.widgets.KSDatePickerAbstract;
021 import org.kuali.student.common.ui.client.widgets.KSTextBox;
022 import org.kuali.student.common.ui.client.widgets.focus.FocusGroup;
023
024 import com.google.gwt.event.dom.client.BlurEvent;
025 import com.google.gwt.event.dom.client.BlurHandler;
026 import com.google.gwt.event.dom.client.ClickEvent;
027 import com.google.gwt.event.dom.client.ClickHandler;
028 import com.google.gwt.event.dom.client.FocusEvent;
029 import com.google.gwt.event.dom.client.FocusHandler;
030 import com.google.gwt.event.dom.client.HasBlurHandlers;
031 import com.google.gwt.event.dom.client.HasFocusHandlers;
032 import com.google.gwt.event.dom.client.KeyCodes;
033 import com.google.gwt.event.dom.client.KeyDownEvent;
034 import com.google.gwt.event.dom.client.KeyDownHandler;
035 import com.google.gwt.event.dom.client.KeyPressEvent;
036 import com.google.gwt.event.dom.client.KeyPressHandler;
037 import com.google.gwt.event.dom.client.KeyUpEvent;
038 import com.google.gwt.event.dom.client.KeyUpHandler;
039 import com.google.gwt.event.logical.shared.ValueChangeEvent;
040 import com.google.gwt.event.logical.shared.ValueChangeHandler;
041 import com.google.gwt.event.shared.HandlerRegistration;
042 import com.google.gwt.i18n.client.DateTimeFormat;
043 import com.google.gwt.user.client.Command;
044 import com.google.gwt.user.client.DeferredCommand;
045 import com.google.gwt.user.client.ui.PopupPanel;
046 import com.google.gwt.user.datepicker.client.DatePicker;
047
048 public class KSDatePickerImpl extends KSDatePickerAbstract implements HasFocusHandlers, HasBlurHandlers{
049 private DatePicker picker = new DatePicker();
050 private KSTextBox dateField = new KSTextBox();
051 private PopupPanel popup = new PopupPanel(true);
052 private Date selectedDate = null;
053 private Date currentDate = new Date();
054 private DateTimeFormat df = DateTimeFormat.getFormat("MM/dd/yyyy");
055 private boolean justPicked = false;
056 private final FocusGroup focus = new FocusGroup(this);
057 private boolean allowedKeyPress = true;
058 private boolean hasWatermark = false;
059 private boolean watermarkShowing = false;
060 private String watermarkText;
061
062 public KSDatePickerImpl(){
063 this.initWidget(dateField);
064 focus.addWidget(picker);
065 focus.addWidget(dateField);
066 //pickerWrapper.add(picker);
067 popup.add(picker);
068
069 picker.setWidth(dateField.getOffsetWidth() + "px");
070 dateField.addBlurHandler(new BlurHandler(){
071 public void onBlur(BlurEvent event) {
072 dateField.removeStyleName("KS-Datefield-Focus");
073 if(!picker.isVisible()){
074 focus.setSuppressed(false);
075 }
076 }
077 });
078
079
080 dateField.addFocusHandler(new FocusHandler(){
081 public void onFocus(FocusEvent event) {
082 dateField.addStyleName("KS-Datefield-Focus");
083 popup.setPopupPosition(getAbsoluteLeft(), getAbsoluteTop() + dateField.getOffsetHeight());
084 if(justPicked){
085 if (dateField.getText() != null) {
086 dateField.selectAll();
087 }
088 justPicked = false;
089 }
090 else{
091 popup.show();
092 DeferredCommand.addCommand(new Command(){
093 @Override
094 public void execute() {
095 focus.setSuppressed(true);
096 }
097 });
098 }
099
100 }
101 });
102
103 dateField.addClickHandler(new ClickHandler(){
104
105 public void onClick(ClickEvent event) {
106 popup.setPopupPosition(getAbsoluteLeft(), getAbsoluteTop() + dateField.getOffsetHeight());
107 popup.show();
108 //dateField.selectAll();
109
110 }
111
112 });
113
114 dateField.addKeyPressHandler(new KeyPressHandler(){
115
116 public void onKeyPress(KeyPressEvent event) {
117 String validInput = "0123456789";
118 if(validInput.indexOf(event.getCharCode()) == -1 && !isDeleteOrBackspaceKey(event.getNativeEvent().getKeyCode())){
119 event.preventDefault();
120 }
121 }
122
123 });
124
125 dateField.addKeyDownHandler(new KeyDownHandler(){
126
127 public void onKeyDown(KeyDownEvent event) {
128 if(event.getNativeKeyCode() == KeyCodes.KEY_TAB){
129 popup.hide();
130 if(picker.getValue() != null){
131 selectedDate = picker.getValue();
132 }
133 }
134 }
135
136 });
137
138 dateField.addKeyUpHandler(new KeyUpHandler(){
139
140 public void onKeyUp(KeyUpEvent event) {
141 String dateText = dateField.getText();
142
143 if(!isDeleteOrBackspaceKey(event.getNativeKeyCode())){
144 if(dateText.length() == 2){
145 dateField.setText(dateText + "/");
146 String current = df.format(currentDate);
147 Date newDate = df.parse(dateField.getText()+ "01" + current.substring(5));
148 picker.setCurrentMonth(newDate);
149 }
150 else if(dateText.length() == 5){
151 dateField.setText(dateText + "/");
152 String current = df.format(currentDate);
153 Date newDate = df.parse(dateField.getText() + current.substring(6));
154 dateField.setText(df.format(newDate).substring(0, 6));
155 picker.setCurrentMonth(newDate);
156 picker.setValue(newDate, false);
157
158 }
159 else if(dateText.length() == 10){
160 Date newDate = df.parse(dateField.getText());
161 picker.setCurrentMonth(newDate);
162 picker.setValue(newDate, false);
163 selectedDate = picker.getValue();
164 }
165 }
166 }
167
168 });
169
170
171 //pickerHandlers
172 picker.addValueChangeHandler(new ValueChangeHandler<Date>(){
173
174 public void onValueChange(ValueChangeEvent<Date> event) {
175 if(picker.getValue() != null){
176 dateField.setText(df.format(picker.getValue()));
177 selectedDate = picker.getValue();
178 }
179 dateField.setFocus(true);
180 popup.hide();
181 justPicked = true;
182 focus.setSuppressed(false);
183 fireValueChangeEvent();
184 }
185 });
186
187 }
188
189 private boolean isDeleteOrBackspaceKey(int code){
190 return (code == KeyCodes.KEY_BACKSPACE || code == KeyCodes.KEY_DELETE);
191 }
192
193 private void fireValueChangeEvent(){
194 ValueChangeEvent.fire(this, selectedDate);
195 }
196
197 public Date getValue(){
198 Date date = null;
199 if(dateField.getText() != null
200 && dateField.getText().trim().length() == 10)
201 {
202 try{
203 date = df.parseStrict(dateField.getText().trim());
204 }
205 catch(IllegalArgumentException e){
206 date = null;
207 }
208 }
209 else{
210 dateField.setText("");
211 }
212 return date;
213 //return this.selectedDate;
214 }
215
216 public void setValue(Date date){
217 if(null==date){
218 dateField.setText("");
219 }else{
220 dateField.setText(df.format(date));
221 picker.setCurrentMonth(date);
222 picker.setValue(date, false);
223 selectedDate = date;
224 }
225
226 }
227
228 public KSTextBox getDateTextField() {
229 return dateField;
230 }
231
232 /* public void setValue(String date){
233 if(date == null || date.equals("")){
234 dateField.setText("");
235 }
236 else{
237 Date newDate = df.parse(date);
238 dateField.setText(date);
239 picker.setCurrentMonth(newDate);
240 picker.setValue(newDate, false);
241 selectedDate = newDate;
242 }
243 }*/
244
245 @Override
246 public void setValue(Date date, boolean fireEvents) {
247 setValue(date);
248 }
249
250 @Override
251 public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Date> handler) {
252 return addHandler(handler, ValueChangeEvent.getType());
253 }
254
255 @Override
256 public HandlerRegistration addFocusHandler(FocusHandler handler) {
257 return focus.addFocusHandler(handler);
258 }
259
260 @Override
261 public HandlerRegistration addBlurHandler(BlurHandler handler) {
262 return focus.addBlurHandler(handler);
263 }
264
265 @Override
266 public boolean hasWatermark() {
267 return dateField.hasWatermark();
268 }
269
270 @Override
271 public void setWatermarkText(String text) {
272 dateField.setWatermarkText(text);
273 }
274
275 @Override
276 public boolean watermarkShowing() {
277 return dateField.watermarkShowing();
278 }
279
280 }