import com.adobe.cairngorm.model.ModelLocator;
import com.adobe.cafetownsend.vo.Employee;
import com.adobe.cafetownsend.vo.User;
[Bindable]
public class AppModelLocator implements ModelLocator {
// this instance stores a static reference to itself
private static var model : AppModelLocator;
// available values for the main viewstack
// defined as constants to help uncover errors at compile time
public static const EMPLOYEE_LOGIN : Number =   0;
public static const EMPLOYEE_LIST : Number =   1;
public static const EMPLOYEE_DETAIL : Number =   2;
// viewstack starts out on the login screen
public var viewing : Number = EMPLOYEE_LOGIN;
// user object contains uid/passwd
// its value gets set at login and cleared at logout but nothing
// binds to it or uses it retained since it was used in the
// original Adobe CafeTownsend example app
public var user : User;
// variable to store error messages from the httpservice
// nothing currently binds to it, but an Alert or the login box
// could to show startup errors
public var errorStatus : String;
// contains the main employee list, which is populated on startup
// mx:application's creationComplete event is mutated into a
// cairngorm event that calls the httpservice for the data
public var employeeListDP : ArrayCollection;
// temp holding space for employees we're creating or editing
// this gets copied into or added onto the main employee list
public var employeeTemp : Employee;
// singleton: constructor only allows one model locator
public function AppLocator(){
if ( AppModelLocator.model != null )
throw new Error(
"Only one ModelLocator instance should be instantiated" );
}
// singleton always returns the only existing instance to itself
public static function getInstance() : AppModelLocator {
if ( model == null )
model = new AppModelLocator();
return model;
}
}
}
Cairngorm | | 17
Convert pdf image 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
convert pdf file to jpg online; best pdf to jpg converter
Convert pdf image 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
batch convert pdf to jpg online; convert pdf page to jpg
This model locator stores the data and the state of this application—in particular, the
variable 
employeeListDP
, which is the place where the list of employees is being stored.
Please note that as ActionScript 3 does not support private constructors, the public
constructor of this class throws an error if someone tries to improperly instantiate it
(i.e., using the 
new
command) but the instance of this object already exists.
We went through the entire process of displaying the initial list of employees, but just
to ensure that the Cairngorm data flow is clear, we’ll include a brief explanation of yet
another use case from Café Townsend.
The user presses the Add New Employee button (see Figure 1-2), enters the detail info
for a new employee on the View component shown in Figure 1-3, and presses the
Submit button. This is what’s happening between this button click and the moment
when the new employee appears in the employee list:
If you want to follow along, please download the source code of Café
Townsend and start from EmployeeDetail.mxml on the following line:
<mx:Button label="Submit" click="saveEmployeeEdits()"
id="submit" />
1.The 
SaveEmployeeEditsEvent
event is dispatched:
var cgEvent : SaveEmployeeEditsEvent = new
SaveEmployeeEditsEvent(model.employeeTemp.emp_id, firstname.text,
lastname.text,startdate.selectedDate, email.text );
CairngormEventDispatcher.getInstance().dispatchEvent( cgEvent );
For some reason, the author of this code decided not to use 
EmployeeVO
here and
stores each 
Employee
attribute separately in 
SaveEmployeeEvent
. This is not the best
way of encapsulating data inside a custom event, but let’s keep the original code
intact.
2.The 
FrontController
receives this event and passes it to the registered command
SaveEmployeeEditsCommand
(see Example 1-4 earlier) for execution.
3.The 
execute()
method of 
SaveEmployeeEditsCommand
does not use any delegates, as
it just needs to add a newly inserted 
Employee
to the model. Because this application
does not save modified data anywhere other than in memory, no other service calls
are made to pass the changed data to the server side for persistence.
4.The View portion of the employee list gets updated automatically as a result of data
binding.
While planning for your application with Cairngorm, think of all events, services, value
objects, and business services and then create appropriate classes similarly to the way
it was done in the Café Townsend example.
18 | | Chapter 1: Comparing Selected Flex Frameworks
Online Convert PDF to Jpeg images. Best free online PDF JPEG
Drag and drop your PDF in the box above and we'll convert the files for you. JPG is the most common image format on the internet.
convert pdf pictures to jpg; convert pdf picture to jpg
Online Convert Jpeg to PDF file. Best free online export Jpg image
Convert a JPG to PDF. the files, try out some settings and then create the PDF files with JPG is the most widely used image format, but we believe in diversity
convert multiple page pdf to jpg; convert pdf to jpg 100 dpi
To Use or Not to Use Cairngorm?
Online, you may encounter lots of debate regarding whether Cairngorm should be used
in Flex projects. With all due respect to the creators of Cairngorm, we don’t believe
that Cairngorm makes a Flex team more productive and that most enterprise projects
would not benefit from it. We prefer working with frameworks that offer enhanced
Flex components rather than just separation of work among team members. If you have
to develop a project without experienced Flex developers on your team, however,
Cairngorm can give your project a structure that will prevent it from failing.
So, is Cairngorm right for your project? Read Chapters 2, 3 and 6, and then decide
whether you prefer working with the components described there or one of the archi-
tectural MVC frameworks. Meanwhile, keep these observations about Cairngorm in
mind:
• Cairngorm’s architecture is based on components dispatching events to a global
event handler without knowing what the latter will do with them. The problem
with this approach is in the global nature of such an event handler. The
FrontController
object serves as a central registry of all Cairngorm events. Al-
though keeping all application events in one place simplifies their maintenance, it
leads to tighter coupling of the application components.
• Using a centralized 
ModelLocator
also makes multiple components dependent on
the knowledge of the properties of the model. If your project will start growing,
the 
ModelLocator
may not scale well.
• Modularizing Flex applications is one of the major ways of minimizing the size of
the downloadable Shockwave Flash (SWF) files. The other benefit is reusability of
the modules. Now imagine a midsize web application that consists of 10 modules.
If this application has been built using Cairngorm, each of these modules becomes
dependent on the central 
FrontController
located in the main .swf file.
• Application developers have to write lots of boilerplate code. For example, you
have to create additional event and command classes for every event that can be
dispatched in your application. Even in a midsize application this can translate to
a hundred or more additional Cairngorm-specific classes. To minimize the amount
of manually written code, consider using Cairngen, an open source code generator
for Cairngorm. It’s available at http://code.google.com/p/cairngen/.
FrontController
allows you to map only one command per event, yet your appli-
cation may need to have several event listeners per command.
• Even though data binding can help in writing less code, because Cairngorm en-
forces data binding as the only mechanism of updating the views, it makes them
nonreusable. For example, you can’t just simply reuse the EmployeeList.mxml from
Example 1-8 in another application, because it has an intimate knowledge of the
internals of the model and relies on the fact that the model has a public variable
Cairngorm | | 19
C# Create PDF from images Library to convert Jpeg, png images to
Batch convert PDF documents from multiple image formats, including Jpg, Png, Bmp, Gif, Tiff, Bitmap, .NET Graphics, and REImage.
.net pdf to jpg; to jpeg
C# Image Convert: How to Convert Adobe PDF to Jpeg, Png, Bmp, &
C# sample code for PDF to jpg image conversion. This demo code convert PDF file all pages to jpg images. // Define input and output files path.
.pdf to jpg; convert pdf to jpg for
employeeListDP
. Just simply renaming this variable in the 
ModelLocator
will require
changes in one or more views that are bound to it.
• Having no other choice but data binding for updating the UI may cause perform-
ance problems. The global 
ModelLocator
object defines multiple bindable variables
representing different models, and the Flex compiler may generate additional
EventDispatcher
objects on the class level (this depends on the types of the varia-
bles). Suppose you have 10 
[Bindable] String
variables in the 
ModelLocator
. If one
of them will get updated, not only will its listener get notified to update the view,
but the other 9 will get this event, too.
• The fact that Cairngorm is built around a Command pattern with a centrally lo-
cated command repository can be very convenient for some projects that require
audit or undo functionality. Every command arrives at the same place, and you
can conditionally hook up, say, an undo module that remembers old/new states
of some data or logs every user request (this can be a must in some financial trading
applications).
• Cairngorm has been around longer than any other Flex framework. As of today,
it’s the most popular framework, and many Flex developers around the world
already know it, which may be an important factor for development managers who
put together large project teams, especially when the teams consist of a large num-
ber of junior Flex developers.
Report Card: Cairngorm
Cairngorm separates business- and UI-related work into different layers, which means
that the work of the project team can be split between developers responsible for
the visual portion and those who are coding just the business logic of the application.
The fact that all services are located in a central place allows us to quickly reconfigure
the data sources, i.e., switch to quality assurance (QA) or production servers.
Development managers who have to work with distributed teams of beginner or mid-
level Flex developers and need a safety net to split the project work into smaller con-
trollable tasks (e.g., John works on the server side and Srinivas works only on the views)
may consider using Cairngorm. Here’s the report card followed by more detailed
explanations.
The pros are:
• It’s a popular framework—many Flex developers know it.
• It allows separate responsibilities of developers.
• It lowers the requirements for developers’ skillsets.
The cons are:
• It requires developers to write lots of additional classes, which adds to project
timeline.
20 | | Chapter 1: Comparing Selected Flex Frameworks
C# Image Convert: How to Convert Tiff Image to Jpeg, Png, Bmp, &
RasterEdge.XDoc.PDF.dll. C:\input.tif"; String outputFilePath = @"C:\output.jpg"; // Convert tiff to jpg. C# sample code for TIFF to jpg image conversion.
convert pdf to jpg converter; bulk pdf to jpg converter online
VB.NET PDF Convert to Images SDK: Convert PDF to png, gif images
PDF. Convert PDF documents to multiple image formats, including Jpg, Png, Bmp, Gif, Tiff, Bitmap, .NET Graphics, and REImage. Turn
change pdf to jpg format; bulk pdf to jpg
• It’s built on global singletons, which complicates modularization.
• It allows only one-to-one mapping between events and commands.
• The framework design is based on singletons, which leads to tight object coupling.
Mate
Mate is an event- and tag-based Flex framework. The API is in MXML tags. Mate-based
applications are built using implicit invocation caused by dispatching and dependency
injection of the results into views.
With implicit invocation, any interested object can listen to the events that are listed
(with their handlers) in one or more MXML components of type 
<EventMap>
. Any im-
portant action in the application should generate one of the events listed in this map.
In Mate, as opposed to Cairngorm, an application developer can configure multiple
handlers for each event and specify the sequence in which they should be invoked by
assigning priorities in the event handler.
This section walks you through the Mate framework by analyzing its version of Café
Townsend, created by the Mate team, which we encourage you to download from http:
//mate.asfusion.com/page/examples/cafe-townsend.
The data flow between Mate components while displaying a list of Café employees is
depicted in Figure 1-6.
Figure 1-6. Bringing a list of employees with Mate
Mate | | 21
C# TIFF: How to Use C#.NET Code to Compress TIFF Image File
C:\demo1.jpg", @"C:\demo2.jpg", @"C:\demo3.jpg" }; // Construct List<REImage> object. List<Bitmap> images = new List<Bitmap>(); / Step1: Load image to REImage
.pdf to .jpg online; convert from pdf to jpg
C# PDF Image Extract Library: Select, copy, paste PDF images in C#
DotNetNuke), SharePoint. Get JPG, JPEG and other high quality image files from PDF document. Able to extract vector images from PDF. Extract
changing pdf to jpg file; convert pdf document to jpg
Mate is a much less intrusive framework than Cairngorm, as it does not force developers
to add lots of boilerplate code in their applications. Figure 1-7 shows the project struc-
ture of the Café. The folder maps contains objects added to the Café project because
it’s written using Mate (at least one event map is required). These objects are included
in the main application as follows:
<maps:MainEventMap />
<maps:ModelMap />
All events that bubble up in Café will reach these map objects, which will process them
according to the event handlers defined in these event maps.
Cairngorm relies on central repositories of events, services, and models; Mate promotes
decoupling among business logic, events, and services. Mate does not force you to
extend any classes. Just create an 
<EventMap>
in your application object, define
<EventHandler>
tags there, and declare the services required for processing these events
inside the handlers, i.e., 
<RemoteObjectInvoker>
<HTTPServiceInvoker>
, or
<WebServiceInvoker>
. When your application grows, consider creating multiple
EventMap
objects to keep them manageable.
Example 1-10 depicts about half of the code of the MainEventMap.mxml from Café
Townsend.
Example 1-10. Fragment of MainEventMap.mxml
<?xml version="1.0" encoding="utf-8"?>
<EventMap xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns="http://mate.asfusion.com/">
<mx:Script>
<![CDATA[
import mx.events.*;
import com.cafetownsend.events.*;
import com.cafetownsend.business.*;
]]>
</mx:Script>
Figure 1-7. Café Townsend Mate project structure
22 | | Chapter 1: Comparing Selected Flex Frameworks
<!-- FlexEvent.PREINITIALIZE -->
<EventHandlers type="{FlexEvent.PREINITIALIZE}">
<ObjectBuilder generator="{AuthorizationManager}"
constructorArguments="{scope.dispatcher}" />
</EventHandlers>
<!-- FlexEvent.APPLICATION_COMPLETE -->
<EventHandlers type="{FlexEvent.APPLICATION_COMPLETE}">
<HTTPServiceInvoker instance="{employeesService}">
<resultHandlers>
<MethodInvoker generator="{EmployeeParser}"
method="loadEmployeesFromXML"
arguments="{resultObject}" />
<MethodInvoker generator="{EmployeeManager}"
method="saveEmpoyeeList" arguments="{lastReturn}" />
</resultHandlers>
</HTTPServiceInvoker>
</EventHandlers>
<!-- LoginEvent.LOGIN -->
<EventHandlers type="{LoginEvent.LOGIN}">
<MethodInvoker generator="{AuthorizationManager}" method="login"
arguments="{[event.username, event.password]}" />
Normally, we would do this inside the resultSequence -->
<ResponseAnnouncer type="loginResultResponse">
<Properties loginResult="{lastReturn}"/>
</ResponseAnnouncer>
</EventHandlers>
<!-- EmployeeEvent.SAVE -->
<EventHandlers type="{EmployeeEvent.SAVE}">
<MethodInvoker generator="{EmployeeManager}"
method="saveEmployee" arguments="{event.employee}"/>
<!-- assume everything was ok, make employee list show up -->
<EventAnnouncer generator="{NavigationEvent}"
type="{NavigationEvent.EMPLOYEE_LIST}"/>
</EventHandlers>
...
<mx:HTTPService id="employeesService" url="assets/data/Employees.xml"
resultFormat="e4x" />
</EventMap>
In the example code, note the declaration of the handler of the system Flex event
APPLICATION_COMPLETE
with nested 
HttpServiceInvoker
to get the data from Employ-
ees.xml via 
employeesService
, which is defined at the very end of this map using the
Mate | | 23
familiar 
<mx:HTTPService>
tag. 
EventHandler
objects match the type of the received event
with the one specified in the type attribute in the map file.
When your application receives the result of the call to 
employeesService
, it invokes
the functions defined in the 
resultHandlers
nested inside the service invoker. In our
case, two methods listed in the result handler section are called sequentially: 
Employee
Parser.loadEmployeesForXML()
and 
EmployeeManager.saveEmployeeList()
:
<resultHandlers>
<MethodInvoker generator="{EmployeeParser}"
method="loadEmployeesFromXML"
arguments="{resultObject}" />
<MethodInvoker generator="{EmployeeManager}"
method="saveEmpoyeeList" arguments="{lastReturn}" />
</resultHandlers>
The first method, 
loadEmployeeList()
, gets the 
resultObject
returned by the
HTTPService
. The second one, 
saveEmployeeList()
, gets the value returned by the first
method via a predefined Mate variable called 
lastReturn
. This way you can chain sev-
eral method calls if needed.
Example 1-11 shows that the method 
loadEmployees()
converts XML into an
ActionScript 
Array
object and returns it to Mate, which, according to the event map,
forwards it to the method 
saveEmployeeList()
for further processing (see Exam-
ple 1-12). The name 
saveEmployeeList()
is a bit misleading, because this method does
not persist data, but rather stores it in memory in an 
ArrayCollection
object.
Example 1-11. EmployeeParser.as
package com.cafetownsend.business{
import com.cafetownsend.vos.Employee;
public class EmployeeParser {
public function loadEmployeesFromXML(employees:XML):Array {
var employeeList:Array = new Array();
for each( var thisEmployee:XML in employees..employee ){
var employee:Employee = new Employee();
employee.email = thisEmployee.email;
employee.emp_id = thisEmployee.emp_id;
employee.firstname = thisEmployee.firstname;
employee.lastname = thisEmployee.lastname;
employee.startdate = new
Date(Date.parse(thisEmployee.startdate));
employeeList.push(employee);
}
return employeeList;
}
}
}
24 | | Chapter 1: Comparing Selected Flex Frameworks
The 
EmployeeManager
plays the role of the model here—it stores employees in the col-
lection 
employeeList
and information about the selected/new employee in the variable
employee
.
Example 1-12. The model: EmployeeManager.as
package com.cafetownsend.business{
import com.cafetownsend.vos.Employee;
import flash.events.Event;
import flash.events.EventDispatcher;
import mx.collections.ArrayCollection;
public class EmployeeManager extends EventDispatcher {
private var _employeeList:ArrayCollection;
private var _employee:Employee;
[Bindable (event="employeeListChanged")]
public function get employeeList():ArrayCollection{
return _employeeList;
}
[Bindable (event="employeeChanged")]
public function get employee():Employee{
return _employee;
}
public function saveEmpoyeeList(employees:Array):void {
_employeeList = new ArrayCollection(employees);
dispatchEvent(new Event('employeeListChanged'));
}
public function selectEmployee(employee:Employee):void {
_employee = employee;
dispatchEvent(new Event('employeeChanged'));
}
public function deleteEmployee (employee:Employee) : void {
selectEmployee(null);
}
public function saveEmployee (employee:Employee) : void {
var dpIndex : int = -1;
for ( var i : uint = 0; i < employeeList.length; i++ ) {
// does the the incoming emp_id exist in the list
if ( employeeList[i].emp_id == employee.emp_id ) {
// set our ArrayCollection index to that employee position
dpIndex = i;
}
}
if ( dpIndex >= 0 ) {
// update the existing employee
Mate | | 25
} else {
// add the employee to the ArrayCollection
var tempEmployee:Employee = new Employee();
tempEmployee.copyFrom(employee);
employeeList.addItem(tempEmployee);
}
// clear out the selected employee
selectEmployee(null);
}
}
}
So far, so good. The array of employees will be passed to the 
saveEmployeeList()
func-
tion and placed for storage in the 
employeeList
collection. But where’s the link between
the Model and the View?
EmployeeList.mxml, located in the package view, has the fragment shown in
Example 1-13.
Example 1-13. Fragment from the View: EmployeeList.mxml
[Bindable]
public var employees:ArrayCollection = null;
...
<mx:List id="employees_li" dataProvider="{employees}"
labelFunction="properName" change="updateEmployee()" width="100%" />
And now let’s take a peek at the content of the second mapping object, called
ModelMap.mxml, shown in Example 1-14. It uses Mate’s 
PropertyInjector
object,
which “injects” the value into the variable 
EmployeeList.employee
from 
EmployeeMan
ager.employeeList
(there is one more 
PropertyInjector
, which is irrelevant for our
discussion).
Example 1-14. ModelMap.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Script>
<![CDATA[
import com.cafetownsend.business.*;
import com.cafetownsend.views.*;
]]>
</mx:Script>
<Injectors target="{EmployeeDetail}" >
<PropertyInjector targetKey="selectedEmployee"
source="{EmployeeManager}" sourceKey="employee" />
</Injectors>
<Injectors target="{EmployeeList}">
<PropertyInjector targetKey="employees"
source="{EmployeeManager}" sourceKey="employeeList" />
26 | | Chapter 1: Comparing Selected Flex Frameworks
Documents you may be interested
Documents you may be interested