NOM

Tk::ConfigSpecs - Définir le comportement de 'configure' pour les widgets composites.


SYNOPSIS

 sub Populate { 
   my ($composite,$args) = @_; 
   ... 
   $composite->ConfigSpecs('-attribut' => [ where,dbName,dbClass,defaut ]); 
   $composite->ConfigSpecs('-alias' => '-autreattribut'); 
   $composite->ConfigSpecs('DEFAULT' => [ where ]);
   $composite->ConfigSpecs($subwidget->ConfigSpecs);
   ... 
 }
 $composite->configure(-attribut => valeur);


DESCRIPTION

Il s'agit de faire en sorte que la méthode configure d'un widget composite ressemble autant que possible à celle d'un widget Tk de base. (Voir Tk::options pour une description de ce comportement). Pour réaliser cela il faut définir les attributs que le composite accepte dans son ensemble.

Définir les ConfigSpecs pour une classe.

Typiquement un widget aura un ou plusieurs appels semblables au suivant

  $composite->ConfigSpecs(-attribut => [where,dbName,dbClass,defaut]);

dans sa méthode Populate. Lorsque ConfigSpecs est appelé de cette manière (avec des arguments), les arguments sont utilisés pour construire ou augmenter/remplacer une table hash pour le widget. (on peut spécifier plus d'une paire -option=>valeur dans un seul appel.)

dbName, dbClass et default sont utilisés uniquement par ConfigDefault décrit ci-dessous, ou pour répondre aux commandes de requête de configure.

Ce peut être soit une des valeurs ci-dessous, ou bien une liste de telles valeurs entre crochets [].

Les valeurs permises actuellement pour where sont :

'ADVERTISED'
applique configure aux subwidgets averties (``nommés'' : voir Tk::mega).

'DESCENDANTS'
applique configure à tous les descendants, récursivement.

'CALLBACK'
Lors de l'initialisation des attributs, effectue Tk::Callback->new($valeur) avant de stocker la valeur dans $composite->{Configure}{-attribut}. Ceci est approprié pour les attributs ``-command => ...'' qui sont pris en charge par le composite et ne sont pas transmis à un subwidget. (par exemple, Tk::Tiler possède -yscrollcommand qui lui permet d'avoir une scrollbar attachée.)

Ceci devrait être le premier de plusieurs mots-clés de 'validation' (par exemple font, cursor, anchor, etc.) que le coeur de Tk rend spécial pour le code C.

