Fix to allow the selection for the DateChooser to be set and visible (show's 
date as selected).


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/79378574
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/79378574
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/79378574

Branch: refs/heads/feature/mdl
Commit: 79378574854ed2953df441c7f7a86f33f74c224f
Parents: c51282f
Author: Peter Ent <[email protected]>
Authored: Tue Dec 13 17:13:32 2016 -0500
Committer: Peter Ent <[email protected]>
Committed: Tue Dec 13 17:13:32 2016 -0500

----------------------------------------------------------------------
 .../flex/org/apache/flex/html/DateChooser.as    |   3 +
 .../apache/flex/html/beads/DateChooserView.as   |  74 ++-----------
 .../controllers/DateChooserMouseController.as   |   4 +
 .../controllers/DateFieldMouseController.as     |  72 +++++++++++-
 .../flex/html/beads/models/DateChooserModel.as  | 110 ++++++++++++++++++-
 5 files changed, 192 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/79378574/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/DateChooser.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/DateChooser.as 
b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/DateChooser.as
index ff5ef28..7e88d9c 100644
--- a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/DateChooser.as
+++ b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/DateChooser.as
@@ -51,6 +51,9 @@ package org.apache.flex.html
                        // fix the DateChooser's size
                        width = 280;
                        height = 240;
+                       
+                       // default to today
+                       selectedDate = new Date();
                }
 
                /**

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/79378574/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/DateChooserView.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/DateChooserView.as
 
b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/DateChooserView.as
index c8a9ad4..b2eaaa0 100644
--- 
a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/DateChooserView.as
+++ 
b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/DateChooserView.as
@@ -84,9 +84,6 @@ package org.apache.flex.html.beads
                private var dayNamesContainer:DateChooserHeader;
                private var daysContainer:DateChooserList;
                
-               private var _dayNames:Array;
-               private var _days:Array;
-               
                /**
                 *  The button that causes the previous month to be displayed 
by the DateChooser.
                 *
@@ -152,17 +149,10 @@ package org.apache.flex.html.beads
                        
                        daysContainer = new DateChooserList();
                        UIBase(_strand).addElement(daysContainer, false);
-                                               
-                       _dayNames = new Array();
-                       
-                       // the calendar has 7 columns with 6 rows, the first 
row are the day names
-                       for(var i:int=0; i < 7; i++) {
-                               _dayNames.push(model.dayNames[i]);
-                       }
                        
                        IEventDispatcher(daysContainer).dispatchEvent( new 
Event("itemsCreated") );
                        
-                       updateCalendar();
+                       model.addEventListener("selectedDateChanged", 
selectionChangeHandler);
                }
                
                private function layoutContents():void
@@ -179,20 +169,22 @@ package org.apache.flex.html.beads
                        monthLabel.x = _prevMonthButton.x + 
_prevMonthButton.width;
                        monthLabel.y = 0;
                        monthLabel.width = sw - _prevMonthButton.width - 
_nextMonthButton.width;
+                       monthLabel.text = 
model.monthNames[model.displayedMonth] + " " +
+                               String(model.displayedYear);
                        
                        dayNamesContainer.x = 0;
                        dayNamesContainer.y = monthLabel.y + monthLabel.height;
                        dayNamesContainer.width = sw;
                        dayNamesContainer.height = monthLabel.height;
                        
-                       dayNamesContainer.dataProvider = _dayNames;
+                       dayNamesContainer.dataProvider = model.dayNames;
                        
                        daysContainer.x = 0;
                        daysContainer.y = dayNamesContainer.y + 
dayNamesContainer.height;
                        daysContainer.width = sw;
                        daysContainer.height = sh - monthLabel.height - 
dayNamesContainer.height;
                        
-                       daysContainer.dataProvider = _days;
+                       daysContainer.dataProvider = model.days;
                        
                        IEventDispatcher(_strand).dispatchEvent( new 
Event("layoutNeeded") );
                        IEventDispatcher(daysContainer).dispatchEvent( new 
Event("layoutNeeded") );
@@ -201,58 +193,12 @@ package org.apache.flex.html.beads
                /**
                 * @private
                 */
-               private function updateCalendar():void
+               private function selectionChangeHandler(event:Event):void
                {
-                       monthLabel.text = 
model.monthNames[model.displayedMonth] + " " +
-                               String(model.displayedYear);
-                       
-                       var firstDay:Date = new 
Date(model.displayedYear,model.displayedMonth,1);
-                       
-                       _days = new Array(42);
-                       
-                       // blank out the labels for the first firstDay.day-1 
entries.
-                       for(var i:int=0; i < firstDay.getDay(); i++) {
-                               _days[i] = null;
-                       }
-                       
-                       // renumber to the last day of the month
-                       var dayNumber:int = 1;
-                       var numDays:Number = 
numberOfDaysInMonth(model.displayedMonth, model.displayedYear);
-                       
-                       for(; i < _days.length && dayNumber <= numDays; i++) {
-                               _days[i] = new Date(model.displayedYear, 
model.displayedMonth, dayNumber++);
-                       }
-                       
-                       // blank out the rest
-                       for(; i < _days.length; i++) {
-                               _days[i] = null;
-                       }
-                       
-                       daysContainer.dataProvider = _days;
-               }
-               
-               /**
-                * @private
-                */
-               private function numberOfDaysInMonth(month:Number, 
year:Number):Number
-               {
-                       var n:int;
-                       
-                       if (month == 1) // Feb
-                       {
-                               if (((year % 4 == 0) && (year % 100 != 0)) || 
(year % 400 == 0)) // leap year
-                                       n = 29;
-                               else
-                                       n = 28;
-                       }
-                               
-                       else if (month == 3 || month == 5 || month == 8 || 
month == 10)
-                               n = 30;
-                               
-                       else
-                               n = 31;
+                       layoutContents();
                        
-                       return n;
+                       var index:Number = model.getIndexForSelectedDate();
+                       daysContainer.selectedIndex = index;
                }
                
                /**
@@ -260,7 +206,7 @@ package org.apache.flex.html.beads
                 */
                private function handleModelChange(event:Event):void
                {
-                       updateCalendar();
+                       layoutContents();
                }
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/79378574/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateChooserMouseController.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateChooserMouseController.as
 
