Friday, February 22, 2008

SingleListener

Добаляет Listener к объекту который срабатывает только 1 раз.


public class SingleListener {

public static function wrap(target: IEventDispatcher, eventName: String, callback: Function): void
{

var listener: Function = function (event: Event): void
{
try {

callback.call(event.currentTarget, event);
} finally {
target.removeEventListener(eventName, listener);
}

}
target.addEventListener(eventName, listener);
}

}





Пример


[Embed(source="/res/image.png")]
[Bandable]

private var _imageSource: Class;

private var _image: Image = new Image();

override protected function createChildren(): void
{

super.createChildren();
addChild(_image);
_image.source = _imageSource;
workWithImageSize(_image.width, _image.height)

}

private function workWithImageSize(width: Number, height: Number): void
{
trace(width + "x" + height);

}



Output:
0x0

Но на самом деле картинка "/res/image.png" имеет размеры 640x480. Т.е. реальные данные о размере картинки мы получим после первого изменения размеров объекта _image.

override protected function createChildren(): void
{
super.createChildren();
addChild(_image);
_image.source = _imageSource;
//use this strut

SingleListener.wrap(_image, ResizeEvent.RESIZE,
function (event: Event): void
{

workWithImageSize(_image.width, _image.height);
});
}

Output:
640x480

Если после каждого изменения source требуется обработать размеры картинки, можно поступить так.

override protected function createChildren(): void
{
super.createChildren();
addChild(_image);
_image.addEventListener("sourceChanged", doOnSourceChanged );
_image.source = _imageSource;

}

private fucntion doOnSourceChanged(event: Event): void
{
//use this strut here
SingleListener.wrap(_image, ResizeEvent.RESIZE,
function (event: Event): void
{

workWithImageSize(_image.width, _image.height);
});
}

Wednesday, February 20, 2008

Custom List

List component doesn't allow to disable COPY action if Drag'n'Drop enabled. The following is a custom component that permit to disable COPY action:

package org.selectionLists
{
import mx.controls.List;
import flash.events.Event;
import mx.events.DragEvent;
import mx.managers.DragManager;

public class CustomList extends List
{

private var _dragCopyEnabled:Boolean = false;

public function get dragCopyEnabled():Boolean {
return _dragCopyEnabled;
}

public function set dragCopyEnabled(value:Boolean):void {
_dragCopyEnabled = value;
}

override protected function dragDropHandler(event:DragEvent):void {
if (!_dragCopyEnabled) {

event.action = DragManager.MOVE;
DragManager.showFeedback(DragManager.MOVE);
}

super.dragDropHandler(event);
}

override protected function dragEnterHandler(event:DragEvent):void {

if (!_dragCopyEnabled) {
event.ctrlKey = false;
}

super.dragEnterHandler(event);
}

override protected function dragOverHandler(event:DragEvent):void {

if (!_dragCopyEnabled) {
event.ctrlKey = false;
}

super.dragOverHandler(event);
}

}
}