Del uso de mx_internal August 25
Como ya he discutido antes, los componentes en el Flex SDK tienen propiedades, métodos y eventos que nos permiten manipular su apariencia y comportamiento. Por ejemplo, el siguiente mxml declara un botón con una leyenda y que ejecuta cierta función al clic.
<mx:Button id="miboton" label="Presiona me" click="ejecutaFuncion()"/>
Cada uno de los componentes en el Flex SDK tiene propiedades y métodos, tanto públicos, privados y protegidos. Esto es por su naturaleza Orientada a Objetos. Teniendo esto en consideración es posible modificar propiedades y métodos predefinidos sobrescribiendo (overriding) su definición. Para saber el alcance ( public, private o protected) de cada propiedad o método, y si son propios o heredados, recurrimos a la documentación de Flex (http://livedocs.adobe.com/flex/2/langref/). Ahí podemos ver las propiedades y su alcance.
A como los componentes son mas sofisticados, encontramos que sus propiedades pueden provenir de un antecesor o están de otros componentes que son usados como parte de ellos, por ejemplo un Label dentro un Button. Aun así, regularmente encontramos como cambiar cierta propiedad mirando la ayuda. Pero que pasa cuando esas propiedades no están disponibles? Por ejemplo, tomemos el dateChooser, el cual muestra en esencia un calendario.
Internamente el dateChooser esta haciendo uso de otros componentes Flex, y regularmente podemos hacer referencia a ellos para cambiarlos. Por ejemplo los meses que por default están en Ingles pueden ser cambiados a Español como ya mostré en otra entrada. Sin embargo, digamos que queremos desaparecer los botones de avance y regreso de los meses. Tal vez queremos mostrar un mes en específico a la vez, y no queremos que el usuario tenga la opción de avanzar o regresar en meses.
Bueno curiosamente no existe una función o propiedad pública, privada o protegida que nos permita hacer referencia a tales botones.
Pero es claro que estos son dos buttons y que fueron declarados en algún lugar. Donde?. Bueno tomando una mirada a la clase original (DateChooser.as) se puede ver que si están declarados ambos botones: backMonthButton y fwdMonthButton.
/**
* @private
* The internal Button which, when clicked,
* makes the DateChooser display the next month.
*/
mx_internal var fwdMonthButton:Button;
/**
* @private
* The internal Button which, when clicked,
* makes the DateChooser display the previous month.
*/
mx_internal var backMonthButton:Button;
Entonces si están como variables en DateChooser, pero no como public, private o protected, sino como mx_internal. Esta declaración, mx_internal, es diseñada para declarar variables de las cuales se pensó no son necesarias para el programador. Aunque en el caso del DateChooser y estos botones, yo diría que deberían estar disponibles y así pudiéramos hacerlos invisible con algo como:
miDateChooser.backMonthButton.visible=false;
Pero si hay una manera de accesarlos, usando el mismo mx_internal, podemos hacer referencia a dichas propiedades.
Esta seria una clase que extiende el DateChooser pero que esconde los botones de avance y regreso del mes usando mx_internal.
//DateChooserNoMonthButtons.as bajo fólder skins
package skins
{
import mx.controls.DateChooser;import mx.core.mx_internal;
// Paso 1: Usar decirle a ActionScript que use el namespace mx_internal
use namespace mx_internal;
public class DateChooserNoMonthButtons extends DateChooser
{
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
super.updateDisplayList(unscaledWidth, unscaledHeight);
// Usar la sintaxis this.mx_internal:: para hacer referencia a propiedades bajo el namespace mx_internal
this.mx_internal::fwdMonthButton.visible=false;
this.mx_internal::backMonthButton.visible=false;
}
}
}
Y se puede usar asi
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:calendario="skins.*">
<calendario:DateChooserNoMonthButtons />
</mx:Application>
Con un resultado como este: