Hugecombo

Le code Tcl de ulis


english


INDEX

  INTRODUCTION
  DESCRIPTION
  INSTALLATION
  UTILISATION
  TELECHARGEMENT
  DISTRIBUTION
  BUGS
 

   INTRODUCTION

Un widget Combobox acceptant un million d'items

Ce que c'est

C'est un script Tcl implémentant un mégawidget.
 

   DESCRIPTION

Ce qu'il fait

a(Huge)ComboBox est un mégawidget écrit en Tcl qui étend le widget entry de Tk 8.4.
Il rajoute au widget entry un bouton et une liste de choix.
Cette liste de choix est implémentée par une Hugelist; ce qui permet à la Hugecombo de pouvoir choisir parmi plus d'un million d'items sans pénalité de temps ou de mémoire.
Un mécanisme de recherche basé sur les motifs de [string match] permet de chercher facilement dans la liste.
Ses avantages :
- il est compatible avec le widget entry de Tk 8.4,
- il est basé sur la Hugelist,
- chacun de ses composant est configurable,
- il sait afficher des images,
- il permet de rechercher facilement dans la liste (motif de recherche, scrolling ultra rapide),
- écrit en Tcl il est facile à modifier.
Ses désavantages :
- c'est un mégawidget écrit en Tcl (mais le temps de chargement est imperceptible).
Erreurs connues :
C'est un nouveau widget.

Comment il fait

L'appui sur le bouton ou sur une touche de navigation dans la liste ouvre une fenêtre toplevel qui contient une Hugelist et une scrollbar.
La sélection d'un item permet la mise à jour du widget entry et la fermeture de la toplevel.
Un grab sur la toplevel permet de détecter la perte du focus et de fermer la toplevel.
 

   INSTALLATION

Pour installer le package Hugecombo :
- téléchargez le fichier Hugecombo.zip,
- décompressez le fichier dans un répertoire,
- transférez ce répertoire dans le répertoire lib de Tcl.
 
Pour Windows, l'arborescence obtenue doit être :
.../Tcl
.../Tcl/bin
.../Tcl/doc
.../Tcl/lib
.../Tcl/lib/Hugecombo
 

   UTILISATION

Le widget Hugecombo s'utilise à peu près comme le widget entry standard.
Les différences sont :
- la déclaration du package,
- les options liées à la liste de choix,
- les opérations liées à la liste de choix,
- les bindings liés à la liste de choix.
 
    package require Hugecombo
    namespace import ::hugecombo::hugecombo
    hugecombo .hc -values {one two three four}
    .hc list find Huge*

Les opérations sur la classe

La commande hugecombo, avec la syntaxe habituelle [hugecombo pathName args], permet de créer des Hugecombo.
Elle permet aussi trois autres opérations sur la classe :
 
 hugecombo option  permet de récupérer ou modifier la valeur par défaut ou la description des options du widget
 hugecombo parms  permet de récupérer ou modifier la valeur par défaut des paramètres de la classe
 hugecombo version  permet de récupérer le numéro de version de Hugecombo

  hugecombo option
 
Cette opération s'applique aux options du widget et accepte deux options, get et set :
 
 hugecombo option get  retourne la liste des options avec les valeurs par défaut
 hugecombo option get key  retourne la valeur par défaut de l'option key
 hugecombo option set key  retourne la description de l'option key
 hugecombo option set key value...  donne la valeur par défaut value à l'option key

Les valeurs par défaut des options sont prises en compte lors de la création d'une Hugecombo.
Les valeurs par défaut du widget Entry sont utilisées pour initialiser la classe, mais ne sont plus utilisées après.
(pour la liste des nouvelles options du widget, voir la section Les options supplémentaires du widget)
 
    hugecombo option get
    set default [hugecombo option get -alternate]
    hugecombo option set -bg beige -alt linen

  hugecombo parms
 
Cette opération s'applique aux paramètres du widget et accepte deux options, get et set :
 
 hugecombo parms get key  retourne la valeur par défaut du paramètre key
 hugecombo parms set key value...  donne la valeur par défaut value au paramètre key

Les paramètres disponibles sont :
 
  nom du paramètre   valeur par défaut   description
 TAG1  HugeCombo  classe de binding du megawidget (frame)
 TAG2  ComboList  classe de binding de l'entry subwidget
 TAG3  HugeEntry  classe de binding de la hugelist
 b:borderwidth  2  option borderwidth du subwidget button
 b:highlightthickness  0  option highlightthickness button subwidget option
 b:image  _hugecombo_  option image du subwidget button
 b:relief  raised  option relief du subwidget button
 b:width  16  option width du subwidget button
 e:borderwidth  0  option borderwidth du subwidget entry
 e:highlightthickness  0  option highlightthickness du subwidget entry
 e:relief  flat  option relief du subwidget entry
 e:selectborderwidth  0  option selectborderwidth du subwidget entry
 l:activestyle  none  option activestyle du subwidget hugelist
 l:borderwidth  0  option borderwidth du subwidget hugelist
 l:highlightthickness  0  option highlightthickness du subwidget hugelist
 l:relief  flat  option relief du subwidget hugelist
 t:relief  raised  option relief du subwidget toplevel
 
    set default [hugecombo parms get b:relief]
    hugecombo parms set b:image button_image

  hugecombo version
 
