If 
dataProvider
is a dynamic object, the function 
ValidationRule.substitute()
enu-
merates all its properties via a 
for each
loop. For regular classes, Flex offers a reflection
mechanism using the function 
describeType()
; give it a class name and it’ll return a
definition of this class in a form of XML. Then the function 
substitute()
gets all class
variables and accessors (getters and setters) and applies the regular expression to the
errorMessage
text.
For example, if you deal with a dynamic object 
o
that has a property 
END_DATE
, the
following line will replace 
($[END_DATE])
in the error text with the value of this property
o[s]
:
str = str.replace(new RegExp("\\$\\["+s+"\\]", "g"), o[s]);
The method 
substitute()
is called from 
doValidate()
, and if the user enters invalid
dates (for example, if the start date is 12/10/2008 and the end date 12/06/2008), the
validator will find the properties called 
END_DATE
and 
START_DATE
and turn this error text:
"End Date ($[END_DATE]) must be later than Start Date $[START_DATE]"
into this one:
"End Date (12/06/2008) must be later than Start Date 12/10/2008"
In Chapter 2, you learned how to write class factories that can wrap functions and
return them as objects. This technique is applied in the 
ValidationRule
class, too, which
supports functions as validators. If the application code uses the setter 
rule
, the func-
tion with business-specific validation rules is expected.
The class 
ValidationRule
has this setter:
public function set rule(f:Object) : void {
if (!(f is Function)){
Alert.show(""+f, "Incorrect Validation Rule" );
return;
}
wrappedRule = function(val:Object) :Boolean {
return f(val);
}
}
In the application DataFormValidation.mxml, you can easily find that this setter has
been used (we already discussed the function 
afterStartDate
earlier):
<fx:ValidationRule
rule="{afterStartDate}"
errorMessage="End Date ($[END_DATE]) must be later
than Start Date $[START_DATE]">
</fx:ValidationRule>
We hope you like the simplicity that 
ValidationRule
offers to application developers
who have to validate forms. The next section examines a sample application that dem-
onstrates the use of this class in a 
DataGrid
control.
Validation | 161
Create pdf thumbnails - Draw thumbnail images for PDF in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Thumbnail Generation with Various Options for Quick PDF Navigation
can't view pdf thumbnails; pdf thumbnail creator
Create pdf thumbnails - VB.NET PDF Thumbnail Create SDK: Draw thumbnail images for PDF in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Thumbnail Generation with Various Options for Quick PDF Navigation
enable pdf thumbnails; create thumbnail from pdf c#
Embedding Validation Rules into a DataGrid
As opposed to component libraries, classes in a framework depend on each other. In
this context, this means that the 
ValidationRule
class requires an enhanced 
DataGrid
component.
Please note that the sample application shown next uses 
DataGrid
and
DataGridItem
from a different namespace. These classes are included in
the clear.swc library and come with the source code accompanying the
book, but due to space constraints, we won’t include the source code
of these objects here.
This example is yet another version of the Café Townsend application from Chap-
ter 1. For simplicity, the employee data hardcoded, and to run this application you
don’t need to do any server-side setup.
This application is an example of a master/detail window with validators embedded
inside a data grid. Figure 3-7 shows the phone number having the wrong number of
digits in the first row of our 
DataGrid
component. The embedded validation rule prop-
erly reports an error message that reads, “Wrong length, need 10 digit number.”
Figure 3-7. Validating the phone DataGridColumn
You can also assign validation rules to the form items that show details of the selected
row. In Figure 3-8 you can see a validation error message stating that “Salary (9.95) is
out of reasonable range.” All fields that have invalid values have red borders. While
examining the source code, please note that the drop-down box “Department” was
populated using a resource file.
The version of the Café Townsend application in Example 3-19 uses the custom object
Employee_getEmployees_gridFormTest
.
162 | Chapter 3: Building an Enterprise Framework
C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
Split PDF Document. File: Compress PDF. Page: Create Thumbnails. Page: Insert PDF Pages. Page: Delete Existing PDF Pages. Page: Replace
show pdf thumbnail in; .pdf printing in thumbnail size
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
Split PDF Document. File: Compress PDF. Page: Create Thumbnails. Page: Insert PDF Pages. Page: Delete Existing PDF Pages. Page: Replace
create thumbnail jpeg from pdf; can't see pdf thumbnails
Example 3-19. Code of Café Townsend with validations
<?xml version="1.0" encoding="UTF-8"?>
<mx:ViewStack height="100%" width="100%" xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:fx="http://www.faratasystems.com/2008/components"  creationPolicy="all"
creationComplete="fill_onClick()">
<fx:DataCollection id="collection" destination="com.farata.datasource.Employee"
method="getEmployees"  collectionChange="trace(event)"
fault="trace(event)" />
<mx:Canvas height="100%" width="100%">
<mx:Panel title="Employee List" width="100%" height="100%">
<fx:DataGrid id="dg"
itemRenderer="{new
UIClassFactory(com.farata.controls.dataGridClasses.DataGridItemRenderer)}"
horizontalScrollPolicy="auto" width="100%" dataProvider="{collection}"
editable="true" height="100%" rowHeight="25">
<fx:columns>
<fx:DataGridColumn dataField="EMP_FNAME"  headerText="First Name"/>
<fx:DataGridColumn dataField="EMP_LNAME"  headerText="Last Name"/>
<fx:DataGridColumn dataField="DEPT_ID"   editable="false"
headerText="Department"
resource="{com.farata.resources.DepartmentComboResource}"/>
<fx:DataGridColumn dataField="STREET"  headerText="Street"/>
<fx:DataGridColumn dataField="CITY"  headerText="City"/>
<fx:DataGridColumn dataField="STATE"  editable="false"
headerText="State"
resource="{com.farata.resources.StateComboResource}"/>
<fx:DataGridColumn dataField="ZIP_CODE"  headerText="Zip Code"
formatString="zip" >
<fx:validators>
<mx:ZipCodeValidator />
</fx:validators>
</fx:DataGridColumn>
<fx:DataGridColumn dataField="PHONE" headerText="Phone Number"
formatString="phone"  >
Figure 3-8. Validating the salary DataGridColumn
Validation | 163
VB.NET PDF File Compress Library: Compress reduce PDF size in vb.
Embedded page thumbnails. Program.RootPath + "\\" 3.pdf"; String outputFilePath = Program.RootPath + "\\" 3_optimized.pdf"; 'create optimizing options Dim
cannot view pdf thumbnails in; pdf thumbnail html
C# PDF Convert to Jpeg SDK: Convert PDF to JPEG images in C#.net
Support of converting from any single one PDF page and multiple pages. Thumbnails can be created from PDF pages. Support for customizing image size.
pdf file thumbnail preview; pdf thumbnail generator
<fx:validators>
<mx:Array>
<mx:PhoneNumberValidator  wrongLengthError="Wrong
length, need 10 digit number"/>
</mx:Array>
</fx:validators>
</fx:DataGridColumn>
<fx:DataGridColumn dataField="STATUS"  headerText="Status"/>
<fx:DataGridColumn dataField="SS_NUMBER" headerText="Ss Number"
formatString="ssn" >
<fx:validators>
<mx:SocialSecurityValidator/>
</fx:validators>
</fx:DataGridColumn>
<fx:DataGridColumn dataField="SALARY" headerText="Salary"
formatString="currency(2)">
<fx:validators>
<mx:Array>
<fx:ValidationRule
rule="{function(data:Object):Boolean
{ return (data &amp;&amp;data.SALARY > 10000
&amp;&amp; data.SALARY < 500000);}}"
errorMessage="Salary ($[SALARY]) is out of reasonable
range"/>
</mx:Array>
</fx:validators>
</fx:DataGridColumn>
<fx:DataGridColumn dataField="START_DATE"  headerText="Start Date"
itemEditor="mx.controls.DateField" editorDataField="selectedDate"
formatString="shortDate"/>
<fx:DataGridColumn dataField="TERMINATION_DATE"
headerText="Termination Date" itemEditor="mx.controls.DateField"
editorDataField="selectedDate" formatString="shortDate">
<fx:validators>
<fx:ValidationRule
rule="{afterStartDate}"
errorMessage="End Date ($[TERMINATION_DATE]) must be
later than Start Date $[START_DATE]">
</fx:ValidationRule>
</fx:validators>
</fx:DataGridColumn>
<fx:DataGridColumn dataField="BIRTH_DATE" headerText="Birth Date"
itemEditor="mx.controls.DateField" editorDataField="selectedDate"
formatString="shortDate"/>
<fx:DataGridColumn dataField="BENE_HEALTH_INS"  headerText="Health"
resource="{YesNoCheckBoxResource}" rendererIsEditor="true"/>
<fx:DataGridColumn dataField="BENE_LIFE_INS"  headerText="Life"
164 | Chapter 3: Building an Enterprise Framework
C# PDF File Compress Library: Compress reduce PDF size in C#.net
Embedded page thumbnails. Program.RootPath + "\\" 3.pdf"; String outputFilePath = Program.RootPath + "\\" 3_optimized.pdf"; // create optimizing options
how to make a thumbnail from pdf; disable pdf thumbnails
VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to
Split PDF Document. File: Compress PDF. Page: Create Thumbnails. Page: Insert PDF Pages. Page: Delete Existing PDF Pages. Page: Replace
create pdf thumbnail; pdf thumbnail viewer
resource="{YesNoCheckBoxResource}"   rendererIsEditor="true"/>
<fx:DataGridColumn dataField="BENE_DAY_CARE"  headerText="Day Care"
resource="com.farata.resources.YesNoCheckBoxResource"
rendererIsEditor="true"/>
<fx:DataGridColumn dataField="SEX"  headerText="Sex"
resource="{SexRadioResource}" rendererIsEditor="true"/>
</fx:columns>
</fx:DataGrid>
<fx:DataForm dataProvider="{dg.selectedItem}">
<mx:HBox>
<mx:Form>
<fx:DataFormItem dataField="EMP_ID" label="Emp Id:"/>
<fx:DataFormItem dataField="EMP_FNAME" label="First Name:"/>
<fx:DataFormItem dataField="STREET" label="Street:"/>
<fx:DataFormItem dataField="CITY" label="City:"/>
<fx:DataFormItem dataField="BIRTH_DATE" label="Birth Date:"
formatString="shortDate" required="true"/>
<fx:DataFormItem dataField="BENE_HEALTH_INS" label="Health:"
resource="{com.farata.resources.YesNoCheckBoxResource}"/>
<fx:DataFormItem dataField="STATUS" label="Status:"
resource="{com.farata.resources.StatusComboResource}"
required="true"/>
</mx:Form>
<mx:Form>
<fx:DataFormItem dataField="MANAGER_ID" label="Manager Id:"/>
<fx:DataFormItem dataField="EMP_LNAME" label="Last Name:"/>
<fx:DataFormItem dataField="STATE" label="State:"
resource="com.farata.resources.StateComboResource"/>
<fx:DataFormItem dataField="SALARY" label="Salary:"
formatString="currency" textAlign="right">
<fx:validators>
<fx:ValidationRule rule="{function(data:Object):Boolean {
return (data &amp;&amp;data.SALARY > 10000 &amp;&amp;
data.SALARY < 500000);}}"
errorMessage="Salary ($[SALARY]) is out
of reasonable range"/>
</fx:validators>
</fx:DataFormItem>
<fx:DataFormItem dataField="START_DATE" label="Start Date:"
formatString="shortDate"/>
<fx:DataFormItem dataField="BENE_LIFE_INS" label="Life:"
resource="{YesNoCheckBoxResource}"/>
<fx:DataFormItem dataField="SEX" label="Sex:"
resource="{SexRadioResource}"/>
</mx:Form>
<mx:Form>
<fx:DataFormItem dataField="DEPT_ID" label="Department:"
resource="{DepartmentComboResource}"/>
<fx:DataFormItem dataField="SS_NUMBER" label="Ss Number:"
itemEditor="{com.farata.controls.MaskedInput}"
formatString="ssn">
Validation | 165
VB.NET Create PDF from Word Library to convert docx, doc to PDF in
Split PDF Document. File: Compress PDF. Page: Create Thumbnails. Page: Insert PDF Pages. Page: Delete Existing PDF Pages. Page: Replace
html display pdf thumbnail; how to show pdf thumbnails in
VB.NET Create PDF from Excel Library to convert xlsx, xls to PDF
Split PDF Document. File: Compress PDF. Page: Create Thumbnails. Page: Insert PDF Pages. Page: Delete Existing PDF Pages. Page: Replace
create pdf thumbnail image; create thumbnail jpg from pdf
<fx:validators>
<mx:SocialSecurityValidator/>
</fx:validators>
</fx:DataFormItem>
<fx:DataFormItem dataField="ZIP_CODE" label="Zip Code:"
formatString="zip">
<fx:validators>
<mx:ZipCodeValidator />
</fx:validators>
</fx:DataFormItem>
<fx:DataFormItem dataField="PHONE" label="Phone Number:"
itemEditor="{com.farata.controls.MaskedInput}"
formatString="phone">
<fx:validators>
<mx:PhoneNumberValidator
wrongLengthError="keep typing"/>
</fx:validators>
</fx:DataFormItem>
<fx:DataFormItem dataField="TERMINATION_DATE"
label="Termination Date:" formatString="shortDate">
<fx:validators>
<fx:ValidationRule
rule="{afterStartDate}"
errorMessage="End Date ($[TERMINATION_DATE]) must be
later than Start Date $[START_DATE]">
</fx:ValidationRule>
</fx:validators>
</fx:DataFormItem>
<fx:DataFormItem dataField="BENE_DAY_CARE" label="Day Care:"
resource="{YesNoCheckBoxResource}"/>
</mx:Form>
</mx:HBox>
</fx:DataForm>
</mx:Panel>
<mx:HBox horizontalScrollPolicy="off" verticalAlign="middle" height="30"
width="100%">
<mx:Spacer width="100%"/>
<mx:VRule strokeWidth="2" height="24"/>
<mx:Button enabled="{dg.selectedIndex != -1}"
click="collection.removeItemAt(dg.selectedIndex)" label="Remove"
icon="@Embed('/assets/delete_16x16.gif')"/>
<mx:Button click="addItemAt(Math.max(0,dg.selectedIndex+1)) " label="Add"
icon="@Embed('/assets/add_16x16.gif')" />
<mx:Label text="Deleted: {collection.deletedCount}"/>
<mx:Label text="Modified: {collection.modifiedCount}"/>
</mx:HBox>
</mx:Canvas>
<mx:Script>    <![CDATA[
import com.farata.controls.dataGridClasses.DataGridItemRenderer;
import com.farata.core.UIClassFactory;
import com.farata.collections.DataCollection;
import mx.collections.ArrayCollection;
import mx.controls.dataGridClasses.DataGridColumn;
166 | Chapter 3: Building an Enterprise Framework
import mx.events.CollectionEvent;
import com.farata.datasource.dto.EmployeeDTO;
import com.farata.resources.*;
import mx.validators.*;
private var linkage:EmployeeDTO = null;
private function fill_onClick():void {
collection.source = Test.data;
dg.selectedIndex=0;
}
private function addItemAt(position:int):void    {
var item:EmployeeDTO = new EmployeeDTO();
collection.addItemAt(item, position);
dg.selectedIndex = position;
}
import com.farata.resources.*;
import com.farata.controls.*;
private function afterStartDate( val: Object) : Boolean {
return !val.TERMINATION_DATE || val.TERMINATION_DATE > val.START_DATE;
}
]]>
</mx:Script>
</mx:ViewStack>
When you review the code in Example 3-19, you’ll find different flavors of validation
rules inside the data grid columns in this implementation of the Café Townsend ap-
plication. For example, the following rule is defined as an anonymous function for the
data grid column 
SALARY
:
<fx:DataGridColumn dataField="SALARY" headerText="Salary"
formatString="currency(2)">
<fx:validators>
<mx:Array>
<fx:ValidationRule
rule="{function(data:Object):Boolean
{ return (data &amp;&amp;data.SALARY > 10000
&amp;&amp; data.SALARY < 500000);}}"
errorMessage="Salary ($[SALARY]) is out of reasonable
range"/>
</mx:Array>
</fx:validators>
</fx:DataGridColumn>
If the data grid is populated and the salary in a particular cell does not fall into the range
between 10,000 and 500,000, this function returns 
false
and this data value is con-
sidered invalid. Such cell(s) will immediately get the red border, and the error message
will report the problem in the red error tip right by this cell.
Some of the validation rules were repeated both in the 
DataGrid
and 
DataForm
, but this
doesn’t have to be the case. The same instances of the 
ValidationRule
class can be
reused as in the 
DataFormValidation
application.
Validation | 167
The data for this sample application is hardcoded in Test.as, which starts as follows:
public class Test{
public function Test(){
}
static public function get data() : Array {
var e : EmployeeDTO = new EmployeeDTO;
e.EMP_FNAME = "Yakov";
e.EMP_LNAME = "Fain";
e.BENE_DAY_CARE = "Y";
e.BENE_HEALTH_INS = "Y";
e.BENE_LIFE_INS = "N";
...
If you’d like to have a deeper understanding of how 
<fx:DataGridColumn>
works with
embedded  validators,  please  examine  the  source  code  of  the  classes 
com.far
ata.controls.dataGridClasses.DataGridItem
and 
com.farata.controls.DataGrid
that
are included with the source code accompanying this chapter.
We had to jump through a number of hoops to allow Flex validators to communicate
with the 
DataGrid
, as the 
Validator
class expects to work only with subclasses of the
UIComponent
that are focusable controls with borders. It’s understandable—who needs
to validate, say, a 
Label
?
But we wanted to be able to display a red border around the cell that has an invalid
value and a standard error tip when the user hovers the mouse pointer over the
DataGrid
cell. Hence we had to make appropriate changes and replace the original
DataGrid.itemRenderer
with our own, which implements the 
IValidatorListener
in-
terface. An 
itemRenderer
on the 
DataGrid
level affects all its columns:
<fx:DataGrid id="dg"
itemRenderer="{new UIClassFactory(
com.farata.controls.dataGridClasses.DataGridItemRenderer)}"
We’ve included this replacement of the 
DataGridItemRenderer
in the demo application
just to show that you can substitute the base classes from the Flex framework with your
own. But as a developer of a business framework, you should hide such code in the
base components, which in this case would have been a constructor of your enhanced
DataGrid
.
Besides validation rules, it is worth noting how master/detail relationships are imple-
mented with just one line:
<fx:DataForm dataProvider="{dg.selectedItem}">
A selected row in a 
DataGrid
(master) is a 
dataProvider
for a 
DataForm
(detail). With
original Flex 
DataGrid
and 
Form
components, it would take a lot more coding to properly
rebind the object representing a selected row that changes whenever the user selects a
different one.
168 | Chapter 3: Building an Enterprise Framework
Once again, a well-designed framework should allow application developers to write
less code. The code of this version of Café Townsend is an example of what can be
done in only about 160 lines of code. It implements master/detail relationships, per-
forms a lot of custom validations, and uses Business Style Sheets. Adding a couple dozen
lines of code  can  turn  this  application  into  a  CRUD  built  on  the powerful
DataCollection
class that will be discussed in Chapter 6.
Minimizing the Number of Custom Events
Until now, you’ve concentrated on building rich components for a business framework.
We Flex architects also recommend some coding techniques that serve the same goal
as these components: enabling application developers to write less code. In this section,
you’ll see how to minimize the number of custom event classes in any application.
Flex is all about event-driven development. Create loosely coupled custom components
and let them send events to each other, as in the mediator pattern example from Chap-
ter 2. You can create new events for every occasion. If an event does not need to carry
any additional data, just give it a name, specify its type as 
flash.events.Event
, and
define the metatag to help Flash Builder list this event in its type-ahead prompts and
dispatch it when appropriate. If your new event needs to carry some data, create an
ActionScript class extending 
flash.events.Event
, define a variable in this subclass to
store application data, and override the method 
clone()
.
Currently, for a midsize Flex application that includes about 30 views, where each view
has two components that can send/receive just one custom event, for example, you
face the need to write 60 custom event classes that look pretty much the same. We’ll
show you how to get away with just one custom event class for the entire application.
To illustrate the concept, we’ve created a simple application that defines one event class
that  can  serve  multiple  purposes.  This  application  consists  of  two  modules
(
GreenModule
, shown in Figure 3-9, and 
RedModule
) that are loaded in the same area of
the main application upon the click of one of the load buttons. It also has one universal
event class called 
ExEvent
.
Clicking any Send button creates an instance of this event that’s ready to carry an
application-specific payload: a DTO, a couple of 
String
variables, or any other object.
Figure 3-9’s example uses an ActionScript class called 
GirlfriendDTO
. No Cairngorm-
style mapping is required between the event being sent and the modules. For example,
if you send a 
Green
event to the 
RedModule
, nothing happens, as the latter is not listening
to the 
Green
event.
This application and its source code are deployed at http://tinyurl.com/5n5qkg.
Flash Builder’s project has a folder called modules that contains two modules:
RedModule
and 
GreenModule
. The red one is listening for the arrival of the girlfriend’s
Minimizing the Number of Custom Events | 169
first and last name, packaged in our single event class as the two separate strings listed
in Example 3-20.
Example 3-20. RedModule.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
width="100%" height="100%" creationComplete="onCreationComplete(event)">
<mx:TextArea id="display" backgroundColor="#FF4949"  width="100%" height="100%"
fontSize="28"/>
<mx:Script>
<![CDATA[
private function onCreationComplete(evt:Event):void{
this.addEventListener("RedGirlfriend", onRedGirlfriend);
}
private function onRedGirlfriend(evt:ExEvent):void{
display.text="My girlfriend is "+ evt.fName+ " " + evt.lName ;
}
]]>
</mx:Script>
</mx:Module>
The green module (Example 3-21) expects the girlfriend’s name in the form of
GirlfriendDTO
(Example 3-22).
Example 3-21. GreenModule.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
width="100%" height="100%" creationComplete="onCreationComplete(event)">
<mx:TextArea id="display" backgroundColor="#9CE29C" width="100%"
height="100%" color="#070707" fontSize="28"/>
<mx:Script>
<![CDATA[
import dto.GirlfriendDTO;
Figure 3-9. The GreenModule is loaded
170 | Chapter 3: Building an Enterprise Framework
Documents you may be interested
Documents you may be interested