b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateChooserMouseController.as
index a43ca7a..f5d7e34 100644
--- 
a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateChooserMouseController.as
+++ 
b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateChooserMouseController.as
@@ -81,6 +81,8 @@ package org.apache.flex.html.beads.controllers
                 */
                private function prevMonthClickHandler(event:MouseEvent):void
                {
+                       event.preventDefault();
+                       
                        var model:DateChooserModel = 
_strand.getBeadByType(IBeadModel) as DateChooserModel;
                        
                        var month:Number = model.displayedMonth - 1;
@@ -98,6 +100,8 @@ package org.apache.flex.html.beads.controllers
                 */
                private function nextMonthClickHandler(event:MouseEvent):void
                {
+                       event.preventDefault();
+                       
                        var model:DateChooserModel = 
_strand.getBeadByType(IBeadModel) as DateChooserModel;
                        
                        var month:Number = model.displayedMonth + 1;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/79378574/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateFieldMouseController.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateFieldMouseController.as
 
b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateFieldMouseController.as
index c4f130a..2b8ea51 100644
--- 
a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateFieldMouseController.as
+++ 
b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/controllers/DateFieldMouseController.as
@@ -21,11 +21,14 @@ package org.apache.flex.html.beads.controllers
        import org.apache.flex.core.IBeadController;
        import org.apache.flex.core.IDateChooserModel;
        import org.apache.flex.core.IStrand;
+       import org.apache.flex.core.IUIBase;
        import org.apache.flex.core.UIBase;
        import org.apache.flex.events.Event;
-       import org.apache.flex.events.MouseEvent;
        import org.apache.flex.events.IEventDispatcher;
+       import org.apache.flex.events.MouseEvent;
        import org.apache.flex.html.beads.DateFieldView;
+       import org.apache.flex.utils.Timer;
+       import org.apache.flex.utils.UIUtils;
        
        /**
         * The DateFieldMouseController class is responsible for monitoring
@@ -74,9 +77,41 @@ package org.apache.flex.html.beads.controllers
                 */
                private function clickHandler(event:MouseEvent):void
                {
+                       event.stopImmediatePropagation();
+                       
                        var viewBead:DateFieldView = 
_strand.getBeadByType(DateFieldView) as DateFieldView;
                        viewBead.popUpVisible = true;
                        
IEventDispatcher(viewBead.popUp).addEventListener("change", changeHandler);
+                       
+                       removeDismissHandler();
+                       
+                       // use a timer to delay the installation of the event 
handler, otherwise
+                       // the event handler is called immediately and will 
dismiss the popup.
+                       var t:Timer = new Timer(0.25,1);
+                       t.addEventListener("timer",addDismissHandler);
+                       t.start();
+               }
+               
+               /**
+                * @private
+                */
+               private function addDismissHandler(event:Event):void
+               {
+                       var host:UIBase = UIUtils.findPopUpHost(_strand as 
UIBase) as UIBase;
+                       if (host) {
+                               host.addEventListener("click", dismissHandler);
+                       }
+               }
+               
+               /**
+                * @private
+                */
+               private function removeDismissHandler():void
+               {
+                       var host:UIBase = UIUtils.findPopUpHost(_strand as 
UIBase) as UIBase;
+                       if (host) {
+                               host.removeEventListener("click", 
dismissHandler);
+                       }
                }
                
                /**
@@ -84,6 +119,8 @@ package org.apache.flex.html.beads.controllers
                 */
                private function changeHandler(event:Event):void
                {
+                       event.stopImmediatePropagation();
+                       
                        var viewBead:DateFieldView = 
_strand.getBeadByType(DateFieldView) as DateFieldView;
                        
                        var model:IDateChooserModel = 
_strand.getBeadByType(IDateChooserModel) as IDateChooserModel;
@@ -91,6 +128,39 @@ package org.apache.flex.html.beads.controllers
 
                        viewBead.popUpVisible = false;
                        IEventDispatcher(_strand).dispatchEvent(new 
Event("change"));
+                       
+                       removeDismissHandler();
+               }
+               
+               /**
+                * @private
+                */
+               private function dismissHandler(event:MouseEvent):void
+               {
+                       var viewBead:DateFieldView = 
_strand.getBeadByType(DateFieldView) as DateFieldView;
+                       var popup:IUIBase = IUIBase(viewBead.popUp);
+                       
+                       COMPILE::SWF {
+                               var before:IUIBase = 
event.targetBeforeBubbling["flexjs_wrapper"] as IUIBase;
+                               if (before) {
+                                       while (before != null) {
+                                               if (before == popup) return;
+                                               before = before.parent as 
IUIBase;
+                                       }
+                               }
+                       }
+                       COMPILE::JS {
+                               var before:IUIBase = event.target as IUIBase;
+                               if (before) {
+                                       while (before != null) {
+                                               if (before == popup) return;
+                                               before = before.parent as 
IUIBase;
+                                       }
+                               }
+                       }
+                       
+                       viewBead.popUpVisible = false;
+                       removeDismissHandler();
                }
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/79378574/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/models/DateChooserModel.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/models/DateChooserModel.as
 
b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/models/DateChooserModel.as
index 2132cc7..a24ca90 100644
--- 
a/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/models/DateChooserModel.as
+++ 
b/frameworks/projects/HTML/src/main/flex/org/apache/flex/html/beads/models/DateChooserModel.as
@@ -38,9 +38,9 @@ package org.apache.flex.html.beads.models
                public function DateChooserModel()
                {
                        // default displayed year and month to "today"
-                       var today:Date = new Date();
-                       displayedYear = today.getFullYear();
-                       displayedMonth = today.getMonth();
+//                     var today:Date = new Date();
+//                     displayedYear = today.getFullYear();
+//                     displayedMonth = today.getMonth();
                }
                
                private var _strand:IStrand;
@@ -60,6 +60,7 @@ package org.apache.flex.html.beads.models
                
                private var _dayNames:Array   = 
["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
                private var _monthNames:Array = 
["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
+               private var _days:Array;
                private var _displayedYear:Number;
                private var _displayedMonth:Number;
                private var _firstDayOfWeek:Number = 0;
@@ -119,6 +120,7 @@ package org.apache.flex.html.beads.models
                {
                        if (value != _displayedYear) {
                                _displayedYear = value;
+                               updateCalendar();
                                dispatchEvent( new 
Event("displayedYearChanged") );
                        }
                }
@@ -139,6 +141,7 @@ package org.apache.flex.html.beads.models
                {
                        if (_displayedMonth != value) {
                                _displayedMonth = value;
+                               updateCalendar();
                                dispatchEvent( new 
Event("displayedMonthChanged") );
                        }
                }
@@ -163,6 +166,18 @@ package org.apache.flex.html.beads.models
                        }
                }
                
+               public function get days():Array
+               {
+                       return _days;
+               }
+               public function set days(value:Array):void
+               {
+                       if (value != _days) {
+                               _days = value;
+                               dispatchEvent( new Event("daysChanged") );
+                       }
+               }
+               
                /**
                 *  The currently selected date or null if no date has been 
selected.
                 *  
@@ -179,13 +194,96 @@ package org.apache.flex.html.beads.models
                {
                        if (value != _selectedDate) {
                                _selectedDate = value;
-                               dispatchEvent( new Event("selectedDateChanged") 
);
                                
                                if (value != null) {
-                                       displayedMonth = value.getMonth();
-                                       displayedYear  = value.getFullYear();
+                                       var needsUpdate:Boolean = false;
+                                       if (value.getMonth() != 
_displayedMonth) {
+                                               needsUpdate = true;
+                                               _displayedMonth = 
value.getMonth();
+                                       }
+                                       if (value.getFullYear() != 
_displayedYear) {
+                                               needsUpdate = true;
+                                               _displayedYear  = 
value.getFullYear();
+                                       }
+                                       if (needsUpdate) updateCalendar();
+                               }
+                               
+                               dispatchEvent( new Event("selectedDateChanged") 
);
+                       }
+               }
+               
+               // Utilities
+               
+               
+               /**
+                * @private
+                */
+               private function updateCalendar():void
+               {       
+                       var firstDay:Date = new 
Date(displayedYear,displayedMonth,1);
+                       
+                       _days = new Array(42);
+                       
+                       // blank out the labels for the first firstDay.day-1 
entries.
+                       for(var i:int=0; i < firstDay.getDay(); i++) {
+                               _days[i] = null;
+                       }
+                       
+                       // renumber to the last day of the month
+                       var dayNumber:int = 1;
+                       var numDays:Number = 
numberOfDaysInMonth(displayedMonth, displayedYear);
+                       
+                       for(; i < _days.length && dayNumber <= numDays; i++) {
+                               _days[i] = new Date(displayedYear, 
displayedMonth, dayNumber++);
+                       }
+                       
+                       // blank out the rest
+                       for(; i < _days.length; i++) {
+                               _days[i] = null;
+                       }
+               }
+               
+               /**
+                * @private
+                */
+               private function numberOfDaysInMonth(month:Number, 
year:Number):Number
+               {
+                       var n:int;
+                       
+                       if (month == 1) // Feb
+                       {
+                               if (((year % 4 == 0) && (year % 100 != 0)) || 
(year % 400 == 0)) // leap year
+                                       n = 29;
+                               else
+                                       n = 28;
+                       }
+                               
+                       else if (month == 3 || month == 5 || month == 8 || 
month == 10)
+                               n = 30;
+                               
+                       else
+                               n = 31;
+                       
+                       return n;
+               }
+               
+               /**
+                * @private
+                */
+               public function getIndexForSelectedDate():Number
+               {
+                       var d:Date = _selectedDate;
+                       if (d == null) return -1;
+                       
+                       for(var i:int=0; i < _days.length; i++) {
+                               var test:Date = _days[i] as Date;
+                               if (test != null) {
+                                       if (test.getMonth() == d.getMonth() && 
test.getDate() == d.getDate() && test.getFullYear() == d.getFullYear()) {
+                                               return i;
+                                       }
                                }
                        }
+                       return -1;
                }
        }
 }

Reply via email to