Hmm.  I think that you need to set loadForCompatibility before calling load() 
unless the url for the app is in a different domain.


On 2/2/10 9:01 AM, "jamesfin" <[email protected]> wrote:








Here is the final code that will enable you to have a subapplication and send a 
simple event to the parent from the child...

PARENT APPLICATION...

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; layout="absolute" 
applicationComplete="init()" preinitialize="preinit()">

<mx:Script>
 <![CDATA[
 import mx.controls.SWFLoader;
 import mx.managers.SystemManager;
import mx.events.FlexEvent;
import mx.managers.PopUpManager;
import mx.core.Application;
import flash.events.Event;
import mx.collections.ArrayCollection;

[Bindable]
private var testDP:ArrayCollection = new ArrayCollection();

 private function preinit():void{
 }

private function init():void{

loader.load("http://71.36.29.20:8888/SubAppTestChild.swf";);
loader.loadForCompatibility = true;
loader.trustContent = true;
loader.visible = true;

systemManager.addEventListener(ResizeEvent.RESIZE_EVENT, newText);
}

private function newText(evt:ResizeEvent):void{
testDP.addItem(evt.someText);
}

private function testChild(event:MouseEvent):void{
(loader.content as Object).application.loadDialog();
 }

 ]]>
 </mx:Script>

<mx:VBox width="100%" height="100%">
<mx:Button click="testChild(event)" label="Open SubApplication"/>
<mx:Spacer height="20"/>
<mx:List width="100%" height="100%" dataProvider="{testDP}"/>
<mx:SWFLoader visible="false" id="loader"/>
</mx:VBox>

</mx:Application>

CHILD/SUBAPPLICATION

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; layout="absolute" 
preinitialize="preinit()" viewSourceURL="srcview/index.html">

<mx:Script>
<![CDATA[
import mx.controls.Alert;

import mx.managers.PopUpManager;


public function loadDialog():void{
var test:TestView = PopUpManager.createPopUp(systemManager.getSandboxRoot(), 
TestView, true) as TestView;
     PopUpManager.centerPopUp(test);
}



]]>
</mx:Script>
</mx:Application>

CHILD VIEW

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow  xmlns:mx="http://www.adobe.com/2006/mxml"; width="500" 
height="500" title="TitleWindow in SubAppTestChild" showCloseButton="false" 
creationComplete="init()">

 <mx:Script>
 <![CDATA[
 import mx.events.CloseEvent;
import mx.managers.PopUpManager;
import ResizeEvent;

private function init():void{
}

private function close(evt:MouseEvent):void{
PopUpManager.removePopUp(this);
}

private function sendParent(evt:MouseEvent):void{

var testEvent:ResizeEvent = new ResizeEvent(ResizeEvent.RESIZE_EVENT, false, 
false, "Test To Parent");
systemManager.getSandboxRoot().dispatchEvent(testEvent);
}
]]>
</mx:Script>

<mx:VBox width="100%" height="100%" verticalAlign="middle" 
horizontalAlign="center">
<mx:TextArea width="100%" height="100%" wordWrap="true" text="This popup is in 
SubAppTestChild and was built with the 3.2SDK.  The parent was written with the 
3.4SDK.  For those interested, SWF files built with different SDK's cannot load 
one-another unless you make a few small tweaks to accomodate it.  Primarily the 
loadForCompatibility flag of SWFLoader.  The rules change a bit when using this 
flag and the child SWF needs to be tweaked to be able to communicate with the 
parent as it has been 'sandboxed'."/>
<mx:HBox width="100%" horizontalAlign="right">
<mx:Button click="sendParent(event)" label="Send 'Test To Parent' String to 
parent list box"/>
<mx:Button label="Close" id="cancelButton" click="close(event)"/>
</mx:HBox>
</mx:VBox>
</mx:TitleWindow>

RESIZE EVENT

package
{
import flash.events.Event;


public class ResizeEvent extends Event
{
public static const RESIZE_EVENT:String = "RESIZE_EVENT";

private var _someText:String;

public function get someText():String{
return _someText;
}

public function ResizeEvent(type:String, bubbles:Boolean, cancelable:Boolean, 
someText:String)
{
super(type, bubbles, cancelable);

_someText = someText;
}

}
}

