You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by jm...@apache.org on 2013/05/09 07:57:02 UTC

[5/5] git commit: [flex-sdk] [refs/heads/develop] - Fix further confusion in code about date ranges being off by one and rewrote removeRangeFromSelection so it actually works for all cases.

Fix further confusion in code about date ranges being off by one and rewrote removeRangeFromSelection so it actually works for all cases.


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

Branch: refs/heads/develop
Commit: 02aa4310bd4427b4b23ebc862e8dfda3c7377cc3
Parents: 154ee70
Author: Justin Mclean <jm...@apache.org>
Authored: Thu May 9 15:23:05 2013 +1000
Committer: Justin Mclean <jm...@apache.org>
Committed: Thu May 9 15:23:05 2013 +1000

----------------------------------------------------------------------
 .../projects/mx/src/mx/controls/CalendarLayout.as  |  114 ++++++++-------
 1 files changed, 62 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/02aa4310/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
index 153d760..05988ed 100644
--- a/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
+++ b/frameworks/projects/mx/src/mx/controls/CalendarLayout.as
@@ -299,7 +299,7 @@ public class CalendarLayout extends UIComponent
     /**
      *  @private
      */
-    mx_internal var selRangeMode:int = 1;
+    mx_internal var selRangeMode:int = START_END;
 
     //--------------------------------------------------------------------------
     //
@@ -834,7 +834,7 @@ public class CalendarLayout extends UIComponent
                 else if (todaysDate < _selectableRange.rangeStart)
                 {
                     callMonth = _selectableRange.rangeStart.getMonth();
-                    callYear = _selectableRange. rangeStart.getFullYear();
+                    callYear = _selectableRange.rangeStart.getFullYear();
                 }
                 else if (todaysDate > _selectableRange.rangeEnd)
                 {
@@ -877,23 +877,22 @@ public class CalendarLayout extends UIComponent
             {
                 case START_END:
                 {
-                    removeRangeFromSelection(null, _selectableRange.rangeStart);
-                    removeRangeFromSelection(_selectableRange.rangeEnd, null);
+                    removeRangeFromSelection(null, addSubtractDays(_selectableRange.rangeStart, -1));
+                    removeRangeFromSelection(addSubtractDays(_selectableRange.rangeEnd, +1), null);
                     break;
                 }
 
                 case START_ONLY:
                 case END_ONLY:
                 {
-                    removeRangeFromSelection(_selectableRange.rangeEnd,
-                                             _selectableRange.rangeStart);
+                    removeRangeFromSelection(addSubtractDays(_selectableRange.rangeStart, -1),
+												addSubtractDays(_selectableRange.rangeEnd, +1));
                     break;
                 }
 
                 case SINGLE_DATE:
                 {
-                    removeRangeFromSelection(null, _selectableRange as Date);
-                    removeRangeFromSelection(_selectableRange as Date, null);
+                    removeDayFromSelection(_selectableRange as Date);
                     break;
                 }
             }
@@ -909,15 +908,13 @@ public class CalendarLayout extends UIComponent
                 case START_ONLY:
                 case END_ONLY:
                 {
-                    removeRangeFromSelection(addSubtractDays(_disabledRanges[i].rangeStart, -1),
-								addSubtractDays(_disabledRanges[i].rangeEnd, +1));
+                    removeRangeFromSelection(_disabledRanges[i].rangeStart, _disabledRanges[i].rangeEnd);
                     break;
                 }
 
                 case SINGLE_DATE:
                 {
-                    removeRangeFromSelection(addSubtractDays(_disabledRanges[i], -1),
-								_disabledRanges[i]);
+                    removeDayFromSelection(_disabledRanges[i]);
                     break;
                 }
             }
@@ -950,7 +947,7 @@ public class CalendarLayout extends UIComponent
 
                 while (tempDate < maxDate)
                 {
-                    removeRangeFromSelection(tempDate, tempDate);
+                    removeDayFromSelection(tempDate);
                     tempDate = addSubtractDays(tempDate, 7);
                 }
             }
