resource="{com.farata.resources.DepartmentComboResource}"/>
<lib:DataFormItem dataField="SS_NUMBER" label="Ss Number:"
itemEditor="{com.theriabook.controls.MaskedInput}" formatString="ssn"/>
<lib:DataFormItem dataField="ZIP_CODE" label="Zip Code:"
formatString="zip"/>
<lib:DataFormItem dataField="PHONE" label="Phone Number:"
itemEditor="{com.theriabook.controls.MaskedInput}" formatString="phone">
<lib:validators>
<mx:Array>
<mx:PhoneNumberValidator  wrongLengthError="keep typing"/>
</mx:Array>
</lib:validators>
</lib:DataFormItem>
<lib:DataFormItem dataField="TERMINATION_DATE"
label="Termination Date:" formatString="shortDate"/>
<lib:DataFormItem dataField="BENE_DAY_CARE" label="Day Care:"
resource="{com.farata.resources.YesNoCheckBoxResource}"/>
</mx:Form>
</mx:HBox>
</lib:DataForm>
This code is an extract from the Café Townsend application (Clear Data Builder’s
version) from Chapter 1. Run the application Employee_getEmployees_GridFormT-
est.mxml, double-click on a grid row, and you’ll see the 
DataForm
in action. In the next
section of this chapter, you’ll see other working examples of 
DataForm
and 
DataGrid
with validators.
Validation
Like data forms and components in general, the Flex 
Validator
could use some en-
hancement to make it more flexible for your application developers. In Flex, validation
seems to have been designed with an assumption that software developers will mainly
use it with forms and that each validator class will be dependent on and attached to
only one field. Say you have a form with two email fields. The Flex framework forces
you to create two instances of the 
EmailValidator
object, one per field.
In real life, though, you may also need to come up with validating conditions based on
relationships between multiple fields, as well as to highlight invalid values in more than
one field. For example, you might want to set the date validator to a field and check
whether the entered date falls into the time interval specified in the start and end date
fields. If the date is invalid, you may want to highlight all form fields.
In other words, you may need to do more than validate an object property. You may
need the ability to write validation rules in a function that can be associated not only
with the UI control but also with the underlying data, that is, with data displayed in a
row in a 
DataGrid
.
Yet another issue of the Flex 
Validator
is its limitations regarding view states of auto-
matically generated UI controls. Everything would be a lot easier if validators could live
Validation | 151
Create thumbnails from pdf files - Draw thumbnail images for PDF in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Thumbnail Generation with Various Options for Quick PDF Navigation
thumbnail view in for pdf files; enable pdf thumbnails in
Create thumbnails from pdf files - 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
show pdf thumbnails in; pdf thumbnail preview
inside the UI controls, in which case they would be automatically added to view states
along with the hosting controls.
Having a convenient means of validation on the client is an important part of the en-
terprise Flex framework. Consider, for example, an RIA for opening new customer
accounts in a bank or an insurance company. This business process often starts with
filling multiple sections in a mile-long application form. In Flex, such an application
may turn into a 
ViewStack
of custom components with, say, 5 forms totaling 50 fields.
These custom components and validators are physically stored in separate files. Each
section in a paper form can be represented as the content of one section in an
Accordion
or other navigator. Say you have total of 50 validators, but realistically, you’d
like to engage only those validators that are relevant to the open section of the
Accordion
.
If an application developer decides to move a field from one custom component to
another, she needs to make appropriate changes in the code to synchronize the old
validators with a relocated field.
What are some of the form fields that are used with view states? How would you validate
these moving targets? If you are adding three fields when the 
currentState="Details"
,
you’d need to write 
AddChild
statements manually in the state section 
Details
.
Say 40 out of these 50 validators are permanent, and the other 10 are used once in a
while. But you don’t want to use even these 40 simultaneously; hence you need to
create, say, 2 arrays having 20 elements each, and keep adding/removing temporary
validators to these arrays according to view state changes.
Even though it seems that Flex separates validators and field to validate, this is not a
real separation but rather a tight coupling. What’s the solution? For the customer ac-
counts example, you want a 
ViewStack
with 5 custom components, each of which has
DataForm
whose elements have access to the entire set of 50 fields, but that validates
only its own set of 10. In other words, all 5 forms will have access to the same 50-field
dataProvider
. If during account opening the user entered 65 in the field age on the first
form, the fifth form may show fields with options to open a pension plan account,
which won’t be visible for younger customers.
That’s why each form needs to have access to all data, but when you need to validate
only the fields that are visible on the screen at the moment, you should be able to do
this on behalf of this particular 
DataForm
. To accomplish all this, we created a new class
called 
ValidationRule
. Our goal is not to replace existing Flex validation routines, but
rather to offer you an alternative solution that can be used with forms and list-based
controls. The next section demonstrates a sample application that uses the class
ValidationRule
. After that, you can take a look at the code under the hood.
152 | Chapter 3: Building an Enterprise Framework
C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
Images. File and Page Process. File: Merge, Append PDF Files. File: Split PDF Document. File: Compress PDF. Page: Create Thumbnails. Page: Insert PDF Pages. Page
program to create thumbnail from pdf; create pdf thumbnails
C# PDF Convert to Jpeg SDK: Convert PDF to JPEG images in C#.net
Turn multiple pages PDF into single jpg files respectively online. Support of converting from any single one PDF page and multiple pages. Thumbnails can be
pdf first page thumbnail; pdf thumbnail fix
Sample Application: DataFormValidation
The DataFormValidation.mxml application (Figure 3-5) has two 
DataForm
containers
located inside the 
HBox
. Pressing the Save button initiates the validation of both forms
and displays the message regardless of whether the entered data is valid.
Figure 3-5. Running the DataFormValidation application
Example 3-17 shows the code of the DataFormValidation.mxml application that cre-
ated these forms.
Example 3-17. DataFormValidation.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application width="100%" height="100%" layout="vertical"
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:fx="http://www.faratasystems.com/2008/components"
creationComplete="onCreationComplete()"
>
<mx:VBox width="100%" height="100%" backgroundColor="white">
<mx:Label text="Submit Vacation Request"
fontWeight="bold" fontSize="16" fontStyle="italic"
paddingTop="10" paddingBottom="5" paddingLeft="10"
/>
<mx:HBox width="100%" height="100%" >
<fx:DataForm id="left" width="100%" dataProvider="{vacationRequestDTO}">
<fx:DataFormItem label="Employee Name: " fontWeight="bold"
dataField="EMPLOYEE_NAME" required="true"
validators="{[nameValidator, requiredValidator]}">
<mx:TextInput  fontWeight="normal" />
Validation | 153
C# PDF Convert to Images SDK: Convert PDF to png, gif images in C#
Turn multipage PDF file into single image files respectively in .NET framework. Converter control easy to create thumbnails from PDF pages.
generate thumbnail from pdf; show pdf thumbnails
C# PDF File Compress Library: Compress reduce PDF size in C#.net
and decompression method and Image files compression and Embedded page thumbnails. Program.RootPath + "\\" 3_optimized.pdf"; // create optimizing options
pdf thumbnails; generate pdf thumbnails
</fx:DataFormItem>
<fx:DataFormItem label="Employee Email: " fontWeight="bold"
dataField="EMPLOYEE_EMAIL" required="true"
validators="{[emailValidator]}">
<mx:TextInput   fontWeight="normal"/>
</fx:DataFormItem>
<fx:DataFormItem label="Employee Email: " fontWeight="bold"
dataField="MANAGER_EMAIL" required="true"
validators="{[emailValidator]}">
<mx:TextInput   fontWeight="normal"/>
</fx:DataFormItem>
<fx:DataFormItem label="Department: " fontWeight="bold"
dataField="DEPARTMENT" required="true"
validators="{[requiredValidator]}">
<fx:TextInput fontWeight="normal"/>
</fx:DataFormItem>
<mx:Spacer height="10"/>
<fx:DataFormItem label="Description: " fontWeight="bold"
dataField="DESCRIPTION">
<mx:TextArea width="200"  height="80" fontWeight="normal" />
</fx:DataFormItem>
</fx:DataForm>
<fx:DataForm id="right" width="100%" dataProvider="{vacationRequestDTO}">
<fx:DataFormItem label="Start Date: " fontWeight="bold"
dataField="START_DATE"  valueName="selectedDate" required="true">
<mx:DateField fontWeight="normal"/>
</fx:DataFormItem>
<fx:DataFormItem label="End Date: " fontWeight="bold"
dataField="END_DATE" valueName="selectedDate" required="true">
<fx:DateField  fontWeight="normal"/>
<fx:validators>
<mx:Array>
<fx:ValidationRule
rule="{afterStartDate}"
errorMessage="End Date ($[END_DATE]) must be later
than Start Date $[START_DATE]">
</fx:ValidationRule>
<fx:ValidationRule
rule="{afterToday}"
errorMessage="End Date ($[END_DATE]) must be later
than today">
</fx:ValidationRule>
</mx:Array>
</fx:validators>
</fx:DataFormItem>
<fx:DataFormItem label="Request Status: " fontWeight="bold"
dataField="STATUS">
<mx:Label  fontWeight="normal"/>
</fx:DataFormItem>
</fx:DataForm>
</mx:HBox>
</mx:VBox>
<mx:Button label="Save" click="onSave()"/>
154 | Chapter 3: Building an Enterprise Framework
VB.NET Create PDF from Word Library to convert docx, doc to PDF in
Images. File & Page Process. File: Merge, Append PDF Files. File: Split PDF Document. File: Compress PDF. Page: Create Thumbnails. Page: Insert PDF Pages. Page
create thumbnails from pdf files; pdf thumbnails in
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
File: Merge, Append PDF Files. |. Home ›› XDoc.PDF ›› VB.NET PDF: Merge and Append PDF. VB.NET Demo code to Combine and Merge Multiple PDF Files into One.
how to create a thumbnail of a pdf document; pdf files thumbnails
<mx:Script>
<![CDATA[
import com.farata.datasource.dto.VacationRequestDTO;
import mx.utils.UIDUtil;
[Bindable] private var vacationRequestDTO:VacationRequestDTO ;
private function afterToday( val: Object) : Boolean {
var b : Boolean = val.END_DATE > new Date();
return b;
}
private function afterStartDate( val: Object) : Boolean {
var b : Boolean = val.END_DATE > val.START_DATE;
return b;
}
private function onCreationComplete():void {
// create a new vacation request
vacationRequestDTO = new VacationRequestDTO;
vacationRequestDTO.REQUEST_ID = UIDUtil.createUID();
vacationRequestDTO.STATUS = "Created";
vacationRequestDTO.START_DATE =
new Date(new Date().time + 1000 * 3600 * 24);
vacationRequestDTO.EMPLOYEE_NAME = "Joe P";
vacationRequestDTO.EMPLOYEE_EMAIL = "jflexer@faratasystems.com";
vacationRequestDTO.VACATION_TYPE = "L"; //Unpaid leave - default
}
private function onSave():void    {
if (isDataValid()) {
mx.controls.Alert.show("Validation succeeded");
} else {
mx.controls.Alert.show("Validation failed");
}
}
private function isDataValid():Boolean {
var failedLeft:Array = left.validateAll();
var failedRight:Array = right.validateAll();
return ((failedLeft.length == 0)&&(failedRight.length == 0));
}
]]>
</mx:Script>
<mx:StringValidator id="nameValidator" minLength="6"
requiredFieldError="Provide your name, more than 5 symbols" />
<mx:EmailValidator id="emailValidator"
requiredFieldError="Provide correct email" />
<mx:StringValidator id="requiredValidator"
requiredFieldError="Provide non-empty value here" />
</mx:Application>
On  the 
creationComplete
event,  this  application  creates  an  instance  of  the
vacationRequestDTO
that is used as a 
dataProvider
for both left and right data forms.
Validation | 155
VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to
Images. File & Page Process. File: Merge, Append PDF Files. File: Split PDF Document. File: Compress PDF. Page: Create Thumbnails. Page: Insert PDF Pages. Page
pdf no thumbnail; thumbnail pdf preview
VB.NET Create PDF from CSV to convert csv files to PDF in vb.net
Images. File & Page Process. File: Merge, Append PDF Files. File: Split PDF Document. File: Compress PDF. Page: Create Thumbnails. Page: Insert PDF Pages. Page
enable pdf thumbnail preview; pdf thumbnail generator online
This code uses a mix of standard Flex validators (
StringValidator
EmailValidator
) and
subclasses of 
ValidatorRule
. Note that both email fields use the same instance of the
EmailValidator
, which is not possible with regular Flex validation routines:
<fx:DataFormItem label="Employee Email: " fontWeight="bold"
dataField="EMPLOYEE_EMAIL" required="true"
validators="{[emailValidator]}">
<mx:TextInput   fontWeight="normal"/>
</fx:DataFormItem>
<fx:DataFormItem label="Employee Email: " fontWeight="bold"
dataField="MANAGER_EMAIL" required="true"
validators="{[emailValidator]}">
<mx:TextInput   fontWeight="normal"/>
</fx:DataFormItem>
Notice that these validators are encapsulated inside the 
DataFormItem
. If application
programmers decide to add or remove some of the form item when the view state
changes, they don’t need to program anything special to ensure that validators work
properly! The form item end date encapsulates two validation rules that are given as
the closures 
afterStartDate
and 
afterToday
:
<fx:DataFormItem label="End Date: " fontWeight="bold"
dataField="END_DATE" valueName="selectedDate" required="true">
<fx:DateField  fontWeight="normal"/>
<fx:validators>
<mx:Array>
<fx:ValidationRule
rule="{afterStartDate}"
errorMessage="End Date ($[END_DATE]) must be later
than Start Date $[START_DATE]">
</fx:ValidationRule>
<fx:ValidationRule
rule="{afterToday}"
errorMessage="End Date ($[END_DATE]) must be later
than today">
</fx:ValidationRule>
</mx:Array>
</fx:validators>
</fx:DataFormItem>
...
private function afterToday( val: Object) : Boolean {
var b : Boolean = val.END_DATE > new Date();
return b;
}
private function afterStartDate( val: Object) : Boolean {
var b : Boolean = val.END_DATE > val.START_DATE;
return b;
}
156 | Chapter 3: Building an Enterprise Framework
The example code does not include standard Flex validators inside 
<fx:validators>
,
but this is supported, too. For example, you can add the following line in the
validators
section of a 
DataFormItem
right under the 
<mx:Array>
tag:
<mx:StringValidator id="requiredValidator"
requiredFieldError="Provide non-empty value here" />
If you do it, you’ll have three validators bound to the same form item, 
End Date
: one
standard Flex validator and two functions with validation rules.
From the application programmer’s perspective, using such validation rules is simple.
It allows reusing validators, which can be nicely encapsulated inside the form items.
For brevity, the function 
onSave()
just displays a message box stating that the validation
failed:
mx.controls.Alert.show("Validation failed");
But if you run this application through a debugger and place a breakpoint inside the
function 
isDataValid()
 you’ll  see  all  validation  errors  in  the 
