package com.exanimo.gallery { import com.exanimo.gallery.*; import flash.display.Bitmap; import flash.display.DisplayObject; import flash.display.Loader; import com.exanimo.events.DataChangeEvent; import com.exanimo.events.DataChangeType; import flash.events.Event; import flash.events.EventDispatcher; import flash.net.URLRequest; /** * * .. * * @langversion ActionScript 3 * @playerversion Flash 9.0.0 * * @author Eric Eldredge * @author Rich Perez * @author Matthew Tretter * @since 2009.01.12 * */ public class GalleryController extends EventDispatcher implements IGalleryController { private var _dataProvider:GalleryDataProvider; private var _itemLoaders:Array; private var _loadManager:GalleryLoadManager; private var _selectedItemIndex:int; private var _thumbnailLoaders:Array; /** * * */ public function GalleryController(dataProvider:GalleryDataProvider = null):void { this._init(dataProvider); } // // accessors // /** * * * */ public function get dataProvider():GalleryDataProvider { return this._dataProvider; } /** * @private */ public function set dataProvider(dataProvider:GalleryDataProvider):void { // If the data providers are equal, don't do anything. if (((this._dataProvider != null) && this._dataProvider.equals(dataProvider)) || ((this._dataProvider == null) && (dataProvider == null))) { return; } var startIndex:int = -1; var endIndex:int = -1; var items:Array; if (this._dataProvider) { startIndex = 0; endIndex = Math.max(0, this._dataProvider.length - 1); items = this._dataProvider.toArray(); this.dispatchEvent(new DataChangeEvent(DataChangeEvent.PRE_DATA_CHANGE, DataChangeType.REMOVE_ALL, items, startIndex, endIndex)); this._dataProvider = null; this.dispatchEvent(new DataChangeEvent(DataChangeEvent.DATA_CHANGE, DataChangeType.REMOVE_ALL, items, startIndex, endIndex)); } this.clearSelection(); var dispatchAddEvent:Boolean = dataProvider && (dataProvider.length > 0); if (dispatchAddEvent) { startIndex = 0; endIndex = Math.max(0, dataProvider.length - 1); items = dataProvider.toArray(); this.dispatchEvent(new DataChangeEvent(DataChangeEvent.PRE_DATA_CHANGE, DataChangeType.ADD, items, startIndex, endIndex)); } this._dataProvider = dataProvider; if (dispatchAddEvent) { this.dispatchEvent(new DataChangeEvent(DataChangeEvent.DATA_CHANGE, DataChangeType.ADD, items, startIndex, endIndex)); } } /** * * */ public function get numItems():uint { return this._dataProvider ? this._dataProvider.length : 0; } /** * * * */ public function get selectedItemIndex():int { return this._selectedItemIndex; } // // public methods // /** * @inheritDoc */ public function bindSelectedItem(gallery:IGallery):void { gallery.addEventListener(GalleryEvent.SELECTED_ITEM_CHANGE, this._selectedItemChangeHandler, false, 0, true); } /** * @inheritDoc */ public function selectItemAt(index:uint):void { this._selectItemAt(index); } private function _selectItemAt(index:int):void { if (index != this._selectedItemIndex) { var oldValue:int = this._selectedItemIndex; this._selectedItemIndex = index; this.dispatchEvent(new GalleryEvent(GalleryEvent.SELECTED_ITEM_CHANGE)); } } /** * @inheritDoc */ public function unbindSelectedItem(gallery:IGallery):void { gallery.removeEventListener(GalleryEvent.SELECTED_ITEM_CHANGE, this._selectedItemChangeHandler); } private function _selectedItemChangeHandler(e:GalleryEvent):void { this._selectItemAt(e.currentTarget.selectedItemIndex); } public function clearSelection():void { this._selectItemAt(-1); } public function getItemLoaderInfo(source:String):Object { return this._loadManager.getItemLoaderInfo(source); } public function getItemLoader(source:String):DisplayObject { return this._loadManager.getItemLoader(source); } public function loadItem(source:String):void { this._loadManager.loadItem(source); } /** * * */ private function _init(dataProvider:GalleryDataProvider):void { this._loadManager = new GalleryLoadManager(); this._thumbnailLoaders = []; this._itemLoaders = []; this.dataProvider = dataProvider; } } }