Cette opération retourne le numéro de version de Hugecombo.
 
    set version [hugecombo version]

Les options supplémentaires ou modifiées

-alternatecolor
 
Cette option permet de définir la couleur des lignes paires dans la pick-list.
 
    hugecombo .hc -alternatecolor gray95 -values {one two three four}

  -compound
 
Cette option permet de réserver la place pour une image à gauche du widget entry.
Elle prend les valeurs 0 ou 1.
 
 1  l'image associée à l'item sélectionné est recopiée à gauche du texte (défaut)
 0  la place n'est pas réservée et l'image n'est pas copiée
 
    hugecombo .hc -compound 1 -values {top left right bottom}
    foreach i {0 1 2 3} \
    {
      set text [.hc itemcget $i -text]
      image create photo img_$text -file $text.gif
      .hc itemconfig $i -image img_$text
    }

  -height
 
Cette option permet de définir le nombre de lignes visibles dans la pick-list.
 
    hugecombo .hc -height 4 -values {one two three four}

  -image (ou -img)
 
Cette option permet de définir ou supprimer l'image affichée à gauche du texte.
Une valeur vide supprime l'image.
Cette valeur est changée par la prochaine sélection dans la pick-list.
Si l'option compound vaut 0 l'image n'est pas affichée.
 
    image create photo img -file img.gif
    hugecombo .hc -image img

  -listvariable
 
Cette option permet de déclarer le nom d'une variable qui contient la liste des valeurs.
 
    set ::listvar {one two three four}
    hugecombo .hc -listvariable ::listvar

  -rowheight
 
Cette option permet de définir la hauteur d'une ligne de la pick-list dans une des formes acceptées par Tk_GetPixels.
 
    hugecombo .hc -rowheight 20 -values {one two three four}

  -state
 
Cette option accepte une valeur supplémentaire.
Suivant la valeur de l'option, il est possible d'éditer le texte du widget, d'y sélectionner du texte et/ou de choisir une valeur dans la pick-list.
Les couleurs du widget varient suivant la valeur de l'option.
 
  valeur   édition   sélection   choix   couleur
 disabled  non  non  non  disabled
 normal  oui  oui  oui  normal
 picklist  non  oui  oui  normal
 readonly  non  oui  non  readonly

Lorsque l'option state a la valeur normal, il est possible d'accéder à une valeur de la pick-list avec des motifs.
Lorsque l'option state a la valeur picklist, il est possible d'accéder à une valeur de la pick-list en tapant sa première lettre.
(voir la section Les bindings supplémentaires)
 
    hugecombo .hc -state picklist

  -values
 
Cette option permet de déclarer la liste des valeurs.
 
    hugecombo .hc -values {one two three four}

Les opérations supplémentaires

component
 
Cette opération permet de récupérer le path de tous les subwidgets du megawidget.
Elle accepte pour paramètre le type du subwidget désiré.
 
 button  retourne le path du subwidget button (bouton)
 canvas  retourne le path du subwidget canvas (image)
 entry  retourne le path du subwidget entry (zone de saisie)
 hugelist  retourne le path du subwidget hugelist (liste)
 listbox  retourne le path du subwidget hugelist (liste)
 scrollbar  retourne le path du subwidget scrollbar (ascenseur)
 
    set hl [.hc component list]
    $hl configure -alternate azure

  itemconfig
 
Cette opération permet de configurer les items de la Hugelist.
Elle accepte tous les paramètres de l'opération itemconfig de la Hugelist.
C'est à dire :
- tous les paramètres de la listbox de Tk,
- un deuxième index pour configurer une tranche d'items,
- une nouvelle option -image (ou -img) qui permet de définir une image à gauche du texte de l'item,
- une nouvelle option -left qui permet de définir la marge de gauche de l'item,
- une nouvelle option -text qui permet de redéfinir le texte de l'item.
 
    .hc itemconfig 0 end -left 10 -image i_down
    .hc itemconfig 4 -image i_left
    .hc itemconfig 4 -text "[.hc itemcget 4 -text] (externe)"

  itemcget
 
