1週間でFlexファイラを作ろうプロジェクト 4日目
昨日に引き続き4日目。
ウィンドウを管理するswf(ウィンドウマネージャ)と、ファイラのswf(FlexFile)を別け、ウィンドウマネージャからFlexFileをSWFLoaderを使ってロードするようにしました。
目論見としては、ウィンドウマネージャはそのままに、ロードするswfをモジューラブルに追加することで、1画面に様々なウィンドウを表示してやろうというもの。
見た目は昨日と変わっていませんが、成果はこのあたり (ソースコード)に転がってます。
今日もサーバー側は変更無し。
ポイントは↓このクラス。
- FlexWindowPanel.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" showCloseButton="true" creationComplete="init()" close="close()"> <mx:Script source="FlexWindowPanel_action.as"/> <mx:SWFLoader id="loader" autoLoad="false" scaleContent="true" width="100%" height="100%" complete="handleChildSM(event)"/> <mx:ControlBar id="cbar"/> </mx:TitleWindow>
- FlexWindowPanel_action.as
import mx.managers.SystemManager; import mx.events.*; private var _childSM:SystemManager; private var _child:FlexFile; private var _childClass:Class; public function set sourceClass(cls:Class):void { _childClass = cls; // 削除予定 // FlexWindowContentBase } public function set source(src:String):void { loader.source = src; loader.load(); } private function init():void { titleBar.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); titleBar.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function onMouseDown(e:MouseEvent):void { FlexWindow(parent).startDrag(); FlexWindowManager.setTopWindow( FlexWindow(parent) ); } private function onMouseUp(e:MouseEvent):void { FlexWindow(parent).stopDrag(); } private function close():void { } private function handleChildSM(e:Event):void { _childSM = SystemManager(loader.content); _childSM.addEventListener(FlexEvent.APPLICATION_COMPLETE, initChild); } private function initChild(e:FlexEvent):void { _child = _childClass(_childSM.application); _child.initParent(this); }
まずSWFLoaderのcompleteイベントで、ロードされるswf(FlexFile.swf)のSystemManagerなるものを取得(handleChildSM())。続いてそのSystemManagerのFlexEvent.APPLICATION_COMPLETEイベントで、FlexFile.mxmlの
SWFLoaderのEvent.COMPLETE → SystemManagerのFlexEvent.APPLICATION_COMPLETEと、イベントを2回ハンドルしないといけないのが面倒なものの、どうやらこうやらないとうまくいかない。
これでロードされた側のswfのメソッドを自由に呼べるようになったので、ロードされる側のswfにinitParent()といった名前のメソッドを定義しておき、それにロードする側のインスタンスを渡してやれば、ロードされた側からもロードする側のメソッドが呼べるという次第。