Avoid calling invalidateXXX() inside commitProperties(), measure(), or
updateDisplayList(), as this can cause a second pass through the
LayoutManager to revalidate; invalidateXXX() is typically called by
property setters.
 
Gordon Smith
Adobe Flex SDK Team

________________________________

From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of Sherif Abdou
Sent: Thursday, February 07, 2008 10:36 AM
To: [email protected]
Subject: Re: [flexcoders] Re: is this how to use commitProperties



so good? bad? any opinions?


----- Original Message ----
From: Sherif Abdou <[EMAIL PROTECTED]>
To: [email protected]
Sent: Wednesday, February 6, 2008 9:53:43 PM
Subject: Re: [flexcoders] Re: is this how to use commitProperties



if anyone cares to check, is this how your suppose to do the stuff or is
it overkill. This is a Tab that contains a Close Button so if the user
clicks on the close Button then the tab gets removed and depending on
the policy that gets picked it reacts.
package flexlib.controls. tabBarClasses

{

import flash.display. DisplayObject;

import flash.events. Event;

import flash.events. MouseEvent;

import flexlib.constants. AdvancedTabConst ant;

import flexlib.interfaces. ICustomComponent Styles;

import mx.controls. Button;

import mx.controls. tabBarClasses. Tab;

import mx.core.UIComponent ;

/**

* The Style For the Close Button that will be used

*/

[Style(name="tabCloseButtonStyl eName",type="String", inherit="no")]

/**

* The Style that is used for the indicator, it will be an image

*/

[Style(name="indicatorClass", type="String", inherit="no")]

public class AdvancedTab extends Tab implements ICustomComponentSty les

{

/**

* Flag to Know if the Button has been created or not

*/

private var _closeButtonCreated :Boolean;

/**

* The Button that will aid us in closing the Tab AKA removing it from
the scene

*/

private var closeButton: Button;

/**

* The Display Indicator that gets seen between the tabs when we move
them

*/

private var indicatorDisplay: UIComponent;

public function AdvancedTab( )

{

super();

//enable Mouse Children so we can Have Interaction with the Buttons

//and other Stuff that will be placed on the Tab, by Default it is false

//reason is if there is a textField in the Tab then a click may be
dispatched or

//heard in the textField instead of the Tab itself and sometimes you
dont want that to

//happen.

mouseChildren=true;

}

/**

* Used to Determine whether or not there was a change in the Close
Policy

*/

private var _closePolicyChanged :Boolean;

/**

* Internal Value for the ClosePolicy so we can react

* accordingly

*/

private var _closePolicy: String;

[Inspectable(defaultValue="close_always",enumeration="close_always,
close_rollover, close_never, close_selected")]

public function set closePolicy( value:String) :void{

if(_closePolicy !=value){

_closePolicy= value;

_closePolicyChanged =true;

invalidatePropertie s();

dispatchEvent(new Event("closePolicyChanged "));

}

}

[Bindable(event="closePolicyChanged ")]

public function get closePolicy( ):String{

return _closePolicy;

}

/**

* Override the CreateChildren so we can create the Close Button, Only
Create Children

* and nothing else, can't size them or position them

*/

override protected function createChildren( ):void{

//call the super method so the other stuff gets constructed like 

//the Button itself and all the other stuff that creates the Tab

super.createChildren( );

//always check if the Button is not made

if(!closeButton) {

//safe now we can create it

closeButton = new Button();

//listen for the click event so we know when to close the tab

closeButton. addEventListener (MouseEvent. CLICK,onCloseBut
tonClickHandler) ;

//hide the close button

closeButton. visible=false;

_closeButtonCreated = true;

addChild(closeButto n);

}

/**

* Used to Display the Indicator, first get the Style as a class

* then what you would need to do is create the style as a class

*/

if(!indicatorDisplay) {

indicatorDisplay = new UIComponent( )

addChild(indicatorD isplay as DisplayObject) ;

}

//call to set the styles

setCustomStyles( );

}

/**

* Called On when the User Clicks on the Close Button,

* all we are going to do is dispatch that the user

* wants to close the tab and handle in the AdvanedTabBar

* so it gets removed cleanly

*/

private function onCloseButtonClickH andler(event: MouseEvent) :void{

dispatchEvent(new Event(AdvancedTabCo nstant.CLOSE_ TAB));

}

/**

* Override the measure to set the compenents custom size

* We set the Close Button Size here and the Indicator??

*/

override protected function measure():void{

super.measure();

if(_closeButtonCreate d){

closeButton. width = closeButton. height=16;

_closeButtonCreated =false;

}

}

/**

* The Sizes and Positions the Children

*/

override protected function updateDisplayList( unscaledWidth: Number,
unscaledHeight: Number):void{

super.updateDisplayList( unscaledWidth, unscaledHeight) ;

//check to see if we have the Button

if(closeButton. visible){

closeButton. move(unscaledWid th-closeButton. width,4);

//change the index of where the button is so we can adjust it

setChildIndex( closeButton, numChildren- 2);

}

if(indicatorDisplay) {

setChildIndex( indicatorDisplay ,numChildren- 1);

}

}

/**

* Create the CommitProperties so we determine if there is a need

* to change the closePolicy Buttons

*/

override protected function commitProperties( ):void{

super.commitProperties( );

if(_closePolicyChange d){

switch(closePolicy) {

case AdvancedTabConstant .CLOSE_ALWAYS:

closeButton. visible=true;

break;

case AdvancedTabConstant .CLOSE_NEVER:

closeButton. visible=false;

break;

case AdvancedTabConstant .CLOSE_SELECTED:

if(selected){

closeButton. visible=true;

}else{

closeButton. visible=false;

}

break;

case AdvancedTabConstant .CLOSE_ROLLOVER:

if(AdvancedTabConstan t.TAB_ROLLED_ OVER){

closeButton. visible=true;

}else{

closeButton. visible=false;

}

}

invalidateDisplayLi st();

_closePolicyChanged =false;

}

}

/**

* Sets The Custom Styles for The Indicator and for the button after they
have been created

*/

public function setCustomStyles( ):void{

//Set the Style of the Button here

closeButton. styleName = getStyle("tabCloseButtonStyl eName");

//set the Style of the Indicator Button here

indicatorDisplay.
setStyle("backgroundImage",getStyle("indicatorClass"));

}

/**

* Keep Track of When the User is over the Button

*/

override protected function rollOverHandler( event:MouseEvent ):void{

AdvancedTabConstant .TAB_ROLLED_ OVER = true;

_closePolicyChanged =true;

invalidatePropertie s();

super.rollOverHandler( event);

}

override protected function rollOutHandler( event:MouseEvent ):void{

AdvancedTabConstant .TAB_ROLLED_ OVER=false;

_closePolicyChanged =true;

invalidatePropertie s();

super.rollOutHandler( event);

}

}

}



----- Original Message ----
From: ecancil <[EMAIL PROTECTED] com>
To: [EMAIL PROTECTED] ups.com <http://ups.com/> 
Sent: Wednesday, February 6, 2008 7:46:45 PM
Subject: [flexcoders] Re: is this how to use commitProperties



it doesnt matter how many times you call invalidate - it will still
only do it once - that's the whole point.
--- In [EMAIL PROTECTED] ups.com <mailto:flexcoders%40yahoogroups.com>
, Sherif Abdou <[EMAIL PROTECTED] ..> wrote:
>
> my bad, i for some reason sent it to flexComponents instead instead
of flexcoders so sorry for double post
> i am just wondering if this is how it usually gets used
> /**
> * Used to Determine whether or not there was a change in the Close
Policy
> */
> private var _closePolicyChanged :Boolean;
> /**
> * Internal Value for the ClosePolicy so we can react
> * accordingly
> */
> private var _closePolicy: String;
> [Inspectable( defaultValue= "close_always" ,enumeration= "close_always
,
close_rollover , close_never, close_selected" )]
> public function set closePolicy( value:String) :void{
> _closePolicy= value;
> _closePolicyChanged =true;
> this.invalidateProp erties();
> dispatchEvent( new Event("closePolicyC hanged")) ;
> }
> [Bindable(event= "closePolicyChan ged")]
> public function get closePolicy( ):String{
> return _closePolicy;
> }
> 
> /**
> * Create the CommitProperties so we determine if there is a need
> * to change the closePolicy Buttons
> */
> override protected function commitProperties( ):void{
> super.commitPropert ies();
> if(_closePolicyChan ged){
> invalidateDisplayLi st();
> _closePolicyChanged =false;
> }
> }
> 
> 
> 
____________ _________ _________ _________ _________ _________ _
> Be a better friend, newshound, and 
> know-it-all with Yahoo! Mobile. Try it now. 
http://mobile. yahoo.com/ ;_ylt=Ahu06i62sR 8HDtDypao8Wcj9tA cJ
<http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAc! J> 
>





________________________________

Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try
it now.
<http://us.rd.yahoo.com/evt=51733/*http://mobile.yahoo.com/;_ylt=Ahu06i6
2sR8HDtDypao8Wcj9tAcJ>  


________________________________

Never miss a thing. Make Yahoo your homepage.
<http://us.rd.yahoo.com/evt=51438/*http://www.yahoo.com/r/hs>  

 

Reply via email to