//////////////////////////////////////////////////////////////////////////////// // // 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. // //////////////////////////////////////////////////////////////////////////////// import mx.collections.ArrayList; import spark.collections.*; import mx.controls.Button; import spark.components.Button; import spark.components.DataGroup; import spark.layouts.*; import spark.skins.spark.*; // This is an optimization to workaround a Mustella performance bug. Some things don't get garbage collected // so only instantiating the ArrayList once and then clearing and refilling it saves a ton of memory public var cachedItemList:ArrayList = new ArrayList(); // Keeps track of number of renderers fired public var rendererAddCounter:int = 0; public function updateRendererCounter(event:Event):void { rendererAddCounter++; } public function setupVerticalVirtualizationTest(dg:DataGroup):Boolean { dg.width = 100; dg.height = 300; dg.layout = new VerticalLayout(); dg.clipAndEnableScrolling = true; dg.itemRendererFunction = virtualizationItemRendererFunction; return true; } public function setupHorizontalVirtualizationTest(dg:DataGroup):Boolean { dg.width = 300; dg.height = 100; dg.layout = new HorizontalLayout(); dg.clipAndEnableScrolling = true; dg.itemRendererFunction = virtualizationItemRendererFunction; return true; } public function setupTileLayoutVirtualizationTest(dg:DataGroup, orientation:String = 'rows'):Boolean { dg.width = 500; dg.height = 500; dg.layout = new TileLayout(); dg.layout.useVirtualLayout = true; (TileLayout(dg.layout)).orientation = orientation; dg.clipAndEnableScrolling = true; dg.itemRenderer = new ClassFactory(VirtualizationItemRenderer); return true; } /** * Provide a generic method that returns an ArrayList of simple integers from 0 .. num */ public function createSimpleIncreasingItems(num:int):ArrayList { var ac:ArrayList = new ArrayList(); for (var i:int = 0; i < num; i++){ ac.addItem(i); } return ac; } public function createEvenOddItems(num:int):ArrayList { return createSimpleIncreasingItems(num); } public function createRandomItems(nItems:int, axis:String):ArrayList { var items:Array = new Array(nItems); for(var i:int = 0; i < nItems; i++) items[i] = {myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: int(Math.random() * (50) + 20)}; cachedItemList.source = items; return cachedItemList; } public function createLargeSmallItems(nItems:int, axis:String):ArrayList { var items:Array = new Array(); for (var i:int = 0; i < nItems; i++){ if (i % 2 == 0){ items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 10}); items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 10}); items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 10}); items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 10}); } else { items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 200}); items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 200}); items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 200}); items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 200}); } } cachedItemList.source = items; return cachedItemList; } public function createGroupedSmallLargeItems(nItems:int, groupSize:int, axis:String):ArrayList { var items:Array = new Array(); var numBunches:int = nItems / groupSize; var uniqueID:int = 0; for (var i:int = 0; i < numBunches; i++){ if (i % 2 == 0){ for (var j:int = 0; j < groupSize; j++){ items.push({myItemIndex: uniqueID++, majorAxis: axis, minorSize: 100, majorSize: 10}); } } else { for (var k:int = 0; k < groupSize; k++){ items.push({myItemIndex: uniqueID++, majorAxis: axis, minorSize: 100, majorSize: 200}); } } } cachedItemList.source = items; return cachedItemList; } public function createMixedItems(nItems:int, axis:String):ArrayList { var items:Array = new Array(); var localMajorSize:int = 24; var localMinorSize:int = 100; var localWidth:int = 0; var localHeight:int = 0; if (axis == "vertical"){ localWidth = localMinorSize; localHeight = localMajorSize; } if (axis == "horizontal"){ localWidth = localMajorSize; localHeight = localMinorSize; } for (var i:int = 0; i < nItems; i++){ items.push({myItemIndex: i, majorAxis: axis, minorSize: localMinorSize, majorSize: localMajorSize}); var newBtn:spark.components.Button = new spark.components.Button(); if(axis == 'vertical') newBtn.label = "btn"+i; newBtn.height = localHeight; newBtn.width = localWidth; items.push(newBtn); var haloBtn:mx.controls.Button = new mx.controls.Button(); if(axis == 'vertical') haloBtn.label = "halobtn"+i; haloBtn.height = localHeight; haloBtn.width = localWidth; items.push(haloBtn); } cachedItemList.source = items; return cachedItemList; } public function createIdenticalItems(numItems:int, objMinor:int, objMajor:int, axis:String):ArrayList { var tempArray:Array = new Array(numItems); for (var i:int = 0; i < numItems; i++){ tempArray[i] = ({myItemIndex: i, majorAxis: axis, minorSize: objMinor, majorSize: objMajor}); } cachedItemList.source = tempArray; return cachedItemList; } public function createGrowingItems(nItems:int, axis:String, sizeLimit:int = 1000):ArrayList { var tempArray:Array = new Array(); for (var i:int = 0; i < nItems; i++){ tempArray[i] = ({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: (i % sizeLimit)}); } cachedItemList.source = tempArray; return cachedItemList; } public function createVariableItems(nItems:int, axis:String):ArrayList { var tempArray:Array = new Array(nItems); for (var i:int = 0; i < nItems; i++){ tempArray[i] = ({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: (20 + ((20 * i) % 100))}); } cachedItemList.source = tempArray; return cachedItemList; } public function createEstimationItems(nItems:int, axis:String):ArrayList { var items:Array = new Array(); items.push({myItemIndex: 0, majorAxis: axis, minorSize: 100, majorSize: 1}); items.push({myItemIndex: 1, majorAxis: axis, minorSize: 100, majorSize: 100}); for (var i:int = 2; i < nItems; i++){ items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 20}); } cachedItemList.source = items; return cachedItemList; } public function createLargeItems(nItems:int, axis:String):ArrayList { var items:Array = new Array(); for (var i:int = 0; i < nItems; i++){ items.push({myItemIndex: i, majorAxis: axis, minorSize: 100, majorSize: 1000}); } cachedItemList.source = items; return cachedItemList; } public function createDuplicateItems(nItems:int, axis:String):ArrayList { var items:Array = new Array(); var localMinorSize:int = 100; var localMajorSize:int = 24; var dupItem1:Object = {myItemIndex:-1, majorAxis: axis, minorSize: localMinorSize, majorSize: localMajorSize}; var dupItem2:Object = {myItemIndex:-2, majorAxis: axis, minorSize: localMinorSize, majorSize: localMajorSize}; for (var i:int = 0; i < nItems; i++){ items.push({myItemIndex: i, majorAxis: axis, minorSize: localMinorSize, majorSize: localMajorSize}); items.push(dupItem1); items.push(dupItem2); } cachedItemList.source = items; return cachedItemList; } public function virtualizationItemRendererFunction(item:*):IFactory { if (item is DisplayObject) return null; else return new ClassFactory(VirtualizationItemRenderer); } public function colorItemRendererFunction(item:*):IFactory { if (item is DisplayObject) return null; else return new ClassFactory(ColorItemRenderer); } public function fancyItemRendererFunction(item:*):IFactory { if (item is DisplayObject) return null; else return new ClassFactory(FancyItemRenderer); } public function stateItemRendererFunction(item:*):IFactory { if (item is DisplayObject) return null; else return new ClassFactory(StateItemRenderer); }