blob: 9ef5da9a7a1cd9f30b52c65ec806847671f8677c [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package spark.components.calendarClasses
{
import spark.collections.OnDemandDataProvider;
import spark.globalization.supportClasses.DateTimeFormatterEx;
[ExcludeClass]
/**
* Helper class for creating a dynamic date range for DateSpinner in DATE_AND_TIME
* mode. Using this class instead of generating all the dates statically avoids
* the cost of applying DateTimeFormatter.format() to every date.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
public class DateAndTimeProvider extends OnDemandDataProvider
{
//----------------------------------------------------------------------------------------------
//
// Class constants
//
//----------------------------------------------------------------------------------------------
// number of milliseconds in a day
private static const MS_IN_DAY:Number = 1000 * 60 * 60 * 24;
// default min/max date
private static const MIN_DATE_DEFAULT:Date = new Date(DateTimeFormatterEx.MIN_YEAR, 0, 1);
private static const MAX_DATE_DEFAULT:Date = new Date(9999, 11, 31, 23, 59, 59, 999);
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Construct a DATE_AND_TIME range for DateSpinner from the start to
* end dates, inclusive. Locale is used to generate the appropriate
* labels.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
public function DateAndTimeProvider(locale:String, start:Date, end:Date,
today:Date = null)
{
if (start == null)
start = MIN_DATE_DEFAULT;
if (end == null)
end = MAX_DATE_DEFAULT;
// we only count days; reset clocks so there are no rounding errors
startDate = new Date(start.time);
endDate = new Date(end.time);
// note: set hours to 11 to avoid being near day boundaries that can
// cause repeat days due to daylight savings time
startDate.hours = 11;
startDate.minutes = 0;
startDate.seconds = 0;
startDate.milliseconds = 0;
endDate.hours = 11;
endDate.minutes = 0;
endDate.seconds = 0;
endDate.milliseconds = 0;
// calculate how many days there are between the two
// +1 because we need to include both start and end dates
_length = ((endDate.time - startDate.time) / MS_IN_DAY) + 1;
formatter = new DateTimeFormatterEx();
if (locale)
formatter.setStyle("locale", locale);
else
formatter.clearStyle("locale");
formatter.dateTimeSkeletonPattern = DateTimeFormatterEx.DATESTYLE_MMMEEEd;
todayDate = today;
}
//----------------------------------------------------------------------------------------------
//
// Variables
//
//----------------------------------------------------------------------------------------------
// start of the date range
private var startDate:Date;
// end of the date range
private var endDate:Date;
private var todayDate:Date;
// formatter to use in localizing the date labels
private var formatter:DateTimeFormatterEx;
//----------------------------------------------------------------------------------------------
//
// Properties
//
//----------------------------------------------------------------------------------------------
//----------------------------------
// length
//----------------------------------
private var _length:int;
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
override public function get length():int
{
return _length;
}
//----------------------------------------------------------------------------------------------
//
// Overridden Methods
//
//----------------------------------------------------------------------------------------------
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
override public function getItemAt(index:int, prefetch:int=0):Object
{
// calc date you want from index
var d:Date = new Date(startDate.time + index * MS_IN_DAY);
// generate the appropriate object
var item:Object = { label:formatter.format(d), data:d.time };
if (todayDate)
{
if (d.getFullYear() == todayDate.getFullYear() &&
d.getMonth() == todayDate.getMonth() &&
d.getDate() == todayDate.getDate())
{
item["_emphasized_"] = true;
}
}
return item;
}
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
override public function getItemIndex(item:Object):int
{
try
{
if (!isNaN(item.data))
{
// set firstDate's hour/min/second to the same values
var dateObj:Date = new Date(item.data);
dateObj.hours = startDate.hours;
dateObj.minutes = startDate.minutes;
dateObj.seconds = startDate.seconds;
dateObj.milliseconds = startDate.milliseconds;
if (dateObj.time >= startDate.time && dateObj.time <= endDate.time)
return Math.round((dateObj.time - startDate.time) / MS_IN_DAY);
}
}
catch(error:Error)
{
}
return -1;
}
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
override public function toArray():Array
{
var result:Array = [];
var numItems:int = length;
for (var i:int = 0; i < numItems; i++)
result.push(getItemAt(i));
return result;
}
}
}