Cette opération permet de récupérer la valeur des options des items de la Hugelist.
Elle accepte tous les paramètres de l'opération itemcget de la Hugelist.
C'est à dire :
- tous les paramètres de la listbox de Tk,
- une nouvelle option -image (ou -img) qui retourne l'image de l'item,
- une nouvelle option -left qui retourne la marge de gauche de l'item,
- une nouvelle option -text qui retourne le texte de l'item.
 
    set img [.hc itemcget 4 -image]
    set text [.hc itemcget 4 -text]

  list
 
Cette opération permet de gérer la Hugelist.
 
Les options sont :
 
 close  ferme la liste
 curselection  retourne l'index de la ligne sélectionnée (ou rien)
 find pattern  sélectionne le prochain item correspondant au motif (ou ne fait rien)
 open  ouvre la liste
 select rowindex  sélectionne la ligne
 
    .hc list open
    set cur [.hc list cursel]
    .hc list find Huge*
    .hc list open
    .hc list select end-1

  load
 
Cette opération permet de charger l'item désigné par l'index dans le widget entry. Si l'index est omis, c'est l'item sélectionné qui est chargé.
 
    .hc load end-1

  send
 
Cette opération simule l'envoi d'un caractère symbolique à la Hugecombo.
 
Les clefs symboliques utilisables sont :
 
 <Escape>  ferme la liste
 <Return>  copie l'item sélectionné et ferme la liste
 <Control-Return>  sélectionne le prochain item correspondant au motif
 <Control-Home>  sélectionne le premier item de la liste
 <Prior>  sélectionne le dernier item de la page précédente
 <Up>  sélectionne l'item précédent dans la liste
 <Down>  sélectionne l'item suivant dans la liste
 <Next>  sélectionne le premier item de la page suivante
 <Control-End>  sélectionne le dernier item de la liste
 
    .hc send <Control-Return>

Les bindings supplémentaires

Des bindings supplémentaires permettent de sélectionner un item dans la liste :
 
 <Control-Home>  sélectionne le premier item de la liste
 <Prior>  sélectionne le dernier item de la page précédente
 <Up>  sélectionne l'item précédent dans la liste
 <Down>  sélectionne l'item suivant dans la liste
 <Next>  sélectionne le premier item de la page suivante
 <Control-End>  sélectionne le dernier item de la liste

Des bindings supplémentaires permettent de sélectionner un item dans la pick-list.
Lorsque l'option state a la valeur normal, <Control-Return> permet de sélectionner suivant le motif de type string match situé dans le widget entry.
La répétition de <Control-Return> sélectionne l'item suivant qui répond au même motif (s'il en existe un).
Lorsque l'option state a la valeur picklist, l'appui sur une touche permet de sélectionner le prochain item qui commence par le caractère tapé.
La répétition de ce caractère sélectionne l'item suivant qui commencec par ce caractère (s'il en existe un).
 
 <Control-Return>  sélectionne le prochain item correspondant au motif
 <KeyPress>  sélectionne le prochain item commençant par le caractère

Des bindings supplémentaires permettent de copier l'item sélectionné dans le widget entry :
 
 <Return>  copie l'item sélectionné et ferme la liste
 <Double-1>
dans la liste
 copie l'item sélectionné et ferme la liste
 

   TELECHARGEMENT

Hugecombo.zip
 

   DISTRIBUTION

Version

La présente version est la version 1.1 du 29/03/2003.
Elle a été testée sous Windows 2000 avec Tcl/Tk 8.4.1.
Elle passe 98% des tests standards du widget entry (voir la section Incompatibilités pour les incompatibilités).
Elle est conçue pour être portable sur toutes les plate-formes supportées par Tcl/Tk.

Licence

Cette version est distribuée sous la licence NOL (No Obligation Licence).
(C) 2003, ulis

Remerciements

Ce travail n'aurait pas pu être accompli sans la conception originale de Tcl et Tk par John Ousterhout, le travail du Core Team et le support de tous les Tcler's.
Un GRAND merci à tous !

Bugs

Prière d'envoyer les rapports de bug et les demandes d'amélioration à ulis.

   BUGS CONNUS

Incompatibilités avec le widget entry

La Hugecombo passe 247 des tests du widget entry, ne passe pas 25 tests spécifiques (polices, UNIX) et échoue à 6 tests.
Liste des échecs :
 
  Type d'incompatibilité   Nombre   Cause
 test utilisant la sélection X  1  sous-widgets apparents
 test utilisant bgerror  1  sous-widgets apparents
 nom de la classe de binding  1  nom de la classe différent
 liste des opérations  2  opérations supplémentaires
 liste des options  1  options supplémentaires

Corrections et modifications

  Description   Détection   Correction
 publication officielle     v1.0 - 14/02/2003
 redimensionnement dynamique  Jorge Suit Perez Ronda - 27/02/2003  v1.0.1 - 01/03/2003
 -state picklist  Jorge Suit Perez Ronda - 12/03/2003  v1.1 - 29/03/2003