2323import com .google .gwt .core .client .JsDate ;
2424import com .google .gwt .dom .client .Document ;
2525import com .google .gwt .dom .client .Element ;
26+ import com .google .gwt .event .logical .shared .CloseEvent ;
27+ import com .google .gwt .event .logical .shared .CloseHandler ;
28+ import com .google .gwt .event .logical .shared .HasCloseHandlers ;
29+ import com .google .gwt .event .logical .shared .HasOpenHandlers ;
30+ import com .google .gwt .event .logical .shared .OpenEvent ;
31+ import com .google .gwt .event .logical .shared .OpenHandler ;
32+ import com .google .gwt .event .logical .shared .ValueChangeEvent ;
33+ import com .google .gwt .event .logical .shared .ValueChangeHandler ;
34+ import com .google .gwt .event .shared .HandlerRegistration ;
35+ import com .google .gwt .user .client .ui .HasValue ;
36+
2637import gwt .material .design .client .base .*;
2738import gwt .material .design .client .base .mixin .ErrorMixin ;
2839import gwt .material .design .client .base .mixin .GridMixin ;
5162 * @see <a href="http://gwt-material-demo.herokuapp.com/#pickers">Material Date Picker</a>
5263 */
5364//@formatter:on
54- public class MaterialDatePicker extends MaterialWidget implements HasGrid , HasError , HasOrientation , HasPlaceholder {
65+ public class MaterialDatePicker extends MaterialWidget implements HasGrid , HasError , HasOrientation , HasPlaceholder ,
66+ HasValue <Date >, HasOpenHandlers <MaterialDatePicker >, HasCloseHandlers <MaterialDatePicker > {
5567
5668 /**
5769 * Enum for identifying various selection types for the picker.
@@ -63,18 +75,6 @@ public enum MaterialDatePickerType {
6375 YEAR
6476 }
6577
66- /**
67- * Delegate interface for handling picker events.
68- */
69- public interface MaterialDatePickerDelegate {
70- /**
71- * Called as soon as a click occurs on the calendar widget. !EXPERIMENTAL!
72- *
73- * @param currDate which is currently selected.
74- */
75- void onCalendarClose (Date currDate );
76- }
77-
7878 private String placeholder ;
7979 private Date date ;
8080 private Date dateMin ;
@@ -87,7 +87,6 @@ public interface MaterialDatePickerDelegate {
8787 private MaterialLabel lblError = new MaterialLabel ();
8888
8989 private Orientation orientation = Orientation .PORTRAIT ;
90- private MaterialDatePickerDelegate delegate ;
9190 private MaterialDatePickerType selectionType = MaterialDatePickerType .DAY ;
9291
9392 private final GridMixin <MaterialDatePicker > gridMixin = new GridMixin <>(this );
@@ -175,31 +174,20 @@ else if (thingSet.select) {
175174 });
176175 }-*/ ;
177176
178- /**
179- * A delegate which implements handling of events from date picker.
180- *
181- * @param delegate which will be notified on picker events.
182- * @see MaterialDatePickerDelegate
183- */
184- public void setDelegate (MaterialDatePickerDelegate delegate ) {
185- this .delegate = delegate ;
186- }
187-
188177 void onClose () {
189-
190- if (delegate != null ) {
191- delegate .onCalendarClose (getDate ());
192- }
178+ CloseEvent .fire (this , this );
193179 }
194180
195181 void onOpen () {
196182 label .addStyleName ("active" );
197183 dateInput .setFocus (true );
184+ OpenEvent .fire (this , this );
198185 }
199186
200187 void onSelect () {
201188 label .addStyleName ("active" );
202189 dateInput .addStyleName ("valid" );
190+ ValueChangeEvent .fire (this , getValue ());
203191 }
204192
205193 void onClear () {
@@ -248,14 +236,7 @@ public static native Element initDatePicker(Element inputSrc, String typeName, S
248236 * @param date - must not be <code>null</code>
249237 */
250238 public void setDate (Date date ) {
251- if (date == null ) {
252- return ;
253- }
254- this .date = date ;
255- if (initialized ) {
256- setPickerDate (JsDate .create ((double ) date .getTime ()), pickatizedDateInput );
257- label .addStyleName ("active" );
258- }
239+ setValue (date );
259240 }
260241
261242 public Date getDateMin () {
@@ -292,11 +273,14 @@ public native void setPickerDate(JsDate date, Element picker) /*-{
292273 picker.pickadate('picker').set('select', date, { muted: true });
293274 }-*/ ;
294275
276+ /**
277+ * Same as calling {@link #getValue()}
278+ */
295279 public Date getDate () {
296280 return getPickerDate ();
297281 }
298282
299- public Date getPickerDate () {
283+ protected Date getPickerDate () {
300284 try {
301285 JsDate selectedDate = getDatePickerValue (pickatizedDateInput );
302286 return new Date ((long ) selectedDate .getTime ());
@@ -403,4 +387,44 @@ public void setFormat(String format) {
403387 }
404388 this .format = format ;
405389 }
390+
391+ @ Override
392+ public HandlerRegistration addValueChangeHandler (ValueChangeHandler <Date > handler ) {
393+ return addHandler (handler , ValueChangeEvent .getType ());
394+ }
395+
396+ @ Override
397+ public Date getValue () {
398+ return getPickerDate ();
399+ }
400+
401+ @ Override
402+ public void setValue (Date value ) {
403+ setValue (value , false );
404+ }
405+
406+ @ Override
407+ public void setValue (Date value , boolean fireEvents ) {
408+ if (value == null ) {
409+ return ;
410+ }
411+ this .date = value ;
412+ if (initialized ) {
413+ setPickerDate (JsDate .create ((double ) value .getTime ()), pickatizedDateInput );
414+ label .addStyleName ("active" );
415+ }
416+ if (fireEvents ){
417+ ValueChangeEvent .fire (this , value );
418+ }
419+ }
420+
421+ @ Override
422+ public HandlerRegistration addCloseHandler (CloseHandler <MaterialDatePicker > handler ) {
423+ return addHandler (handler , CloseEvent .getType ());
424+ }
425+
426+ @ Override
427+ public HandlerRegistration addOpenHandler (OpenHandler <MaterialDatePicker > handler ) {
428+ return addHandler (handler , OpenEvent .getType ());
429+ }
406430}
0 commit comments