TextInputにDataGridのitemEditEndみたいなイベントを追加する

TextInput入力終了時に、編集前の値と編集後の値を取得したい。
DataGridのitemEditEndみたいなイベント。
changeイベントとかで出来るかと思ったら、1文字変更するごとにイベントが発生するらしい。
用途が違ったから、自分で作った。
 
フォーカスを当てられた時に、itemEditBeginイベントを発生させる。
フォーカスが外れた時に、itemEditEndイベントを発生させる。
編集中にエスケープが押されたら、編集前の状態に戻して、フォーカスを外す。
編集中にエンターが押されたら、タブを押されたイベントを発生させて、次のオブジェクトにフォーカスを移す。
 

使い方

itemEditEndに、直に式を入れる方法が解らない。
clickイベントみたいな奴。
ActionScriptはEval出来ないし、どうやってるんだろう。
 

<eth0:EditTextInput id="input1" width="200" itemEditEnd="{function(){input1_edit_end(this);}}" />

 

public function input1_edit_end(input:EditTextInput):void
{
	if (input.isCancel || input.oldValue==input.newValue) {
		return;
	}
	Alert.show("編集前:" + input.oldValue + " 編集後:" + input.newValue);
}

 

jp.eth0.EditTextInput.as

TextInputの継承クラスとイベント用のクラス、別々にすればよかった。

package jp.eth0
{
	import mx.controls.TextInput;
	import flash.events.FocusEvent;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;

	public class EditTextInput extends TextInput
	{
		public const ITEM_EDIT_BEGIN:String = "ITEM_EDIT_BEGIN";
		public const ITEM_EDIT_END:String = "ITEM_EDIT_END";

		public var oldValue:String;
		public var newValue:String;
		public var isCancel:Boolean;

		public var itemEditBegin:Function;
		public var itemEditEnd:Function;

		// コンストラクタ
		public function EditTextInput():void
		{
			addEventListener(KeyboardEvent.KEY_DOWN, _keyDownHandler);
			addEventListener(FocusEvent.FOCUS_IN, _focusInHandler);
			addEventListener(FocusEvent.FOCUS_OUT, _focusOutHandler);
			super();
		}

		// キーが押された
		private function _keyDownHandler(event:KeyboardEvent):void
		{
			// Escape
			// 編集前の状態に戻す
			if (event.keyCode==Keyboard.ESCAPE) {
				isCancel = true;
				text = oldValue;
				this.stage.focus = null;
				return;
			}

			// Enter
			// 次のオブジェクトにフォーカスを当てる
			if (event.keyCode==Keyboard.ENTER) {
				var tabKeyEvent:FocusEvent = new FocusEvent(FocusEvent.KEY_FOCUS_CHANGE, true, false, null, event.shiftKey, Keyboard.TAB);
				dispatchEvent(tabKeyEvent);
				return;
			}
		}

		// フォーカスが当てられた
		private function _focusInHandler(event:FocusEvent):void
		{
			oldValue = super.text;
			newValue = "";
			isCancel = false;
			dispatchEvent(new Event(ITEM_EDIT_BEGIN));
			itemEditBegin(new Event(ITEM_EDIT_BEGIN));
		}

		// フォーカスが外れた
		private function _focusOutHandler(event:FocusEvent):void
		{
			newValue = super.text;
			dispatchEvent(new Event(ITEM_EDIT_END));
			itemEditEnd(new Event(ITEM_EDIT_END));
		}
	}
}