001 /* 002 * Copyright 2012 GWT-Bootstrap 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package com.github.gwtbootstrap.datepicker.client.ui.base; 017 018 import java.util.Date; 019 020 import com.github.gwtbootstrap.client.ui.TextBox; 021 import com.github.gwtbootstrap.client.ui.base.HasAlternateSize; 022 import com.github.gwtbootstrap.client.ui.base.HasId; 023 import com.github.gwtbootstrap.client.ui.base.HasPlaceholder; 024 import com.github.gwtbootstrap.client.ui.base.HasSize; 025 import com.github.gwtbootstrap.client.ui.base.HasStyle; 026 import com.github.gwtbootstrap.client.ui.base.HasVisibility; 027 import com.github.gwtbootstrap.client.ui.base.HasVisibleHandlers; 028 import com.github.gwtbootstrap.client.ui.base.IsResponsive; 029 import com.github.gwtbootstrap.client.ui.base.IsSearchQuery; 030 import com.github.gwtbootstrap.client.ui.base.PlaceholderHelper; 031 import com.github.gwtbootstrap.client.ui.base.ResponsiveHelper; 032 import com.github.gwtbootstrap.client.ui.base.SearchQueryStyleHelper; 033 import com.github.gwtbootstrap.client.ui.base.SizeHelper; 034 import com.github.gwtbootstrap.client.ui.base.Style; 035 import com.github.gwtbootstrap.client.ui.base.StyleHelper; 036 import com.github.gwtbootstrap.client.ui.constants.AlternateSize; 037 import com.github.gwtbootstrap.client.ui.constants.Device; 038 import com.github.gwtbootstrap.client.ui.event.HiddenHandler; 039 import com.github.gwtbootstrap.client.ui.event.HideEvent; 040 import com.github.gwtbootstrap.client.ui.event.HideHandler; 041 import com.github.gwtbootstrap.client.ui.event.ShowEvent; 042 import com.github.gwtbootstrap.client.ui.event.ShowHandler; 043 import com.github.gwtbootstrap.client.ui.event.ShownHandler; 044 import com.github.gwtbootstrap.datepicker.client.ui.util.LocaleUtil; 045 import com.google.gwt.core.client.GWT; 046 import com.google.gwt.dom.client.Element; 047 import com.google.gwt.editor.client.IsEditor; 048 import com.google.gwt.editor.client.adapters.TakesValueEditor; 049 import com.google.gwt.event.dom.client.ChangeEvent; 050 import com.google.gwt.event.dom.client.ChangeHandler; 051 import com.google.gwt.event.dom.client.HasChangeHandlers; 052 import com.google.gwt.event.logical.shared.HasValueChangeHandlers; 053 import com.google.gwt.event.logical.shared.ValueChangeEvent; 054 import com.google.gwt.event.logical.shared.ValueChangeHandler; 055 import com.google.gwt.event.shared.HandlerRegistration; 056 import com.google.gwt.i18n.client.DateTimeFormat; 057 import com.google.gwt.user.client.ui.HasValue; 058 import com.google.gwt.user.client.ui.Widget; 059 060 /** 061 * Base DatePicker component. 062 * 063 * @author Carlos Alexandro Becker 064 * @author ohashi keisuke 065 * @since 2.0.4.0 066 */ 067 public class DateBoxBase extends Widget implements HasValue<Date>, HasValueChangeHandlers<Date>, HasVisibility, 068 HasChangeHandlers, HasVisibleHandlers, HasAllDatePickerHandlers, IsEditor<TakesValueEditor<Date>>, HasPlaceholder, HasAlternateSize, IsSearchQuery, HasSize, HasId, IsResponsive , HasStyle { 069 070 private final TextBox box; 071 private String format; 072 private String language; 073 private DateTimeFormat dtf; 074 private TakesValueEditor<Date> editor; 075 076 /** placeholderHelper */ 077 private PlaceholderHelper placeholderHelper = GWT.create(PlaceholderHelper.class); 078 079 public DateBoxBase() { 080 this.box = new TextBox(); 081 setElement(box.getElement()); 082 setFormat("mm/dd/yyyy"); 083 this.language = LocaleUtil.getLanguage(); 084 setValue(new Date()); 085 } 086 087 /** 088 * {@inheritDoc} 089 */ 090 @Override 091 public void setFormat(String format) { 092 this.format = format; 093 Date oldValue = getValue(); 094 this.dtf = DateTimeFormat.getFormat(format.replaceAll("mm", "MM")); 095 if (oldValue != null) { 096 setValue(oldValue); 097 } 098 } 099 100 public void setLanguage(String language) { 101 this.language = language; 102 LocaleUtil.forceLocale(language); 103 } 104 105 /** 106 * Returns the internal instance of textbox element. Use only if know what you are doing. 107 * 108 * @return internal textbox intance. 109 */ 110 protected TextBox getBox() { 111 return box; 112 } 113 114 /** 115 * {@inheritDoc} 116 */ 117 @Override 118 public Date getValue() { 119 try { 120 return dtf != null && box.getValue() != null ? dtf.parse(box.getValue()) : null; 121 } catch(Exception e) { 122 return null; 123 } 124 } 125 126 /** 127 * Get un-tranceform text 128 * @return text box value 129 */ 130 public String getOriginalValue() { 131 return box.getValue(); 132 } 133 134 /** 135 * {@inheritDoc} 136 */ 137 @Override 138 public void setValue(Date value) { 139 setValue(value, false); 140 } 141 142 /** 143 * {@inheritDoc} 144 */ 145 @Override 146 public void setValue(Date value, boolean fireEvents) { 147 box.setValue(value != null ? dtf.format(value) : null); 148 149 updateValue(box.getElement()); 150 151 if (fireEvents) { 152 ValueChangeEvent.fire(this, value); 153 } 154 } 155 156 protected native void updateValue(Element e)/*-{ 157 if($wnd.jQuery(e).data('datepicker')) { 158 $wnd.jQuery(e).data('datepicker').update(); 159 } 160 }-*/; 161 162 /** 163 * {@inheritDoc} 164 */ 165 @Override 166 public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Date> dateValueChangeHandler) { 167 return addHandler(dateValueChangeHandler, ValueChangeEvent.getType()); 168 } 169 170 /** 171 * {@inheritDoc} 172 */ 173 @Override 174 protected void onLoad() { 175 super.onLoad(); 176 configure(); 177 } 178 179 /** 180 * Configure the elements for a specific widget. 181 * Use only if you know what you are doing. 182 * 183 * @param w: the widget to configure. 184 */ 185 protected void configure(Widget w) { 186 w.getElement().setAttribute("data-date-format", format); 187 w.getElement().setAttribute("data-date-language", language); 188 configure(w.getElement()); 189 } 190 191 /** 192 * dateChange event handler. 193 */ 194 public void onChange() { 195 ValueChangeEvent.fire(this, getValue()); 196 } 197 198 public void onShow() { 199 fireEvent(new ShowEvent()); 200 } 201 202 public void onHide() { 203 fireEvent(new HideEvent()); 204 } 205 public void reconfigure() { 206 removeDataIfExists(getElement()); 207 configure(); 208 } 209 210 /** 211 * configure this datepicker. 212 */ 213 protected void configure() { 214 configure(this); 215 } 216 217 protected native void removeDataIfExists(Element e) /*-{ 218 var $that = $wnd.jQuery(e); 219 if($that.data('datepicker')) { 220 console.log($that.data()); 221 $that.removeData('dateFormat'); 222 $that.removeData('dateLanguage'); 223 $that.removeData('dateWeekstart'); 224 $that.removeData('dateStartdate'); 225 $that.removeData('dateEnddate'); 226 $that.removeData('datepicker'); 227 $that.off(); 228 console.log($that.data()); 229 } 230 }-*/; 231 232 /** 233 * call jquery datepicker plugin in a element. 234 * 235 * @param e: Element that will be transformed in a datepicker. 236 */ 237 protected native void configure(Element e) /*-{ 238 var that = this; 239 $wnd.jQuery(e).datepicker(); 240 $wnd.jQuery(e).on('change' , function() { 241 that.@com.github.gwtbootstrap.datepicker.client.ui.base.DateBoxBase::onChange()(); 242 }); 243 $wnd.jQuery(e).datepicker().on("show", function () { 244 that.@com.github.gwtbootstrap.datepicker.client.ui.base.DateBoxBase::onShow()(); 245 }); 246 $wnd.jQuery(e).datepicker().on("hide", function () { 247 that.@com.github.gwtbootstrap.datepicker.client.ui.base.DateBoxBase::onHide()(); 248 }); 249 }-*/; 250 251 private native void execute(Element e, String cmd) /*-{ 252 $wnd.jQuery(e).datepicker(cmd); 253 }-*/; 254 255 private void execute(String cmd) { 256 execute(getElement(), cmd); 257 } 258 259 /** 260 * {@inheritDoc} 261 */ 262 @Override 263 public void show() { 264 execute("show"); 265 } 266 267 /** 268 * {@inheritDoc} 269 */ 270 @Override 271 public void hide() { 272 execute("hide"); 273 } 274 275 /** 276 * {@inheritDoc} 277 */ 278 @Override 279 public void toggle() { 280 //TODO 2012/06/21 ohashi keisuke shoud be support 281 throw new UnsupportedOperationException("not support toggle"); 282 } 283 284 /** 285 * {@inheritDoc} 286 */ 287 @Override 288 public HandlerRegistration addHideHandler(HideHandler handler) { 289 return addHandler(handler, HideEvent.getType()); 290 } 291 292 /** 293 * {@inheritDoc} 294 */ 295 @Override 296 public HandlerRegistration addHiddenHandler(HiddenHandler handler) { 297 //TODO 2012/06/21 ohashi keisuke shoud be support 298 throw new UnsupportedOperationException("not support hidden event"); 299 } 300 301 /** 302 * {@inheritDoc} 303 */ 304 @Override 305 public HandlerRegistration addShowHandler(ShowHandler handler) { 306 return addHandler(handler, ShowEvent.getType()); 307 } 308 309 /** 310 * {@inheritDoc} 311 */ 312 @Override 313 public HandlerRegistration addShownHandler(ShownHandler handler) { 314 //TODO 2012/06/21 ohashi keisuke shoud be support 315 throw new UnsupportedOperationException("not support shown event"); 316 } 317 318 /** 319 * {@inheritDoc} 320 */ 321 @Override 322 public void setWeekStart(int start) { 323 getElement().setAttribute("data-date-weekstart", start + ""); 324 } 325 326 /** 327 * {@inheritDoc} 328 */ 329 @Override 330 public void setStartDate(String startDate) { 331 getElement().setAttribute("data-date-startdate", startDate); 332 } 333 334 /** 335 * {@inheritDoc} 336 */ 337 @Override 338 public void setStartDate_(Date startDate) { 339 setStartDate(dtf.format(startDate)); 340 } 341 342 343 /** 344 * {@inheritDoc} 345 */ 346 @Override 347 public void setEndDate(String endDate) { 348 getElement().setAttribute("data-date-enddate", endDate); 349 } 350 351 /** 352 * {@inheritDoc} 353 */ 354 @Override 355 public void setEndDate_(Date endDate) { 356 setEndDate(dtf.format(endDate)); 357 } 358 359 /** 360 * {@inheritDoc} 361 */ 362 @Override 363 public void setAutoClose(boolean autoclose) { 364 getElement().setAttribute("data-date-autoclose", autoclose + ""); 365 } 366 367 /** 368 * {@inheritDoc} 369 */ 370 @Override 371 public void setStartView(ViewMode mode) { 372 setStartView(mode.name()); 373 } 374 375 /** 376 * {@inheritDoc} 377 */ 378 @Override 379 public void setStartView(String mode) { 380 getElement().setAttribute("data-date-startview", mode.toLowerCase()); 381 } 382 383 /** 384 * Retuen Editor 385 * @return editor 386 */ 387 @Override 388 public TakesValueEditor<Date> asEditor() { 389 if(editor == null){ 390 editor = TakesValueEditor.of(this); 391 } 392 return editor; 393 } 394 395 @Override 396 public HandlerRegistration addChangeHandler(ChangeHandler handler) { 397 return addHandler(handler, ChangeEvent.getType()); 398 } 399 400 /** 401 * {@inheritDoc} 402 */ 403 @Override 404 public void setPlaceholder(String placeholder) { 405 placeholderHelper.setPlaceholer(getElement(), placeholder); 406 } 407 408 /** 409 * {@inheritDoc} 410 */ 411 @Override 412 public String getPlaceholder() { 413 return placeholderHelper.getPlaceholder(getElement()); 414 } 415 416 /** 417 * {@inheritDoc} 418 */ 419 @Override 420 public void setSearchQuery(boolean searchQuery) { 421 SearchQueryStyleHelper.setSearchQuery(this, searchQuery); 422 } 423 424 /** 425 * {@inheritDoc} 426 */ 427 @Override 428 public boolean isSearchQuery() { 429 return SearchQueryStyleHelper.isSearchQuery(this); 430 } 431 432 /** 433 * {@inheritDoc} 434 */ 435 @Override 436 public void setAlternateSize(AlternateSize size) { 437 StyleHelper.changeStyle(this, size, AlternateSize.class); 438 } 439 440 /** 441 * {@inheritDoc} 442 */ 443 @Override 444 public void setSize(int size) { 445 SizeHelper.setSize(this, size); 446 } 447 448 /** 449 * {@inheritDoc} 450 */ 451 @Override 452 public String getId() { 453 return getElement().getId(); 454 } 455 456 /** 457 * {@inheritDoc} 458 */ 459 @Override 460 public void setId(String id) { 461 getElement().setId(id); 462 } 463 464 /** 465 * {@inheritDoc} 466 */ 467 @Override 468 public void setShowOn(Device device) { 469 ResponsiveHelper.setShowOn(this, device); 470 } 471 472 /** 473 * {@inheritDoc} 474 */ 475 @Override 476 public void setHideOn(Device device) { 477 ResponsiveHelper.setHideOn(this, device); 478 479 } 480 481 /** 482 * {@inheritDoc} 483 */ 484 @Override 485 public void setStyle(Style style) { 486 StyleHelper.setStyle(this, style); 487 } 488 489 /** 490 * {@inheritDoc} 491 */ 492 @Override 493 public void addStyle(Style style) { 494 StyleHelper.addStyle(this, style); 495 } 496 497 /** 498 * {@inheritDoc} 499 */ 500 @Override 501 public void removeStyle(Style style) { 502 StyleHelper.removeStyle(this, style); 503 504 } 505 }