@@ -1927,7 +1924,7 @@ public class CalendarLayout extends UIComponent
     mx_internal function addToSelected(newDate:Date, range:Boolean = false):void
     {
 
-        if (!selectedRangeCount)
+        if (selectedRangeCount == 0)
             rangeStartDate = null;
 
         lastSelectedDate = newDate;
@@ -2018,48 +2015,61 @@ public class CalendarLayout extends UIComponent
 		for (var n:int = 0; n < selectedRangeCount; n++)
 		{
 			rangeStart = _selectedRanges[n].rangeStart;
+			rangeEnd = _selectedRanges[n].rangeEnd;
 			
-			if (endDate < rangeStart)
+			// ignore selection range outsie of date range
+			if (endDate < rangeStart || startDate > rangeEnd)
 				continue;
 			
-			rangeEnd = _selectedRanges[n].rangeEnd;
-			
-			if (startDate <= rangeStart)
+			// remove selection range inside of date range
+			if (startDate <= rangeStart && endDate >= rangeEnd)
+			{
+				_selectedRanges[n] = null;
+			}
+			// split selection range if date range inside selection range
+			else if (startDate > rangeStart && endDate < rangeEnd)
 			{
-				if (endDate < rangeEnd)
-				{
-					_selectedRanges[n].rangeStart = endDate;
-				}
-				else
-				{
-					_selectedRanges[n] = _selectedRanges[selectedRangeCount - 1];
-					_selectedRanges[selectedRangeCount - 1] = null;
-					
-					selectedRangeCount -= 1;
-				}
+				var temp:Date = _selectedRanges[n].rangeEnd;
+				
+				_selectedRanges[n].rangeEnd = addSubtractDays(startDate, -1);
+				
+				_selectedRanges[selectedRangeCount] = {};
+				_selectedRanges[selectedRangeCount].rangeStart = addSubtractDays(endDate, +1);
+				_selectedRanges[selectedRangeCount].rangeEnd = temp;
+				
+				selectedRangeCount++;
 			}
+			// move selection start date if end overlaps
+			else if (endDate >= rangeStart)
+			{
+				_selectedRanges[n].rangeStart = addSubtractDays(endDate, +1);	
+			}
+			// move selection end date if start overlaps
 			else if (startDate <= rangeEnd)
 			{
-				if (endDate < rangeEnd)
-				{
-					var temp:Date = _selectedRanges[n].rangeEnd;
-					
-					_selectedRanges[n].rangeEnd = startDate;
-					
-					_selectedRanges[selectedRangeCount] = {};
-					_selectedRanges[selectedRangeCount].rangeStart = endDate;
-					_selectedRanges[selectedRangeCount].rangeEnd = temp;
-					
-					selectedRangeCount += 1;
-				}
-				else
-				{
-					_selectedRanges[n].rangeEnd = startDate;
-				}
+				_selectedRanges[n].rangeEnd = addSubtractDays(startDate, -1);	
+			}			
+		}
+		
+		// clean up any removed selections
+		for (n = selectedRangeCount -1; n > 0; n--)
+		{
+			if (_selectedRanges[n] == null)
+			{
+				_selectedRanges.splice(n,1);
+				selectedRangeCount--;
 			}
 		}
 	}
-
+	
+	/**
+	 *  @private
+	 *  Removes a single date specified by singleDate from the selected dates.
+	 */
+	mx_internal function removeDayFromSelection(singleDate:Date):void
+	{
+		removeRangeFromSelection(singleDate, singleDate);
+	}
 
     /**
      *  @private
@@ -2458,7 +2468,7 @@ public class CalendarLayout extends UIComponent
                     if (alreadySelected)
                     {
                         removeSelectionIndicator(colIndex, rowIndex);
-                        removeRangeFromSelection(newDate, newDate);
+                        removeDayFromSelection(newDate);
                     }
                     else
                     {
@@ -2482,15 +2492,15 @@ public class CalendarLayout extends UIComponent
                         else if (event.ctrlKey)
                         {
                             removeSelectionIndicator(colIndex, rowIndex);
-                            removeRangeFromSelection(newDate, newDate);
+                            removeDayFromSelection(newDate);
                         }
                     }
                     else
                     {
-                            selectedRangeCount = 0;
-                            addSelectionIndicator(colIndex, rowIndex);
-                            addToSelected(newDate);
-                            setSelectedIndicators();
+                        selectedRangeCount = 0;
+                        addSelectionIndicator(colIndex, rowIndex);
+                        addToSelected(newDate);
+                        setSelectedIndicators();
                     }
                 }
             }