'CHILDREN'
applique configure à tous les enfants. (les enfants sont les descendants immédiats d'un widget.)

'METHOD'
appelle $cw->attribut(valeur)

C'est le cas le plus général. Il suffit d'avoir une méthode de la classe du composite portant le même nom que l'attribut. La méthode peut effectuer toute les validations et avoir tous les effets de bord que vous désirez. Il est probablement préférable de les 'mettre en file d'attente' en utilisant afterIdle pour obtenir des effets de bord plus complexes.

'PASSIVE'
Stocke simplement la valeur dans composite->{Configure}{-attribute}

Cette forme est également le bon endroit pour les attributs que vous gérez uniquement à la création du composite.

'SELF'
Applique configure au widget (par exemple Frame) qui est à la base du composite. (C'est le comportement par défaut pour la plupart des attributs qui font qu'une simple Frame devient ce que vous en attendez.) Notez qu'une fois que vous avez spécifié ConfigSpecs pour un attribut vous devez explicitement inclure 'SELF' dans la liste si vous voulez que les attributs s'appliquent au composite lui-même (ceci élimine les dangereux problèmes de récursion infinie).

$reference (blessed)
Appelle $reference->configure(-attribut => valeur)

Un cas courant est celui où $reference est un subwidget.

$reference peut aussi être le résultat de

 Tk::Config->new(setmethod, getmethod, args, ...);

La classe Tk::Config est utilisée pour implémenter tous les types de mot-clé ci-dessus. La classe possède les méthodes ``configure'' et ``cget'' ce qui permet au code de niveau plus élevé de toujours appeler simplement une de ces méthodes sur n'importe quel objet.

hash reference
Si l'on définit :
  $cw->ConfigSpecs( 
    ... 
    -option => [ { -optionX=>$w1, -optionY=>[$w2, $w3] }, 
        dbname, dbclass, default ], 
    ... 
  );

alors

  $cw->configure(-option => valeur)>"

a en réalité pour effet :

  $w1->configure(-optionX => valeur); 
  $w2->configure(-optionY => valeur); 
  $w3->configure(-optionY => valeur);

'autrechaîne'
Appelle
  $composite->Subwidget('autrechaîne')->configure( -attribut => valeur );

Puisque ceci existe pour compatibilité ascendante avec Tk-b5, il est certainement mieux d'utiliser directement la référence au subwidget. Le seul cas où l'on devrait retenir cette forme est de fournir une couche d'abstraction supplémentaire - peut-être en ayant un subwidget 'courant' - ceci n'est pas prouvé.

Alias
ConfigSpecs( -alias => '-autreattribut' ) est utilisé pour rendre -alias équivalent à -autreattribut. Par exemple les alias
  -fg => '-foreground', 
  -bg => '-background'

sont fournis automatiquement (même s'ils ne sont pas toujours spécifiés).

Déléguer toutes les options d'une classe de widget à un subwidget

  $composite->ConfigSpecs($subwidget->ConfigSpecs);

L'instruction ci-dessus génère une liste des arguments ConfigSpecs d'un composite, un pour chaque option valide dans la classe de $subwidget, et délègue lesdites options à $subwidget. Voir Tk::Widget et la méthode ConfigSpecs de widget. Dupliquer des ConfigSpecs de composite et des ConfigSpecs de widget peut amener des résultats indéfinis.

Valeurs par défaut

Après l'exécution de la méthode Populate, la méthode ConfigDefault est appelée. Ceci appelle

  $composite->ConfigSpecs;

(sans arguments) qui retourne une référence à un hash. Les entrées du hash prennent la forme :

  '-attribut' => [ where, dbName, dbClass, défaut ]

ConfigDefault ignore complètement 'where' (ainsi que l'entrée DEFAULT) et teste la base de données 'options' du widget, et si une entrée correspondant à dbName/dbClass est présente,

  -attribut => valeur

est ajouté à la liste des options que new appliquera finalement au widget. De la même manière s'il n'y a pas de correspondance avec dbName/dbClass et que ``défaut'' est défini cette valeur par défaut sera ajoutée.

Les entrées alias du hash sont utilisées pour convertir les valeurs spécifiées pour l'alias par l'utilisateur en valeurs pour le véritable attribut .

New()-time Configure

Lorsque new reprend le contrôle, la liste des options fournies par l'utilisateur et celle provenant de ConfigDefault sont appliquées au widget au moyen de la méthode configure ci-dessous.

Les widgets sont d'autant plus flexibles et d'autant plus ``Tk-like'' qu'elles gèrent la majorité de leurs attributs de cette manière.

Configurer les composites

Une fois ceci effectué, le appels de la forme :

  $composite->configure( -attribut => valeur );

devraient ressembler à ceux de n'importe quel autre widget du point de vue du code de l'utilisateur final. configure sera pris en charge par Tk::Derived::configure de cette manière :

  $composite->ConfigSpecs;

est appelé (sans arguments) et retourne une référence à un hash dans lequel on recherche -attribut, si -attribut n'est pas présent dans le hash alors on recherche 'DEFAULT' à la place. (Les alias sont essayés autant qu'il faut et entraînent une redirection vers l'attribut alias). Le résultat doit être une référence à une liste du type :

  [ where, dbName, dbClass, default ]

à ce point nous nous intéressons seulement à where, qui renvoie vers une liste de références d'objet (éventuellement un seul) pour chaque

  $object->configure( -attribut => valeur );

évalué.

Retrouver les attributs d'un composite

  $composite->cget( '-attribut' );

Ceci est traité par Tk::Derived::cget d'une manière similaire à configure. Actuellement si where est une liste de plus d'un objet il est ignoré complètement et la valeur ``cachée'' dans

  $composite->{Configure}{-attribut}

est renvoyée.


AVERTISSEMENTS

Il est dans l'intention de l'auteur de porter autant de widgets composites ``Tix'' qu'il est possible. Le mécanisme décrit ci-dessus doit évoluer pour rendre cela possible, toutefois maintenant que les alias sont gérés je pense que ce qui est décrit ici est suffisant.


VOIR AUSSI

Tk::composite, Tk::options


TRADUCTION

Jean-Pierre Vidal jeanpierre.vidal@free.fr


RELECTURE

Pas de relecture pour le moment