Although this example deals with only one module (SimpleModule.swf), you may up-
grade this code to a reusable utility. Then the unloading of the module can be coded
like in Example 7-10.
Example 7-10. Module unloading technique
private function unloadModule(moduleUrl:String):void {
var moduleInfo:IModuleInfo  = ModuleManager.getModule(moduleUrl);
if (moduleInfo.loaded) {
var moduleList:Array = modules[moduleUrl];
// If more then one module instance was loaded, unload each one 
for  each(var module:Module in  moduleList) {
module.parent.removeChild(module);
}
delete modules[moduleUrl];
moduleInfo.unload();
moduleInfo.release();
}
isModuleLoaded = false;
}
Figure 7-3 illustrates the example application after the creation of one instance of
SimpleModuleExample 7-11 lists the complete code of the ModuleManagerDemo
application.
Figure 7-3. ModuleManagerDemo with one instance of the module
Example 7-11. Complete code of ModuleManagerDemo
<?xml version="1.0" encoding="utf-8"?>
<!-- ModuleManagerDemo.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.core.UIComponent;
Preloading Modules with ModuleManager r | 337
Convert pdf document to jpg - Convert PDF to JPEG images in C#.net, ASP.NET MVC, WinForms, WPF project
How to convert PDF to JPEG using C#.NET PDF to JPEG conversion / converter library control SDK
bulk pdf to jpg; convert pdf to gif or jpg
Convert pdf document to jpg - VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.net, ASP.NET MVC, WinForms, WPF project
Online Tutorial for PDF to JPEG (JPG) Conversion in VB.NET Image Application
convert pdf to jpg 100 dpi; convert pdf to 300 dpi jpg
import mx.controls.Alert;
import mx.modules.Module;
import mx.core.IFlexModuleFactory;
import mx.modules.IModuleInfo;
import mx.events.ModuleEvent;
import mx.modules.ModuleManager;
private const MODULE_URL:String='SimpleModule.swf';
private var moduleInfoRef:Object = {};
[Bindable]private var modules:Dictionary = new Dictionary();
private function loadModule(moduleUrl:String,
applicationDomain:ApplicationDomain=null):void {
moduleInfo.addEventListener(ModuleEvent.READY, onModuleReady ) ;
moduleInfo.addEventListener(ModuleEvent.ERROR, onModuleError ) ;
moduleInfoRef[moduleUrl] = moduleInfo;
moduleInfo.load(
applicationDomain?
applicationDomain:ApplicationDomain.currentDomain
);
}
private function createModuleInstance(moduleUrl:String,
var module:Module;
var flexModuleFactory:IFlexModuleFactory = moduleInfo.factory;
if (flexModuleFactory != null) {
module = flexModuleFactory.create() as Module;
new Array();
moduleList.push(module);
modules[moduleUrl] = moduleList;
if (parent) {
parent.addChild(module);
}
}
return module;
}
[Bindable] private var isModuleLoaded:Boolean=false;
private   function onModuleReady(event:ModuleEvent):void {
// Module is loaded. You may create module instances
//  via event.module.factory (moduleInfo)
moduleInfoRef[event.module.url]=null;
isModuleLoaded = true;
}
private function onModuleError (event:ModuleEvent):void {
Alert.show( event.errorText );
}
private function unloadModule(moduleUrl:String):void {
338 | | Chapter 7: Modules, Libraries, Applications, and Portals
Online Convert PDF to Jpeg images. Best free online PDF JPEG
to make it as easy as possible to convert your PDF Your PDF and JPG files will be deleted from our XDoc.PDF for .NET) supports converting PDF document to JPEG
change pdf into jpg; change from pdf to jpg
Online Convert Jpeg to PDF file. Best free online export Jpg image
So, feel free to convert them too with our Download and try RasterEdge.XDoc.PDF for .NET with RasterEdge.com is professional provider of document, content and
changing pdf to jpg; pdf to jpg
if (moduleInfo.loaded) {
var moduleList:Array = modules[moduleUrl];
for  each(var module:Module in  moduleList) {
module.parent.removeChild(module);
}
delete modules[moduleUrl];
moduleInfo.unload();
moduleInfo.release();
}
isModuleLoaded = false;
}
]]>
</mx:Script>
<mx:HBox>
<mx:Button label="Load Module" click="loadModule(MODULE_URL)" />
<mx:Button label="Instantiate Module"
click="createModuleInstance(MODULE_URL, this)"
enabled="{isModuleLoaded}"/>
<mx:Button label="Unload Module"
click="unloadModule(MODULE_URL)"
enabled="{isModuleLoaded}"/>
</mx:HBox>
</mx:Application>
Note that Example 7-11 applies the concept of application domains:
moduleInfo.load(
applicationDomain?applicationDomain:ApplicationDomain.currentDomain
);
You’ll learn about domains a bit later in this chapter. For now, suffice it to say that the
code loads module classes into the same area (in memory) where the classes of the
calling applications were loaded.
Whether via 
ModuleLoader
or 
ModuleManager
, you have loaded your module. How will
the application communicate with it?
Communicating with Modules
You’ve designed your modules to be independent, but there should be provisions to
allow external applications to communicate with them, pass them some information
and receive response notifications. From the user’s point of view, it may look like an
innocent drag-and-drop action, but internally you must resort to one of the several
available means of communication. We will start with direct references to the module
variables and methods.
First, consider the method-based interfaces. We’ll assume that you have the
IGreeting
interface, as shown in Example 7-12.
Communicating with Modules s | | 339
C# Image Convert: How to Convert Adobe PDF to Jpeg, Png, Bmp, &
Adobe PDF document can be easily loaded into your C#.NET project and converted to C:\input.pdf"; String outputFilePath = @"C:\output.jpg"; // Convert PDF to jpg
change pdf to jpg file; convert pdf file into jpg format
C# Image Convert: How to Convert MS PowerPoint to Jpeg, Png, Bmp
RasterEdge.XDoc.PDF.dll. C:\input.pptx"; String outputDirectory = @"C:\output\"; // Convert PowerPoint to The second is for converting PPT document to Png image
convert multiple pdf to jpg online; c# pdf to jpg
Example 7-12. IGreeting interface
//IGreeting.as
package
{
public interface IGreeting {
function getGreeting():String;
function setGreeting( value:String ):void;
}
}
Further, suppose that a module, such as 
ModuleWithIGreeting
in Example 7-13, is
implementing this interface. Please notice that calling 
setGreeting()
will modify the
bindable variable 
greeting
that affects the title of the module’s panel.
Example 7-13. Example of a module implementing the IGreeting interface
<?xml version="1.0"?>
<!- ModuleWithIGreeting.mxml -->
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*"
implements="IGreeting"
creationComplete="onCreationComplete()"
>
<mx:Script>
<![CDATA[
[Bindable] private var greeting:String="";
public function setGreeting(value:String):void {
greeting = value;
}
public function getGreeting():String {
return greeting;
}
]>
</mx:Script>
height="200">
</mx:Panel>
</mx:Module>
How can your application take advantage of the fact that the loaded module imple-
ments a known interface? Assuming that it has used a 
ModuleLoader
, as the following
snippet shows, you can cast its 
child
property to the 
IGreeting
interface:
var greeting:IGreeting = moduleLoader.child as IGreeting;
greeting.setGreeting(" loaded by application");
Then again, no one prevents you from simply referencing the panel from Mod-
uleWithIGreeting by name:
var module:Module = moduleLoader.child as Module;
var panel:Panel = module.getChildByName("panel") as Panel;
trace(panel.title); //Simple Module  loaded by application
340 | | Chapter 7: Modules, Libraries, Applications, and Portals
C# Create PDF from images Library to convert Jpeg, png images to
C# Example: Convert More than Two Type Images to example shows how to build a PDF document with three new Bitmap(Program.RootPath + "\\" 1.jpg")); images.Add
change pdf file to jpg file; batch pdf to jpg
VB.NET PDF Convert to Images SDK: Convert PDF to png, gif images
Convert PDF to Jpg, Png, Bmp, Gif, Tiff and Bitmap in ASP.NET. Sometimes, to convert PDF document into BMP, GIF, JPEG and PNG raster images in Visual Basic .NET
.pdf to jpg; convert pdf file to jpg on
The complete ReferenceCommunicationDemo application is presented in
Example 7-14.
Example 7-14. ReferenceCommunicationDemo application
<?xml version="1.0"?>
<!-- ReferenceCommunicationDemo.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.modules.Module;
import mx.containers.Panel;
private const MODULE_URL:String="ModuleWithIGreeting.swf";
private function modifyLoadedContent():void {
var greeting:IGreeting = moduleLoader.child as IGreeting;
greeting.setGreeting(" loaded by application");
var module:Module = moduleLoader.child as Module;
var panel:Panel = module.getChildByName("panel") as Panel;
trace(panel.title); //Simple Module  loaded by application
}
]]>
</mx:Script>
<mx:HBox>
<mx:Button label="Load Module"
click="moduleLoader.loadModule(MODULE_URL)" />
<mx:Button label="Modify Content"
click="modifyLoadedContent()"/>
<mx:Button label="Unload Module"
click="moduleLoader.unloadModule()"
enabled="{moduleLoader.loaderInfo.bytesTotal!=0}"/>
</mx:HBox>
<mx:ModuleLoader id="moduleLoader"/>
</mx:Application>
This application has three buttons labeled Load Module, Modify Content, and Unload
Module (Figure 7-4), each associated with a similarly named function. This separation
of functions enables you to profile the application and verify that there is no memory
leak associated with module unloading.
Although this interface-based method of working with modules is appealing, use it with
care: it uses direct references to the modules, and any unreleased direct reference will
indefinitely lock your module in memory. Against this backdrop, the elegance of the
interfaces does not matter much.
The best way to make sure you do not have unreleased references is to avoid them to
begin with. Instead, use events to communicate with the loaded modules. To do so,
you need an 
EventDispatcher
that can be commonly accessed by the module and the
loading application (here’s yet another example of the Mediator design pattern from
Communicating with Modules s | | 341
C# WPF PDF Viewer SDK to convert and export PDF document to other
document. 2. To TIFF. Export PDF to TIFF file format. 3. To TXT. Export and convert PDF to TXT file. 4. To Image. Convert PDF to image formats, such as PNG, JPG
convert multiple page pdf to jpg; convert pdf photo to jpg
C# TIFF: C#.NET Code to Convert JPEG Images to TIFF
jpg", @"C:\demo2.jpg", @"C:\demo3.jpg" }; // Construct List new Exception("Fail to construct TIFF Document"); // Step3: Other Use C# Code to Convert Png to Tiff.
convert pdf file into jpg; pdf to jpeg converter
Chapter 2). One object that suits the task particularly well is 
sharedEvents
, accessible
as 
loader.loaderInfo.sharedEvents
from the module and loading application as well.
The complete code of the sample application 
EventCommunicationDemo
is presented in
Example 7-15. Note that in the 
loadModule()
, you subscribe to 
Event.COMPLETE
to be
sent by the modules upon loading and creating the module’s display list. Then the
onComplete()
handler application itself sends an event to the module. The module, as
you will see soon, interprets this event to modify a panel’s header.
Example 7-15. EventCommunicationDemo application
<?xml version="1.0"?>
<!-- EventCommunicationDemo.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.events.DynamicEvent;
import mx.controls.Alert;
import mx.events.ModuleEvent;
import mx.modules.Module;
private const MODULE_URL:String="ModuleWithEvents.swf";
[Bindable] private var moduleLoaded:Boolean;
private function loadModule():void {
// Subscribe to notifications from the module
var sharedEventDispatcher:IEventDispatcher =
moduleLoader.loaderInfo.sharedEvents;
sharedEventDispatcher.addEventListener(
Event.COMPLETE, onModuleCreated
);
moduleLoader.loadModule(MODULE_URL);
moduleLoaded = true;
}
Figure 7-4. ReferenceCommunicationDemo
342 | | Chapter 7: Modules, Libraries, Applications, and Portals
// This event "comes" from the module
private function onModuleCreated(event:Event):void {
trace("Module CreateComplete happened");
//Send commands to the module
var sharedEventDispatcher:IEventDispatcher =
moduleLoader.loaderInfo.sharedEvents;
var dynamicEvent:DynamicEvent = new DynamicEvent("command");
dynamicEvent.data = " Two-way talk works!";
sharedEventDispatcher.dispatchEvent(dynamicEvent);
}
private function unloadModule():void {
moduleLoader.unloadModule();
moduleLoaded = false;
}
]]>
</mx:Script>
<mx:HBox>
<mx:Button label="Load Module" click="loadModule()" />
<mx:Button label="Unload Module"   click="unloadModule()"
enabled="{moduleLoaded}"/>
</mx:HBox>
<mx:ModuleLoader id="moduleLoader"/>
</mx:Application>
Example 7-16 presents the corresponding module sample 
ModuleWithEvents
. Notice the
handler of the 
creationComplete
event. It subscribes to the command events sent by the
application and notifies the application that the module is ready for receiving such
events by dispatching 
Event.COMPLETE
.
The syntax of 
addEventListener()
specifies weak reference, because strong reference to
the 
sharedEventDispatcher
would prevent the module from being garbage-collected. If
you run the application and click on the button Load Module, you will see the screen
shown in Figure 7-5.
The panel’s header will read “Module With Events. Two-way talk works!” to emphasize
the fact that the application and the module exchange events in both directions. You
may want to actually profile the application and watch how referencing of the event
listener (weak versus strong) dramatically affects the ability to unload the module.
Example 7-16. Counterpart module example to EventCommunicationDemo
<?xml version="1.0"?>
<!- ModuleWithEvents.mxml -->
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="onCreationComplete()"
>
<mx:Script>
<![CDATA[
import mx.events.DynamicEvent;
Communicating with Modules s | | 343
[Bindable] private var command:String="";
private function onCreationComplete():void {
var sharedEventDispatcher:IEventDispatcher =
systemManager.loaderInfo.sharedEvents
//Subscribe to command from the application
sharedEventDispatcher.addEventListener(
"command", onCommand,false,0,true
); //Strong reference would lock the module to application
// Notify the applications that creation has completed
sharedEventDispatcher.dispatchEvent(new Event(Event.COMPLETE)
);
}
private function onCommand(event:DynamicEvent):void {
command = event.data as String;
}
]]>
</mx:Script>
height="200"/>
</mx:Module>
Figure 7-5. EventCommunicationDemo application
Introducing Application Domains
You’re packing for the snorkeling trip with your kid. Into your travel bag you put the
two new pairs of goggles you bought just yesterday. Meanwhile, your small one found
two old pairs in the garage and placed them in his backpack. You arrive to the beach
with two sets of goggles. Which ones are you going to use?
• You are a perfectionist. You want the spotless snorkeling, and use the new goggles.
344 | | Chapter 7: Modules, Libraries, Applications, and Portals
• You are a good father. You want your kid to feel that his preparation for the trip
was important and use the old goggles.
• You are a pedant. You use the new goggles. Your kid should have consulted with
you instead of bringing old ones.
Now, if we replace the travel bag with a parent application domain, your kid’s backpack
with a child application domain, and start discussing class definitions instead of goggles,
the only choice you are going to get is #3, or “delegate to your parent.”
Classes get loaded into application domains, which form a tree. By default, a module’s
classes get loaded into the child domain (of the application or parental module). The
child has access to all classes in the parental chain. This means that a module can create
all the classes the application can (your kid can use your goggles).
On the contrary, the application does not get access to the classes carried by the module
(you are not allowed to open your kid’s backpack), and the child can’t reload the class
already known to the parent (your goggles are the only ones your kid gets to use).
The application ModuleDomainDemo illustrates this concept. Its 
ModuleLoader
has an
applicationDomain
property set to a bindable expression that depends on the user-
controlled radio button:
<mx:ModuleLoader id="moduleLoader"
applicationDomain="{
same_domain.selected?
ApplicationDomain.currentDomain:
new ApplicationDomain(ApplicationDomain.currentDomain)
}"
/>
For the complete code of ModuleDomainDemo, see Example 7-19 (a bit
later).
The subexpression 
ApplicationDomain.currentDomain
refers to the domain that the very
code containing this expression belongs to. In the example’s case, it means the domain
that keeps the class definitions of the application itself. At the same time, the expression
new ApplicationDomain(ApplicationDomain.currentDomain)
refers to the child of that
domain. These are two alternative application domain settings when you are loading
the modules: the same domain or a child domain (default). The module that you are
going to load is a slightly modified version of the 
SimpleModule
you used earlier: it
explicitly links in the 
CustomGrid
control, as shown in Examples 7-17 and 7-18.
Example 7-17. SimpleModule with linked-in CustomGrid component
<?xml version="1.0"?>
<!-- SimpleModule -->
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml"
Introducing Application Domains s | | 345
><mx:Script>
<![CDATA[
CustomGrid; //Needed only for ModuleDomainDemo
]]>
</mx:Script>
</mx:Panel>
</mx:Module>
Example 7-18. CustomGrid component
<?xml version="1.0" encoding="utf-8"?>
<!-- CustomGrid.mxml -->
<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:columns>
<mx:Array>
<mx:DataGridColumn  dataField="phone" headerText="Phone"/>
</mx:Array>
</mx:columns>
</mx:DataGrid>
The application attempts dynamic creation of the 
CustomGrid
, purely by class name. To
obtain the class definition from the current application domain, use the 
loaderInfo
property shared by all display objects:
var clazz:Class =
loaderInfo.applicationDomain.getDefinition("CustomGrid") as Class;
dg  = DataGrid(new clazz());
Run the application and make sure that the radio button Same Domain is selected. This
means that classes will get loaded into the 
ApplicationDomain.currentDomain
. In other
words, you have allowed your kid to put his things into your bag (it’s a “MiracleCom-
pactPro” bag, all right, because it does not accept the same article twice). Click Load
Module and then click Create Custom Grid. The application will look as shown in
Figure 7-6. The application (not the module!) has created 
DataGrid
using the class from
the module’s .swf.
Restart the application and load the module with the radio button Child Domain se-
lected. The application won’t be able to create the 
CustomGrid
. It’s out of the applica-
tion’s reach now, because you loaded modules classes in the isolated child application
domain (Figure 7-7).
By no means are we suggesting the use of modules instead of the libraries, as far as
reusable resources are concerned (we discuss libraries in the next section). Exam-
ple 7-19ModuleDomainDemo.mxml, merely illustrates the class isolation provided by
the application domains. That said, if you find yourself loading your modules into the
same domain—you’ve got company! Provided you use careful class naming, this is a
viable alternative to child domains.
346 | | Chapter 7: Modules, Libraries, Applications, and Portals
Documents you may be interested
Documents you may be interested