[PercentProxy] Metadata tag

La metadata, conocida en otros lenguajes como anotaciones, es una potente herramienta para comunicarse con Flex Builder que permite realizar un abanico de tareas que van desde la generación de código hasta chequeos especiales en tiempo de compilación pasando por integración con el sistema de autocompletado del IDE.
En esta entrada veremos el funcionamiento de la anotación PercentProxy, con la cual podemos definir parámetros en unidades numéricas o porcentuales.

Sintaxis

[PercentProxy("propiedadPorcentual")]
Argumentos:

  • propiedadPorcentual (obligatorio) es la versión de cálculo porcentual del getter/setter al que afecta.

Posicionamiento

Esta anotación debe situarse antes de la declaración de un getter/setter de tipo numérico.

Descripción

Este tag de metadata (indocumentado) es la solución a la falta de sobrecarga de métodos en el lenguaje ActionScript 3. Cuando el compilador se encuentra una declaración porcentual en MXML para un valor que debería ser numérico y la propiedad está marcada con la anotación [PercentProxy] internamente se crea la lógica necesaria para que la asignación apunte al setter que le toca.

Ejemplo

TestPercentProxy.mxml

MXML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application
  3.     xmlns:mx="http://www.adobe.com/2006/mxml"
  4.     xmlns:local="*">
  5.     <mx:DataGrid>
  6.         <mx:columns>
  7.             <local:DataGridColumnPorcentualSize
  8.                 headerText="Col 1"
  9.                 width="15%"/>
  10.             <local:DataGridColumnPorcentualSize
  11.                 headerText="Col 2"
  12.                 width="15%"/>
  13.             <local:DataGridColumnPorcentualSize
  14.                 headerText="Col 3"
  15.                 width="70%"/>
  16.         </mx:columns>
  17.     </mx:DataGrid>
  18. </mx:Application>

DataGridColumnPorcentualSize.as

Actionscript 3:
  1. package
  2. {
  3.     import flash.utils.setTimeout;
  4.    
  5.     import mx.controls.DataGrid;
  6.     import mx.controls.dataGridClasses.DataGridColumn;
  7.     import mx.core.mx_internal;
  8.    
  9.     use namespace mx_internal;
  10.    
  11.     public class DataGridColumnPorcentualSize extends DataGridColumn
  12.     {
  13.         public function DataGridColumnPorcentualSize( columnName:String = null )
  14.         {
  15.             super( columnName );
  16.         }
  17.  
  18.         [PercentProxy( "widthPercent" )]
  19.         override public function get width():Number
  20.         {
  21.             return super.width;
  22.         }
  23.         override public function set width( value:Number ):void
  24.         {
  25.             super.width = value;
  26.         }
  27.  
  28.  
  29.         public function get widthPercent():Number
  30.         {
  31.             var dg:DataGrid = owner as DataGrid;
  32.             return 100 * ( dg.columnCount / dg.width );
  33.         }
  34.         public function set widthPercent( value:Number ):void
  35.         {
  36.             setWidth( value );
  37.         }
  38.        
  39.        
  40.         private function setWidth(value:Number):void
  41.         {
  42.             if(owner){
  43.                 var dg:DataGrid = owner as DataGrid;
  44.                 width = dg.width * ( value / 100 );
  45.             }else{
  46.                 // Esto está lejos de ser lo más correcto
  47.                 // pero esto SOLO es un ejemplo...
  48.                 setTimeout( setWidth, 100, value );
  49.             }
  50.         }
  51.     }
  52. }

La clase DatGridColumn que viene en el SDK de Flex no permite asignar los anchos de las columnas porcentualmente (por buenas razones). Para ilustrar el uso de la anotación en cuestión se puede ver en la clase DataGridColumnPorcentualSize la lógica añadida para que se soporte este tipo de asignación.

Comparte:



2votos  Vota!!

Acerca de esta entrada