Here
you guy's, gal's go don't forget to change the package location. I use this
technique in allot of way's. Just let me know what you think ;) Code is below.
The delayed class, and the sample use.
Cheers
Jason
Begin: DelayedTimer.as
/**
* This class provides a timer abstraction, and issues a callback to the * desired function once the time event hit's. Create one instance for each * delayed timer you require * * @langversion ActionScript 3.0 * @playerversion Flash 8.5 * @tiptext * **/ package com.vision.delayedTimer{ import flash.utils.Timer; import flash.events.Event; import flash.events.TimerEvent; public class DelayedTimer extends Timer { private var _caller:Object; public function DelayedTimer (){ //init the extended class super(1000,1); } /** * getters and setters for the object passed **/ public function get caller():Object { return _caller; } public function set
caller(d:Object):void
{ _caller = d; } /** * Inicialize the timer for the delayed call * * -Parameters * @event = the event that set off this obejct * @func = a function call to run * @caller = the actual object that called this object * @delay = the delay in milliseconds between timer events * @repeat = number of times to repeat 0= indefinit * * -verion * @langversion ActionScript 3.0 * @playerversion Flash 8.5 * @tiptext * **/ public function startDelayedTimer(event:Event,func:Function, callerin:Object=null,delay:Number=1000, repeat:uint=1):void { if (func == null){return;} if (caller
!=null){
caller=callerin; } if (caller != event.target){ caller = event.target; if (running ==true){ cancelDelayedTimer(); } delay = delay; repeatCount=1; addEventListener(TimerEvent.TIMER,func); start(); } } /** * clean up the call and stop the running timer * * -verion * @langversion ActionScript 3.0 * @playerversion Flash 8.5 * @tiptext **/ public function cancelDelayedTimer():void{ if (running ==true){ _caller=null; stop(); reset(); } } } } End: DelayedTimer.as
Begin:
SampleDragDropOpen.mxml <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script>
<![CDATA[ //***************************************************** //all this stuff is for the sample //***************************************************** [Bindable] public var dsXML:XML = <groups> <group isBranch="true" label="Folder 1"> <item label="Folder 1 Item 1" /> <item label="Folder 1 Item 2" /> <item label="Folder 1 Item 3" /> <item label="Folder 1 Item 4" /> <group isBranch="true" label="No Children 1-0"/> <group isBranch="true" label="No Children 1-2"/> </group> <group isBranch="true" label="Folder 1"> </group> <item label="Item 1" /> <item label="Item 2" /> </groups> ]]> </mx:Script> <mx:Script> <![CDATA[ //************************************************* //tree delayed open while draginging an item //************************************************* //handles auto open on drag drop operations
import com.vision.delayedTimer.DelayedTimer; private var oDelayedTimer:DelayedTimer = new DelayedTimer(); //stored for opening private var lastFolderOver:Object //the returned dispatched call if delay triggered private function dispatchDelayedOpen(event:Event):void{ Tree0.expandItem(lastFolderOver,true,true); } import mx.events.DragEvent; private function handleDragOver(event:DragEvent):void{ /** this is the guts of it **/ var currTree:Tree = Tree(event.currentTarget); var rowindex:int = currTree.calculateDropIndex(event); var currNodeOver:Object; if (currTree.indexToItemRenderer(rowindex) !=null){ currNodeOver = currTree.indexToItemRenderer(rowindex).data; } else{ currNodeOver=null; } //if not over any node cleanup if nessesary and return if (currNodeOver == null){ if (lastFolderOver != null){ oDelayedTimer.cancelDelayedTimer(); lastFolderOver = null; } return; } if ([EMAIL PROTECTED] && currTree.isItemOpen(currNodeOver)==false){ //test if not the same if(lastFolderOver !=currNodeOver){ //clear and reset the delay store this folder as last lastFolderOver = currNodeOver; //clear the existing oDelayedTimer.cancelDelayedTimer(); //create callback oDelayedTimer.startDelayedTimer(event,dispatchDelayedOpen,currNodeOver); } return; } else{ //clear the existing if (lastFolderOver != null){ oDelayedTimer.cancelDelayedTimer(); lastFolderOver = null; } return; } } private function handleDragComplete(event:DragEvent):void{ //cleanup delay stuff oDelayedTimer.cancelDelayedTimer(); lastFolderOver = null; } ]]> </mx:Script> <mx:XMLListCollection source="{dsXML.children()}"
id="XMLdc"/> <mx:Tree id="Tree0" dragComplete="handleDragComplete(event)" dragOver="handleDragOver(event)" labelField="@label" dragEnabled="true" dataProvider="{XMLdc}" dragMoveEnabled="true" dropEnabled="true" width="250" height="100%" /> </mx:Application> End:
SampleDragDropOpen.mxml __._,_.___ -- Flexcoders Mailing List FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt Search Archives: http://www.mail-archive.com/flexcoders%40yahoogroups.com YAHOO! GROUPS LINKS
|
- RE: [flexcoders] Explorer-like drag & drop tree (Delaye... Jason Hawryluk