failedLeft
and
failedRight
arrays (Figure 3-6).
The next question is, “How does all this work?”
Figure 3-6. Debugger’s view of validation errors
The ValidationRule Class Explained
Enhancing the original Flex validators, the new 
ValidationRule
extends the Flex
Validator
and is known to clear.swc’s UI controls. With it, developers can attach any
Validation | 157
number of validation rules to any field of a form or a list-based component. This means
you can attach validation rules not only on the field level, but also on the parent level,
such as to a specific 
DataGrid
column or to an entire row.
When we designed the class, our approach was to separate (for real) validation rules
from the UI component they validate. We also made them reusable to spare application
developers from copy/pasting the same rule repeatedly. With the 
ValidationRule
class,
you can instantiate each rule once and reuse it across the entire application. Our goal
was to move away from one-to-one relationships between a validator and a single
property of a form field, to many-to-many relationships where each field can request
multiple validators and vice versa.
If you don’t need to perform cross-field validation in the form, you can continue using
the original Flex validator classes. If you need to validate interdependent fields—if, say,
the amount field has a value greater than $10K, and you need to block overnight delivery
of the order field until additional approval is provided—use our more flexible exten-
sion, 
ValidationRule
.
We still want to be able to reuse the validators (
EmailValidator
StringValidator
, etc.)
that come with Flex, but they should be wrapped in our 
ValidationRule
class. On the
other hand, with the 
ValidationRule
class, the application developers should also be
able to write validation rules as regular functions, which requires less coding.
The source code of the 
ValidationRule
class that supports all this functionality is listed
in Example 3-18.
Example 3-18. The ValidationRule class
package com.farata.validators{
import mx.controls.Alert;
import flash.utils.describeType;
import mx.events.ValidationResultEvent;
import mx.validators.ValidationResult;
import mx.validators.Validator;
public class ValidationRule   extends Validator{
public var args:Array = [];
public var wrappedRule:Function ;
public var errorMessage : String = "[TODO] replace me";
public var data:Object;
public function ValidationRule() {
super();
required = false;
}
private function combineArgs(v:Object):Array {
var _args:Array = [v];
if( args!=null && args.length>0 )
_args["push"].apply(_args, args);
return  _args;
}
158 | Chapter 3: Building an Enterprise Framework
public function set rule(f:Object) : void {
if (!(f is Function)){
Alert.show(""+f, "Incorrect Validation Rule" );
return; // You may throw an exception here
}
wrappedRule = function(val:Object) :Boolean {
return f(val);
}
}
private function substitute(...rest):String {
var len:uint = rest.length;
var args:Array;
var str:String = "" + errorMessage;
if (len == 1 && rest[0] is Array){
args = rest[0] as Array;
len = args.length;
}
else{
args = rest;
}
for (var i:int = 0; i < len; i++){
str = str.replace(new RegExp("\\$\\["+i+"\\]", "g"), args[i]);
}
if ( args.length == 1 && args[0] is Object) {
var o:Object = args[0];
for each (var s:*  in o){
str = str.replace(new RegExp("\\$\\["+s+"\\]", "g"), o[s]);
}
var classInfo:XML = describeType(o);
// List the object's variables, their values, and their types.
for each (var v:XML in classInfo..variable) {
str = str.replace(new RegExp("\\$\\["+v.@name+"\\]", "g"),
o[v.@name]);
}
// List accessors as properties
for each (var a:XML in classInfo..accessor) {
// Do not get the property value if it is write-only
if (a.@access != 'writeonly') {
str = str.replace(new RegExp("\\$\\["+a.@name+"\\]",
"g"), o[a.@name]);
}
}
}
return str;
}
override protected function doValidation(value:Object):Array{
var results:Array = [];
Validation | 159
if (!wrappedRule(data))
results.push(new ValidationResult(true, null, "Error",
substitute(combineArgs(data))));
return results;
}
override public function validate(value:Object = null,
suppressEvents:Boolean = false):ValidationResultEvent{
if (value == null)
value = getValueFromSource();
// If the required flag is true and there is no value,
// we need to generate a required field error
if (isRealValue(value) || required){
return super.validate(value, suppressEvents);
}
else {
// Just return the valid value
return new ValidationResultEvent(ValidationResultEvent.VALID);
}
}
}
}
The superclass 
Validator
has two methods that will be overridden in its descendants:
doValidation()
, which initiates and performs the validation routine, and the function
validate()
, which watches required arguments and gets the values from the target UI
control.
Notice that this code fragment from the DataFormValidation.mxml application:
<fx:ValidationRule rule="{afterStartDate}"
errorMessage="End Date ($[END_DATE]) must be later than Start Date $[START_DATE]">
</fx:ValidationRule>
mentions the name of the function 
afterStartDate
that alternatively could have been
declared inline as a closure. The function ensures that the date being validated is older
than the 
END_DATE
:
private function afterToday( val: Object) : Boolean {
var b : Boolean = val.END_DATE > new Date();
return b;
}
In this code, 
val
points at the 
dataProvider
of the form, which, in the sample applica-
tion, is an instance of the 
vacationRequestDTO
. An important point is that both the
DataForm
and the 
ValidationRule
see the same 
dataProvider
.
The value of the 
errorMessage
attribute includes something that looks like a macro
language: 
($[END_DATE])
. The function 
substitute()
finds and replaces via regular ex-
pression the specified name (e.g., 
END_DATE
) in all properties in the 
dataProvider
with
their values.
160 | Chapter 3: Building an Enterprise Framework
Documents you may be interested
Documents you may be interested