tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

はじめてのFlex その10

その7でYUI Frameworkを試した結果、functionを追加するだけでイベント処理が書けるようになったのは便利なのですが、どんなイベントがいつ発生しているのかわかりません。


そこで今回は全てのイベントをtrace()に出力して、いわゆる見える化してみます。

logic/HelloViewLogic.as

package logic {
	
	import flash.events.*;
	import flash.utils.*;
	import mx.controls.*;
	import mx.core.*;
	
	import view.*;
	import dto.*;
	
	public class HelloViewLogic {
		
		[View]
		public var helloView:HelloView;
		
		[Model(bindView="helloView")]
		public var helloViewDto:HelloViewDto; 
		
		/**
		 * コンストラクタ
		 */
		public function HelloViewLogic() {
			UIComponent.mx_internal::["dispatchEventHook"] = dispatchEventHook;
		}
	
		/**
		 * Hookイベント
		 */
		private function dispatchEventHook(event:Event, component:UIComponent):void {
			trace("[EventHook]" + getShortClassName(component) + "->" + getShortClassName(event) + "->" + event.type);
		}
		
		/**
		 * クラス名を取得
		 */
		private function getShortClassName(object:Object):String {
			const sep:String = "::";
			var cls:String = getQualifiedClassName(object);
			var pos:Number = cls.lastIndexOf(sep);
			return pos == -1 ? cls : cls.substring(pos+sep.length);
		}

		/**
		 * ボタン押下
		 */
		public function clickMeClickHandler(event:MouseEvent):void {
			if (helloViewDto.message == "") {
				return;
			}
			Alert.show(helloViewDto.message);
		}
	}
}


これで全てのイベントがdispatchEventHook()へ通知されるようになります。
このサンプルでは以下のようなメッセージ形式で出力されます。

[EventHook]HelloYuiWorld->PropertyChangeEvent->propertyChange
[EventHook]HelloYuiWorld->Event->widthChanged
[EventHook]HelloYuiWorld->Event->heightChanged
[EventHook]HelloYuiWorld->ResizeEvent->resize

しかし、けっこうな量のメッセージが出力されます。