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()といった名前のメソッドを定義しておき、それにロードする側のインスタンスを渡してやれば、ロードされた側からもロードする側のメソッドが呼べるという次第。