//////////////////////////////////////////////////////////////////////////////// // // 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 year range. Using this class instead of * generating all the years statically avoids the cost of applying DateTimeFormatterEx.format() * to every date. * * @langversion 3.0 * @playerversion AIR 3 * @productversion Flex 4.6 */ public class YearProvider extends OnDemandDataProvider { //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Construct a year 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 YearProvider(locale:String, start:int = 1601, end:int = 9999, today:Date = null) { super(); startYear = start; endYear = end; formatter = new DateTimeFormatterEx(); if (locale) formatter.setStyle("locale", locale); else formatter.clearStyle("locale"); formatter.dateTimePattern = formatter.getYearPattern(); todayDate = today; } //---------------------------------------------------------------------------------------------- // // Variables // //---------------------------------------------------------------------------------------------- // start of the date range private var startYear:int; // end of the date range private var endYear:int; private var todayDate:Date; // formatter to use in localizing the date labels private var formatter:DateTimeFormatterEx; //---------------------------------------------------------------------------------------------- // // Properties // //---------------------------------------------------------------------------------------------- //---------------------------------- // length //---------------------------------- /** * @inherit */ override public function get length():int { return (endYear - startYear) + 1; } //---------------------------------------------------------------------------------------------- // // Overridden Methods // //---------------------------------------------------------------------------------------------- /** * @inheritDoc * * @langversion 3.0 * @playerversion AIR 3 * @productversion Flex 4.6 */ override public function getItemAt(index:int, prefetch:int=0):Object { var year:int = index + startYear; var d:Date = new Date(year, 0, 1); var enabledFlag:Boolean = year >= startYear && year <= endYear; // generate the appropriate object var item:Object = {label:formatter.format(d), data:year, enabled:enabledFlag }; if (todayDate) { if (year == todayDate.fullYear) item["_emphasized_"] = true; } return item; } /** * @inheritDoc * * @langversion 3.0 * @playerversion AIR 3 * @productversion Flex 4.6 */ override public function getItemIndex(item:Object):int { try { var year:Number = item.data; if (!isNaN(year)){ if (year >= startYear && year <= endYear) return Math.floor(year - startYear); } } catch (e:Error) // in case object is in an incorrect format { } 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; } } }