Skip to content

Instantly share code, notes, and snippets.

@destroytoday
Created January 16, 2011 23:36
Show Gist options
  • Save destroytoday/782269 to your computer and use it in GitHub Desktop.
Save destroytoday/782269 to your computer and use it in GitHub Desktop.
var menu:NativeMenu = new NativeMenu();
var runner:IRecycleOperationRunner = new RecycleOperationRunner();
var operation:IRecycleOperation = new RecycleOperation();
function updateMenu(menu:NativeMenu, data:Vector.<String>):void
{
operation.menu = menu;
operation.labelList = labelList;
runner.run(operation);
}
updateMenu(menu, Vector.<(['One', 'Two'])>); // creates 2 items
updateMenu(menu, Vector.<(['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet'])>); // reuses 2, creates 5
updateMenu(menu, Vector.<(['Banana', 'Apple', 'Peach', 'Grape'])>); // reuses 4, disposes 3 to the pool
package
{
public interface IRecycleOperation extends IDisposable
{
function get numObjects():int;
function get numDataItems():int;
function createObject():void;
function reuseObject(i:int):void;
function setupObject(i:int):void;
function removeObject():void;
}
}
package
{
public interface IRecycleOperationRunner
{
function run(operation:IRecycleOperation):void;
}
}
package
{
public class MenuItemRecycleOperation
{
public var itemLabelList:Vector.<String>;
public var menu:NativeMenu;
protected var pool:ObjectPool = new ObjectPool(NativeMenuItem);
protected var currentMenuItem:NativeMenuItem;
public function MenuItemRecycleOperation()
{
}
public function get numObjects():int
{
return menu.numItems;
}
public function get numDataItems():int
{
return itemLabelList.length;
}
public function createObject():void
{
currentMenuItem = pool.getObject();
}
public function reuseObject(i:int):void
{
currentMenuItem = menu.getItemAt(i);
}
public function setupObject(i:int):void
{
currentMenuItem.label = itemLabelList[i];
}
public function removeObject():void
{
currentItem = removeItemAt(menu.numItems - 1);
pool.disposeObject(currentItem);
}
public function dispose():void
{
currentItem = null;
}
}
}
package
{
public class RecycleOperationRunner implements IRecycleOperationRunner
{
public function RecycleOperationRunner()
{
}
public function run(operation:IRecycleOperation):void
{
const m:int = Math.max(numObjects, numDataItems);
for (var i:int = 0; i < m; i++)
{
if (i < numDataItems)
{
if (i < numObjects)
{
operation.reuseItem(i);
}
else
{
operation.createItem(i);
}
operation.setupItem(i);
}
else
{
operation.removeItem(i);
}
}
operation.dispose();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment