Apr/09
Mockups with Balsamiq
We need mockups. They allow us to communicate with developers, clients, users and everybody in between in a common language. I’m a big fan of the Sharpie and a pad of paper. Balsamiq Mockups has created a really great piece of software to speed up the mockup process.

Apr/09
Pleat Menu – Flex Component (draft)
The Pleat menu that is used in Buzzword is really sweet. I wanted to emulate in an attempt to get a reusable component along the same lines. This is the first draft at my attempt, and it admittedly needs some work, but it is still useful, even in its current state.
One of my goals with this is to have all the actual controls in the Pleat available at the top level. This makes it a lot easier to capture in PureMVC (or your event/notification system of choice) and doesn’t bury the components. I want to go in and refactor it some more to emulate the Adobe set of Flex components. We’ll see if I have the time
the icons are from the awesome fugue set found here.
Feb/09
Form Validation for the Lazy Programmer in Flex
Forms… Any data-centric application is going to have its fair share of them. They are fairly tedious work. Layout out the form, manage the output, validate the output, over and over. Validation is best when it is active, to let the user know that they have made a mistake before they try to submit the data. Optimally the user won’t be allowed to continue until the form data is complete and accurate.
Every form I’ve written carries the same structure for validation, so as a dedicated lazy programmer I wrote a simple FormValidator class to handle the boilerplate.
package com.visualempathy.validators { import flash.display.DisplayObject; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import mx.events.ValidationResultEvent; import mx.validators.Validator; [Bindable] public class FormValidator extends EventDispatcher { public var formIsValid:Boolean = false; public var validators:Array; private var focusedFormControl:DisplayObject; public function FormValidator(target:IEventDispatcher=null) { super(target); } public function validateForm(event:Event):void { focusedFormControl = event.target as DisplayObject; formIsValid = true; for each( var validator:Validator in validators ) validate(validator); } private function validate(validator:Validator):Boolean { var validatorSource:DisplayObject = validator.source as DisplayObject; var supressEvents:Boolean = validatorSource != focusedFormControl; var event:ValidationResultEvent = validator.validate(null, supressEvents) var currentControlIsValid:Boolean = event.type == ValidationResultEvent.VALID; formIsValid = formIsValid && currentControlIsValid; return currentControlIsValid; } } } |
in the MXML I add an Array structure to hold the Validators, and add the FormValidator like so:
<mx:Array id="validators"> <mx:StringValidator id="studioNameValidator" source="{this.studioNameInput}" property="text" required="true"/> <mx:EmailValidator id="emailValidator" source="{this.emailInput}" property="text" required="true"/> <mx:PhoneNumberValidator id="phoneValidator" source="{this.phoneInput}" property="text" required="true"/> <mx:StringValidator id="addValidator" source="{this.addressInput}" property="text" required="true"/> <mx:StringValidator id="cityValidator" source="{this.cityInput}" property="text" required="true"/> <mx:StringValidator id="stateValidator" source="{this.stateInput}" minLength="2" maxLength="2" property="text" required="true"/> <mx:ZipCodeValidator id="zipcodeValidator" source="{this.zipcodeInput}" property="text" required="true"/> </mx:Array> <validators:FormValidator id="formValidator" validators="{this.validators}"/> |
This allows you to add an arbitrary number of validators. Then in the various inputs:
<mx:TextInput id="studioNameInput" text="{this.studio.name}" width="100%" change="this.formValidator.validateForm(event);"/> |
with the button to commit the changes enabled only when the form is valid:
<mx:Button id="saveChangesBtn" label="save" click="handleSaveChanges()" enabled="{this.formValidator.formIsValid}"/> |
It reduces some of the pain and tedium with the process of creating forms, which is always welcome.
Jan/09
Adding a ToolTip function to a ComboBox in Flex
My screens get a bit crowded sometimes, especially when dealing with forms. Users want to be able to see additional information, but there is just no place to put it. The data is dynamic though, so the toolTip needs to change based on the currently selectedItem of the ComboBox. With a DataGrid, for example, you have a showDataTip property on a column and can assign a dataTipFunction. There is no similar function in the ComboBox, but it is easy enough to add. I’m also using the HtmlToolTip class for a little extra style in the ToolTip itself.
View Source is enabled.
Dec/08
ImageSwap (crossfade) Flex Component
I needed a component that would work in my slideshow component and give a decent crossfade while letting the user know that something was going on. I used TweenLite for the tweening, and it works pretty well. It dispatches an ‘imageLoaded’ event when the image swap has completed. I needed this so that the slideshow timer can resume. It pauses when the image starts loading because of various image sizes/connection speeds. Pretty simple, but it is a lot nicer than the harsh transition (or lack of) in the current slideshow.