--- In [email protected] <mailto:flexcoders%40yahoogroups.com> , 
"jamesfin" <james.alan.finni...@...> wrote:
>
> Understood!  I'll add that to my blog.
>
> Thanks again.
>
> --- In [email protected] <mailto:flexcoders%40yahoogroups.com> , 
> Alex Harui <aharui@> wrote:
> >
> > TopLevelSystemManager is might be used by a sub-app of that sub-app to get 
> > to its parent sub-app if they are both on the same version and not using 
> > loadForCompatibility (did you follow that?)
> >
> > LoaderContext is available for those who really know what they are doing 
> > and need explicit control for some configuration we don't support with the 
> > Marshall Plan, usually for controlling the policy file parameter.  The 
> > marshall plan does not support re-using an appdom.  LoadForCompatibility 
> > refreshes the loaderContext before each load.
> >
> >
> > On 2/1/10 4:01 PM, "jamesfin" <james.alan.finnigan@> wrote:
> >
> >
> >
> >
> >
> >
> > And...
> >
> > With what use-case would the loaderContext be used?
> >
> > --- In [email protected] <mailto:flexcoders%40yahoogroups.com>  
> > <mailto:flexcoders%40yahoogroups.com> , "jamesfin" <james.alan.finnigan@> 
> > wrote:
> > >
> > > Thanks for the feedback.  Ironically, I had just found the 
> > > systemManager.getSandboxRoot() reference and was putting it in to test!
> > >
> > > While on the same subject, is systemManager.topLevelSystemManager used in 
> > > a non-sandboxed-sub-app?
> > >
> > > I'll blog this for sure as it was quite a hike around the mountain.
> > >
> > > Thx again!
> > >
> > > --- In [email protected] <mailto:flexcoders%40yahoogroups.com>  
> > > <mailto:flexcoders%40yahoogroups.com> , Alex Harui <aharui@> wrote:
> > > >
> > > > Couple of things:
> > > >
> > > >
> > > >  1.  You should not be setting a loaderContext.  It doesn't affect this 
> > > > test case, but it is not recommended practice.  Set 
> > > > loadForCompability=true BEFORE you call load().  I modified your init() 
> > > > function to look just like this:
> > > >
> > > >             private function init():void{
> > > >
> > > >                 loader.loadForCompatibility = true;
> > > >                 loader.load("SubAppTestChild.swf");
> > > >             }
> > > >
> > > > 2. I thought the original goal was to get the sub-apps popup to center 
> > > > in the main app, but the code looked like the goal was to center 
> > > > between two lines.  If the goal is to center in the main app, I 
> > > > adjusted the code to look like this:
> > > >
> > > >             public function loadDialog():void{
> > > >                 var test:TestView = 
> > > > PopUpManager.createPopUp(systemManager.getSandboxRoot(), TestView, 
> > > > true) as TestView;
> > > >                 PopUpManager.centerPopUp(test);
> > > >             }
> > > >
> > > >
> > > >
> > > > On 2/1/10 11:32 AM, "jamesfin" <james.alan.finnigan@> wrote:
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > I've been trying to center a dialog in a sub application but haven't 
> > > > had any success.  All SubApplication experts can pitch-in here...
> > > >
> > > > Backgrounder...SubApps are cool because two SWF's can be compiled with 
> > > > different SDK's and can still work together.
> > > >
> > > > The upper/left-hand corner of the dialog appears between the two 
> > > > HRule's because that is where the SWFLoader resides in the parent MXML. 
> > > >  The dialog isn't clipped in any way.
> > > >
> > > > I've tried many combinations to get the dialog to center but it won't 
> > > > budge.
> > > >
> > > > For a quick demo...
> > > >
> > > > http://71.36.29.20:8888/SubAppTestParent.html
> > > >
> > > > Parent Source...
> > > >
> > > > <?xml version="1.0" encoding="utf-8"?>
> > > > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; 
> > > > layout="absolute" applicationComplete="init()" 
> > > > preinitialize="preinit()">
> > > >
> > > > <mx:Script>
> > > >  <![CDATA[
> > > >  import mx.controls.SWFLoader;
> > > >  import mx.managers.SystemManager;
> > > > import mx.events.FlexEvent;
> > > > import mx.managers.PopUpManager;
> > > >
> > > >  private function preinit():void{
> > > > // Security.allowDomain("*");
> > > >  }
> > > >
> > > > private function init():void{
> > > >
> > > > var context:LoaderContext = new LoaderContext();
> > > > context.securityDomain = SecurityDomain.currentDomain;
> > > > context.applicationDomain = new ApplicationDomain();
> > > > loader.loaderContext = context;
> > > > loader.load("http://71.36.29.20:8888/SubAppTestChild.swf";);
> > > > loader.loadForCompatibility = true;
> > > > loader.trustContent = true;
> > > > }
> > > >
> > > > private function testChild(event:MouseEvent):void{
> > > > (loader.content as Object).application.loadDialog();
> > > >  }
> > > >
> > > >  ]]>
> > > >  </mx:Script>
> > > >
> > > > <mx:VBox width="100%">
> > > > <mx:HBox width="100%">
> > > > <mx:Button click="testChild(event)" label="Open SubApplication"/>
> > > > <mx:Text text="The popup top/left corner should be between the two 
> > > > HRule lines"/>
> > > > </mx:HBox>
> > > > <mx:HRule width="100%"/>
> > > > <mx:SWFLoader id="loader"/>
> > > > <mx:HRule width="100%"/>
> > > > </mx:VBox>
> > > >
> > > > </mx:Application>
> > > >
> > > > Child Source...
> > > >
> > > > <?xml version="1.0" encoding="utf-8"?>
> > > > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; 
> > > > layout="absolute" preinitialize="preinit()" 
> > > > viewSourceURL="srcview/index.html">
> > > >
> > > > <mx:Script>
> > > > <![CDATA[
> > > >
> > > > import mx.managers.PopUpManager;
> > > >
> > > > private function preinit():void{
> > > > // Security.allowDomain("*");
> > > >  }
> > > >
> > > > public function loadDialog():void{
> > > > var test:TestView = PopUpManager.createPopUp(Application.application as 
> > > > DisplayObject, TestView, true) as TestView;
> > > >      PopUpManager.centerPopUp(test);
> > > > }
> > > >
> > > > ]]>
> > > > </mx:Script>
> > > > </mx:Application>
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > --
> > > > Alex Harui
> > > > Flex SDK Team
> > > > Adobe System, Inc.
> > > > http://blogs.adobe.com/aharui
> > > >
> > >
> >
> >
> >
> >
> >
> >
> > --
> > Alex Harui
> > Flex SDK Team
> > Adobe System, Inc.
> > http://blogs.adobe.com/aharui
> >
>






--
Alex Harui
Flex SDK Team
Adobe System, Inc.
http://blogs.adobe.com/aharui

Reply via email to