This class could be used for two-way communication in between parent swf and child swf; where the child swf is loaded inside the parent swf.
SOURCE CODE
USAGE (Parent)
USAGE (Child)
SOURCE CODE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | package { import CEvent; import flash.events.Event; import flash.events.IEventDispatcher; import mx.events.FlexEvent; import mx.managers.SystemManager; import spark.components.Application; /** * @file CSwfCommunicator.as * @author Abhishek Kumar */ public class CSwfCommunicator { public var prepare:Function; public var procedure:Function; public var proceed:Function; private var holder:SystemManager; private var childApp:Application; private var childFunc:Function; public function CSwfCommunicator() { trace("CSwfCommunicator -> constructor"); } public function instantiate(data:*):void { trace("CSwfCommunicator -> instantiate"); holder = data as SystemManager; attachListeners(holder); } public function terminate():void { trace("CSwfCommunicator -> terminate"); terminateChildApp(); holder = null; } private function attachListeners(dispatcher:IEventDispatcher):void { trace("CSwfCommunicator -> attachListeners"); dispatcher.addEventListener(FlexEvent.APPLICATION_COMPLETE, applicationCompleteHandler); } private function detachListeners(dispatcher:IEventDispatcher):void { trace("CSwfCommunicator -> detachListeners"); dispatcher.removeEventListener(FlexEvent.APPLICATION_COMPLETE, applicationCompleteHandler); } private function applicationCompleteHandler(event:FlexEvent):void { trace("CSwfCommunicator -> applicationCompleteHandler:", event); detachListeners(holder); initializeChildApp(holder.application); if(prepare != null) prepare(holder.application); } // Child App public function initializeChildApp(data:*):void { trace("CSwfCommunicator -> initializeChildApp"); childApp = Application(data); attachListeners_childApp(childApp); } public function terminateChildApp():void { trace("CSwfCommunicator -> terminateChildApp"); detachListeners_childApp(childApp); childApp = null; } private function attachListeners_childApp(dispatcher:IEventDispatcher):void { trace("CSwfCommunicator -> attachListeners_childApp"); dispatcher.addEventListener(CEvent.CALL_PARENT_METHOD, callParentMethodHandler); } private function detachListeners_childApp(dispatcher:IEventDispatcher):void { trace("CSwfCommunicator -> detachListeners_childApp"); dispatcher.removeEventListener(CEvent.CALL_PARENT_METHOD, callParentMethodHandler); } // Comunicators ... for parent private function callParentMethodHandler(e:CEvent):void { trace("CSwfCommunicator -> callParentMethodHandler:", e); var o:Object = e.data; //trace("CSwfCommunicator -> callParentMethodHandler:", o.method, o.args, o.revert); if(o.revert != null) { if(procedure != null) callChildMethod(o.revert, procedure(o.method, o.args)); } else { if(proceed != null) proceed(o.method, o.args); } } public function callChildMethod(method:String, args:Object):Object { trace("CSwfCommunicator -> callChildMethod:", method, args); if (childApp.hasOwnProperty(method)) { childFunc = childApp[method] as Function; return childFunc(args); } return null; } /* // Comunicators ... for child public function callParentMethod(method:String, param:Object, ack:String):void { trace("CSwfCommunicator -> callParentMethod:", method, param, ack); var o:Object = { method: method, args: param, revert: ack }; dispatchEvent(new CEvent(CEvent.CALL_PARENT_METHOD, o)); } */ } } |
USAGE (Parent)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | private function onLoad_ChildSwf():void { var sc:CSwfCommunicator = new CSwfCommunicator(); sc.procedure = commander1; sc.proceed = commander2; sc.instantiate(swfholder_sl.content); } private function commander1(method:String, o:Object):Object { trace('commander1', method, o); var ack:Object = {}; switch(method) { case 'foo': ack.text = JSON.encode(o); break; } return ack; } private function commander2(method:String, o:Object):void { trace('commander2', method, o); switch(method) { case 'foo': display_lbl.text = JSON.encode(o); break; } } |
USAGE (Child)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import CEvent; import CSwfCommunicator; // Important Method public function callParentMethod(method:String, param:Object, ack:String):void { trace("callParentMethod:", method, param, ack); var o:Object = { method: method, args: param, revert: ack }; dispatchEvent(new CEvent(CEvent.CALL_PARENT_METHOD, o)); } protected function btn_clickHandler(event:MouseEvent):void { callParentMethod('foo', {a:1, b:2}, 'acknowledge'); } public function acknowledge(o:Object):void { display_tb.text = o.text; } |
Comments
Post a Comment