© Jean-Pierre ANGHEL - 2004
FOX + RUBY
=
FXRuby
Par l’exemple
Quelles
connaissances faut-il avoir ?
Présentation
des composants visuels.
Présentation
des aménageurs d'espace.
Les
fenêtres et tout ce qui va avec.
Les
commentaires et substitutions
Exemple
général sur les boutons.
Les boutons
avec flèches incorporées
Les
expressions conditionnelles
Le composant
"Boîte de texte" et divers gadgets :
Les boîtes
à lister, les répertoires :
Les
variables globales prédéfinies
Eh oui, encore un. Pourquoi ? parce qu' il y
a pléthore de bouquins pour les sujets connus et très peu sur les sujets peu …
porteurs, dirons-nous. Parce que le Français est généralement viscéralement
fermé à la langue anglaise, ce qui le prive de pas mal de connaissances et
d'évolutions (Combien ont arrêté de faire des macros sur le tableur de Monsieur
Bill depuis qu'elles sont en anglais ?) et que "le" livre sur le
sujet qui nous préoccupe est dans la langue de Shakespeare (c'est comme ça
qu'on dit et du coup on dirait que c'est ce brave homme qui a inventé l'anglais
!)
Faire découvrir un langage puissant et très
intéressant : Ruby, facilement mis en œuvre à l'aide d'une librairie graphique
également originale: Fox.
Qu'est-ce
que Ruby ?
Ruby est un
nouveau (pas tant que ça comme on le verra plus loin) langage de
programmation pour écrire de petits
(pas si petits comme on etc…) programmes appelés par les anglais des scripts. C'est un langage interprété.
C'est aussi un langage totalement orienté objet. C'est un langage qui a été
porté sur de nombreuses plates-formes. Et c'est enfin un langage entièrement gratuit.
Qu'est-ce que Fox ?
Fox
est un outil de développement graphique construit en C++. Il offre un large
éventail de contrôles et autres composants graphiques. Il a aussi été porté sur
nombre de plates-formes et se remarque par sa rapidité et sa facilité
d'utilisation. Et c'est de plus une interface entièrement gratuite.
A qui s'adresse ce livre ?
A ceux qui ont tout de même quelques rudiments
de programmation. A tous ceux qui veulent écrire de courts programmes, qui
veulent apprendre la programmation OO (orientée objet) en utilisant une
interface graphique, qui ne veulent pas enrichir encore plus Monsieur
Bill, qui n'ont pas de budget à
consacrer à un énième langage "visuel" ou qui ne veulent pas pirater (si, si , y'en a !) etc… Les chevronnés
n'apprendront certainement pas grand-chose, voire rien du tout, mais celui qui
est interessé par les "bidouilles" sur son ordinateur et ne sait
comment les faire y trouvera une réponse. A propos de bidouille, une question à
ceux qui programment : comment feriez-vous pour remplacer la chaîne
"truc" par la chaîne "machin" dans tous les fichiers d'un
même répertoire, munis des extensions "c" et "h" et
sauvegarder les anciens fichiers avec l'extension '.bak' ? Voici le résultat
tel qu'il est présenté dans le guide de l'utilisateur Ruby :
ruby -i.bak -pe 'sub
"truc","machin"' *.[ch]
Ruby ça "marche" sur quoi ?
Ruby fonctionne à peu près sur toutes les
plates-formes. MSDOS, Windows 9x, OS2, Unix, Mac (livré avec l'OS). Et sur
Linux . Ce qui est encourageant pour les petits budgets du paragraphe précédent
: ils peuvent avoir l' OS et les programmes pour pas un sou. En parlant de
petit budget les enseignants vont certainement se reconnaître, mais tant pis
(ou tant mieux !). Ce qui ne veut pas dire d'ailleurs que Ruby, Fox etc.. soient en quelque sorte l'informatique
du pauvre. Loin de là cette idée car, comme vous le verrez en l'étudiant, il
n'a absolument rien à envier, mais alors rien du tout, aux autres langages payants.
Et en conclusion de cette introduction,
comme il est certain qu' un langage
dédié uniquement au "script" n'intéresserait que des spécialistes, il
est urgent de dire que Ruby est accompagné de deux interfaces graphiques, Tcl/Tk et Fox, qui permettent de faire (presque) du Visual machin-chose. Et
comme on ne peut pas tout faire, ce livre est axé sur la programmation Ruby avec Fox, sous Windows.
Les langages Perl,
Python, Smalltalk existaient déjà et Ruby est un peu un mélange de tout ça, en mieux ça va de soi.
Ruby est né au Japon en 1993 des envies d'un programmeur d'avoir un langage "à sa main" dirons-nous. Yukihiro Matsumoto est son nom (Matz pour les intimes). Il aura fallu attendre trois ans pour que ce langage prenne forme et se développe au Japon. Il faudra encore attendre quelques années pour qu' il soit traduit en anglais, et l'an 2000 pour un premier livre occidental. Et en français il n'y en a qu'un , celui de chez O'Reilly "Ruby in a nutshell" (encore de l'anglais !, mais uniquement dans le titre heureusement).
Pourquoi le nom de Ruby ? tout simplement parce
qu'il existait déjà Perl … astucieux n'est-il pas?
L'interface graphique Tcl/Tk existait sur de nombreuses plates-formes jusqu'à ce que Jeroen van der Zijp se dise in petto (il y a de l' anglais partout, je peux bien mettre un peu d'italien, non ?), que cette extension graphique avait vieilli et qu'il était temps d'en construire une autre portable sur toutes les plates-formes. Ce qu'il fit et fort bien en créant Fox sur une idée qui naquit au printemps de 1997. Fox est une librairie graphique développée en C++ pour rendre la programmation simple, efficace et indépendante de la plate-forme. Deux des aspects les plus spectaculaires de cette librairie se situent d'une part dans la communication directe entre composants et d'autre part dans le gestionnaire d'arrangement des composants entre-eux et dans une fenêtre, sans précison de coordonnées.
Lyle Johnson adapta Fox à Ruby, et continue d'ailleurs à le faire, pour le bonheur de tous.
La plupart des exemples de ce livre sont inspirés
des programmes en anglais disponibles sur le Net. Mais comment expliquer le
fonctionnement d'un bouton si ce n'est en en créant un tout seul dans une
simple fenêtre ? Hormis les titres en français, le code est évidemment le même
pour la suite.
Ruby pour
Windows est disponible sur Internet sur le site suivant : http://www.pragmaticprogrammer.com/ruby/downloads/ruby-install.html
Dans la version Windows le fichier s'installe automatiquement. A noter que sur NT, 2000 et XP il faut se loger en administrateur pour renseigner le chemin d'accès (le 'path' anglais)
Le site officiel de ruby est http://www.ruby-lang.org
Pour des informations supplémentaires voir sur http://www.rubycentral.com
Comme livre il n'existe à ce jour, en dehors de
celui cité plus haut, que la "bible" de David Thomas et Andrew Hunt :
"Programming Ruby : The Pragmatic Programmer's Guide" chez
Addison-Wesley. Disons aussi que ce livre est en accès libre sur Internet sur http://www.pragmaticprogrammer.com/ruby/downloads/book.html
Tout ceci est évidemment, et malheureusement, en
anglais.
Avec celui
que l'on veut, mais il vaut mieux en avoir un qui reconnaîsse la syntaxe, les
mots clefs de Ruby comme Scite qui
fonctionne sous Windows. De plus lui aussi est non seulement gratuit mais
dispose d' une multitude de langages. Vraiment inutile de s'en priver.
Scite est d'ailleurs fourni avec la distribution
Windows précédemment citée.
En dehors
de l'éditeur de texte pour taper des programmes entiers, il y a la possibilité de se servir de IRB (Interactive ruby), un utilitaire
en ligne de commande. IRB est très utile pour tester quelques lignes de code
sans utiliser le mode graphique, Ruby fonctionne alors dans une fenêtre DOS.
IRB est bien entendu fourni avec la distribution de Ruby pour Windows.
Il vaut
mieux connaître un langage objet classique. Si on programme déjà dans un des
langages de "script" cités plus haut, ou bien avec C++, pas de problèmes d'adaptation . Si on vient
de Pascal ou de Delphi, ça sera un peu plus dur mais rien d'insurmontable
surtout avec les composants visuels de Fox.
Outre le
fait que Ruby et Fox soient gratuits, il existe un autre avantage, énorme, qui
est celui de la stabilité. En effet sont disponibles sur le Net les versions
stables ainsi que celles à l'essai pour
les bêta-testeurs ou les curieux. Les versions en cours de modification sont
les versions dont le deuxième chiffre est impair. La version en cours au moment
de la rédaction du présent ouvrage est la 1.8 qui est "vieille" d’un an environ. C'est tout de même un
avantage énorme d'avoir un logiciel garanti sans bogues, ou tout du moins dans le domaine du raisonnable.
Evidemment ceci n'est malheureusement possible qu'avec des logiciels libres,
les lois du marché étant impitoyables et stupides : achèteriez-vous le dernier
modèle de voiture uniquement pour la frime, si vous deviez sortir la boîte à
outils à tous les feux rouges à cause d'un bogue dans le moteur ? Mais le monde
est ainsi fait et les gens continueront d'acheter la dernière version mise sur
le marché par monsieur Bill, parce qu'on leur a fait croire qu'elle est encore
meilleure que la précédente. Et les mêmes paieront sans barguigner les
rectificatifs et corrections de bogues un mois plus tard…
D'accord, on
appelle ça maintenant des "widgets" (de 'Windows' et 'gadgets'). Ca
fait bien, très à la page, et ça fait nager le débutant pendant quelque temps
jusqu'à ce qu' un initié ou un magazine lui dévoile le secret. De toutes façons
ne dites pas à un bouton qu'il n'est
qu' un simple gadget, il ne vous répondra même pas.
Nous verrons donc dans les chapitres suivants les
composants visuels de Fox un à un, mais commençons donc par les présentations:
Les fenêtres
Les cadres
Les boutons
Les cases à cocher
Les boutons radios
Les canevas
Les potentiomètres
Les boîtes de dialogue
Les fenêtres MDI (Multiple Documents Interface)
Les fenêtres modales ou non
Les boîtes à grouper
Les boîtes de saisie
Les onglets
Les feuilles de calcul
Etc...etc...
Tout au long de cet ouvrage vont alterner les
présentations de composants visuels et
le B.A. BA de Ruby. Car il va de soi que si Ruby peut fonctionner sans FOX,
l'inverse n'est pas vrai.
Nous avons dit plus haut qu'il n'était pas nécessaire de préciser les coordonnées des composants dans une fenêtre ou à l'intérieur d'un autre composant, comme c'est le cas dans d'autres langages ou interfaces graphiques. En effet, la programmation visuelle était une révolution mais le programmeur passe son temps à aligner ses composants, le plus souvent au pixel près, et l'utilisateur peut tout démolir en choisissant une autre fonte par exemple. Dans Fox ce sont les gestionnaires d'aspect qui se chargent de tout ce travail, à l'aide de quelques constantes indiquant la position souhaitée, et le résultat visuel est plus que satisfaisant comme vous allez le voir bientôt. Il est bien évident que si l'utilisateur redimensionne l'image, l'aspect restera le même pour tous les composants.
·
FXPacker . L' "emballeur" place
ses composants enfants (c'est à dire ceux qui vont dépendre de lui pour
l'emplacement et les commandes) dans son rectangle intérieur en se débrouillant
pour les placer le long de ses quatre côtés.
·
FXTopWindow . C'est
la fenêtre toute simple qui fonctionne comme le composant ci-dessus mais en
respectant les commandes de placement des composants. Pour de simples dialogues
ou sous-fenêtres, c'est le composant le
plus simple.
·
FXHorizontalFrame . C'est
un cadre qui place ses enfants de la gauche vers la droite, ou inversement. Les
composants s'afficheront suivant l'ordre de leur déclaration dans le programme.
·
FXVerticalFrame . La
même chose que le composant horizontal, mais en vertical.
·
FXMatrix . La
matrice place ses enfants en lignes et colonnes.Elle peut travailler soit comme
orienté-colonnes, soit orienté-lignes, le deuxième cas étant la normale.
·
FXGroupBox. Il
est comme FXPacker, mais offre en plus un élégant cadre autour de ses enfants
avec un titre optionnel. Si les enfants sont des boutons-radio il n'en accepte
qu'un de coché à la fois.
·
FXSplitter . Le "diviseur"
divise un espace en deux parties, horizontalement ou verticalement et permet à
l'utilisateur d'agrandir l'une d'elles.
On trouvera en annexe B la description des constantes de présentation pour
tous ces gestionnaires.
A tout seigneur tout honneur, la fenêtre est reine. Où mettre des composants si ce n'est dans une fenêtre. Commençons donc par la fenêtre toute simple et par un exemple tout aussi simple pour ne pas effaroucher le futur utilisateur.
***************************************************************************
1-
require 'fox'
2-
include Fox
3-
monApp = FXApp.new
4-
maFenetre = FXMainWindow.new(monApp, "Coucou",
nil,nil,DECOR_ALL,0,0,200,20)
5-
monApp.create
6-
maFenetre.show
7-
monApp.run
***************************************************************************
Explications
:
Ligne 1 : on indique que la librairie graphique Fox
est nécessaire.
Ligne 2 : n'est pas obligatoire, mais permet d'avoir
disponibles tous les noms déclarés dans le module Fox.
Ligne 3 : une instance d' application est créée par
appel de la méthode new.
Ligne 4 : on crée une instance de fenêtre et on lui passe en paramètre le nom de l'application (une variable pointeur) , le texte entre guillemets devant figurer sur le bandeau supérieur de la dite fenêtre ici, "Coucou" . Viennent ensuite 3 autres paramètres dont nous parlerons plus tard. Puis le point d'ancrage de la fenêtre, ici x=0 et y=0, donc la fenêtre est en haut à gauche de l'écran, les coordonnées débutant effectivement à cet endroit-là. Enfin 2 autres nombres qui sont la largeur et la hauteur de la fenêtre en pixels.
Ligne 5 : on
crée l'application elle-même.
Ligne 6 : par défaut toutes les fenêtres en FXRuby
sont invisibles, il nous faut donc montrer maFenetre, ce que fait la méthode
.show.
Ligne 7 : il n'y a plus qu'à lancer en appelant la
méthode 'run' qui va boucler jusqu'à ce que l'on quitte le programme : et que
ça roule !…
Si
tout a bien fonctionné vous obtenez une image semblable à celle-ci :
Fig 1 - Coucou1.png
Vous
remarquerez que pour une fois il n'y a pas de "Hello, world", ça
change…
Vous remarquerez aussi que la petite fenêtre est
ancrée dans le coin supérieur gauche de l'écran, peut-être même l'avez-vous
cherchée si la définition de votre écran est importante. Pas de panique, nous
verrons ce que l'on peut faire.
Il n'y a pas grand chose d'autre à dire pour le moment si ce n'est qu' une grosse partie des initialisations de constantes est faite dans la classe FXWindow.
La
version complète de la méthode 'new' est la suivante :
FXMainWindow.new(app, title, icon=nil,
miniIcon=nil, opts=DECOR_ALL,
x=0, y=0, width=0, height=0, padLeft=0,
padRight=0,
padTop=0, padBottom=0, hSpacing=4, vSpacing=4)
Les
paramètres 'app' et 'title' désignent respectivement un pointeur sur
l'application et le titre de la fenêtre. Les autres paramètres sont facultatifs,
nous en parlerons plus loin.
Tout
d'abord, posons-nous la question de savoir ce qu'est un objet.
"Objets inanimés avez vous donc une âme ?"
En programmation non seulement les objets ne sont
pas forcément inanimés mais ils savent faire de naissance beaucoup de choses,
comme se déplacer, tourner, se cacher, réapparaître etc.. à condition toutefois
qu'on leur dise quoi faire, sinon ils ne font rien…
Imaginez un bloc de code dans lequel se trouvent des données modifiables (des variables) et du code actif sous forme de procédures ou de fonctions pour agir sur ces données. Et bien le tout forme ce qu'on appelle un "objet". Histoire de changer et bien marquer la différence avec la programmation procédurale, les variables deviennent des "Attributs" en Ruby (et "Propriétés" dans d'autres langages), les procédures et les fonctions se réunissent et deviennent des "Méthodes". Bref tout ce bloc de code se retrouve dans une zone mémoire et n'en bouge plus, mais tout est là prêt à l'action. Imaginons que nous ayons un objet "Tasse". Contrairement à votre tasse du petit déjeuner, qui ne sait pas faire grand chose d'elle même, celle-ci a été dotée de méthodes lui permettant par exemple de se déplacer, de se renverser etc… et d'attributs lui indiquant sa capacité, sa température maximale d'utilisation, sa couleur etc… Mais un tel objet n'est en quelque sorte qu'un modèle, une matrice inopérante, une 'Classe'. Pour utiliser un tel objet il faut passer par son clône, qu'on appelle 'instance', une copie "vivante" en quelque sorte, mise au monde par la méthode 'new'. Pour indiquer l'utilisation de tel ou tel attribut ou bien de telle ou telle méthode, nous indiquons le nom de l'instance suivit d'un point puis du nom de l'attribut ou de la méthode :
maTasse = tasse.new # création de l'instance
maTasse.couleur=rouge
# attribution de la couleur à l'attribut 'couleur'
maTasse.tourne(90) # ordre de tourner de 90 degrés.
En Ruby il
n'y a pas de déclaration préalable de variables. Ces dernières ne sont pas
typées, c'est à dire n'acceptant qu'un seul type de données. La mémoire est
gérée automatiquement, si un objet est détruit il n'est pas nécessaire de
libérer la mémoire.
En Ruby tout est objet (y compris un simple nombre). Bien entendu on peut créer ses propres objets, et les faire "descendre" d'un objet existant. Le nouvel objet va hériter des attributs et méthodes de son ascendant.
Un module
est une partie de code qu'on ne charge en mémoire que si nécessaire, sauf bien
entendu les modules qui font tourner la mécanique et sont chargés d'office.
'require'
est une méthode du module 'kernel', c'est à dire du noyau même de Ruby, qui
indique que le module dont le nom suit est obligatoire.
Nous avons vu que pour créer une instance d'objet il fallait faire appel à la méthode 'new'; en FXRuby il y a une distinction faite entre l'instanciation d'un objet et sa création dans le système. Pour créer l'objet Windows associé à l'objet FXRuby déjà construit, nous appelons la méthode 'create'.
Pour ceux
qui ont commencé à programmer en Pascal disons qu'une 'Classe' est tout
simplement une déclaration de 'Type',
une 'instance' équivaut à une variable ('Var'), un objet c'est un
'Record' dans lequel on a mis des procédures et des fonctions, 'require'
remplace la clause 'Uses', et enfin un module ressemble fort à une 'Unit'.
Les boutons et autres composants
qui vont avec.
Une fenêtre sans rien qui bouge à l'intérieur, c'est à dire quelque chose d'actif, ce n'est pas très pratique, ni très utile. Nous allons donc lui rajouter un bouton.
***************************************************************************
1-
require 'fox'
2-
include Fox
3-
monApp = FXApp.new
4-
maFenetre = FXMainWindow.new(monApp, "Coucou2",nil,nil,DECOR_ALL,0,0,200,20)
4 bis - monBouton =
FXButton.new(maFenetre, "Cliquez donc
ici !")
5-
monApp.create
6-
maFenetre.show
7-
monApp.run
***************************************************************************
Il suffit de rajouter une instance de bouton en ligne 4bis en lui passant en paramètres 'maFenetre' et l' intitulé du bouton. Et comme de cliquer dessus ne produit aucun effet, il ne reste qu' à rajouter une commande :
4 ter -
monBouton.connect(SEL_COMMAND) {exit}
Même les plus réfractaires à l' anglais auront
compris qu'avec le mot 'exit' , le bouton vous fait tout quitter. Alors
contemplez-le bien , avant de cliquer dessus comme il vous y invite.
Fig 2 - Coucou2.png
Ouais, mais moi j' ai l'habitude d'avoir une icône
sur mon bouton ! c'est plus joli !
D'accord, d'accord on y va :
***************************************************************************
1- require 'fox'
2- include Fox
3- monApp = FXApp.new("Coucou3", "FoxTest")
4- main = FXMainWindow.new(monApp, "Hello", nil, nil, DECOR_ALL)
# Charge une icône .PNG qui sera attachée au bouton. Notons que le second
# argument de la méthode .new nécessite seulement un flux d'octets (par
# exemple une chaîne); ici nous lisons les octets à partir d'un fichier sur
# le disque.
5- icon = FXPNGIcon.new(monApp, File.open("fox.png", "rb").read)
# On construit le bouton en tant qu'enfant de la fenêtre principale.
6- FXButton.new(main, "&Coucou!\tOllé, FOX c'est super!\nCliquez sur l'icone pour quitter 'monApp'.", icon, monApp, FXApp::ID_QUIT, ICON_UNDER_TEXT|JUSTIFY_BOTTOM)
7- FXTooltip.new(monApp)
8- monApp.create
9- main.show(PLACEMENT_SCREEN)
10- monApp.run
***************************************************************************
Ouh là là, tout a changé. Mais non, pas tant que ça,
et puis nous ne sommes pas là pour rigoler. Voyons les changements :
·
Ligne
3 : on découvre que les paramètres de FXApp.new sont facultatifs. Le premier
désigne le nom de l'application et le second la clef vendeur, c'est à dire le
copyright ou tout ce que vous voulez. Ces deux chaînes sont en relation avec la
partie de la base de registres Windows dédiée à Fox . Nous y reviendrons plus
loin.
· Ligne 4 : là aussi 2 nouveautés : le point d'ancrage et les dimensions de la fenêtre ne sont plus là. La fenêtre va se dimensionner automatiquement en fonction de son ou ses occupants, ici le bouton qui lui-même s'autodimentionnera en fonction des dimensions de l'image. Les deux 'nil' sont là pour signifier qu'il n'y a ni icône ni petite icône, mais par contre une option : DECOR_ALL qui signifie all of the above.
·
Ligne
5 : on charge une image à partir d'un fichier .png. Le paramètre "rb" n'a rien à voir avec l'extension
des fichiers Ruby. Voir plus loin dans "Un peu de Ruby".
·
Ligne
6 : là, on s'accroche :
- 1er paramètre,
on attache le bouton à la fenêtre. Le 'main' de la ligne 4.
- 2ème
paramètre le titre et dans la foulée, suivant le " \t" (de
tabulation), le texte d' une info- bulle.
- 3ème
paramètre le pointeur de l' icône du bouton.
- 4ème
paramètre le pointeur de l'application,
- et 5ème
paramètre la commande liée au bouton, passée ici directement avec l'objet dont
il dépend. Le signe '&' (esperluette pour les gens calés) précédant le 'C'
du mot Coucou, introduit un raccourci clavier pour le bouton, et l'appui
simultané des touches 'CTRL ' et 'c' équivaudra à un clic de souris sur le
bouton.
·
Ligne
7 : C'est ici qu'on fait la bulle, tool tip en anglais. L' info-bulle va
apparaître sous le curseur de la souris, à condition évidemment de laisser
celui-ci immobile une seconde au dessus du bouton.
Avez-vous remarqué qu'autrefois, lorsque les
ordinateurs étaient en mode texte, il y avait des intitulés dans des menus
déroulants (déroutants ?). Puis le mode graphique est arrivé avec son cortège
d'icônes plus ou moins explicites, plutôt moins d'ailleurs puisqu'on a jugé
indispensable de leur donner une explication supplémentaire à l'aide de 26
icônes connues depuis quelques années déjà et qui ont pour nom l'alphabet… Fox
résoud ce problème en rendant possible l'affichage d'une info-bulle explicative
sur chaque composant visuel et/ou par un affichage au bas de l'écran.
·
Ligne
9 : un paramètre de plus et on a la fenêtre au milieu de l'écran. C'est pas
beau ça ?
Le paramètre
en question est déclaré dans FXTopWindow qui a pour héritier FXMainWindow. Voir
annexe 'A' pour les détails.
Et comme résultat nous avons la figure suivante :
Fig 3 - Coucou3.png
A remarquer tout de même que le bouton est en fait l'image toute entière et ce parce que nous n'avons pas donné de dimensions particulières ni à la fenêtre ni au bouton dans leur initialisation.
Bref vous
vous êtes aperçu que certain paramètres sont facultatifs. Bravo, vous avez bien
deviné. La version intégrale se presente comme suit :
FXButton.new(parent, text, icon=nil,
target=nil, selector=0, opts=BUTTON_NORMAL, x=0, y=0, width=0, height=0,
padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD, padTop=DEFAULT_PAD,
padBottom=DEFAULT_PAD)
Les
valeurs des paramètres portés dans la présentation ci-dessus sont des valeurs
par défaut.
DEFAULT_PAD
valant zéro.
Allez ! On va décortiquer tout ça paramètre par paramètre :
1-
'parent'
: C'est le parent. Généralement un cadre, lui-même fils d'un autre cadre ou
d'une fenêtre.
2-
'text'
: Le titre du bouton. En faisant précéder une lettre du caractère"&", on crée un raccourci
clavier. Par exemple "&Cliquez ici" souligne la lettre 'C' sur le
bouton et permet le raccourci 'Ctrl_C'. La tabulation "\t" en FXRuby
permet d'insérer le texte de l' info-bulle d'explication dans la foulée. Une
autre tabulation permet d'afficher une aide différente dans la barre d'état.
3-
'icon'
: Un pointeur vers un dessin.
4- 'target'
: La cible d'un éventuel message.
5-
'selector' : Soit on indique ici le message destiné à être émis par le
bouton, par exemple "FXApp::ID_QUIT"
soit on indique '0' (zéro) et on utilise la méthode 'connect', si par
exemple il y a un traitement supplémentaire à faire. Voir à ce sujet la
description du module Responder2.
6- 'opts' : Les options d'apparence et de
positionnement du bouton. Voir les constantes prédéfinies déclarées dans
FXWindow.
7 et 8 - coordonnées 'x' et 'y' du coin supérieur
gauche.
9 - 'width' : largeur du bouton.
10 - 'height' : hauteur du bouton.
11 à 14 - Comme dans FXMainWindow, il s'agit de la
largeur du passe-partout, largeur variable selon le côté. Le moyen le plus
efficace pour comprendre "comment ça marche", c'est d'essayer.
Ajoutez donc les paramètres d'ancrage et de dimensions dans la fenêtre
principale, avec une valeur nulle, et ceux du passe-partout : …DECOR_ALL,
0,0,0,0,10,10,10,10). Si vous avez bien suivi vous obtenez un passe-partout de
10 pixels de large. Nous pouvons faire de même avec le passe-partout de 'main',
les deux étant indépendants, les valeurs s'ajoutant entre elles.
Vous avez
sans aucun doute compris que les commentaires en Ruby se font à la suite d'un
caractère '#'. C'est exact. Il y a une autre façon de faire, pour les blocs de
texte qui comportent plusieurs lignes, qui consiste à commencer une ligne par
'=begin' et terminer le texte par une ligne '=end'.
En dehors
de la tabulation il existe d'autres substitutions précédées du caractère '\'
dans une chaîne de caractères délimitée par l'apostrophe double ("chaîne").
Ils viennent en majorité d'un héritage de l'utilisation autrefois des 20
premiers codes ASCII sur télétype :
\a : la sonnerie (Bell)
\b : retour arrière (Backspace)
\e : échappement (Escape)
\f : (Formfeed)
\n : changement de ligne (Newline ou
LineFeed)
\r : retour chariot (Return)
\s : espace (Space)
\t : tabulation (Tab)
\v : tabulation verticale (Vertical tab)
\nnn : nnn en octal
\xnn : nn en hexadécimal
\cx
: contrôle-x
\C-x : contrôle-x
\x : x
#{expr}
: valeur de expr
A noter aussi que pour afficher un caractère de contrôle dans une chaîne, il faut le faire précéder du caractère '\'. Ex : ' " ' qui délimite une chaîne, nécessite pour être imprimé dans une chaîne d'être comme ceci : ' \" ' . Et '\\' affiche donc '\'.
Il existe
aussi une syntaxe particulière en entrée pour les chaînes, tableaux et
expressions rationnelles. Tous ces littéraux débutent par le signe '%' suivi
d'un simple caractère identifiant le type de littéral.
%q chaîne entre apostrophes simples (').
%Q chaîne entre apostrophes doubles
(").
%w tableau de chaînes.
%r expression rationnelle (regular
expression).
%x ligne de commande (Shell command)
Dans la
lecture du fichier .PNG nous avons vu qu'il y avait passage de deux paramètres
dans 'file.open(…)'. Le premier est le nom du fichier, le deuxième
("rb") un des modes d'ouverture décrit dans le tableau ci-dessous :
Mode |
Signification |
``r'' |
En lecture seulement, démarre au début du fichier (mode par défaut). |
``r+'' |
En lecture / écriture, démarre au début du fichier. |
``w'' |
En écriture seulement, tronque le fichier existant à une longueur de zéro ou bien crée un nouveau fichier pour écrire. |
``w+'' |
En lecture/écriture, tronque le fichier existant à une longueur de zéro ou bien crée un nouveau fichier pour lire et écrire. |
``a'' |
En écriture seulement, démarre à la fin du fichier existant, sinon crée un nouveau fichier pour écire. |
``a+'' |
En lecture/écriture, démarre à la fin du fichier existant, sinon crée un nouveau fichier pour lire/écire. |
``b'' |
(DOS/Windows seulement) Mode fichier binaire (peut être joint à un des modes ci-dessus). |
Pour se rendre compte de l'aspect et du fonctionnement des divers boutons, rien de tel qu'un (bon) exemple. Alors allons-y avec "boutons.rbw" dont le listing suit :
***************************************************************************
require 'fox'
include Fox
class BoutonsWindow < FXMainWindow
def initialize(app)
# Appelle la classe de base
super(app, "Bouton Test", nil, nil, DECOR_ALL, 100, 100, 0, 0)
# Crée le gestionnaire de bulles
FXTooltip.new(self.getApp())
# Barre de statut
statusbar = FXStatusbar.new(self,
LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
statusbar.statusline.normalText="Prêt"
# Contrôles à droite
controls = FXVerticalFrame.new(self,
LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH)
# Séparateur vertical
FXVerticalSeparator.new(self,
LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y|SEPARATOR_GROOVE)
# Contenant
contents = FXHorizontalFrame.new(self,
LAYOUT_SIDE_LEFT|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH,
0, 0, 0, 0, 20, 20, 20, 20)
# Construit une image en la chargeant depuis le disque
bigpenguin = loadIcon("bigpenguin.png")
# Le bouton
@button = FXButton.new(contents,
"&Ceci est un label multi-ligne\nun bouton pour montrer\n" +
"les possibilités de l'objet bouton.\t" +
"C'est aussi une info-bulle\n(qui peut aussi être multi-ligne).\t" +
"Ici un message d'aide pour la ligne de statut.",
bigpenguin,nil, 0,
FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|
LAYOUT_FIX_HEIGHT,0, 0, 300, 200)
checkButton = FXCheckButton.new(controls, "Style Toolbar \tCool style boutons \"poppy\"")
checkButton.connect(SEL_COMMAND) { |sender, sel, checked|
if checked
@button.buttonStyle |= BUTTON_TOOLBAR
@button.frameStyle = FRAME_RAISED
else
@button.buttonStyle &= ~BUTTON_TOOLBAR
@button.frameStyle = FRAME_RAISED|FRAME_THICK
end
}
group1 = FXGroupBox.new(controls, "Placement Horizontal",
GROUPBOX_TITLE_CENTER|FRAME_RIDGE)
FXRadioButton.new(group1, "Avant le texte").connect(SEL_COMMAND) {
@button.iconPosition =
(@button.iconPosition|ICON_BEFORE_TEXT) & ~ICON_AFTER_TEXT
}
FXRadioButton.new(group1, "Après le texte").connect(SEL_COMMAND) {
@button.iconPosition =
(@button.iconPosition|ICON_AFTER_TEXT) & ~ICON_BEFORE_TEXT
}
FXRadioButton.new(group1, "Centré").connect(SEL_COMMAND) {
@button.iconPosition =
(@button.iconPosition & ~ICON_AFTER_TEXT) & ~ICON_BEFORE_TEXT
}
group2 = FXGroupBox.new(controls, "Placement Vertical",
GROUPBOX_TITLE_CENTER|FRAME_RIDGE)
FXRadioButton.new(group2, "Au dessus du texte").connect(SEL_COMMAND) {
@button.iconPosition =
(@button.iconPosition|ICON_ABOVE_TEXT) & ~ICON_BELOW_TEXT
}
FXRadioButton.new(group2, "Sous le texte").connect(SEL_COMMAND) {
@button.iconPosition =
(@button.iconPosition|ICON_BELOW_TEXT) & ~ICON_ABOVE_TEXT
}
FXRadioButton.new(group2, "Centré").connect(SEL_COMMAND) {
@button.iconPosition =
(@button.iconPosition & ~ICON_ABOVE_TEXT) & ~ICON_BELOW_TEXT
}
group3 = FXGroupBox.new(controls, "Justification horizontale ",
GROUPBOX_TITLE_CENTER|FRAME_RIDGE)
FXRadioButton.new(group3, "Centré").connect(SEL_COMMAND) {
@button.justify &= ~JUSTIFY_HZ_APART
}
FXRadioButton.new(group3, "Gauche").connect(SEL_COMMAND) {
@button.justify = (@button.justify & ~JUSTIFY_HZ_APART) | JUSTIFY_LEFT
}
FXRadioButton.new(group3, "Droite").connect(SEL_COMMAND) {
@button.justify = (@button.justify & ~JUSTIFY_HZ_APART) | JUSTIFY_RIGHT
}
FXRadioButton.new(group3, "A part").connect(SEL_COMMAND) {
@button.justify |= JUSTIFY_HZ_APART
}
group4 = FXGroupBox.new(controls, "Justification verticale",
GROUPBOX_TITLE_CENTER|FRAME_RIDGE)
FXRadioButton.new(group4, "Centré").connect(SEL_COMMAND) {
@button.justify &= ~JUSTIFY_VT_APART
}
FXRadioButton.new(group4, "Haut").connect(SEL_COMMAND) {
@button.justify = (@button.justify & ~JUSTIFY_VT_APART) | JUSTIFY_TOP
}
FXRadioButton.new(group4, "Bas").connect(SEL_COMMAND) {
@button.justify = (@button.justify & ~JUSTIFY_VT_APART) | JUSTIFY_BOTTOM
}
FXRadioButton.new(group4, "A part").connect(SEL_COMMAND, method(:onCmdJustVerApart))
quitButton = FXButton.new(controls, "&Quitter", nil, nil, 0, FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X)
quitButton.connect(SEL_COMMAND) {
getApp().exit(0)
}
end
def onCmdJustVerApart(sender, sel, ptr)
@button.justify |= JUSTIFY_VT_APART
end
def loadIcon(filename)
FXPNGIcon.new(getApp(), File.open(filename, "rb").read)
end
def create
super
show(PLACEMENT_SCREEN)
end
end # fin d'initialize
def run
# Construit une application
application = FXApp.new("Bouton", "FoxTest")
# Construit la fenêtre principale
BoutonsWindow.new(application)
# Crée l'application
application.create
# Lance l'application
application.run
end
run
***************************************************************************
Décortiquons un peu tout cela. L'exemple, dont on voit le résultat ci-après, montre une fenêtre partagée verticalement en deux parties. Celle de gauche contient un gros bouton test qui va changer d'allure suivant l'état des boutons radios situés dans la partie droite. En un seul exemple nous allons donc voir toutes (ou presque) les possibilités des boutons sous FXRuby.
·
On
crée tout d'abord une nouvelle classe qui descend de 'FXMainWindow'. Toute fenêtre un tant soit peu compliquée
est plus facilement exploitable en dérivant d'une classe ancêtre.
·
La
méthode 'initialize' est une méthode qui est appelée automatiquement après l'appel de 'new', avec les paramètres
éventuels du dit 'new'. Elle permet donc d'y inclure tous les traitements que
l'on souhaite, ici pratiquement toute la description de la fenêtre. Cette
méthode doit être redéfinie dans les sous-classes.
· A l'intérieur du corps d'une méthode, un appel à 'super' agit exactement comme un appel à la méthode portant le même nom de l'objet ancêtre. S'il n'y a pas de paramètres fournis, ce seront les valeurs par défaut des paramètres de l'ancêtre qui seront utilisés.
super [ ( [
param
]*
[*array
] ) ] [
block
]
·
FXToolTip.new crée le gestionnaire des info-bulles.
Remarquons le passage du paramètre : 'self' représente la classe elle-même et
renvoie donc le pointeur de l'application par la méthode 'getApp'.
·
Sont
ensuite créées les variables représentant les divers composants nécessaires à
la construction de notre fenêtre exemple. A savoir dans l'ordre d'apparition
dans le programme :
Statusbar : la ligne de statut munie d'un coin de dragage (STATUSBAR_WITH_DRAGCORNER).
Après sa création, on modifie le texte par
défaut qui s'affiche dans la barre de statut. En lieu et place du
"Ready" anglais, nous mettons le "Prêt" français.
Controls : le cadre à droite contenant les boutons de réglage.
Contents : le cadre à
gauche contenant le gros bouton de test.
bigpenguin : l'icône du gros
bouton. Ici il est fait appel à la méthode 'loadIcon()'. Pour une icône à
charger, cela ne nécessite pas en fait de faire une méthode spécifique, mais
comme nous le verrons plus loin, s'il y en a plusieurs, la création d'une telle
méthode évite la répétition de code.
@button : le gros bouton de test(voir plus loin "Un
peu de Ruby").
Checkbutton : la case à cocher
indiquant si le gros bouton doit avoir une apparence normale ou bien
l'apparence d'un bouton de barre d'outils c'est à dire sans cadre apparent, le
cadre devenant visible lorsque le curseur de la souris passe dessus. A noter la
condition 'if… else… end' dans la
méthode 'connect'. A remarquer aussi le raccourci d'affectation (voir aussi
plus loin "Un peu de Ruby") :
@button.buttonStyle |=
BUTTON_TOOLBAR
qui
équivaut à @button.buttonStyle =
@button.buttonStyle |BUTTON_TOOLBAR
On voit pour la première fois l'utilisation de fonctions logiques et de comparaison de nombres bit à bit :
& pour le "ET" logique .
| pour le
"OU" logique.
~ pour obtenir le complément d'un nombre.
Group1,
group2, group3, group4 : les boîtes de
groupe, FXGroupBox, englobant les différents boutons radio, FXRadioButton.
QuitButton : le
bouton habituel pour quitter l'application.
·
Remarquez
dans le groupe 4, la puissance des raccourcis avec Ruby dans la création du
dernier bouton :
FXRadioButton.new(group4,
"Apart").connect(SEL_COMMAND,
method(:onCmdJustVerApart))
Dans la
foulée on fait "Objet.new.connect". Le passage de paramètres se faisant
par
l'appel d'une méthode déclarée
plus loin dans la définition de la classe.
·
Quelques
précisions sur la façon de faire passer les messages :
La
plupart des objets FOX envoient des messages qui ont quatre éléments importants
:
1.
L'expéditeur
du message est l'objet qui envoie le message. Dans ce cas l'instance de
FXButton est l'expéditeur 'sender'.
2.
Le
type de message est une constante entière prédéfinie qui indique quelle sorte
d'événement a eu lieu (c'est à dire le but de l'envoi du message). Dans ce cas
le type du message est 'SEL_COMMAND', qui indique que la commande associée à ce
composant doit être invoquée.
3.
L'identifiant
du message est une autre constante entière qui est utilisée pour différencier
les messages de même type. Par exemple le message qui rend visible une fenêtre
est un message 'SEL_COMMAND' avec l'identifiant FXWindow::ID_SHOW (où ID_SHOW est une constante définie dans la
classe FXWindow ). Un identifiant différent,
FXWindow::ID_HIDE, appelle une instance de FXWindow pour la rendre
invisible.
4.
La
donnée du message est un objet contenant une information spécifique. Si
l'expéditeur n'est pas utile, ni les données, on peut alors utiliser le
raccourci que nous avons vu dans l'exemple en début de chapitre.
FXRuby utilise une syntaxe inspiré de GTK (l'autre
interface graphique de Ruby). On peut attacher, comme nous venons de le voir
ci-dessus, un bloc à un composant en utilisant la méthode 'connect'. Par
exemple :
unBouton = FXButton.new(parent, "Cliquer
ici")
unBouton.connect(SEL_COMMAND) { |sender,
sel, ptr|
puts "Ouf !"
}
Une autre forme de la méthode 'connect' utilise soit une méthode ('method') soit une instance de procédure ('proc') comme second argument (sans lier un bloc), par exemple :
def pousse(sender, sel, ptr)
puts "Ouf !"
end
unBouton = FXButton.new(parent, "Cliquer
ici")
unBouton.connect(SEL_COMMAND,
method(:pousse))
Et
enfin la forme raccourcie déjà vue :
unBouton = FXButton.new(parent, "Cliquer
ici")
unBouton.connect(SEL_COMMAND) { puts
"Ouf !" }
Tout cela rappellera aux anciens programmeurs Pascal les déclarations de 'TurboVision' en beaucoup plus simples puisqu' il n'est nul besoin, même si cela est prévu, d'indiquer les positions du composant dans la fenêtre parent, FOX se chargeant de l'arrangement lui-même. L'astuce consiste à placer des cadres verticaux ou horizontaux dans les fenêtres, ceux-ci allant se placer automatiquement en fonction des paramètres.
-
1er
cadre vertical à droite (LAYOUT_SIDE_RIGHT). Il occupe toute la place
disponible en hauteur (LAYOUT_FILL_Y).
-
2ème
cadre à gauche (LAYOUT_SIDE_LEFT). Il occupe toute la place restante en largeur
comme en hauteur (LAYOUT_FILL_X | LAYOUT_FILL_Y)
Les boîtes à grouper vont se positionner automatiquement dans l'ordre de leur déclaration. Remarquons qu'elles n'ont pas de dimensions précisées. Le tout va décider de la largeur et de la hauteur du cadre parent. Il en est de même du gros bouton qu'on décide de centrer en largeur et en hauteur (LAYOUT_CENTER_X | LAYOUT_CENTER_Y) et de dimensions fixes de 300 X 200 pixels.Il impose donc une largeur au cadre de gauche qui se retrouve avec une hauteur imposée par le cadre de droite !
Et
voici ce que l'on obtient à l'écran :
Fig 2 - boutons.rbw
Remarquez la bulle d'aide affichée en surimpression
du bouton, et le texte d'aide dans la ligne de statut.
Nous avons donc découvert dans cet exemple les
composants suivants :
FXFrame.new(parent,
opts=FRAME_NORMAL, x=0, y=0, width=0, height=0, padLeft=DEFAULT_PAD,padRight=DEFAULT_PAD,
padTop=DEFAULT_PAD, padBottom=DEFAULT_PAD) {|theFrame| ...}
Les cadres servent à remplir les fenêtres et à
héberger à leur tour d'autres composants visuels.
Il y en a pour tous les goûts, et cela se décide
dans le paramètre 'opts' qui se décline en huit possibilités du 'sans cadre' au
'cadre normal'. Voir la liste en annexe dans FXWindow.
FXHorizontalFrame et FXVerticalFrame sont des cadres horizontaux (resp. verticaux) qui
placent les fenêtres enfants horizontalement (verticalement) selon les renseignements apportés par les
fenêtres enfants. Si ces composants ne possèdent pas de cible ('target') ni de
sélecteur, ils ont en plus des paramètres de dimensionnement, deux paramètres
indiquant la distance minimale souhaitée entre les composants enfants déclarés
dans la méthode 'new' ci-dessous par 'hSpacing' et 'vSpacing'. La valeur par
défaut est égale à '0'.
FXHorizontalFrame.new(parent, opts=0, x=0, y=0,
width=0, height=0, padLeft=DEFAULT_SPACING, padRight=DEFAULT_SPACING,
padTop=DEFAULT_SPACING,
padBottom=DEFAULT_SPACING, hSpacing=DEFAULT_SPACING, vSpacing=DEFAULT_SPACING)
FXVerticalSeparator et FXHorizontalSeparator sont, comme leur nom le laisse deviner, de
simples traits de séparation. Les paramètres de positionnement, de largeur et
hauteur sont à zéro, par défaut. Par défaut aussi, le nombre de pixels minimum
du tracé : 'pl', 'pr', 'pt',, 'pb' signifiants "left",
"right", "top" et "bottom". Dans le séparateur
vertical ce sont les pixels de haut en bas qui ont un minimum de 1 pixel.
FXVerticalSeparator.new (parent,
opts=SEPARATOR_GROOVE|LAYOUT_FILL_Y, x=0, y=0, w=0, h=0, pl=0, pr=0, pt=1,
pb=1)
FXGroupBox.new(parent, text,
opts=GROUPBOX_NORMAL, x=0, y=0, width=0,height=0, padLeft=DEFAULT_SPACING, padRight=DEFAULT_SPACING,
padTop=DEFAULT_SPACING, padBottom=DEFAULT_SPACING,
hSpacing=DEFAULT_SPACING,
vSpacing=DEFAULT_SPACING)
FXGroupBox produit un cadre surélevé ou en puits autour d'un groupe de composants visuels. Généralement un titre est placé à gauche pour clarifier les choses. Des radios boutons placés à l'intérieur d'une boîte à grouper ont automatiquement le comportement attendu, c'est à dire qu'un seul d'entre eux est coché à la fois. L'option 'opts' permet de justifier le titre à gauche, à droite ou au milieu. Voir détails en annexe.
FXCheckButton.new(parent, text, target=nil,
selector=0,
opts=CHECKBUTTON_NORMAL, x=0, y=0,width=0,
height=0,
padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD,
padTop=DEFAULT_PAD, padBottom=DEFAULT_PAD)
Pas de surprises, les paramètres sont les mêmes à
part celui des options qui devient CHECKBUTTON_NORMAL, ce qui paraît tout de
même logique.
On devine facilement que les boutons-radio sont identiques aux cases à cocher à ceci près qu'ils sont reliés ensemble afin qu'un seul d'entre eux soit coché à un instant donné. Il suffit pour cela de les regrouper dans une boîte de groupe FXGroupBox.
FXRadioButton.new(parent, text, target=nil,
selector=0, opts=RADIOBUTTON_NORMAL,
x=0, y=0, width=0, height=0,
padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD,
padTop=DEFAULT_PAD,
padBottom=DEFAULT_PAD)
Les boutons-bascule sont des boutons à deux états,
qui permettent de mettre un bouton au lieu de deux, lorsqu'ils ne peuvent être
ensemble sans que l'un d'eux soit désactivé. Par exemple si l'on veut ouvrir un
fichier, il n'est pas nécessaire d'avoir le bouton de fermeture.
FXToggleButton.new(p, text1, text2, icon1=nil,
icon2=nil, tgt=nil, sel=0, opts=TOGGLEBUTTON_NORMAL, x=0, y=0, w=0, h=0,
pl=DEFAULT_PAD, pr=DEFAULT_PAD,
pt=DEFAULT_PAD, pb=DEFAULT_PAD)
A part le fait que les textes et les icônes sont en double, le reste des paramètres est le même que dans un bouton normal. Voir les détails en annexe.
FXArrowButton.new(parent, target=nil,
selector=0, opts=ARROW_NORMAL, x=0, y=0, width=0, height=0,
padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD, padTop=DEFAULT_PAD,
padBottom=DEFAULT_PAD)
Ils ont l'avantage d'être prévus. Hormis cela ils
n'ont rien de bien particulier et fonctionnent comme des boutons normaux munis
d'une icône.
La figure 3 montre quelques exemples de boutons, avec de gauche à droite un bouton normal, un bouton flèche, un bouton style barre à outils (sans le curseur souris dessus), un bouton normal désactivé, un bouton normal sans cadre et enfin un bouton-bascule.
Fig. 3 stylbout.png
FXToolTip.new(app, opts=TOOLTIP_NORMAL,
x=0, y=0, width=0, height=0)
Rien de bien spécial si ce n'est l'option éventuelle pour rendre l'info-bulle visible, tant que le bouton est survolé par le curseur souris ou bien dépendant de la longueur du texte, pour en permettre plus facilement la lecture. Voir détails en annexe.
Située en bas de la fenêtre, elle a pour fonction principale d'afficher le texte d'aide supplémentaire des info-bulles..
Sa déclaration est des plus simples :
FXStatusBar.new(p, opts=0, x=0, y=0, w=0, h=0, pl=3, pr=3, pt=2, pb=2, hs=4, vs=0)
Remarquons toutefois l'initialisation du passe-partout à une valeur non-nulle (2 et 3 pixels), ainsi que l'espace entre composants enfants (4 pixels).
Par ses attributs, la barre de statut nous donne accès à :
- FXDragCorner qui est le "coin de dragage", visible ou non, et dont on peut modifier la couleur.
- FXStatusLine qui est la ligne de statut proprement
dite, c'est à dire celle qui contient le texte à afficher. Dans l'exemple ci
dessus, nous modifions le texte de repos pour qu'il soit en français et nous
pouvons aussi changer, de la même façon, la couleur et la fonte. Voir les
attributs en Annexe A.
Les
types de variables avec Ruby sont au nombre de 5 :
-
variables
globales : elles débutent par le signe '$'.
-
variables locales
: elles débutent par une minuscule.
-
variables d'instance
: elles débutent par un '@'.
-
variables de classes
: elles débutent par un double arobase '@@'.
-
constantes : elles débutent par une majuscule.
Cette façon de faire permet donc de reconnaître
instantanément à quel type de variable on a à faire.
La portée des
variables.
On entend par là de quel endroit on peut les appeler
pour les lire ou bien y écrire.
-
Les
variables globales sont, comme leur nom l'indique, accessibles de n'importe
quel endroit d'un programme. Elles valent 'nil' si non initialisées.
-
Les
variables locales ont comme vision l'endroit où elles ont été déclarées. Ce qui
peut être dans une 'proc{...}', dans une méthode 'def...end,' une classe
'class...end'.
-
Les
variables d'instance ont une portée limitée aux objets qui se réfèrent à
'self'. Elles ont la valeur 'nil' jusqu'à leur initialisation. Elles ne sont
accessibles de l'extérieur que par des accesseurs. Chaque instance d'un objet
possède les mêmes variables d'instance et elles peuvent avoir des valeurs différentes.
-
Les
variables de classe sont uniques à l'intérieur d'une classe. Elles peuvent être
modifiées, mais sont communes à toutes les instances de la classe.
-
Les
constantes doivent bien sûr être initialisées et sont accessibles en dehors de
la classe.
Dans
les paramètres on remarque le signe '|'. Il s'agit du 'ou' de comparaison bit à
bit.
Voici
la liste des autres opérateurs de Ruby classés par ordre de précédence :
Méthode |
Opérateur |
Description |
OUI |
[ ] [ ]= |
Référence d'éléments, ensemble d'éléments |
OUI |
** |
Exponentiation |
OUI |
! ~ + -- |
Négation, complément, plus et moins unaire (les noms de méthodes pour les deux derniers sont +@ and -@) |
OUI |
* / % |
Multiplication, division, et modulo |
OUI |
+ -- |
Plus et moins |
OUI |
>> << |
Décalage de bits droit et gauche |
OUI |
& |
'Et' bit à bit |
OUI |
^ | |
`ou' exclusif et `ou' régulier bit à bit |
OUI |
<= < > >= |
Operateurs de comparaison, inf. ou égal, inf, sup., sup. ou égal. |
OUI |
<=> == === != =~
!~ |
Retourne '–1' si l'argument à gauche est <= à celui de droite, '0' si égalité, '1' si >=. Teste l'égalité. === teste l'égalité sans 'when'ou 'case'. Expression rationnelle. Retourne la position de la première occurrence dans une chaîne. (!= et !~ ne peuvent être définis comme méthodes) |
|
&& |
'ET' logique |
|
|| |
'OU' logique |
|
.. ... |
Intervalle (inclusif et exclusif) |
|
? : |
'if-then-else' ternaire |
|
= 0%= 0{ /= 0--= 0+= 0|= &= 0>>= 0<<= 0*= 0&&= 0||= 0**= |
Assignement |
|
Defined? |
Teste si le symbole est defini |
|
Not |
Négation logique |
|
or and |
Composition logique (ou, et) |
|
if unless while until |
Expressions conditionnelles et boucles (si, si non, tant que, jusqu'à ) |
|
Begin/end |
Bloc (partie de code) |
La colonne "Méthode" indique si
l'opérateur est une méthode. Rappelons que tout (ou presque) dans Ruby est
objet et possède donc des méthodes.
Notons enfin le raccourci syntaxique d'affectation
qui est fait du signe '=' précédé de l'opérateur idoine :
'variable +=
constante ' équivaut à 'variable = variable + constante'.
Les opérateurs concernés sont : +
, - , * , / , **, %, <<,>>,
&, |, ^, &&, ||.
Les autres langages ont des fonctions, des
procédures, des méthodes ou des routines mais en Ruby il n'y a que des méthodes
qui retournent une valeur.
Une méthode est définie en utilisant les mots clé
'def' et 'end'. Les noms de méthodes doivent débuter par une lettre minuscule.
On peut bien entendu déclarer des paramètres dans une méthode et même y
affecter des valeurs par défaut :
Ex:
def
mamethode # sans
paramètre.
# traitement
end
def mamethode (arg1, arg2, arg3) #
3 paramètres
# traitement
end
def mamethode (arg1="Jean",
arg2="Pierre", arg3="Paul") # 3 paramètres
initialisés
# traitement
end
La valeur de retour d'une méthode est la valeur de
la dernière expression calculée.
Cependant il existe une expression 'return' qui fait
quitter la méthode avec la valeur qui lui est passée en paramètre, par exemple
'return 1' retourne la valeur '1', ou 'nil' s'il n'y a pas de paramètre, ou
bien encore un tableau s'il y a plusieurs paramètres.
Les noms des méthodes qui fonctionnent comme des
questions sont souvent terminés par un '?'. ( ex. : '.toto?'). Les noms de
méthodes "dangereuses" ou qui modifient le destinataire peuvent être
terminés par un '!' (ex. : '.titi!').
Par
exemple, si a = ['chat','chien'] et b = ['chat','chien']
a.eql?(b) è true (teste la valeur)
a.equal?(b) è false (teste l'identifiant 'ID')
Par exemple dans la classe 'string', la méthode
'.chop' enlève le dernier caractère d'une chaîne et retourne une nouvelle
chaîne. Tandis que '.chop!' modifie directement la chaîne passée en paramètre
et retourne 'nil' si la chaîne est vide. Par exemple :
"string\n".chop è "string"
"string".chop è "strin"
"x".chop.chop è ""
"".chop è ""
tandis
que "".chop! è nil
Peut-être plus facile à comprendre : la méthode
'upcase' transforme les minuscules en majuscules
ch1="truc"
ch2=ch1.upcase
donne ch1="truc" et ch2="TRUC"
mais ch2=ch1.upcase!
donne ch1="TRUC" et ch2="TRUC".
On ne
devait pas savoir comment appeler une partie de l'écran sur laquelle on peut
soit dessiner, soit afficher une image. Le mot feuille étant déjà pris par les
tableurs, pour une fois on n'en a pas inventé un nouveau et le mot connu
surtout dans le monde de la tapisserie est alors apparu.
Contrairement au composant bouton, le canevas subit
plutôt qu'il opère.
FXCanvas.new(parent, target=nil,
selector=0, opts=FRAME_NORMAL, x=0, y=0, width=0, height=0)
Ce composant est l'occasion d'apprendre à dessiner
sur un canevas et de voir comment fonctionnent les messages sous Fox. Rien de
tel qu'un exemple simple et son décortiquage pour expliquer les divers
mécanismes.
Voici donc 'Gribouille', un tableau blanc à l'écran
pour dessiner à l'aide de la souris.
***************************************************************************
require 'fox'
require 'fox/colors'
include Fox
class GribouilleWindow < FXMainWindow
def initialize(app)
# Initialise en premier la classe de base.
super(app, "Gribouillage", nil, nil, DECOR_ALL,
0, 0, 320, 200)
# Construction d'un cadre horizontal pour contenir la fenêtre principale.
@contents = FXHorizontalFrame.new(self,
LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0)
# Le panneau de gauche contient le canevas.
@canvasFrame = FXVerticalFrame.new(@contents,
FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
0, 0, 0, 0, 10, 10, 10, 10)
# Place une étiquette au-dessus du canevas.
FXLabel.new(@canvasFrame, "Cadre de canevas", nil,
JUSTIFY_CENTER_X|LAYOUT_FILL_X)
# Ligne horizontale de séparation.
FXHorizontalSeparator.new(@canvasFrame, SEPARATOR_GROOVE|LAYOUT_FILL_X)
# Trace le canevas.
@canvas = FXCanvas.new(@canvasFrame, nil, 0, (FRAME_SUNKEN|FRAME_THICK|
LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT))
@canvas.connect(SEL_PAINT) do |sender, sel, event|
FXDCWindow.new(@canvas, event) do |dc|
dc.foreground = @canvas.backColor
dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
end
end
@canvas.connect(SEL_LEFTBUTTONPRESS) do
@canvas.grab
@mouseDown = true
end
@canvas.connect(SEL_MOTION) do |sender, sel, event|
if @mouseDown
# Récupère un contexte de périphérique pour le canevas.
dc = FXDCWindow.new(@canvas)
# Indique la couleur de fond.
dc.foreground = @couleurTrace
# Trace une ligne du point précédent au point actuel de la souris.
if @mirrorMode.value
cW = @canvas.width
cH = @canvas.height
dc.drawLine(cW-event.last_x, event.last_y,
cW-event.win_x, event.win_y)
dc.drawLine(event.last_x, cH-event.last_y,
event.win_x, cH-event.win_y)
dc.drawLine(cW-event.last_x, cH-event.last_y,
cW-event.win_x, cH-event.win_y)
end
dc.drawLine(event.last_x, event.last_y, event.win_x, event.win_y)
# On a tracé quelque chose, le canevas est donc sale.
@dirty = true
# Libère le contexte.
dc.end
end
end
@canvas.connect(SEL_LEFTBUTTONRELEASE) do |sender, sel, event|
@canvas.ungrab
if @mouseDown
# Récupère un contexte de périphérique pour le canevas.
dc = FXDCWindow.new(@canvas)
# Indique la couleur de fond.
dc.foreground = @couleurTrace
# Trace une ligne du point précédent au point actuel de la souris.
dc.drawLine(event.last_x, event.last_y, event.win_x, event.win_y)
# On a tracé quelque chose, le canevas est donc sale.
@sale = true
# Le bouton souris est relâché.
@mouseDown = false
# Libère le contexte.
dc.end
end
end
# Panneau de droite pour les boutons.
@buttonFrame = FXVerticalFrame.new(@contents,
FRAME_SUNKEN|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
0, 0, 0, 0, 10, 10, 10, 10)
# Etiquette au-dessus des boutons.
FXLabel.new(@buttonFrame, "Cadre boutons", nil,
JUSTIFY_CENTER_X|LAYOUT_FILL_X)
# Ligne horizontale de séparation.
FXHorizontalSeparator.new(@buttonFrame,
SEPARATOR_RIDGE|LAYOUT_FILL_X)
# Active ou désactive le mode miroir.
@mirrorMode = FXDataTarget.new(false)
FXCheckButton.new(@buttonFrame, "Miroir", @mirrorMode, FXDataTarget::ID_VALUE, CHECKBUTTON_NORMAL|LAYOUT_FILL_X)
# Bouton pour nettoyer le canevas.
clearButton = FXButton.new(@buttonFrame, "&Effacer", nil, nil, 0,
FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
0, 0, 0, 0, 10, 10, 5, 5)
clearButton.connect(SEL_COMMAND) do
FXDCWindow.new(@canvas) do |dc|
dc.foreground = @canvas.backColor
dc.fillRectangle(0, 0, @canvas.width, @canvas.height)
@sale = false
end
end
clearButton.connect(SEL_UPDATE) do |sender, sel, ptr|
# Cette procédure contient le message de mise à jour envoyé par le bouton d'effacement
# à sa cible. Chaque composant visuel de Fox reçoit un message (SEL-UPDATE) durant la phase de temps mort,
# lui demandant de se mettre à jour lui-même. Par exemple un bouton peut
# être actif ou inactif suivant l'état de l'application.
# Dans ce cas nous désactivons l'expéditeur (le bouton effacer) quand le canevas a été
# nettoyé, et le réactivons quand il a été utilisé (il est sale).
message = @sale ? FXWindow::ID_ENABLE : FXWindow::ID_DISABLE
sender.handle(self, MKUINT(message, SEL_COMMAND), nil)
end
# Bouton pour quitter.
FXButton.new(@buttonFrame, "&Quitter", nil, app, FXApp::ID_QUIT,
FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
0, 0, 0, 0, 10, 10, 5, 5)
# Initialisation des autres variables.
@couleurTrace = FXColor::Red
@mouseDown = false
@sale = false
end
# Crée et montre la fenêtre principale.
def create
super # Cré la fenêtre.
show(PLACEMENT_SCREEN) # Montre la fenêtre.
end
end
if __FILE__ == $0
# Construit l'objet 'application'.
application = FXApp.new('Gribouillage', 'FoxTest')
# Construit la fenêtre principale.
scribble = GribouilleWindow.new(application)
# Crée l'application.
application.create
# Exécute l'application.
application.run
end
***************************************************************************
La partie
'initialize' ressemble en grande partie à celle du programme
"boutons.rbw". Le fait nouveau se situe dans la transmission des
commandes de la méthode 'connect' du canevas.
En effet,
lors du clic gauche de la souris sur le canevas, la variable @mousedown est
positionnée à 'true', et le canevas en position de saisie(méthode 'grab').
Si la
souris glisse, la commande change, et une ligne est traçée.
Enfin, lors
du relâchement de la souris, on trace le dernier trait, et on remet tout dans
l'ordre.
Remarquons
le mode miroir qui, s'il est en action, recopie simultanément le dessin en
cours de tracé symétriquement par rapport à l'axe des 'x', l'axe des 'y' et le
centre du canevas. Donc, à partir d'un tracé on en obtient quatre.
Notons l'initialisation de la variable 'message'
dans la méthode du bouton d'effacement :
Il s'agit ici de la version "rapide", appelée opérateur ternaire, de "if.. then .. else":
Expression-boooléenne ? expr1 : expr2
Retourne
expr1 si expression-booléenne est vrai,
sinon expr2.
Dans la création de l'application par la méthode 'new', nous retrouvons ces mystérieux paramètres passés sous forme de chaînes. Il a été dit précédemment qu'ils avaient une relation avec la base de registres de Window. En effet, FXRuby construit automatiquement une base de données d'initialisation de tous ses programmes. Pour retrouver ces données il faut appeler tout d'abord la base de registres en faisant 'Démarrer', puis 'Exécuter' et entrer 'Regedit' dans la boîte de dialogue. Une fois dans la base de registres choisir 'HKEY_CURRENT_USER' et faire descendre l'arborescence. Cliquer sur 'Software' et vous verrez apparaître le répertoire 'FoxTest' cité dans les exemples précédents. Chaque essai comportant la clef 'FoxTest' aura un sous-répertoire dans le répertoire 'FoxTest', portant le nom que vous aurez donné à votre application. Si vous faites des essais, par exemple d'aspect, avec les programmes exemples, pensez à détruire les fichiers relatifs à l'initialisation sinon vous risquez d'avoir des surprises et penser que votre programmation est inadéquate…
Bon ce n'est pas encore PaintShop Pro, d'accord,
mais en si peu de lignes ce n'est tout de même pas mal, non ?
Et
voilà le résultat :
Fig 3 . Gribouille.rbw
Après la méthode 'connect' vous avez sans doute
remarqué un 'do' mystérieux suivi d'un bloc de code. Les blocs de code peuvent
être associés à des appels de méthodes, et implémenter des itérateurs.
Les blocs de code sont simplement du code compris entre accolades '{', '}' ou bien entre
un 'do' …'end', comme vous avez pu le voir dans les exemples précédents, où
l'une ou l'autre version a été employée.
{puts "Coucou"} # ceci est un bloc
do #
objet.faitcela #
end #
Une fois qu'un bloc est créé on peut l'associer à
l'appel d'une méthode. Cette méthode peut faire appel au bloc passé en
paramètre, une ou plusieurs fois en utilisant le mot clé 'yield'.
Par exemple :
Def appelBloc
yield
yield
end
appelBloc {puts "Coucou"} # 'puts ' écrit ce qui le suit entre guillemets sur le
périphérique
# de sortie.
produit
: Coucou
Coucou
C'est comme si on passait le bloc { puts
"Coucou"} en paramètre à la méthode 'appelBloc'.
Le bloc peut débuter par une liste d'arguments entre des barres verticales '|' :
def appelBloc(p1)
if block_given?
yield(p1)
else
p1
end
end
appelBloc("no Block") => "no Block"
appelBloc("no Block") { |s| s.sub(/no /, '') } =>
"Block"
Dans le second exemple le bloc est appelé par 'yield' et signifie que pour chaque chaîne rencontrée, la première occurence de 'no ' sera remplacée par '', c'est à dire rien. Dans notre exemple il n'y a bien sûr qu'une chaîne, celle passée en paramètre, mais dans le cas de la lecture d'un fichier texte c'est chaque ligne qui serait soumise à l'ablation de 'no '.
Un itérateur est fait pour répéter (itérer) des
parties de code un certain nombre de fois. Contrairement à d'autres langages,
Ruby ne possède pas de boucle 'for i=x
to y do fairececi end'. Mais pas de panique, il y a les itérateurs.
Les blocs de code sont utilisés en Ruby pour
implémenter les itérateurs c'est à dire des méthodes qui retournent des
éléments de collections (par exemple des tableaux dont on verra la description
au chapitre 6).
a = %w(
chat chien oie boa) # crée
un tableau
a.each { |animal| puts animal } # itère le contenu
donne
:
chat
chien
oie
boa
La variable d'itération, ici 'animal', est mise
entre deux barres verticales.
Et, chose extraordinaire, les itérateurs sont inclus
dans nombre d'objets de Ruby et n'apparaissent donc que comme de simples
méthodes :
5.times { print "*" }
3.upto (6) { |i| print i }
('a'..'e').each { |char| print char }
produit
: *****3456abcde
'.each' signifie donc : pour chaque membre de ce qui
me précède, je vais faire ceci.
Ruby fournit de très nombreux itérateurs plus
interessants les uns que les autres. Notons au passage ceux pour les chaînes de
caractères : 'each, each_byte, each_line…'
Bien, il n'y a pas de boucle 'for do
end' mais il y a les itérateurs, somme toute beaucoup plus pratiques.
Restent les boucles conditionnelles au nombre de deux :
expression while expression-booléenne
Si expression est
autre chose qu'un bloc begin/end, exécute expression
zéro ou plusieurs fois
tant que
expression-booléenne est
'true' (vrai).
expression until expression-booléenne
Si expression est autre chose qu'un bloc begin/end, exécute expression zéro ou plusieurs fois tant que expression-booléenne est 'false' (faux).
Si expression
est un bloc de code, le bloc sera toujours exécuté au moins une fois.
Pour
sortir d'une boucle (infernale ça va de soi !) il y a quatre moyens :
-
'break' qui fait quitter la boucle immédiatement.
-
'next'
qui fait sauter au début de l'itération suivante.
-
'redo'
qui répète l'itération courante.
-
'retry'
qui fait tout reprendre au début.
Pas de 'for…' c'est vite dit; il y en a un et fort intéressant. Il s'agit du 'for' qui parcourt tous les membres d'une collection ou d'un tableau, par exemple.
for i in 0..5
fairececi
end
ou
bien
for i in
['un','deux','trois']
fairecela
end
Elles sont au nombre de deux 'if' et 'unless' :
if expression-booléenne [then]
faire ceci
elsif expression-booléenne [then]
faire ceci
else
faire ceci
end
unless expression-booléenne [then]
faire ceci
else
faire ceci
end
Les
expressions entre crochets, comme ici [then]
sont facultatives.
Le mot clé
'then' sépare le corps du code de la condition. Il n'est pas requis si le corps
démarre sur une nouvelle ligne. La valeur d'une expression 'if' ou 'unless' est
la valeur de la dernière expression évaluée où le code a été exécuté.
A noter que 'if' et 'unless' peuvent être employés
dans une syntaxe de modificateurs:
expression if expression-booléenne
expression unless expression-booléenne
Evalue
expression seulement si expression-booléenne est 'true' ('false'
pour 'unless')
'case'
sert à tester une suite de conditions :
i =
5
case
i
when 1..5
print "Entre 1 et 5"
when 6..10
print "Entre 6 et 10"
else
print "> 10"
end
Le
résultat sera : "Entre 1 et 5".
L'expression 'case' cherche une égalité en
commençant la recherche à la première comparaison en utilisant de façon interne
l'opérateur : '==='. Si l'égalité est trouvée la recherche est arrêtée et le bloc de code
qui suit est exécuté. 'case' retourne alors la valeur de la dernière expression
exécutée.Si aucune égalitén'est trouvée et qu' il existe une clause 'else',
c'est elle qui est exécutée, s' il n'y en a pas c'est la valeur 'nil' qui est
retournée.
Juste avant la ligne de lancement de l'application
de l'exemple précédent, nous trouvons une bizarrerie '__FILE__', qui est un mot
réservé. Attention les traits soulignés encadrant le mot 'FILE' sont doublés.
__FILE__ |
and |
def |
end |
in |
or |
self |
unless |
|
__LINE__ |
begin |
defined? |
ensure |
module |
redo |
super |
until |
|
BEGIN |
break |
do |
false |
next |
rescue |
then |
when |
|
END |
case |
else |
for |
nil |
retry |
true |
while |
|
alias |
class |
elsif |
if |
not |
return |
undef |
yield |
|
Ces
mots, puisqu'on les appelle réservés, ne sont pas utilisables comme noms de
variables locales, ni de constantes.
Dans
cette liste sont comprises les pseudo-variables :
'self' l'objet récepteur de la
méthode décrite.
'true' valeur "vraie"
'false' valeur "fause"
'nil' valeur indéfinie
'__FILE__
' nom du fichier source
courant
'__LINE__
' numéro de la ligne courante
dans le fichier source.
Quand à '$0' il s'agit d'une variable prédéfinie
représentant le "nom du programme en cours d'exécution". Il s'agit
donc d'une déclaration de sécurité.
Particularités
de FXRuby :
La librairie " fox/iterators.rb " ajoute
une méthode 'each' pour les classes suivantes :
FXComboBox, FXGLGroup, FXHeader, FXIconList, FXList,
FXListBox, FXTable, FXTreeItem, FXTreeList et FXTreeListBox. Le module
'Enumerable' est aussi présent dans chacune de ces classes.
Le bloc de paramètres passé à votre bloc de code
dépend de la classe. Par exemple une instance de FXList s'itère en donnant les
paramètres de FXListItem :
aList.each { |aListItem|
puts "texte pour cet item =
#{aListItem.getText()}"
}
alors
qu'une instance de FXComboBox nécessite deux paramètres, le texte de l'item
(une chaîne 'string') et les données de l'item :
aComboBox.each { |itemText, itemData|
puts "texte pour cet item =
#{itemText}"
}
Le
tableau suivant indique les paramètres pour les itérateurs de ces classes:
FXComboBox :
le texte de l'item (une chaîne 'string') et les données.
FXGLGroup : une instance de FXGLObject.
FXHeader : une instance de
FXHeaderItem.
FXIconList : une instance de FXIconItem.
FXList : une instance de
FXListItem .
FXListBox : le texte de l'item
('string'), une icône (une instance de FXIcon) et les données.
FXTreeItem : une instance de FXTreeItem.
FXTreeList : une instance de FXTreeItem.
FXTreeListBox : une instance de FXTreeItem.
Nous arrivons maintenant à la partie vraiment
relationnelle d'un programme, c'est à dire la communication avec l'utilisateur.
Les menus sont des composants auxquels nous sommes habitués depuis que les
programmes évolués existent, et il en est de même des boîtes de dialogues. Pour
ne rien changer à nos habitudes voici un nouvel exemple regroupant ces deux
concepts.
***************************************************************************
require 'fox'
include Fox
# Une petite boîte de dialogue pour nos tests.
class FXTestDialog < FXDialogBox
def initialize(owner)
# Invoque en premier la fonction 'initialize' de la classe de base.
super(owner, "Test de boîte de dialogue", DECOR_TITLE|DECOR_BORDER)
# Boutons du bas.
buttons = FXHorizontalFrame.new(self,
LAYOUT_SIDE_BOTTOM|FRAME_NONE|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,
0, 0, 0, 0, 40, 40, 20, 20)
# Séparateur.
FXHorizontalSeparator.new(self,
LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|SEPARATOR_GROOVE)
# Contenu.
contents = FXHorizontalFrame.new(self,
LAYOUT_SIDE_TOP|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH)
# Sous-menu, sans commande.
submenu = FXMenuPane.new(self)
FXMenuCommand.new(submenu, "Un")
FXMenuCommand.new(submenu, "Deux")
FXMenuCommand.new(submenu, "Trois")
# Menu.
menu = FXMenuPane.new(self)
FXMenuCommand.new(menu, "&Accepter", nil, self, ID_ACCEPT)
FXMenuCommand.new(menu, "A&nnuler", nil, self, ID_CANCEL)
FXMenuCascade.new(menu, "Sous-menu", nil, submenu)
FXMenuCommand.new(menu, "&Quitter\tCtl-Q", nil, getApp(), FXApp::ID_QUIT)
# Menu instantané (PopUp).
pane = FXPopup.new(self)
FXOption.new(pane, "Un", nil, nil, 0, JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXOption.new(pane, "Deux", nil, nil, 0, JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXOption.new(pane, "Trois", nil, nil, 0,JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXOption.new(pane, "Quatre", nil, nil,0,JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXOption.new(pane, "Cinq", nil, nil, 0, JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXOption.new(pane, "Six", nil, nil, 0, JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXOption.new(pane, "Sept", nil, nil, 0, JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXOption.new(pane, "Huit", nil, nil, 0, JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXOption.new(pane, "Neuf", nil, nil, 0, JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXOption.new(pane, "Dix", nil, nil, 0, JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
# Menu option.
FXOptionMenu.new(contents, pane, (FRAME_RAISED|FRAME_THICK|
JUSTIFY_HZ_APART|ICON_AFTER_TEXT|LAYOUT_CENTER_X|LAYOUT_CENTER_Y))
# Bouton pour le menu instantané.
FXMenuButton.new(contents, "&Menu", nil, menu, (MENUBUTTON_DOWN|
JUSTIFY_LEFT|LAYOUT_TOP|FRAME_RAISED|FRAME_THICK|ICON_AFTER_TEXT|
LAYOUT_CENTER_X|LAYOUT_CENTER_Y))
# Accepter.
FXButton.new(buttons, "&Accepter", nil, self, ID_ACCEPT,
FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT|LAYOUT_CENTER_Y)
# Annuler.
FXButton.new(buttons, "A&nnuler", nil, self, ID_CANCEL,
FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT|LAYOUT_CENTER_Y)
end
end
# Sous-classe de la fenêtre principale.
class DialogTester < FXMainWindow
def initialize(app)
# Invoque en premier la fonction 'initialize' de la classe de base.
super(app, "Test Dialogues", nil, nil, DECOR_ALL, 0, 0, 400, 200)
# Info-bulles.
FXTooltip.new(getApp())
# Barre de menu.
menubar = FXMenubar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
# Séparateur.
FXHorizontalSeparator.new(self,
LAYOUT_SIDE_TOP|LAYOUT_FILL_X|SEPARATOR_GROOVE)
# Menu fichier.
filemenu = FXMenuPane.new(self)
FXMenuCommand.new(filemenu, "&Quitter", nil, getApp(), FXApp::ID_QUIT, 0)
FXMenuTitle.new(menubar, "&Fichier", nil, filemenu)
# Contenu.
contents = FXHorizontalFrame.new(self,
LAYOUT_SIDE_TOP|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH)
# Bouton pour afficher un dialogue normal.
nonModalButton = FXButton.new(contents,
"Dialogue &Non-Modal ...\tAffiche une boîte de dialogue normale.", nil, nil, 0,FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y)
nonModalButton.connect(SEL_COMMAND, method(:onCmdShowDialog))
# Bouton pour afficher un dialogue modal.
modalButton = FXButton.new(contents,
"Dialogue &Modal ...\tAffiche une boîte de dialogue modale", nil, nil, 0,FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y)
modalButton.connect(SEL_COMMAND, method(:onCmdShowDialogModal))
# Construit une instance de boîte de dialogue.
@dialog = FXTestDialog.new(self)
end
# Montre le dialogue non-modal.
def onCmdShowDialog(sender, sel, ptr)
@dialog.show
end
# Montre le dialogue modal.
def onCmdShowDialogModal(sender, sel, ptr)
FXTestDialog.new(self).execute
return 1
end
# Démarrage.
def create
super
show(PLACEMENT_SCREEN)
end
end
def run
# Construit une application.
application = FXApp.new("Dialog", "FoxTest")
# Construit la fenêtre principale de l'application.
DialogTester.new(application)
# Crée l'application.
application.create
# Exécute l'application.
application.run
end
run
***************************************************************************
A l'exécution
une première fenêtre vous propose le choix entre un dialogue modal et un
dialogue non-modal. Qu'ès acò ? .
Réponse : un dialogue modal se trouve dans une
fenêtre qui ne se fermera, et même mieux ne laissera la place à aucune autre,
que s'il y a abandon de la part de l'utilisateur ou bien réponse à une question
posée. La fenêtre en question reste toujours sur le devant de l'écran et attend
obstinément une réponse.
Le dialogue non-modal permet d'aller faire un petit
tour dans les fenêtres ouvertes alentour sans se formaliser pour autant de
votre abandon.
Dans la partie 'initialize' une instance de la
fenêtre de dialogue est créée : '@dialog'. C'est cette instance qui va être
affichée lors d'un appel à la méthode 'onCmdShowDialog' qui appellera la
méthode '.show' de l'instance. Tandis que dans la méthode ' onCmdShowDialogModal' c'est
à la méthode '.execute' de l'instance de 'FXDialogBox' qu'il est fait appel.
Hormis cela l'aspect est le même, ce qui explique le
code unique des sous-fenêtres dans l'exemple ci-dessus.
En regardant les images suivantes on observe, en partant du haut de celles-ci, la mention 'Fichier'. Avant d'en arriver à sa description il nous faut parler de ses propriétaires. Le premier est 'menubar, une instance de FXMenuBar dont la déclaration complète est :
FXMenuBar.new(parent, opts=LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X,
x=0, y=0, width=0, height=0, padLeft=3,
padRight=3, padTop=2, padBottom=2,
hSpacing=DEFAULT_SPACING, vSpacing=DEFAULT_SPACING)
Le
propriétaire 'parent' est ici l'application elle-même ('app'), suivi dans les
paramètres des options habituelles et d'aspect.
La
barre de menu possède quant à elle un "titre de menu" tel que :
FXMenuTitle.new(parent, text, icon=nil,
popupMenu=nil, opts=0)
qui
commande par 'popupMenu' une sous-fenêtre de type FXMenuPane :
FXMenuPane.new(owner, opts=0)
qui
est propriétaire, pour finir, des commandes qui vont déclencher des actions :
FXMenuCommand.new(parent, text, icon=nil,
target=nil, selector=0, opts=0)
et des éventuels séparateurs d'enjolivure :
FXMenuSeparator.new(parent, opts=0)
Schématiquement
nous avons donc :
Barre
de menu => Titre => Sous-menus => Commandes
=> Séparateurs
La figure ci-dessus montre le menu instantané 'pane', cachant le menu propriétaire 'FXOptionMenu'. Ce dernier gardera la valeur qui sera cliquée dans le menu instantané, son deuxième paramètre étant en effet 'pane' . C'est un exemple qui montre bien la facilité avec laquelle s'opère le passage de données entre composants dans Fox. FXOptionMenu réagit donc comme une boîte à lister, tout en prenant moins de place, en affichant une valeur par défaut qui peut être modifiée par le choix d'une autre valeur choisie dans un menu instantané.
La figure ci-dessus montre le menu bouton
('FXMenuButton') qui fait apparaître les sous-fenêtres ('FXMenuPane) comprenant
les commandes des menus ('FXMenuCommand')
'Accepter' à 'Quitter' et le sous-menu "cascade" de 'Un' à
'Trois'.
Faites attention au composant FXMenuCascade qui, bien
que déclaré en même temps que les commandes ne passe pas les mêmes paramètres :
…
FXMenuCommand.new(menu,
"A&nnuler", nil, self, ID_CANCEL)
FXMenuCascade.new(menu,
"Sous-menu", nil, submenu)
…
Au lieu de 'self' c'est bien le sous-menu devant
apparaître qui est passé en paramètre, ici 'submenu'.
Le bouton, situé à droite de la boîte, avec une
flèche sur sa droite, déclanche donc l'apparition de sous-menus, qui à leur
tour peuvent faire de même, tandis que le bouton de gauche affiche une valeur.
Notre tour d'horizon des menus ne serait pas complet
sans les barres déplaçables, contenant des boutons, des menus...bref des
composants qui bougent avec la barre et se réorganisent suivant la forme de
cette dernière. Commençons donc par le propriétaire principal qu'est
FXToolBarShell dont la déclaration ne comporte que deux paramètres principaux :
'owner' et 'opts', vu que c'est lui le proprio... Hop, terminé, passons donc au
suivant . Il peut s'agir soit d'un FXMenubar, pour les menus conventionnels,
soit d'un FXToolbar pour les menus
composés de boutons à icône. FxMenubar a été vu plus haut, voyons donc
FXToolbar dont la déclaration est la suivante :
new(p,q,opts....)
dans le cas où il est rattaché à un
FXToolBarShell, et
new(p,opts...)
dans le cas
où il est non-flottant. Dans le premier cas le paramètre 'p' désigne, comme
vous vous en doutez, le propiétaire, et 'q' pointe vers son autre fenêtre
d'accueil, généralement un FXToolBarShell. En définitive FXToolBarShell n'est
qu'une simple sous-fenêtre, avec certes un comportement particulier, rattachée
à la fenêtre principale ...
Dans ces FXToolbar vont prendre place suivant leur
rôle, soit des FXMenuCommand, soit des boutons avec une icône. Reste que pour
manipuler ces composants il nous faut une poignée (avez-vous tenté d'ouvrir un
tiroir sans poignée, pas facile n'est ce pas ?), et c'est FXToolBarGrip qui s'y colle avec la définition
suivante :
new(parent,
target=nil, selector=0, opts...)
Généralement
parent et cible ne font qu'un.
Un
petit exemple pour concrétiser :
*****************************************************************************
require 'fox'
include Fox
class ToolWindow < FXMainWindow
def initialize(app)
super(app, "FOX barre d'outils", nil, nil, DECOR_ALL,
0, 0, 340, 200, 0, 0)
fileopenicon = getIcon("fileopen.png")
filesaveicon = getIcon("filesave.png")
paletteicon = getIcon("palette.png")
# Construit la barre de menus.
dragshell1 = FXToolbarShell.new(self, 0)
menubar = FXMenubar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|FRAME_RAISED)
FXToolbarGrip.new(menubar, menubar, FXMenubar::ID_TOOLBARGRIP,
TOOLBARGRIP_DOUBLE)
# Barre d'outils.
dragshell2 = FXToolbarShell.new(self, 0)
toolbar = FXToolbar.new(self, dragshell2, (LAYOUT_SIDE_TOP|
PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT|FRAME_RAISED|LAYOUT_FILL_X))
FXToolbarGrip.new(toolbar, toolbar, FXToolbar::ID_TOOLBARGRIP,
TOOLBARGRIP_DOUBLE)
# Barre de statut.
statusbar = FXStatusbar.new(self,
LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
statusbar.statusline.normalText="Prêt"
# Menu fichier.
filemenu = FXMenuPane.new(self)
FXMenuTitle.new(menubar, "&Fichier", nil, filemenu)
# Boutons avec icône.
openBtn = FXButton.new(toolbar, "&Ouvrir\tOuvrir un fichier\tOuvre un fichier.", fileopenicon,
nil, 0, ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
saveBtn = FXButton.new(toolbar, "&Sauver\tSauvegarde\tSauve un fichier.", filesaveicon,
nil, 0, ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
# Couleur.
FXButton.new(toolbar, "&Couleurs\tCouleurs\tAffiche la boîte de dialogue couleurs.", paletteicon,nil,0,
ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_RIGHT)
# Entrées du menu "Fichier".
FXMenuCommand.new(filemenu, "&Ouvrir...\tCtl-O\tOuvrir un fichier.", fileopenicon)
FXMenuCommand.new(filemenu, "&Sauver...\tCtl-S\tSauver un fichier.", filesaveicon)
FXMenuCommand.new(filemenu, "&Quitter\tCtl-Q").connect(SEL_COMMAND, method(:onCmdQuit))
FXTooltip.new(getApp(), TOOLTIP_NORMAL)
end
def getIcon(filename)
FXPNGIcon.new(getApp(), File.open(filename, "rb").read)
end
def onCmdQuit(sender, sel, ptr)
getApp().exit(0)
end
def create
super # i.e. FXMainWindow::create()
show
end
end # classe
def run
application = FXApp.new("Boite outils", "FoxTest")
window = ToolWindow.new(application)
application.addSignal("SIGINT", window.method(:onCmdQuit))
application.create
application.run
end
run
*****************************************************************************
Et nous obtenons la fenêtre suivante :
tooltest.png
Remarquez dans les "FXToolBarGrip" le sélecteur qui correspond à la cible. Si la commande est en fait la même (ID_TOOLBARGRIP), son propriétaire doit être de la même classe que la cible (FXMenuBar et FXToolBar). Ca coule de source, mais cela va mieux en le disant.
Nous avons vu précédemment que les objets ont des
méthodes, et que le descendant d'un objet hérite de ces méthodes. Il peut
arriver que l'on ait besoin dans certains cas d'avoir un héritier qui sorte du
lot et doive avoir un comportement différent, tout en gardant le même nom de
méthode. Dans d'autres langages ceci n'est soit pas possible, soit nécessite
des précautions si ce n'est des prévisions à long terme en prévoyant ce cas
éventuel dans l'ancêtre lui-même. Ou bien aussi de créer de toutes pièces une
nouvelle classe. Avec Ruby, vous vous en doutiez n'est ce pas ?, pas de
problème, il y a ce que l'on appelle les méthodes singletons qui permettent de redéfinir une méthode à la volée :
Class oiseau
def modeLoco
print "vole"
end
end
pingouin
= oiseau.new
manchot
= oiseau.new
def manchot.modeLoco
print "ne vole pas"
end
pingouin.modeLoco => "vole"
manchot.modeLoco => "ne vole pas"
L'exemple ci-dessus n'est pas innocent, puisqu'il paraît que les Français (pas les Belges ?) confondent les pingouins du pôle Nord avec les manchots du pôle Sud…
Bien
entendu, il est tout à fait autorisé de redéfinir une classe :
Class
manchot< oiseau
def modeLoco
print
"ne vole pas""
end
end
Ce qui ne fera tout de même pas voler les manchots… Le signe '<' indique que 'manchot' est une nouvelle classe descendant de la classe 'oiseau' et hérite par conséquent de tout ce que possède 'oiseau'.
Vous avez pu voir, si votre sens de l'observation est toujours en éveil, que parfois, dans les exemples précédents, une variable était attribuée à une instance et parfois non. L'explication est simple. Si l'on n'a pas besoin d'accéder ni aux attributs ni aux méthodes, il n'est pas nécessaire d'attribuer une variable à une instance de composant. Seul inconvénient, le ramasse-miettes de Ruby, va détruire l'objet sitôt qu'il ne servira plus. En fait cela n'a aucune importance, puisqu'il se recréera au prochain appel et dans la transparence la plus totale pour l'utilisateur.
Nous avons déjà parlé des tableaux mais sans nous y attarder. Il est temps de voir plus en détail ce concept très utilisé en programmation.
En Ruby vous pouvez créer des tableaux très simplement en affectant des valeurs entre crochets à une variable :
monTableau = [] (ensemble vide)
monTableau =
[1,2,"trois", "quatre"]
Nous voyons que les valeurs peuvent être de plusieurs types. Nous pouvons utiliser les tableaux un peu comme des chaînes de caractères en les concaténant :
monTableau +
["cinq",6] contiendra [1,2,"trois",
"quatre","cinq",6]
en les multipliant :
monTableau*2
=[1,2,"trois",
"quatre","cinq",6,1,2,"trois",
"quatre","cinq",6]
On peut se référer aux éléments par un indice (qui commence à '0').
monTableau[0] = 1
monTableau[2,2] = ["trois","quatre"]
monTableau[-2,2] =
["cinq",6] (les indices négatifs vont de la droite vers la gauche)
monTableau[13] = nil
En
Ruby les tableaux, comme le reste
d'ailleurs, sont très "puissants" et possèdent une multitude de
méthodes. En voici quelques-unes :
·
'|'
pour l'union
["1","2",3"] |
["2","3","4"] =
["1","2","3","4"]
· '&' pour l'intersection [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] = [1, 3]
· '<<' ajoute à la fin [ 1, 2 ] << "c" << "d" = [1, 2, "c", "d"]
· '==" l'égalité [ "a", "b" ] == [ "a", "b", "c" ] = false
· '.clear' vide le tableau : a = [ "a", "b", "c" ], a.clear = []
·
'.include?' booléen : a = [ "a", "b",
"c" ]
·
a.include?("b") = true
·
a.include?("z") = false
·
'.index'
donne l'indice : a
= [ "a", "b", "c" ]
·
a.index("b") = 1
· a.index("z") = nil
· '.lenght' donne le nombre d'éléments : [ 1, 2, 3, 4, 5 ].length = 5
· '.sort' pour trier : a = [ "d", "a", "e", "c", "b" ] a.sort = ["a", "b", "c", "d", "e"]
Aucun rapport avec votre boucher. L'autre nom connu est le "dictionnaire". Plus simplement c'est comme un tableau à deux colonnes, où se trouvent une clef dans la première et une donnée dans la seconde. Si dans un tableau on accède aux éléments au moyen d'un indice, dans une table de hachage c'est par une clef. Une table de hachage se construit en Ruby avec des groupes de deux éléments entre accolades '{}', les éléments étant séparés par une flèche composée du signe '=' et de '>' soit '=>' :
h = {"a"=>100,
"b"=>200}
h["a"] renvoie 100
h["c"] renvoie nil
h["c"] = 300
agrandit la table de la clef "c" et de la donnée 300
Comme pour les tableaux, voici quelques méthodes :
·
'.clear'
vide la table.
·
'.default' donne une valeur à la valeur par défaut :
h.default = "Loupé !"h["d"] renvoie "Loupé"
·
'.delete'
supprime une clef et sa donnée : h.delete["c"]
·
'has_value?'
bolléen, renvoie 'true' si la valeur est présente dans les données :
h.has_value(100) renvoie 'true'
·
'.index'
retourne la clef pour une valeur donnée : h.index(200) renvoie "b".
·
'.lenght'
renvoie le nombre de paires de valeurs de la table : h.lenght renvoie 2.
·
'.sort'
trie la table.
·
'.to_s'
renvoie une chaîne avec les valeurs de la table : h.to_s renvoie "a100b200"
Gros chapitre que nous entamons là. Mais tout est si simple avec FOX, que nous n'hésitons pas à attaquer de front plusieurs composants, visuels ou non d'ailleurs.
La boîte de saisie, appelée parfois "InputBox" ou "TextBox" ou bien encore "EditBox" etc.. , se nomme en FOX "FXTextField". Sa déclaration est la suivante :
FXTextField.new(p,
numColumns, tgt=nil, sel=0, opts=TEXTFIELD_NORMAL, x=0, y=0, w=0, h=0,
pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD)
-
'p'
est le propriétaire.
-
'numcolums'
le nombre de caractères possible à l'affichage.
-
'tgt'
la cible des messages éventuels.
-
'sel'
le sélecteur
-
etc…
C'est tout bêtement une zone rectangulaire blanche dans laquelle l'utilisateur est amené à entrer du texte et des chiffres, ou bien uniquement à y lire une information non modifiable directement. FXTextField peut cependant se spécialiser par le choix de ses options 'opts'. Il peut être converti en boîte de saisie de nombres entiers, de nombres réels, de texte de longueur fixée ou bien encore en mode secret pour entrer un mot de passe.
Pour communiquer avec les autres composants il en existe un, non visuel celui-là, qui
sert d'estafette. Il s'agit de FXDataTarget qui permet à un composant comme
FXTextField d'être relié directement à une variable ou à un ou plusieurs
compères.
Rien de tel qu' un petit programme pour visualiser tout cela et
nous ferons le point après.
***************************************************************************
require 'fox'
include Fox
class ProgressWindow < FXMainWindow
def initialize(app)
# Initialise la classe de base.
super(app, "Test de progression", nil, nil, DECOR_ALL, 20, 20, 600,100)
# Crée une cible avec une valeur entière.
@intTarget = FXDataTarget.new(10)
# Barre de menu.
menubar = FXMenubar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
# Menu Fichier.
filemenu = FXMenuPane.new(self)
FXMenuCommand.new(filemenu, "Dialogue de
progression...").connect(SEL_COMMAND) do
@progressdialog.show(PLACEMENT_OWNER)
end
FXMenuCommand.new(filemenu,"&Quitter\tCtlQ",nil,getApp(),FXApp::ID_QUIT)
FXMenuTitle.new(menubar, "&Fichier", nil, filemenu)
# Crée une boîte d'information reliée à la valeur de @intTarget.
@progressdialog = FXProgressDialog.new(self, "Progression", "%
effectué...",PROGRESSDIALOG_CANCEL|DECOR_BORDER|DECOR_RESIZE)
@progressdialog.target = @intTarget
@progressdialog.selector = FXDataTarget::ID_VALUE
FXHorizontalSeparator.new(self,LAYOUT_SIDE_TOP|SEPARATOR_GROOVE|
LAYOUT_FILL_X)
# Une matrice pour bien aligner les composants.
matrix = FXMatrix.new(self, 7,
MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
FXLabel.new(matrix, "&Entier", nil,
LAYOUT_CENTER_Y|LAYOUT_CENTER_X|JUSTIFY_RIGHT|LAYOUT_FILL_ROW)
FXTextField.new(matrix, 10, @intTarget, FXDataTarget::ID_VALUE,
LAYOUT_CENTER_Y|LAYOUT_CENTER_X|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_ROW)
FXTextField.new(matrix, 10, @intTarget, FXDataTarget::ID_VALUE,
LAYOUT_CENTER_Y|LAYOUT_CENTER_X|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_ROW)
FXSlider.new(matrix, @intTarget, FXDataTarget::ID_VALUE,
LAYOUT_CENTER_Y|LAYOUT_FILL_ROW|LAYOUT_FIX_WIDTH, 0, 0, 100)
FXDial.new(matrix, @intTarget, FXDataTarget::ID_VALUE, (LAYOUT_CENTER_Y|LAYOUT_FILL_ROW|LAYOUT_FIX_WIDTH|DIAL_HORIZONTAL|DIAL_HAS_NOTCH),0, 0, 100)
FXSpinner.new(matrix, 5, @intTarget, FXDataTarget::ID_VALUE,
SPIN_CYCLIC|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW)
FXProgressBar.new(matrix, @intTarget, FXDataTarget::ID_VALUE,
(LAYOUT_CENTER_Y|LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK|
PROGRESSBAR_PERCENTAGE|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW))
# Installe un accélérateur clavier de fermeture.
self.accelTable.addAccel(fxparseaccel("Ctl-Q"), getApp(),
MKUINT(FXApp::ID_QUIT, SEL_COMMAND))
end
# Méthode pour Quitter.
def onCmdQuit(sender, sel, ptr)
getApp.exit(0)
end
# Début.
def create
# Création de la fenêtre.
super
# Montre la fenêtre principale.
show(PLACEMENT_SCREEN)
end
end
if __FILE__ == $0
# Construit une application.
application = FXApp.new("Progression", "FoxTest")
# L'implémentation de "threads' actuels peut causer des problèmes avec cet exemple. On les désactive donc.
application.threadsEnabled = false
# Crée la fenêtre principale.
window = ProgressWindow.new(application)
# Poignée d'interruption pour quitter l'application d'une manière gracieuse
application.addSignal("SIGINT", window.method(:onCmdQuit))
# Création de l'application.
application.create
# Et roulez jeunesse !
application.run
end
*****************************************************************************
Et voici ce que vous devez obtenir à l'écran :
Nous voyons donc dans l'ordre et de gauche à droite : une étiquette, suivit de deux boîtes de saisie, puis un potentiomètre, un cadran, un compteur et enfin une barre de progression.
En cliquant sur le menu 'Fichier', puis sur la
sous-commande 'Dialogue de progression', vous verrez apparaître la fameuse
fenêtre d'information anti-stress vous
annonçant que tel programme se déroule normalement mais qu'il est un tout petit
peu long à s'exécuter…
En modifiant la valeur d'un seul composant on
modifie tous les autres, grâce à celui qui est invisible : FXDataTarget.
Dans l'ordre d'entrée en scène nous avons donc :
·
L'appel,
auquel nous sommes maintenant habitués, à 'super'.
·
La
création de FXDataTarget initialisé à la valeur '10' , ce qui va par la même
occasion initialiser les autres composants à cette valeur, vu qu'ils ont tous
'@intTarget' comme cible.
·
Vient
ensuite la description de la barre de menu
(Fichier à Dialogue… et Quitter)
·
L'initialisation
de la boîte d'information de la progression. Si vous avez la curiosité de
regarder dans l'appendice A, afin de rechercher les attributs de
FXProgressDialog initialisés dans les lignes suivantes ('.target' et
'.selector'), vous ne les trouverez pas tout de suite. N'oubliez pas que dans
Ruby et FOX tout est objet, et qu'un objet possède la particularité d'hériter de
ses ancêtres. Il va donc falloir remonter assez haut pour trouver l'origine de
ces attributs : FXProgressDialog => FXDialogBox => FXTopWindow =>
FXShell => FXComposite => FXWindow.
·
Le
séparateur horizontal, pour faire joli.
·
Un
nouveau composant : FXMatrix à qui il suffit d'indiquer le nombre de colonnes
désiré, les options habituelles de positionnement et le tour est joué, FXMatrix
va ranger ses enfants dans l'ordre et la discipline. Il faudrait un de ces
composants pour chaque classe de collège…
·
Et
voici les 7 composants qui seront tous enfants de 'matrix'. Blanche Neige et
les 7 nains quoi… Pour commencer FXLabel, déjà vu et revu, passons donc au
suivant.
·
FXTextField.
Le composant actif par excellence, puisqu'on peut y écrire dedans. Comme c'est
un composant générique capable de faire une foultitude de choses, il ressemble,
en plus petit, à un traitement de texte complet. Vous en trouverez la
description complète en Annexe A. Tout ce que nous allons en dire pour le
moment consiste en la description de son initialisation dans le programme. Donc
en dehors des paramètres de positionnements facultatifs nous avons dans new(p,
numColumns,tgt=nil,sel=0,pts=TEXTFIELD_NORMAL) le paramètre 'p' du propriétaire
(ici 'matrix' en personne), le nombre de colonnes ('numColumns') ici '10' pour
faire un peu large, la cible 'tgt' représentée par l'instance de FXDataTarget
qu'est '@intTarget'. La cible va se comporter comme un miroir et renvoyer à
tous les composants dont elle est la cible tout changement qui sera accompagné du
message 'ID_VALUE' qui est partie prenante du paramètre suivant, le sélecteur
'sel'. Les options de 'pts' sont là pour l'arrangement habituel du composant,
plus LAYOUT_FILL_ROW qui va remplir la cellule de la matrice. Encore plus
intéressants sont les attributs qui vont de la précision de la couleur du
texte, sa justification, sa longueur en passant par la position du caret (curseur texte). Précisons pour terminer qu'il
supporte les opérations couper, copier, coller du presse-papier.
·
Les
autres composants ont tous la même présentation de la méthode 'new' et le même ordre d'entrée des paramètres.
Nous allons donc uniquement décrire quelques-unes de leurs possibilités, les
plus curieux se réfèreront à l'Annexe A. (Finalement je n'aurais dû écrire que
l'Annexe A, diront certains). Bref le suivant est le potentiomètre FXSlider.
·
Le
prochain sur la liste est le cadran, FXDial. Un vu-mètre serait plus exact. Les
attributs accessibles ne sont pas aussi nombreux que ceux de FXTextField mais
citons tout de même celui définissant l'intervalle de valeurs prise en compte
:'.range', et celui renseignant la valeur à prendre en compte pourl'affichage :
'.value'.
·
Le
compteur, en nombre entier, FXSpinner, peut voir sa valeur augmenter ou
diminuer suivant la flèche cliquée, ou bien la valeur qu'il reçoit de
FXDataTarget, ou bien encore par le changement de la valeur contenue dans sa
fenêtre, laquelle est sélectionnable comme dans un FXTextField.
·
Arrive
enfin le dernier de la liste, la barre de progression FXProgressBar. La barre
peut être horizontale ou verticale, ou bien encore se transformer en cadran
circulaire grâce à son option 'opts'. Elle affiche aussi, toujours en fonction
des options, soit la valeur seule soit la valeur suivie du signe pourcentage.
·
Continuons
par un composant non visuel qui permet de programmer aisément la sortie du
programme, ou d'autres commandes, par l'intermédiaire du clavier. Il s'agit de
FXAccelTable. C'est une table qui contient
: des "messages" à envoyer à des "cibles" lorsque
une certaine combinaison de
"touches" est frappée. En bref nous avons utilisé la déclaration
suivante : addAccel(hotKey, target=nil, seldn=0, selup=0), 'hotKey' étant
"Ctrl-Q", 'target' étant l'application elle-même appelée par la
fonction 'getApp', et le sélecteur transformé par MKUINT qui est une
méthode du module 'FOX' qui transforme
les deux paramètres de 16 bits en un seul de 32.
·
Les
'threads'. Ce sont les différentes tâches lancées durant l'exécution d'un
processus et gérées, tant bien que mal, par le système d'exploitation qui se
veut du coup "multi-tâches". Au moment de l'écriture de ces lignes ,
le créateur de FXRuby pour Windows n'est pas satisfait du support de l'actuel
multi-tâches et par conséquent préfère prévenir toute panne éventuelle en le
déconnectant dans certains programmes.
·
Terminons
en beauté avec le bizarre "SIGINT". Les méthodes FXApp#addSignal
ainsi que FXApp#removeSignal, ont été améliorées pour accepter une chaîne ou un
entier comme premier argument. Si c'est une chaîne (par ex. "SIGINT' ou juste
"INIT") le code déterminera le numéro du signal correspondant pour
vous (comme la méthode Process.kill de la librairie standard de Ruby). Il
existe 3 formes d'appel pour intercepter les signaux du système d'information.
Chaque version possède aussi deux arguments optionnels (voir dans FXApp en
appendice).La plus ancienne spécifie la cible et l'identifiant du message :
aSignal =
getApp().addSignal("SIGINT", signalHandlerObj, ID_SIGINT)
La seconde prend
soit une méthode , soit une instance de procédure ('Proc') comme second
argument :
aSignal = getApp().addSignal("SIGINT", method(:signalHandlerMethod))
La dernière forme utilise un bloc de code comme poignée pour le signal :
aSignal = getApp().addSignal("SIGINT") { |sender, sel,
ptr|
#
traite le signal
}
Puisque nous en sommes aux boîtes d'entrée de texte et à la communication, essayons de simplifier, largement, l'exemple ci-dessus et de faire des tests variés. Après un traitement spartiate nous arrivons au code suivant de test1.rbw :
*****************************************************************************
require 'fox'
include Fox
class Test1Window < FXMainWindow
def initialize(app)
super(app, "Test_1", nil, nil, DECOR_ALL)
FXHorizontalSeparator.new(self,
LAYOUT_SIDE_TOP|SEPARATOR_GROOVE|LAYOUT_FILL_X)
matrix = FXMatrix.new(self, 3,
MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
FXLabel.new(matrix, "&Integer", nil,
LAYOUT_CENTER_Y|LAYOUT_CENTER_X|JUSTIFY_RIGHT|LAYOUT_FILL_ROW)
@t1 = FXTextField.new(matrix, 10, nil,0,
LAYOUT_CENTER_Y|LAYOUT_CENTER_X|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_ROW)
@t2 = FXTextField.new(matrix, 10, nil,0,
LAYOUT_CENTER_Y|LAYOUT_CENTER_X|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_ROW)
@t1.connect(SEL_COMMAND){
@t2.text=@t1.text*2
}
@t1.setFocus
# Démarrage
def create
super
show(PLACEMENT_SCREEN)
end
end
if __FILE__ == $0
application = FXApp.new("Test", "FoxTest")
window = Test1Window.new(application)
application.create
application.run
end
*****************************************************************************
Ici plus question d'échange de données évoluée et instantanée, mais de
communication de données d'un composant à un autre après un traitement
quelconque. @t1 envoie un message SEL_COMMAND et multiplie la valeur de sa zone
de texte par 2. Si vous êtes un tant soit peu curieux, vous avez déjà parcouru
l'Appendice A et vu que le message SEL_COMMAND de l'objet FXTextField est
envoyé lors de l'appui de la touche 'Enter' ou de la touche 'Tab'. Et nous
obtenons le résultat suivant :
La réponse doit vous paraître bizarre non ? comme c'est bizarre. L'explication vient du fait que Ruby traite les mots comme des nombres, et donc '* 2' signifie pour lui que l'on veut doubler l'entrée; il répète donc ce que l'on a tapé. Donc si l'entrée est 'AaBb' le texte de '@t2' sera 'AaBbAaBb'. Pour effectuer de vrais calculs il suffit de transformer la donnée chaîne en donnée nombre. Remplaçons donc la ligne suivant celle de '@t1.connect' par
'@t2.text = (@t1.text.to_i * 2).to_s
qui va tout faire rentrer dans l'ordre en transformant d'abord le texte en nombre entier ('.to_i'), en le multipliant par 2 et finalement en retransformant le tout en chaîne ('.to_s). Voici le résultat plus sympathique pour les matheux :
test2.png
Et pour que tout soit vraiment en ordre, ajoutons
aux options de '@t1' :
TEXTFIELD_INTEGER|, ce qui obligera à entrer uniquement des chiffres. Pour améliorer encore la
saisie, nous pouvons indiquer que nous voulons des réels en ajoutant
'TEXTFIELD_REAL|' ( au lieu de TEXTFIELD_INTEGER|, bien sûr) aux options et changer la
méthode '.to_i' en '.to_f' (float). Nous aurons donc accès à la lettre 'e'
(ou'E'), au point '.' (notation anglaise, la virgule ne fonctionnant pas), et
bien sûr à tous les chiffres.
La ligne @t1.setFocus force le focus sur '@t1' afin
d'avoir le caret sur ce composant dès l'apparition de la fenêtre.
Histoire de voir toutes les possibilités du composant FXTextField, ajoutons dans les options de '@t1' le mot 'TEXTFIELD_PASSWD|' ce qui permet de cacher l'entrée lors de la frappe.
Nous
pouvons encore améliorer le traitement et appeler une méthode :
@t2.text =
(mul(@t1.text.to_i)).to_s
def mul(n)
n *= 2
end
Afin
d'empêcher la saisie dans '@t2', il suffit de fixer son attribut 'editable' à
'false', après son initialisation ça va de soi, donc suite à la ligne
'@t1.setFocus' par exemple :
'@t2.editable = false'
- Si mot =
"to" alors 'mot * 3' ==>
"tototo"
- Pour concaténer des chaînes (ajouter l'une à l'autre), le signe '+' est de rigueur :
"to" + "to"
==> "toto"
si a = "to" alors a <<
"tem" ==> a sera égal à "totem"; '<<' modifie donc
la variable.
-
Pour extraire un élément de mot, on utilise les crochets '[]', Ruby traitant
les chaînes comme des tableaux. S'il
y a un seul chiffre, c'est le code du caractère qui est retourné :
a = "Bonjour'
a[1] = 111 c'est à dire le code du caractère
'o', l'indice débutant à zéro !
mais
par contre a[1,1] ="o" et
a[1,3] ="onj"
a[-3,2] = "ou" dans le cas de la marche
arrière on part de la droite et on débute à 1 et non à 0.
a[-5..-3]
= "njo" ici on utilise l'intervalle grâce au deux points '..'
a["on"]
retourne "on" parce que la correspondance existe.
a["zut"]
retourne 'nil'.
-
pour les comparaisons il y a
la méthode '<=>' qui retourne '1', '0', '-1'
"abcdef" <=> "abcde" ==> 1
"abcdef" <=> "abcdef" ==> 0
"abcdef" <=> "abcdefg" ==> -1
"abcdef" <=> "ABCDEF" ==> 1
-
le
test d'égalité '==' retourne un booléen 'true' ou 'false'
-
le
remplacemnt de caractères s'effectue par '[]=' :
a =
"Bonjour"
a[2,1]="xyz" ==>
"Boxyzjour"
a[-4,2]="xyz" ==>
"Bonxyzur"
-
la
méthode 'capitalize' retourne une chaîne débutant par une majuscule le reste en
minuscule :
"bonjour".capitalize
=> "Bonjour"
"BONJOUR".capitalize
=>"Bonjour"
-
la
méthode 'downcase' transforme toutes
les majuscules en minuscules.
-
la
méthode 'upcase' transforme toutes les minuscules en majuscules.
-
'to_i'
convertit une chaîne en un entier (i pour integer).
-
'to_f'
convertit une chaîne en réel (f pour float)
-
'length'
retourne la longueur de la chaîne.
et
de nombreuses autres méthodes dont l'intégralité se trouve dans
"Programming Ruby"
Les nombres sont répartis en deux grandes classes
qui sont 'Fixnum' pour les entiers et 'Bignum' pour les réels. Les entiers sont
dans un intervalle allant normalement de -230 à 230-1 ou
-262 à
262-1. Hors de cet intervalle ils sont
stockés comme des objets de la classe Fixnum.
Les nombres aussi ont leurs méthodes, de naissance si l'on peut dire, puisque tout est objet dans Ruby, répétons-le.
- Tout d'abord les signes d'opérations élémentaires : +, --, *, /, **, %. Attention la soustraction nécessite deux signes '-'.
-
'to_s' transforme un nombre en une chaîne.
-
La méthode de comparaison '<=>' qui retourne '-1', '0', ou '1' suivant
que l'argumeznt de gauche est <, = ou > à celui de droite.
-
Les méthodes d'opérations bit à bit :
~ a Inversion bit à bit (complément)
a | n OU bit à bit
a & n ET bit à bit
a ^ n OU EXCLUSIF bit à bit
a << n décalage à gauche de n bits
a >> n décalage à droite de n bits
Etc...
même remarque que pour les chaînes ci-dessus.
C'est bien beau de faire des gribouillages sur un canevas, comme au chapitre 4, mais il y a certainement mieux à faire, charger des images d'artistes plus "inspirés", par exemple. Les composants à la base des affichages d'images et des opérations éventuelles sont FXImage et FXImageView dont les déclarations sont les suivantes :
FXImage.new(app, pixels=nil, options=0,
width=1, height=1)
et
FXImageView .new(p, img=nil, tgt=nil, sel=0,
opts=0, x=0, y=0, w=0, h=0)
(voir
les autres détails, comme d'habitude, à l'appendice A)
Pour nous entraîner à manipuler les images nous allons partir du petit programme de "gribouillage" et le transformer pour effectuer différentes manipulations.
testimg.rbw
***************************************************************************
require 'fox'
require 'fox/colors'
include Fox
class ImageWindow < FXMainWindow
def initialize(app)
super(app, "Test image", nil, nil, DECOR_ALL,0,0,340,200)
@contents = FXHorizontalFrame.new(self,
LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
@canvasFrame = FXVerticalFrame.new(@contents,
FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
0, 0, 0, 0, 10, 10, 10, 10)
FXLabel.new(@canvasFrame,"Cadre de l'image",nil,
JUSTIFY_CENTER_X|LAYOUT_FILL_X)
FXHorizontalSeparator.new(@canvasFrame, SEPARATOR_GROOVE|LAYOUT_FILL_X)
# Composant visionneuse d'image.
@imageview = FXImageView.new(@canvasFrame, nil, nil, 0,
LAYOUT_FILL_X|LAYOUT_FILL_Y)
@buttonFrame = FXVerticalFrame.new(@contents,
FRAME_SUNKEN|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
0, 0, 0, 0, 10, 10, 10, 10)
FXLabel.new(@buttonFrame, "Cadre boutons", nil,
JUSTIFY_CENTER_X|LAYOUT_FILL_X)
FXHorizontalSeparator.new(@buttonFrame,SEPARATOR_RIDGE|LAYOUT_FILL_X)
# Le bouton de test.
testButton = FXButton.new(@buttonFrame, "&Test", nil, nil, 0,
FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
0, 0, 0, 0, 10, 10, 5, 5)
testButton.connect(SEL_COMMAND, method(:onCmdChange))
FXButton.new(@buttonFrame, "&Quitter", nil, app, FXApp::ID_QUIT,
FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
0, 0, 0, 0, 10, 10, 5, 5)
loadImage("BigPenguin.png")
end # initialize
# Chargement de l'image.
def loadImage(file)
img = nil
img = FXPNGImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
FXFileStream.open(file, FXStreamLoad) { |stream| img.loadPixels(stream) }
img.create
@imageview.image = img
end
# Ce qui change dans le test.
def onCmdChange(sender, sel, ptr)
img = @imageview.image
img.rotate(90)
@imageview.image = img
end
def create
super
show(PLACEMENT_SCREEN)
end
end # class
def run
application = FXApp.new("TestImage", "FoxTest")
window = ImageWindow.new(application)
application.create
application.run
end
run
***************************************************************************
Nous avons tout simplement remplacé le canevas par un visionneur FXImageView et modifié le bouton d'effacement de telle sorte qu'il communique les ordres à l'image, laquelle est chargée par la méthode 'loadImage'. Nous allons attribuer au bouton de test une commande pour effectuer l'opération de notre choix par l'intermédiaire de SEL_COMMAND. Nous avons déjà eu l'occasion de charger des icônes, voilà le tour des images. Le format n'étant pas le même, le principe pour les charger ne l'est pas non plus. Nous attribuons à la variable 'img' la création par 'new' d'une image 'PNG' et nous la chargeons par l'intermédiaire d'un flux. 'FXFileStream.open' ouvre un fichier 'file' avec la directive 'FXStreamLoad', qui indique un chargement (contrairement à FXStreamSave qui sauvegarde).
Ce qui donne l'image ci-dessous :
testimg1.png
C'est dans la méthode onCmdChange que nous effectuerons nos essais proprement dits en changeant la méthode de la variable intermédiaire 'img'. Comme premier essai nous avons choisi de faire tourner l'image de 90 degrés :
'img.rotate(90)'
Cliquez sur le bouton 'Test' et le pingouin bascule
sur le côté. Vous pouvez, sans aucun risque pour sa vie, le faire tourner de
divers angles en modifiant le paramètre de 'rotate'.
D'autres méthodes sont définies dans la classe FXImage, à vous de les essayer. Par exemple pour modifier la taille de l'image, remplacez 'img.rotate()' par
'img.scale(96,114)'
qui va grossir l'image(la taille d'origine est de 48
X 57 pixels).
La méthode 'crop' va vous donner la photo d'identité du pingouin en faisant
'img.crop(12,0,25,25)'
Il s'agit de la méthode permettant de recadrer une
image, en extraire une partie.
Dernière méthode disponible, 'mirror' permet
d'effectuer une symétrie soit par rapport à la verticale soit par rapport à
l'horizontale.
'img.mirror(true,false)'
permet
de faire regarder le pingouin dans l'autre direction.
testimg2.png
D'où l'explication de la présence d'un pingouin dans
Windows : ce n'est pas un clin d'oeil à Linux mais tout simplement la nécessité
de faire tourner la tête d'une façon qui ne passe pas inaperçue...
Le chargement d'images n'est pas limité aux fichiers
".PNG". FXRuby est
capable, au moment où ces lignes sont écrites (c'est à dire pour la version
1.6.8 de Ruby et 1.0.26 de FXRuby) de lire les formats d'images suivants : BMP, ICO, GIF, JPG, PNG, PCX, TIF, TGA,
XPM avec plus où moins de bonheur il faut le dire (mais cela est peut-être - je
n'ose pas dire certainement - dû à
l'âge canonique de mon matériel !). L'appel se faisant de manière identique
(heureusement !) pour tous les formats :
FXxxxImage.new(app, pixels=nil, opts=0, width=1, height=1)
-
App
désigne l'application.
-
Pixels désigne un pointeur vers un tableau de
données représentant l'image.
-
Opts
désigne les options éventuelles déclarées dans FXImage.
-
Width
désigne la largeur de l'image.
-
Height
désigne la hauteur de l'image.
Puisque nous sommes en train
de voir comment afficher une image et la faire tourner dans tous les sens,
pourquoi ne pas s'occuper aussi de la couleur. Au prix de quelques
modifications, nous allons avoir accès à la boîte de couleur de Fox.
Rajoutons dans la méthode 'initialize' la déclaration de la dite boîte :
# Création boîte de dialogue couleur.
colordlg = FXColorDialog.new(self,
"Boîte de couleurs")
puisque nous avons déjà un bouton de test autant nous en servir en modifiant les paramètres de cible et de sélecteur, et en désactivant la méthode 'connect' par un '#' en début de ligne :
testButton = FXButton.new(@buttonFrame,
"&Test", nil, colordlg, FXWindow::ID_SHOW,...
#
testButton.connect...
Et,
oh miracle de FXRuby, voilà ce qui enchante nos yeux :
couleurs.png
Si ses joues sont bien colorées, la pauvre petite manque de renseignements, n'est ce pas ? Pour remédier à cette absence il suffit de rajouter les info-bulles :
FXTooltip.new(getApp(), TOOLTIP_NORMAL)
dans la méthode 'initialize' bien entendu.
Dans la partie gauche de la fenêtre se trouve un bouton muni d'une icône représentant une pipette. Ce bouton commande... une pipette, représentée par une croix qui sert à pointer un endroit de l'image. Vous pouvez ainsi ausculter le pingouin sous toutes ses coutures. La croix disparaît après chaque clic souris et affiche les composantes de la couleur choisie dans les divers volets représentants les diverses descriptions : RGB , HSV etc...
Depuis le début de cet ouvrage nous utilisons dans chaque programme, le mot 'class' et nous avons brièvement abordé le sujet dans le premier chapitre. Il est temps de développer les explications. Nous avons vu qu'une classe était en fait la description du type d'un objet, un bloc de code compris entre les mots 'class' et 'end', et dans lequel se trouvent des variables (attributs) et des méthodes. A partir d'une classe on peut créer des sous-classes qui hériteront de la classe supérieure. Ruby est suffisamment souple pour permettre de redéfinir une méthode héritée si le besoin s'en fait sentir ou bien de la compléter en appelant la méthode de la classe supérieure par 'super' et en rajoutant du code (cf. toutes les méthodes 'initialize' des composants FOX).
class nomdeclasse [< classesuperieure ]
code interne
end
Les classes peuvent par exemple avoir des constantes, qui seront communes à tous les
descendants, et accessibles de l'extérieur par le nom de la classe suivie d'un
double deux-points : '::'
CONST = 123
end
Par
contre les variables propres aux instances sont accessibles par ce que l'on
appelle des accesseurs.
Nous savons que les variables appartenant à des instances débutent par un '@'. Pour y accéder, soit en lecture soit en écriture, nous passons par des accesseurs d'attributs.
class
Truc
def EcritVarxyz(n) # pour écrire dans la variable @xyz.
@xyz=n
end
def LitVarxyz # pour lire la variable @xyz.
@xyz
end
end
Mais
Ruby propose, évidemment, des raccourcis pour ces méthodes :
class
Truc
def Varxyz=(n) # pour écrire dans la variable @xyz.
@xyz=n
end
def Varxyz # pour lire la variable @xyz.
@xyz
end
end
Un module est une classe qui ne peut être instanciée. Un module peut contenir des classes et des méthodes d'instances qui peuvent être invoquées en utilisant l'objet 'Module' comme un destinataire et les constantes sont accessibles par l'opérateur deux-point : '::'. Un module ne peut pas avoir de sous-classes. Un module est définit par le bloc : module .... end.
Soit la définition :
module Truc
CONST = 1
def Truc.methode1
CONST + 1
end
end
Truc::CONST donnera 1
Truc.methode1 donnera 2
Un
module permet de concentrer des constantes et des méthodes d'un même centre
d'intêret. Par exemple le module 'Math' possède deux constantes ('E' et 'PI')
et des méthodes se rapportant à l'exercice mathématique.
Math.sqrt(4) donnera 2
Math::PI donnera 3.141592654
Nous avons vu que nous pouvons déclarer un module
dans un programme par 'include'. Une autre manière consiste à inclure le module
dans une définition de classe ce qui permet d'avoir en quelque sorte un
héritage "multiple". C'est ce que l'on appelle, en anglais, les
"Mixins" de "mixed in".
Un exemple valant souvent mieux qu'un long discours, supposons que votre classe possède une méthode '<=>' . Si on inclut le module 'Enumerable' on hérite de méthodes telles que 'find' pour chercher, 'sort' pour trier, 'max' pour une valeur maxi etc...Si de plus la méthode 'each' fait partie de la classe, c'est alors d'une quinzaine de méthodes dont on dispose.
Par exemple la méthode '.collect' donnera pour un
intervalle :
(1..4).collect
{|i| i*i } ------> [1, 4, 9, 16]
(1..100).detect
{|i| i % 5 == 0 and i % 7 == 0 } ------> 35
Entrées depuis longtemps dans les moeurs, les boîtes
à lister, modifiables ou non, sont désormais inévitables et c'est une bonne
chose, tant elles facilitent aussi bien le travail du programmeur que celui de
l'utilisateur. Elles servent à choisir une valeur dans une liste, d'où leur
nom.
Pour tester ces composants, nous allons continuer à
utiliser notre petite fenêtre déjà vue au chapitre 6, et modifier au minimum
son code. Commençons par la boîte à lister toute simple appelée FXListBox, dont
la déclaration est la suivante :
new(p, nvis, tgt=nil, sel=0, opts=FRAME_SUNKEN|FRAME_THICK|LISTBOX_NORMAL,
x=0, y=0, w=0, h=0, pl=DEFAULT_PAD,
pr=DEFAULT_PAD, pt=DEFAULT_PAD,
pb=DEFAULT_PAD)
'p'
est le parent, 'nvis' le nombre d'éléments visibles dans la fenêtre du
composant. Les autres paramètres sont habituels.
*****************************************************************************
require 'fox'
include Fox
FAMILLE = ["PAPA", "MAMAN", "LA BONNE", "ET MOI"]
class ListWindow < FXMainWindow
def initialize(app)
super(app, "Test de liste", nil, nil, DECOR_ALL,0,0,200,40)
matrix = FXMatrix.new(self, 2,
MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
FXLabel.new(matrix, "Choix : ", nil,
LAYOUT_CENTER_Y|LAYOUT_CENTER_X|JUSTIFY_RIGHT|LAYOUT_FILL_ROW)
@List = FXListBox.new(matrix, 3, nil, 0,
LISTBOX_NORMAL|FRAME_SUNKEN|FRAME_THICK)
for i in 0..3
@List.appendItem(FAMILLE[i])
end
end
def onCmdQuit(sender, sel, ptr)
getApp.exit(0)
end
def create
super
show(PLACEMENT_SCREEN)
end
end
if __FILE__ == $0
application = FXApp.new("Listes", "FoxTest")
window = ListWindow.new(application)
application.addSignal("SIGINT", window.method(:onCmdQuit))
application.create
application.run
end
*****************************************************************************
Ce
qui donne l'image suivante :
list.png
Première remarque : le rectangle de visualisation se
dimensionne automatiquement suivant la longueur du texte affiché, et les items
défilent horizontalement, en suivant le curseur souris, permettant ainsi leur
lecture. Deuxième remarque : le texte n'est pas modifiable et ne se met donc
pas en surbrillance dans le rectangle habituel de saisie.
La déclaration n'appelle pas de remarque
particulière. Sont disponibles également les textes d'aides habituels dans les
info-bulles ou bien la ligne de statut. Le nombre d'items visibles dans la
fenêtre peut être modifié par l'entremise de l'atttribut 'numVisible'. De la même manière les
attributs permettent de modifier la fonte, la couleur du fond etc... voir
l'appendice A.
Nouveauté en début de programme, la déclaration de tableau et l'insertion de ses éléments dans la liste par la méthode 'append'. La méthode 'prepend' les aurait insérés dans l'ordre inverse en les rajoutant au début de liste à chaque insertion.
Notons aussi que FXListBox offre en option la possibilité
de stocker une icône et un pointeur vers une donnée, pour chaque élément de la
liste.
L'autre
composant classique est la boîte "combo" dont la déclaration est la
suivante :
new(parent, numColumns,
numVisible, target=nil, selector=0, opts=COMBOBOX_NORMAL, x=0, y=0, width=0,
height=0, padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD, padTop=DEFAULT_PAD,
padBottom=DEFAULT_PAD)
La
différence principale se situe dans le nombre de colonnes ('numColumns') à
afficher, c'est à dire en fait le nombre de caractères. L'aspect est
visuellement identique à FXListBox.
Remplaçons la ligne
'@List = FXListBox.new...'
par
'FXComboBox.new(matrix,10,3,nil,0,COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)'
Avec l'option 'COMBOBOX_STATIC' le texte ne peut être modifié, mais il existe d'autres options qui permettent non seulement de le faire , mais aussi d'insérer le nouveau texte à l'endroit voulu ou bien encore de remplacer le texte mis en surbrillance. Voir les détails en appendice A.
FXComboBox admet outre son texte normal, un pointeur
vers une donnée (facultatif).
FXListBox et FXComboBox possèdent tous deux les
attributs nécessaires à la modification de couleurs des items, du nombre
visible d'entre eux et des textes d'aide.
FXDirList
Composant visuel indispensable dès que l'on a à travailler avec des fichiers, FXDirList est aussi simple d'emploi que les composants que nous avons déjà vus. Sa déclaration le montre immédiatement :
FXDirList.new(p, nvis, tgt=nil, sel=0,
opts=0, x=0, y=0, w=0, h=0)
Comme son nom l'indique il s'agit d'une liste
graphique de répertoires, le deuxième paramètre indiquant le nombre d'items
visibles. Si celui-ci n'est pas fixé, la liste remplira la fenêtre autant que
faire se peut.
Encore un petit programme pour concrétiser tout cela
:
***************************************************************************
require "fox"
include Fox
class DirListWindow < FXMainWindow
def initialize(app)
super(app, "Liste répertoires", nil, nil, DECOR_ALL, 0, 0, 400, 500)
# Construit la barre de menu.
menubar = FXMenubar.new(self, LAYOUT_FILL_X)
filemenu = FXMenuPane.new(self)
FXMenuCommand.new(filemenu, "&Quitter\tCtl-Q", nil,
getApp(), FXApp::ID_QUIT)
FXMenuTitle.new(menubar, "&Fichier", nil, filemenu)
helpmenu = FXMenuPane.new(self)
FXMenuCommand.new(helpmenu, "&A propos de FOX...").connect(SEL_COMMAND) {
FXMessageBox.information(self, MBOX_OK, "A propos de FOX",
"FOX est une excellente librairie en C++...\n" +
"et FXRuby est une interface GUI très simple pour Ruby!")
}
FXMenuTitle.new(menubar, "&Aide", nil, helpmenu, LAYOUT_RIGHT)
# Construit la liste des répertoires.
dirlist = FXDirList.new(self, 0, nil, 0, (HSCROLLING_OFF|
TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|FRAME_SUNKEN|FRAME_THICK|
LAYOUT_FILL_X|LAYOUT_FILL_Y))
end
def create
super
show(PLACEMENT_SCREEN)
end
end
def run
application = FXApp.new("DirList", "FoxTest")
DirListWindow.new(application)
application.create
application.run
end
run
***************************************************************************
Ce
qui nous donne la fenêtre ci-dessous :
Fig 4 - Dirlist.rbw
Encore une fois rien de bien particulier à dire au sujet de la ligne qui nous intéresse, à savoir celle de la déclaration de FXDirList, si ce n'est sur les constantes employées dans le paramètre des options : TREELIST_SHOWS_LINES et TREELIST_SHOWS_BOXES. Elles sont déclarées dans l'ancêtre FXTreeList et imposent respectivement l'affichage des lignes pointillées de liaison et celui des petites boîtes qui contiennent le signe '+'. Soit dit en passant, on peut se demander quelle est leur utilité, étant donné que, sous Windows, ces "boîtes" sont présentes qu'il y ait ou non des sous-répertoires. Pour ceux auprès de qui ce genre de "machin" trouve grâce, il existe aussi TREELIST_ROOT_BOXES qui affiche une "boîte" à côté de la racine...
La constante HSCROLLING_OFF désactive le défilement horizontal.
FXFileList
Après les répertoires - pardon, depuis Win 95 on
appelle ça des dossiers et je ne suis pas encore habitué - vient l'affichage
des fichiers. FXFileList est le composant chargé de cette besogne et possède la
déclaration suivante :
FXFileList.new(p, tgt=nil, sel=0, opts=0,
x=0, y=0, w=0, h=0)
Toujours pas de surprises dans les paramètres : le
parent, la cible des messages, le sélecteur, les options et les dimensions.
Rien à dire, FOX est vraiment très simple d'emploi, je ne le dirai jamais
assez. Pour tester ce composant remplaçons la ligne :
dirlist
= FXDirList.new(...
par
la suivante :
dirlist = FXFileList.new(self,nil,0, (HSCROLLING_OFF|FILELIST_SHOWHIDDEN |FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y))
Par défaut c'est le répertoire racine qui est choisi et la constante FILELIST_SHOWHIDDEN permet l'affichage des fichiers cachés. Pour changer de répertoire on utilise l'attibut 'directory' :
dirlist.directory =
"C:\WINDOWS"
Nous voyons que le composant FXFileList affiche tout ce que l'on désire savoir sur les fichiers : le nom, la taille, le type, la date et les attributs comme le montre la figure ci-dessous.
filelist.png
Les colonnes sont bien entendu réglables en largeur
et un clic sur le fronton de l'une d'entre elle change l'ordre de tri.
A l'aide de ces deux derniers composants il est donc
relativement facile de se fabriquer un "Explorateur" digne de ce
nom... Alors à vos claviers !
Nous avons vu dans l'itération d'affectation de données du petit programme sur les
listes, la ligne 'for i in 0..3' ce qui signifie en langage courant :
"pour i variant de la valeur 0 à la valeur 3, faire ceci..."
Il s'agit là de la forme habituelle de la déclaration d'un intervalle, constituée de deux points. Il existe aussi une forme "3 points" excluant le dernier élément. Les intervalles peuvent être déclarés pour plusieurs types.
1..3 avec des nombres
'a'..'z' avec des lettres
et tous les types qui possèdent la méthode de comparaison '<=>'.
Les intervalles possèdent eux aussi leurs méthodes. Si l'intervalle n'est pas représenté par une variable il doit être entouré de parenthèses pour utiliser ses méthodes. En voici un échantillon :
'.begin' renvoie le premier élément de l'intervalle.
'.each' l'itérateur :(10..15).each do |n|
end
produit 10 11 12 13 14 15
'.end' retourne
le dernier élément.
'.lenght'
retourne le nombre d'éléments :
'(1..10).length' renvoie '10'
'(1...10).length' renvoie ' 9 '
Nous avons vu que Ruby possède plusieurs sortes de variables parmi lesquelles figurent les variables globales, commençant par le signe '$'. Et parmi ces variables globales figurent des variables spéciales dont le caractère '$' est suivi d'un seul autre caractère. Ces variables ont chacune une signification particulière énoncée dans le tableau suivant :
$. |
numéro
de la dernière ligne lue dans le fichier d'entrée. |
$0 |
le
nom du programme en cours. |
$? |
valeur
de retour du dernier processus. |
$: |
tableau
des répertoires pour 'require'. |
$! |
dernier
objet exception. |
$@ |
la
pile d'appel de la dernière exception. |
$$ |
l'identificateur
de processus du programme. |
$& |
le
caractère (ou la chaîne) trouvé lors d'une comparaison. |
$` |
la
chaîne précédant le caractère trouvé lors d'une comparaison. |
$' |
la
chaîne suivant le caractère trouvé lors d'une comparaison. |
Il
y en a beaucoup d'autres concernant :
-
les
exceptions
-
les
correspondances de forme
-
les
entrées/sorties
-
l'environnement
Les fenêtres multiples
Pour obtenir des fenêtres multiples il y a un
ensemble de composants interdépendants dont les deux principaux sont FXMDIChild
et FXMDIClient. Les autres ne sont en fait que des descendants spécialisés de
FXButton pour agrandir, mettre en icône etc… MDI signifie Multiple Documents
Interface.
Nous allons examiner tout cela une fois de plus avec
un exemple dans lequel nous découvrirons
aussi les fenêtres avec ascenseurs et les fontes (c'est-à-dire les
polices de caractères).
***************************************************************************
require 'fox'
require 'fox/colors'
include Fox
RATON= <<POEME
Inventaire
Une pierre
deux maisons
trois ruines
quatre fossoyeurs
un jardin
des fleurs
un raton laveur
une douzaine d'huîtres un citron un pain
un rayon de soleil
une lame de fond
six musiciens
une porte avec son paillasson
un monsieur décoré de la légion d'honneur
un autre raton laveur...
-Jacques Prévert
POEME
class MDITestWindow < FXMainWindow
def initialize(app)
super(app, "Composant Multi Fenêtre ", nil, nil, DECOR_ALL, 0, 0, 340, 200)
# Création de la fonte.
@font = FXFont.new(getApp(), "courier", 15, FONTWEIGHT_BOLD)
menubar = FXMenubar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
statusbar =FXStatusbar.new(self,
LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
statusbar.statusline.normalText = "Prêt"
# Client MDI.
@mdiclient = FXMDIClient.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y)
# Icône pour les fenêtres enfants.
@mdiicon = FXPNGIcon.new(getApp(), File.open("penguin.png", "rb").read)
# Création du menu MDI.
@mdimenu = FXMDIMenu.new(self, @mdiclient)
# Les boutons MDI du menu - notez les messages 'ID'.
# Normalement les commandes MDI sont soit activées soit désactivées.
# Sous la barre de menu, cependant,il y en a de cachées si le client MDI
# n'est pas maximisé. Pour gérer tout cela des ID différents sont utilisés :
# Il s'agit des icônes des fenêtres Windows, avec dans l'ordre de
# déclaration :
# - L'icône située à gauche et contenant les sous-menus de déplacement et
# fermeture.
# - Les icônes situées à droite des fenêtres à savoir celles de
# fermeture, de restauration et de mise en icône.
FXMDIWindowButton.new(menubar, @mdiclient, FXMDIClient::ID_MDI_MENUWINDOW,
LAYOUT_LEFT)
FXMDIDeleteButton.new(menubar, @mdiclient, FXMDIClient::ID_MDI_MENUCLOSE,
FRAME_RAISED|LAYOUT_RIGHT)
FXMDIRestoreButton.new(menubar, @mdiclient, FXMDIClient::ID_MDI_MENURESTORE,
FRAME_RAISED|LAYOUT_RIGHT)
FXMDIMinimizeButton.new(menubar, @mdiclient,
FXMDIClient::ID_MDI_MENUMINIMIZE, FRAME_RAISED|LAYOUT_RIGHT)
# Création de quelques fenêtres de test pour le démarrage.
mdichild = createTestWindow(10, 10, 200, 150)
@mdiclient.setActiveChild(mdichild)
createTestWindow(20, 20, 200, 150)
createTestWindow(30, 30, 200, 150)
# Menu fichier.
filemenu = FXMenuPane.new(self)
newCmd = FXMenuCommand.new(filemenu, "&Nouveau\tCtl-N\tCréation d'un nouveau document.")
newCmd.connect(SEL_COMMAND, method(:onCmdNew))
FXMenuCommand.new(filemenu, "&Quitter\tCtl-Q\tQuitter l'application.", nil,
getApp(), FXApp::ID_QUIT, 0)
FXMenuTitle.new(menubar, "&Fichier", nil, filemenu)
# Menu des fenêtres.
windowmenu = FXMenuPane.new(self)
FXMenuCommand.new(windowmenu, "&Horizontales", nil,
@mdiclient, FXMDIClient::ID_MDI_TILEHORIZONTAL)
FXMenuCommand.new(windowmenu, "&Verticales", nil,
@mdiclient, FXMDIClient::ID_MDI_TILEVERTICAL)
FXMenuCommand.new(windowmenu, "&Cascade", nil,
@mdiclient, FXMDIClient::ID_MDI_CASCADE)
FXMenuCommand.new(windowmenu, "&Fermer", nil,
@mdiclient, FXMDIClient::ID_MDI_CLOSE)
FXMenuCommand.new(windowmenu, "&Tout fermer", nil,
@mdiclient, FXMDIClient::ID_CLOSE_ALL_DOCUMENTS)
sep1 = FXMenuSeparator.new(windowmenu)
sep1.setTarget(@mdiclient)
sep1.setSelector(FXMDIClient::ID_MDI_ANY)
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_1)
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_2)
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_3)
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_4)
FXMenuTitle.new(menubar,"Fe&nêtres", nil, windowmenu)
# Menu d'aide.
helpmenu = FXMenuPane.new(self)
FXMenuCommand.new(helpmenu, "&Au sujet de FOX...").connect(SEL_COMMAND) {
FXMessageBox.information(self, MBOX_OK, "Au sujet du test multi fenêtres",
"Test du composant MDI (Multi Document Interface)\nEcrit par Jeroen van der Zijp")
}
FXMenuTitle.new(menubar, "&Aide", nil, helpmenu, LAYOUT_RIGHT)
end
# Méthode de création d'une nouvelle fenêtre enfant.
def createTestWindow(x, y, w, h)
mdichild = FXMDIChild.new(@mdiclient, "Fille", @mdiicon, @mdimenu,
0, x, y, w, h)
scrollwindow = FXScrollWindow.new(mdichild, 0)
scrollwindow.verticalScrollbar.setLine(@font.fontHeight)
btn = FXButton.new(scrollwindow, RATON, nil, nil, 0,
LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, 0, 0, 250, 200)
btn.font = @font
btn.backColor = FXColor::White
mdichild
end
# Appel pour une nouvelle fenêtre.
def onCmdNew(sender, sel, ptr)
mdichild = createTestWindow(40, 40, 200, 150)
mdichild.create
return 1
end
# Démarrage.
def create
super
@font.create
show(PLACEMENT_SCREEN)
end
end
if __FILE__ == $0
application = FXApp.new("MDIApp", "FoxTest")
MDITestWindow.new(application)
application.create
application.run
end
***************************************************************************
new(p, opts=0, x=0, y=0, w=0,
h=0) Allons-y pour les remarques, dans l'ordre de déroulement du programme :
·
Appel
du module 'colors' à cause de la couleur du fond, dans la méthode de création
des fenêtres : FXColor::White
·
Insertion
d'un texte complet en utilisant un délimiteur de chaîne. Voir "Un peu de
Ruby" plus loin dans ce chapitre.
·
Nouveauté
avec l'apparition des fontes, dont la déclaration est la suivante :
new(app, face, size, weight=FONTWEIGHT_NORMAL,
slant=FONTSLANT_REGULAR,
encoding=FONTENCODING_DEFAULT, setWidth=FONTSETWIDTH_DONTCARE,
hints=0)
'app'
représente le parent, 'face' une chaîne décrivant la fonte, 'size' un entier
représentant la
taille
de la fonte et le reste des paramètres des options particulières aux polices de
caractères
et
dont la description se trouve en AppendiceA.
·
La
déclaration de la barre de menu et de la barre de statut comprenant la
traduction du message par défaut.
·
Apparition
de FXMDIClient qui agit en quelque sorte comme les aménageurs d'espace vus
depuis le début, en s'occupant de tout. FXMDIClient reçoit les messages en
premier avant de les répercuter sur les fenêtres enfants. C'est ce composant
qui gère aussi l'espace occupé par les composants enfants. Sa déclaration ne
suscite aucun commentaire tant elle est habituelle aux composants de Fox :
Les paramètres se limitent au parent et
aux options classiques.
·
Chargement
d'une icône. Du déjà vu...
·
Création
d'un menu MDI. Il s'agit de l'icône située en haut à gauche des fenêtres
Windows, et qui lors d'un clic font apparaître un menu contenant les commandes
de changement de focus des fenêtres (Next =suivante, Previous = précédente) et
de minimisation, maximisation et fermeture.
·
Création
des différents boutons de gestion des fenêtres enfants. Remarquez que ce sont
des boutons spécialisés, chacun ayant une fonction bien définie. Leur cible,
pour les messages, est, comme attendu , le gestionnaire '@mdiclient' .
·
Création
de 3 fenêtres enfants par appel de la méthode 'createTestWindow( )' que nous
découvrirons plus loin. Appel de la méthode 'setActiveChild( )' afin de rendre
la première fenêtre enfant active.
·
Création
classique des menus de la barre de menus où l'on révise les différents modes de
passage de commandes : soit par appel d'une méthode créatrice de nouvelles
fenêtres ('onCmdNew'), soit par appel direct des constantes de la classe
('FXMDIClient'), soit enfin par la méthode 'connect' (pour le menu d'aide). A
noter le passage des commandes d'arrangement des fenêtres (horiz., vert.,
cascade...) par appel aux constantes de
la classe FXMDIClient.
·
La
méthode de création d'une nouvelle fenêtre reçoit en paramètres les dimensions
de la fenêtre à créer. Nous sommes obligés de tout définir dans chaque fenêtre
puisqu'il s'agit ici de fenêtres MDI qui ont un comportement inhabituel régi
par un composant FXMDIClient. Une variable locale ('mdichild') sert à instancier un composant FXMDIChild
dont la définition est la suivante :
new(p, name, ic=nil, mn=nil,
opts=0, x=0, y=0, w=0, h=0)
'p' désignant le propriétaire, 'name'
une chaîne pour le nom de la fenêtre, 'ic' un pointeur vers
une icône, 'mn' un pointeur vers un menu
MDI, 'opts' un entier pour les options.
Cette fenêtre va
être incorporée dans un composant FXScrollWindow qui est un ascenseur
contenant un autre objet plus grand qu'il permet de déplacer dans son
environnement.
Ce composant est un descendant de
FXScrollArea qui possède l'attribut
'verticalScrollbar'
pointant vers une barre d'ascenseur
FXScrollBar dont on fixe l'incrément de la hauteur de
ligne par la méthode 'setLine'. La
définition de FXScrollWindow est la
suivante :
new(p,opts=0, x=0, y=0, w=0,
h=0)
Ensuite
c'est tout simplement un bouton qui joue le rôle d'afficheur de texte. Pas
besoin de
sortir
l'artillerie lourde pour un texte qui ne sera pas modifié, du moins dans cet
exemple…
On
déclare une nouvelle fonte pour l'affichage et on fixe la couleur du fond. Pour
finir on
passe
la variable 'mdichild' en valeur de retour de la méthode 'createTestWindow( )'.
Rappelez-vous, 'createTestWindow( )' a été appelée par une variable,
aussi nommée
'mdichild' mais locale elle, à la méthode 'initialize'.
·
La
méthode 'onCmdNew' de création de nouvelles fenêtres est le point de chute de
la commande 'Nouveau' du bouton 'Fichier' de la barre de menu. Encore une variable locale 'mdichild'
qui sert à la création de fenêtres par appel à la méthode 'createTestWindow'.
Comme la fenêtre est en fait créée dans cette méthode, 'onCmdNew' n'a pas de
valeur, représentant une fenêtre, à retourner et renvoie donc la valeur '1'
pour dire que tout s'est bien passé.
·
Dans
la méthode 'create' nous créons véritablement la fonte déclarée en début de
méthode 'initialize'. Comme dans d'autres ressources la construction d'une
fonte passe par deux étapes: la construction -la partie côté-client- par la
méthode 'new', suivie par la création par le système - côté-serveur- par la
méthode 'create'. Dans la plupart des cas les fontes sont créées lors de la
création des composants qui les utilisent, mais en cas de création plus tardive
de fonte, un appel à la méthode 'create' permet d'affirmer que l'objet fonte
est complètement initialisé.
mditest.png
Le texte du poème est entouré par les signes '<< POEME' et 'POEME', ceci sert à délimiter des textes sur plusieurs lignes. Les deux signes '<<' doivent précéder un nom en majuscule et le même nom servira de signal de fin de bloc et devra être au début d'une ligne. Pour obtenir une indentation, faire suivre '<<' par un tiret : '<<-', la fin du bloc pourra alors être décalée sur la ligne. Si le nom attribué est mit entre guillemets : "POEME", les règles définies plus haut pour les chaînes de caractères sont appliquées.
Le meilleur pour la fin. Les expressions rationnelles ("Regular expressions" en anglais, mais l'auteur préfère l'autre dénomination !) permettent de faire une foule de choses dans les chaînes de caractères en définissant des formats au moyen de caractères et de combinaison de caractères. La première fois qu'on aborde ce système on a l'impression d'entrer dans le monde du sorcier Gargamel manipulant un grimoire rempli de formules mystérieuses. Mais l'enjeu en vaut la chandelle, car les expressions rationnelles permettent des raccourcis de programmation spectaculaires. Nous ne ferons que survoler le sujet tant il est vaste, au point qu'un ouvrage entier lui a été consacré : "Maîtrise des expressions régulières" de Jeffrey E.F. Friedl aux éditions O'Reilly. Les expressions rationnelles sont entourées par le caractère '/'. Tous les caractères correspondent à eux-mêmes à l'exception de ., |, (, ), [, \, ^, {, +, $, *, et ? . Pour utiliser un de ces caractères il faut le faire précéder d'un '\'.
Le
tableau ci-dessous indique la signification de quelques caractères ou
combinaisons :
[] |
spécifie
un intervalle : [a-z] représente tout l'alphabet en minuscule. |
\d |
spécifie
un chiffre |
\s |
spécifie
un espace |
\w |
spécifie
une lettre ou un chiffre |
* |
spécifie
zéro ou plusieurs occurence(s) de ce qui précède |
+ |
spécifie
une ou plusieurs occurence(s) de ce qui précède |
{m,n} |
spécifie
au moins m occurences et au plus n, de ce qui précède |
? |
spécifie
au plus une occurence de ce qui précède |
| |
spécifie
soit ce qui précède soit ce qui suit |
^ |
indique
le début d'une ligne |
$ |
indique
la fin d'une ligne |
\A |
indique
le début d'une chaîne |
\z |
indique
la fin d'une chaîne |
( ) |
groupe |
Voici quelques
exemples extraits de"Programming Ruby" :
Supposons
que nous voulions savoir si une chaîne contient les mots "Perl" ou
"Python", l'expression s'écrira : /Perl|Python/
ou
bien en utilisant des parenthèses :
/P(erl|ython)/
/Ruby (Perl|Python)/ correspond à : "Ruby", un espace,
et soit "Perl" soit "Python"
/\d\d:\d\d:\d\d/ peut repésenter une heure
: 12:34:56
Les
expression rationnelles servent aussi à remplacer des chaînes par d'autres :
line.sub(/Perl/, 'Ruby') remplace la première occurence de 'Perl' par 'Ruby'
line.gsub(/Python/, 'Ruby') remplace toutes les occurences de 'Python'
par 'Ruby'
Signalons
aussi l'opérateur '=~' qui peut être utilisé pour comparer une chaîne à une
expression rationnelle, et qui retourne la position de départ de la première
occurence trouvée ou 'nil' si aucune :
a
= "Fats Waller"
a
=~ /a/ retourne 1
a
=~ /z/ retourne nil
a
=~ "ll" retourne 7
Un
exemple plus compliqué mettant en oeuvre une méthode et utilisant des variables
globales prédéfinies:
def showRE(a,re)
if a =~ re
"#{$`}<<#{$&}>>#{$'}"
else
"pas
de correspondance"
end
end
showRE('very interesting', /t/) retourne ---> very in<<t>>eresting
showRE('Fats Waller', /ll/) retourne ---> Fats Wa<<ll>>er
Un
dernier exemple pour la route. Supposons que nous voulions un chiffre en
hexadécimal entouré par '<' et '>'
: /<0[Xx][\dA-Fa-f]+>/
Pour chaque composant visuel il est décrit les
déclarations de constantes, d'attributs, de méthodes, d' événements. Ces
descriptions sont celles élaborées par Lyle Johnson et s'adressent
particulèrement à FXRuby; même s'il n'y a que peu de différences avec celles de
FOX, il y en a tout de même.
Pour les attributs les mentions entre crochets
[RW] signifient respectivement en lecture pour 'R' et en écriture pour 'W'.
Fox
C'est le module de base, qui contient la liste
de toutes les classes et en plus des méthodes générales publiques de classes.
Les méthodes :
MKUINT(lo,
hi) : transforme deux entiers courts (16 bits) non
signés en un entier long (32 bits) non signé. 'lo' représente la partie de
poids faible et 'hi' la partie de poids fort de l'entier long.
SELTYPE(sel)
: retourne le type de message pour le sélecteur 'sel'.
SELID(sel)
: retourne l'identifiant de message du sélecteur 'sel'.
FXRGB(r,
g, b) : construit une couleur à partir des
composantes rouge, verte et bleue.
FXRGBA(r,
g, b, a) : idem plus la composante 'alpha' de
transparence.
FXREDVAL(color)
: retourne la valeur du rouge de la couleur 'color'.
FXGREENVAL(color)
: retourne la valeur du vert de la couleur 'color'
FXBLUEVAL(color)
: retourne la valeur du bleu de la couleur 'color'
FXALPHAVAL(color)
: retourne la valeur de transparence de la couleur
'color'
FXRGBACOMPVAL(color,
component) : retourne la valeur de la composante
'component' de la couleur 'color', où 'component' peut prendre la valeur 0, 1,
2 ou 3.
fxparseaccel(s)
: cherche un code d'accélération dans une chaîne 's'.
fxparsehotkey(s)
: cherche un code de raccourci dans une chaîne 's'.
fxfindhotkeyoffset(s)
: localise le code de raccourci à partir du début de
la chaîne 's'.
makeHiliteColor(clr)
: retourne la couleur de surbrillance.
makeShadowColor(clr) :
retourne la couleur de l'ombre.
fxcolorfromname(colorName) :
retourne la valeur RGB de la couleur 'colorName'
fxnamefromcolor(color)
: retourne le nom de la couleur la plus proche de la
valeur RGB.
fxrgb_to_hsv(r,
g, b) : converti les valeurs RGB en HSV.
fxhsv_to_rgb(h,
s, v) : converti les valeurs HSV en RGB.
fxversion()
: retourne le numéro de version de FOX sous forme de
chaîne (par ex. "1.0.34").
fxTraceLevel()
: niveau de trace des contrôles.
fxloadICO(store)
: charge un fichierICO depuis une instance 'store' de
FXStream. En cas de succés retourne un tableau dont les éléments sont les
données de l'image (une chaîne), la couleur de transparence, la largeur et la
hauteur de l'icône. Si l'opération n'abouti pas, la méthode retourne 'nil'.
fxsaveICO(store,
pixels, transp, width, height) : sauve un fichier
'ICO' dans un flux FXStream. Retourne 'true' en cas de succés et 'false' sinon.
fxloadJPG(store)
: charge une image JPEG d'un flux 'store'. En cas de
succés retourne un tableau dont les éléments sont les données de l'image (une
chaîne), la couleur de transparence, la largeur et la hauteur de l'icône et la
qualité de l'image. Si l'opération n'abouti pas, la méthode retourne 'nil'.
fxsaveJPG(store,
data, transp, width, height, quality) :
sauve une image JPEG dans un flux 'store', avec les données 'data', la couleur
'transp' de transparence, la largeur 'width', la hauteur 'height', et le degré
de compression 'quality'. Retourne 'true' en cas de succés, 'false' sinon.
fxloadPCX(store)
: charge une image PCX d'un flux 'store'.Retourne, en
cas de succés, un tableau contenant les
données des pixels, la couleur de transparence, la largeur et la hauteur de
l'image. Retourne 'nil' en cas d'échec.
fxsavePCX(store,
pixels, transp, width, height) : sauve une image PCX
dans un flux 'store', avec les données 'data', la couleur 'transp' de
transparence, la largeur 'width', la hauteur 'height'. Retourne 'true' en cas
de succés, 'false' sinon
fxdecodeColorData(data)
: les données utilisées pour les couleurs sont une
séquence d'entiers courts, en ordre d'octets natifs. Ici, nous utilisons la
directive 'S' pour String#unpack (qui traite deux caractères successifs comme
un entier court non signé dans l'ordre natif) pour décoder les valeurs RGB et
A.
fxencodeColorData(rgba)
: l'inverse de la méthode
ci-dessus.
fxrubyversion()
: retourne le
numéro de version de FXRuby sous forme de chaîne, par ex;
"1.0.19""
Méthodes d'instances publiques.
fxloadPNG(store) : charge une image PNG d'un flux 'store'.Retourne, en cas de
succés, un tableau contenant les
données des pixels, la couleur de transparence, la largeur et la hauteur de
l'image. Retourne 'nil' en cas d'échec.
fxsavePNG(store,
pix, transp, width, height) : sauve une image PCX dans un flux 'store', avec les données 'data',
la couleur 'transp' de transparence, la largeur 'width', la hauteur 'height'.
Retourne 'true' en cas de succés, 'false' sinon.
FXAccelTable
La table d'accélération envoit un message à un
objet cible spécifique, quand la touche indiquée, ou la combinaison de touches, est frappée.
Ancêtre :
FXObject.
Déclaration :
FXAccelTable.new() {|acceleratorTable| ...}
Construit une table vide.
addAccel(hotKey,
target=nil, seldn=0, selup=0) : ajoute un
accélérateur à la table.
Parametres :
hotKey : la touche associée à cet accélérateur [Integer]
tgt
: la cible du message [FXObject]
seldn : sélecteur pour l'événement SEL_KEYPRESS [Integer]
selup : sélecteur pour l'événement SEL_KEYRELEASE [Integer]
hasAccel?(hotKey)
: retourne 'true' si 'hotKey' est l'accélérateur spécifié.
targetOfAccel(hotKey)
: retourne l'objet cible de l'accélérateur 'hotKey'.
removeAccel(hotKey)
: supprime
l'accélération de 'hotKey'.
FXApp
L'objet application.
Ancêtre :
FXObject.
Déclaration :
FXApp.new(appName="Application", vendorName="FoxDefault")
{|theApp| ...}
Les constantes prédéfinies :
Ces constantes représentent les différentes
formes de curseur utilisés par les applications FOX et peuvent être utilisées
en tant qu'argument 'which' des méthodes 'getDefaultCursor' et 'setDefaultCursor'.
DEF_ARROW_CURSOR : curseur flèche.
DEF_RARROW_CURSOR : curseur flèche inversée.
DEF_TEXT_CURSOR : curseur texte.
DEF_HSPLIT_CURSOR : curseur de fractionnement horizontal.
DEF_VSPLIT_CURSOR: curseur de fractionnement vertical.
DEF_XSPLIT_CURSOR : curseur de fractionnement en croix.
DEF_SWATCH_CURSOR : curseur de montre en couleur.
DEF_MOVE_CURSOR : curseur de déplacement.
DEF_DRAGH_CURSOR : curseur de redimensionnement horizontal de bordure .
DEF_DRAGV_CURSOR : curseur de redimensionnement vertical de bordure .
DEF_DRAGTL_CURSOR : curseur de redimensionnement coin supérieur gauche .
DEF_DRAGBR_CURSOR : curseur de redimensionnement coin inférieur droit .
DEF_DRAGTR_CURSOR : curseur de redimensionnement coin supérieur droit .
DEF_DRAGBL_CURSOR : curseur de redimensionnement coin inférieur gauche .
DEF_DNDSTOP_CURSOR : curseur de stop de tirer-lacher (Drag and drop)
DEF_DNDCOPY_CURSOR : curseur de copie de tirer-lacher (Drag and drop)
DEF_DNDMOVE_CURSOR : curseur de déplacement de tirer-lacher (Drag and drop)
DEF_DNDLINK_CURSOR : curseur de liaison de tirer-lacher (Drag and drop)
DEF_CROSSHAIR_CURSOR : curseur croix fine.
DEF_CORNERNE_CURSOR : curseur nord-est.
DEF_CORNERNW_CURSOR : curseur nord-ouest
DEF_CORNERSE_CURSOR : curseur sud-est.
DEF_CORNERSW_CURSOR : curseur sud-ouest.
DEF_ROTATE_CURSOR : curseur de rotation.
Modes pour la méthode addInput()
INPUT_NONE : inactif.
INPUT_READ : fd en lecture.
INPUT_WRITE : fd en écriture.
INPUT_EXCEPT : fd en except.
Pour la modalité :
MODAL_FOR_NONE : boucle d'événement non modal (diffusion
normale).
MODAL_FOR_WINDOW
: dialogue modal (bip si à l'extérieur du dialogue)
MODAL_FOR_POPUP : modal pour les "popup" (toujours
diffusés vers les "popup")
Identifiants de message
ID_QUIT : termine l'application normalement.
ID_DUMP : vide l'arbre des composants.
Les attributs :
animSpeed [RW] : vitesse d'animation en millisecondes [Integer]
appName [R] : nom de l'application [String]
backColor [RW] : couleur du fond par défaut [FXColor]
baseColor [RW] : couleur du fond des contrôles GUI [FXColor]
blinkSpeed
[RW] : vitesse de clignotement en millisecondes
[Integer]
borderColor [RW] : couleur du bord
[FXColor]
clickSpeed [RW] : vitesse du clic en millisecondes [Integer]
cursorWindow [R] : la fenêtre sous le curseur, si elle existe [FXWindow]
defaultVisual [RW] : aspect par défaut [FXVisual]
display [R] : affichage
[Integer]
dragDelta
[RW] : delta de dragage, en pixels [Integer]
focusWindow [R] : la fenêtre au sommet de la chaîne des
focus, si elle existe [FXWindow]
foreColor [RW] : couleur d'avant plan par défaut [FXColor]
hiliteColor [RW] : couleur
de surbrillance des contrôles GUI [FXColor]
mainWindow [R] : la fenêtre principale, si elle existe [FXWindow]
menuPause [RW] : pause des menus en millisecondes [Integer]
modalModality [R] : mode
de la boucle modale courante [Integer]
modalWindow
[R] : la fenêtre de la
boucle modale courante [FXWindow]
monoVisual [R] : aspect monochrome [FXVisual]
normalFont [RW] : fonte par défaut. [FXFont]
reg [R] : registre pour cette application [FXRegistry]
root [R] : fenêtre racine [FXRootWindow]
scrollDelay [RW] : délai de défilement en millisecondes [Integer]
scrollSpeed [RW] : vitesse de défilement en
millisecondes [Integer]
selbackColor [RW] : couleur de fond pour les
composants sélectionnés [FXColor]
selforeColor
[RW] : couleur d'avant plan pour les composants
sélectionnés [FXColor]
shadowColor
[RW] : couleur des ombres pour les contrôles GUI
[FXColor]
sleepTime [RW] : temp (en milliseconde) avant prise de contrôle par
l'ordonnanceur de processus de Ruby [Integer]
tipbackColor [RW] : couleur de fond par défaut des info-bulles [FXColor]
tipforeColor [RW] : couleur d'avant plan par défaut des info-bulles [FXColor]
tooltipPause [RW] : temps de pause des
info-bulles en millisecondes [Integer]
tooltipTime [RW] : temps d'affichage des info-bulles en millisecondes [Integer]
typingSpeed
[RW] : vitesse de frappe
utilisée pour les composants FXIconList, FXList et FXTreeList en millisecondes.
La valeur par défaut est 1000.
vendorName [R] : nom du vendeur [String]
waitCursor
[RW] : curseur sablier [FXCursor]
wheelLines
[RW] : nombre de lignes de
défilement [Integer]
Les méthodes :
copyright() : méthode interne, renvoie le copyright de la librairie.
instance() : retourne l'instance de l'application.
openDisplay(dpyname = ":0") : appellé par 'init', ouvre une connection
pour l'affichage.
closeDisplay() : ferme la connection avec
l'affichage.
addTimeout(ms, tgt, sel) : ajoute un message de pause à envoyer à la cible en
millisecondes; l'horloge démarrre une fois l'intervalle de temps expirée.
removeTimeout(timer) : supprime le message 'timer', retourne 'nil'.
addChore(tgt, sel) : ajoute un message de temps mort à envoyer à la cible quand
le système n'a plus d'événement à traiter.
removeChore(chore) : supprime le message de temps mort.
addSignal(sig, tgt, sel, immediate=false, flags=0) : ajoute un message de
processus à envoyer à l'objet cible quand le signal 'sig' est atteint, les
drapeaux sont à mettre comme des définitions POSIX. Quand 'immediate' est à
'true', le message est envoyé à la cible immédiatement, ce qui doit être
utilisé avec beaucoup de précautions si l'application risque d'être interrompue
à une position inconnue dans son exécution.
removeSignal(sig) : supprime le message pour le signal 'sig'.
addInput(fd,
mode, tgt, sel) : ajoute un descripteur de
fichier de surveillance déterminé par 'mode', où 'mode' est une combinaison
logique "OU" de INPUT_READ,
INPUT_WRITE et INPUT_EXCEPT. Un message de type
SEL_IO_READ, SEL_IO_WRITE, ou SEL_IO_EXCEPT sera envoyé à la cible quand
l'activité spécifiée est détectée dans le descripteur de fichier.
removeInput(fd, mode) : supprime le message d'entrée et l'objet cible pour le descripteur
de fichier spécifié ('fd') et le mode ('mode'), qui est une combianison logique
"OU" de
(INPUT_READ,INPUT_WRITE, INPUT_EXCEPT).
create() : crée la fenêtre de l'application.
destroy() : détruit la fenêtre de l'application.
detach()
: détache les fenêtres de l'application.
peekEvent() : teste l'existence d'un événement.
runOneEvent() : exécute une diffusion d'événement.
run() : éxecute la boucle événement de l'application principale jusqu'à l'
appel de 'stop', et retourne le code de sortie passé comme argument à 'stop'.
runUntil(condition) : exécute une boucle événementielle jusqu'à ce qu'un drapeau
devienne non nul.
runWhileEvents(window=nil) : déclenche une boucle événementielle tant qu'il y a des
événements dans la file d'attente. Retourne '1' si la file est vide, et '0'
quand la boucle est terminée. Excepté pour la fenêtre modale et ses enfants,
toutes les entrées vers les autres fenêtres sont bloquées; si la fenêtre modale
est à 'nil' toutes les entrées sont bloquées.
runModal() : déclenche la boucle d'événement modal, bloquant le clavier et les
événements souris jusqu'à ce que 'stopModal' soit appelé.
runModalFor(window) : déclenche une boucle événementielle pour la fenêtre 'window'
donnée, jusqu'à ce que 'stop' ou 'stopModal' soit appelé. Excepté pour la
fenêtre modale et ses enfants, toutes les entrées vers les autres fenêtres sont
bloquées; si la fenêtre modale est à 'nil' toutes les entrées sont bloquées.
runModalWhileShown(window) : déclenche une boucle événementielle pour la fenêtre 'window'
donnée tant que la fenêtre est visible ou jusqu'à ce que 'stop' ou 'stopModal'
soit appelé. Excepté pour la fenêtre modale et ses enfants, toutes les entrées
vers les autres fenêtres sont bloquées; si la fenêtre modale est à 'nil' toutes
les entrées sont bloquées.
runPopup(window)
: active un
menu furtif tant qu'il est visible ou jusqu'à ce que 'stop' ou 'stopModal' soit
appelé.
modal?(window) : retourne 'true' si la fenêtre est modale.
stop(value=0)
: termine la boucle d'événement la plus externe, et toutes
les modales internes; les boucles d'événements les plus profondes sont
terminées avec un code égal à '0', tandis que la plus externe retourne un code
égal à 'value'.
stopModal(window,
value=0) : arrête la boucle modale en retournant un
code égal à 'value'. Toutes les boucles interne sont terminées avec un code
égal à '0'.
stopModal2(value=0) : arrête la boucle d'événements la plus profonde et retourne un code
égal à 'value'.
forceRefresh()
: force le rafraichissement GUI.
refresh() : ordonnance un rafraîchissement.
flush(sync=false)
: termine las actions de dessins en attente.
repaint() : peint toutes les fenêtres à redessiner. Au retour toutes les fenêtres
de l'application sont repeintes.
init(argv,
connect=true) : initialise l'application. Parcourt et relève
les arguments de la ligne de commande, lit le registre. Finallement, si
'connect' est à 'true', ouvre l'affichage.
exit(code=0) : quitte l'application. Ferme l'affichage et écrit les registres.
registerDragType(name)
: enregistre
un nouveau type de dragage-largage.
getDragTypeName(type) :retourne le nom du type de dragage.
beep() :
émet un bip sonore.
endWaitCursor()
: termine
le bloc le plus profondément imbriqué
du curseur d'attente. Voir 'beginWaitCursor'.
getDefaultCursor(which) : envoit un curseur par défaut.
setDefaultCursor(which, cursor) : change le curseur par défaut.
dumpWidgets() : information sur les composants.
enableThreads() : active le support des applications multitaches.
disableThreads() : désactive le support d'application multi-taches.
threadsEnabled?() : teste si les applications multi-taches sont supportées.
beginWaitCursor() {|| ...} change le curseur par
défaut en un sablier, pour indiquer une attente. Pour revenir à l'ancien
curseur appeler la méthode 'endWaitCursor'. Par ex;
getApp().beginWaitCursor()
...
opération ...
getApp().endWaitCursor()
Des appels à 'beginWaitCursor' peuvent être
imbriqués, et dans ce cas, un appel à 'endWaitCursor' se rapporte au plus
récent appel de 'beginWaitCursor'.
Si un bloc de code est présent, 'endWaitCursor'
est automatiquement appelé à la fin du bloc, par ex :
getApp().beginWaitCursor()
{
... operation ...
... endWaitCursor()
est automatiquement appellé ...
}
Les événements :
L'objet FXApp ne possède pas lui même une cible
de message comme les autres objets FOX, mais il peut envoyer tout de même des
messages aux objets pour quelques événements spéciaux.
Timers
: quand un événement d'attente est enregistré par la
méthode 'addTimeout', un message SEL_TIMEOUT
est envoyé à la cible.
Chores
: quand un événement de routine est enregistré par la
méthode 'addChore', un message
SEL_CHORE est envoyé à la cible.
Inputs
: quand un événement d'entrée est enregistré par la
méthode 'addInput' un message
SEL_IO_READ, SEL_IO_WRITE ou SEL_IO_EXCEPT peut être envoyé à la cible.
Signals
: quand un objet signalétique est enregistré par la
méthode 'addSignal', un message
SEL_SIGNAL peut être envoyé à la cible.
FXArrowButton
Bouton muni d'une flèche pointant dans une
direction donnée.
Ancêtre : FXFrame.
Déclaration :
FXArrowButton.new(parent, target=nil, selector=0, opts=ARROW_NORMAL, x=0, y=0, width=0,
height=0, padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD, padTop=DEFAULT_PAD,
padBottom=DEFAULT_PAD) {|theArrowButton| ...}
Les constantes prédéfinies :
D'aspect :
ARROW_NONE : pas de flèche.
ARROW_UP : flèche vers le haut.
ARROW_DOWN : flèche vers le bas.
ARROW_LEFT : flèche vers la gauche.
ARROW_RIGHT : flèche vers la droite.
ARROW_REPEAT : répétition si le bouton reste enfoncé.
ARROW_AUTOGRAY : automatiquement grisé si non mis à jour.
ARROW_AUTOHIDE : automatiquement caché si non mis à jour.
ARROW_TOOLBAR : bouton de style barre d'outils.
ARROW_NORMAL : identique à FRAME_RAISED|FRAME_THICK|ARROW_UP
Message
ID_REPEAT : identifiant de message
utilisé en interne par le 'timer' qui
gère l'autorépétition (activé par l'option ARROW_REPEAT).
Les attributs :
arrowColor [RW] : couleur de remplissage pour la flèche [FXColor]
arrowSize [RW] : dimension par défaut de la flèche, en pixels [Integer]
arrowStyle [RW] : style de la flèche.
helpText [RW] : texte d'aide de la ligne de statut pour le bouton [String]
justify [RW] : mode de justification.
state [RW] : état du bouton, où 'true' signifie que le bouton est pressé
[Boolean]
tipText [RW] : message de l' info-bulle d'aide pour le bouton [String]
Les événements :
Les
messages suivants sont envoyés à ses cibles par FXArrowButton.
SEL_COMMAND : envoyé lors d'un clic sur le bouton.
SEL_KEYPRESS : envoyé lors de l'appui d'une touche
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui de la touche gauche de la souris
SEL_LEFTBUTTONRELEASE : envoyé lors de l'appui de la touche droite de la souris
SEL_COMMAND : envoyé quand le bouton est cliqué (ou répétitivement lorsque le
bouton est maintenu enfoncé, si l'option ARROW_REPEAT est en fonction)
Les messages sont des instances de FXEvent.
FXButton
Un FXButton produit un bouton poussoir, avec
une icône 'icon' optionnelle et /ou l'étiquette 'text'.
Ancêtre : FXLabel.
Déclaration :
FXButton.new(parent, text, icon=nil, target=nil, selector=0, opts=BUTTON_NORMAL,
x=0, y=0, width=0,
height=0,padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD, padTop=DEFAULT_PAD,
padBottom=DEFAULT_PAD)
{|theButton| ...}
Les constantes prédéfinies :
Pour
l'apparence :
BUTTON_AUTOGRAY = 0x00800000, automatiquement
grisé si non mis à jour.
BUTTON_AUTOHIDE = 0x01000000, automatiquement caché si non mis à jour.
BUTTON_TOOLBAR = 0x02000000, bouton style barre d'outils (sans cadre)
BUTTON_DEFAULT = 0x04000000, peut devenir le bouton initial en recevant
le focus.
BUTTON_INITIAL = 0x08000000, bouton initial par défaut.
BUTTON_NORMAL =(FRAME_RAISED|FRAME_THICK|JUSTIFY_NORMAL|
ICON_BEFORE_TEXT)
Pour l'état :
STATE_UP = 0, Bouton
relevé
STATE_DOWN = 1, Bouton enfoncé
STATE_ENGAGED = 2, Bouton occupé
STATE_UNCHECKED = STATE_UP, Identique à STATE_UP (utilisé pour les cases à cocher et
les Boutons-radio)
STATE_CHECKED = STATE_ENGAGED , identique
à STATE_ENGAGED (utilisé pour les cases
à cocher et les boutons-radio)
Les attributs :
buttonStyle [RW] : définit le style du
bouton ( Combinaisons de
BUTTON_AUTOGRAY,
BUTTON_AUTOHIDE,
etc.) [Integer]
state [RW] : état du bouton (Combinaisons de STATE_UP, STATE_DOWN, etc.)
[Integer]
Les événements :
Les
messages suivants sont envoyés à la cible par FXCheckButton.
SEL_COMMAND : envoyé lors d'un clic sur le bouton.
SEL_KEYPRESS : envoyé lors de l'appui d'une touche
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui de la touche gauche de la souris
SEL_LEFTBUTTONRELEASE : envoyé lors de l'appui de la touche droite de la souris
Les messages sont des instances de FXEvent
FXCanvas
Ancêtre :
FXWindow.
Déclaration :
FXCanvas.new(parent, target=nil, selector=0, opts=FRAME_NORMAL, x=0, y=0, width=0,
height=0) {|theCanvas| ...}
Les événements :
SEL_KEYPRESS : envoyé lors de l'appui d'une touche
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche.
SEL_MOTION : envoyé quand la souris bouge.
SEL_PAINT : envoyé lorsque le canevas doit être redessiné.
Les messages sont des instances de FXEvent
FXCheckButton
Un composant FXCheckButton est un bouton à
trois états. Normalement il s'agit des états 'TRUE' ou 'FALSE' , et alterne
entre 'TRUE' et 'FALSE' quand il est pressé. Un troisième état peut être
utilisé pour indiquer que la sélection n'a pas encore été faite par
l'utilisateur, ou bien quand l'état est ambiguë.
Ancêtre :
FXLabel.
Déclaration :
FXCheckButton.new(parent, text, target=nil, selector=0, opts=CHECKBUTTON_NORMAL, x=0,
y=0, width=0, height=0, padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD,
padTop=DEFAULT_PAD, padBottom=DEFAULT_PAD) {|theCheckButton| ...}
Les constantes prédéfinies :
Pour l'apparence ('opts') :
CHECKBUTTON_AUTOGRAY : Automatiquement grisé quand non actualisé.
CHECKBUTTON_AUTOHIDE : Automatiquement caché quand
non actualisé.
CHECKBUTTON_NORMAL : JUSTIFY_NORMAL|ICON_BEFORE_TEXT
Les attributs :
checkState [RW] : état de la case à cocher,TRUE, FALSE ou MAYBE [Integer]
checkButtonStyle
[RW] : style de la case à cocher [Integer]
boxColor
[RW] : couleur
de fond de la case à cocher [FXColor]
Les méthodes :
checked?()
: Retourne
'true' si la case est cochée (état à vrai).
unchecked?() : Retourne 'true' si la case
n'est pas cochée (état à faux).
maybe?() : Retourne 'true' si l'état de la case est MAYBE (état à peut-être)
Les événements :
Les
messages suivants sont envoyés à la cible par FXRadioButton.
SEL_COMMAND : envoyé lors d'un clic sur le bouton.
SEL_KEYPRESS : envoyé lors de l'appui d'une touche.
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui de la touche gauche de la souris
SEL_LEFTBUTTONRELEASE : envoyé lors de l'appui de la touche droite de la souris.
Les messages sont des instances de FXEvent
FXColorDialog
FXColorDialog est une boîte de dialogue pour
éditer les couleurs. Elles peuvent être éditées via
RGB (Rouge, Vert, Bleu en mode de couleurs
additives), via HSV (Teinte, Saturation, Valeur), via CMY (Cyan, Magenta, Jaune
en mode de couleurs soustractives), ou par noms. Les couleurs habituelles
peuvent être tranportées dans de petits godets pour être utilisées
répétitivement; ces couleurs sont automatiquement sauvegardées dans la base de
registres pour les futures utilisations.
Ancêtre :
FXDialogBox.
Déclaration :
FXColorDialog
.new(owner, title, opts=0, x=0, y=0, width=0,
height=0) {|theColorDialog| ...}
Les constantes prédéfinies :
ID_COLORSELECTOR :
usage interne pour identifier les messages de FXColorSelector.
Les
attributs :
opaqueOnly [W]
: couleurs opaques seulement. [Boolean]
rgba [RW]
: la couleur [FXColor]
Les
méthodes :
opaqueOnly?() :
retourne 'true' si les couleurs opaques sont seules permises.
Les événements :
SEL_CHANGED : envoyé continuellement tant que le sélecteur de couleurs est utilisé.
SEL_COMMAND : envoyé lors de la sélection définitive.
FXComboBox
Zone de liste modifiable.
Ancêtre :
FXPacker.
Déclaration :
FXComboBox.new(parent, numColumns, numVisible, target=nil, selector=0,
opts=COMBOBOX_NORMAL, x=0, y=0, width=0, height=0, padLeft=DEFAULT_PAD,
padRight=DEFAULT_PAD, padTop=DEFAULT_PAD, padBottom=DEFAULT_PAD) {|theComboBox|
...}
Les constantes prédéfinies :
Pour l'apparence :
COMBOBOX_INSERT_AFTER : le texte frappé est inséré après le texte courant.
COMBOBOX_INSERT_BEFORE : le texte frappé est inséré avant le texte courant.
COMBOBOX_INSERT_FIRST : le texte frappé est inséré au début de la liste.
COMBOBOX_INSERT_LAST : le texte frappé est inséré à la fin de la liste.
COMBOBOX_NO_REPLACE : laisse la liste inchangée.
COMBOBOX_NORMAL : options par défaut.
COMBOBOX_REPLACE : remplace l'item courant par le texte frappé.
COMBOBOX_STATIC : boîte inchangeable.
Les messages :
ID_LIST :
identifiant associé à l'instance intégrée de FXList.
ID_TEXT :
identifiant associé à l'instance intégrée de FXTextField.
Les attributs :
backColor [RW] : couleur du fond
[FXColor]
comboStyle [RW] : style de la boîte à
lister [Integer]
currentItem [RW] : index de l'item
courant, ou '-1' s'il n'y en a pas [Integer]
editable [W]
: état éditable [Boolean]
font
[RW] : fonte du texte [FXFont]
helpText
[RW] : texte d'aide de la ligne de statut [String]
numColumns [RW] : nombre de colonnes
[Integer]
numItems [R] : nombre d'items dans la
liste [Integer]
numVisible
[RW] : nombre d'items visibles [Integer]
selBackColor
[RW] : couleur du fond pour les items sélectionnés [FXColor]
selTextColor
[RW] : couleur du texte pour les items sélectionnés [FXColor]
text [RW]
: texte [String]
textColor
[RW] : couleur du texte [FXColor]
tipText
[RW] : message info-bulle [String]
Les méthodes :
editable?() : renvoie 'true' si la boîte est éditable.
itemCurrent?(index) : retourne 'true' si l'item situé à l'index 'index' est l'item courant.
Renvoie un IndexError si l'index est
hors limites.
retrieveItem(index) : retourne le texte de l'item situé à 'index'. Renvoie un IndexError si
l'index est hors limites.
replaceItem(index,
text, data=nil) : remplace l'item situé à l'index 'index' par
un nouvel item de texte 'text' et de données 'data'. Renvoie un IndexError si
l'index est hors limites.
insertItem(index,
text, data=nil) : insère un nouvel item à l'index 'index', de
texte 'text' et de données 'data'. Renvoie un IndexError si l'index est hors
limites.
appendItem(text,
data=nil) : ajoute un nouvel item à la liste, de texte
'text' et de données 'data'.
prependItem(text,
data=nil) : ajoute un item au début de la liste avec le
texte 'text' et les données 'data'.
removeItem(index)
: supprime de la liste l'item situé à l'index 'index'.
Renvoie un IndexError si l'index est hors limites.
clearItems()
: supprime
tous les items de la liste.
setItemText(index,
text) : place le texte 'text' dans l'item situé à
l'index 'index'. Renvoie un IndexError si l'index est hors limites.
getItemText(index)
: renvoie le texte de l'item situé à l'index 'index'.
Renvoie un IndexError si l'index est hors limites.
setItemData(index,
data) : place les données 'data' dans l'item situé à
l'index 'index'. Renvoie un IndexError si l'index est hors limites.
getItemData(index)
: renvoie un pointeur pour les données de l'item situé
à l'index 'index'. Renvoie un IndexError si l'index est hors limites.
paneShown?() : retourne 'true' si la sous-fenêtre est visible.
sortItems() : tri les items en utilisantla fonction de tri en cours.
each()
{|itemText, itemData| ...} : itérateur. Appelle le
bloc pour chaque item de la liste, en passant le texte de l'item et les données
en tant que paramètres.
Les événements :
Les messages suivants sont envoyés par
FXComboBox à ses cibles :
SEL_CHANGED : envoyé lors d'un changement de texte dans le champ texte; les données
du message sont une chaîne contenant le nouveau texte.
SEL_COMMAND
: envoyé quand un nouvel item est sélectionné dans la
liste, ou quand un message de commande est envoyé à partir du champ texte; Les
données du message sont une chaîne contenant le nouveau texte.
FXCommand
FxCommand est une classe abstraite de base pour
vos commandes. Au minimum vos sous-classes doivent implémenter les méthodes
'undo', 'redo', 'undoName', et 'redoName'.
Ancêtre :
Object.
Les méthodes :
undo() : annule cette commande; doit sauvegarder suffisamment d'informations
pour rétablir.
redo()
: rétabli la commande; doit sauvegarder suffisamment
d'informations pour annuler.
undoName() : nom de la commande d'annulation à afficher sur un bouton ou un menu
de commande; par exemple, "Annuler suppression".
redoName() : Nom de la commande de rétablissement, à afficher sur un bouton sous
un menu de commande; par exemple "Rétablir suppression".
size() : retourne la taille de l'information dans l'enregistrement
d'annulation, c'est à dire le nombre d'octets nécessaire au stockage en
mémoire. Ceci est utilisé seulement par la méthode FXUndoList#trimSize, qui
peut être appelée pour réduire l'utilisation de la mémoire de la liste
d'annulation à une certaine dimension.
FXComposite
Composant composite, contenant d'autres
composants, par opposition au composant individuel. FXWindow descend de ce
composant.
Ancêtre :
FXWindow.
Déclaration :
FXComposite.new(parent, opts=0, x=0, y=0, width=0, height=0) {|theComposite| ...}
Les méthodes :
maxChildWidth() : retourne la largeur de la fenêtre enfant la plus large.
maxChildHeight() : retourne la largeur de la fenêtre enfant la plus haute.
Les événements :
Les messages suivants sont envoyés par
FXComposite à ses cibles.
SEL_KEYPRESS : envoyé lors de l'appui sur une touche, mais seulement si aucun autre
composant n'a le focus (ou bien si le composant possédant le focus refuse le
message).
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche, mais seulement si aucun
autre composant n'a le focus (ou bien si le composant possédant le focus refuse
le message).
Les données sont une instance de FXEvent.
FXCURCursor
Classe des curseurs CUR.
Ancêtre :
FXCursor.
Déclaration :
FXCURCursor.new(app, pixels) {|theCursor| ...}
Construit un curseur CUR à partir d'un flux
mémoire dans le format CUR de Microsoft.
FXCursor
Classe des curseurs
Ancêtre :
FXId.
Déclaration :
FXCursor.new(app, stockCursorId=CURSOR_ARROW) {|theCursor| ...}
Construit un curseur où 'stockCursorId' est un
des curseurs disponibles (CURSOR_ARROW, CURSOR_RARROW, etc.)
Ou bien
FXCursor.new(app, source, mask, width=32, height=32, hotX=-1, hotY=-1) {|theCursor|
...}
Construit un curseur à partir de 'source' et de
'mask'. Les dimensions doivent être de 32X32 pixels pour la portabilité.
Les constantes prédéfinies :
Curseurs courants :
CURSOR_ARROW : flèche vers la gauche, par défaut.
CURSOR_RARROW : flèche vers la droite.
CURSOR_IBEAM : curseur texte (caret).
CURSOR_WATCH : sablier.
CURSOR_CROSS : curseur en forme de croix.
CURSOR_UPDOWN : curseur flèches haut, bas.
CURSOR_LEFTRIGHT : curseur flèches gauche, droite.
+CURSOR_MOVE : curseur de déplacement haut,bas,gauche, droite.
Les attributs :
height
[R] : hauteur du curseur en pixels [Integer]
hotX
[R] : Point d'attaque du curseur,coordonnée x [Integer]
hotY [R] : Point d'attaque du curseur,coordonnée y
[Integer]
width [R] : largeur du curseur en pixels [Integer]
Les méthodes :
savePixels(stream) : sauve les données en pixels seulement.
loadPixels(stream) : charge les données en pixels seulement.
FXDataTarget
Un
composant FXDataTarget permet à un composant tel qu'un FXSlider ou un
FXTextField d'être directement connecté à une variable dans le programme. Même
si le contrôle change, la variable connectée par l'intermédiaire de
FXDataTarget est automatiquement mise à jour ; réciproquement, même si le
programme change une variable, tous les composants connectés seront mis à jour
pour afficher la nouvelle valeur. FxDataTarget permet aussi de connecter des
FXRadioButtons, FXMenuCommands etc.. à une variable. Dans ce cas la nouvelle
valeur de la variable est calculée en soustrayant : +FXDataTarget::ID_OPTION+
de l'identifiant du message
Ancêtre :
FXObject.
Module inclus : Responder2
Déclaration :
FXDataTarget.new(value=nil, tgt=nil, sel=0) {|theDataTarget| ...}
Les constantes prédéfinies :
ID_VALUE : fait demander par FXDataTarget la valeur à l'expéditeur.
ID_OPTION : ID_OPTION+i met la valeur à
i, où -10000 <= i <= 10000.
Les attributs :
selector
[RW] : l'identifiant du message pour cette donnée
[Integer]
target [RW] : l'objet cible pour cette
donnée [FXObject]
value [RW] : la valeur courante de la donnée de la cible [Object]
Les méthodes :
to_s()
: retourne la représentation sous forme de chaîne de la
valeur de cette donnée
Les événements :
Les messages suivants sont envoyés par
FXDataTarget à ses cibles :
SEL_COMMAND : envoyé après que la cible est elle-même produit un message
SEL_COMMAND.
SEL_CHANGED : envoyé après que la cible est elle-même produit un message
SEL_CHANGED.
FXDC
Un contexte de périphérique est utilisé pour
maintenir l'état du système graphique. Définir votre code de dessin en terme de
contexte de périphérique abstrait permet d'afficher sur différents types de
surfaces, par exemple les fenêtres et les images (FXDCWindow), ou bien sur
papier (FXDCPrint) avec un code identique.
Ancêtre :
Object.
Déclaration :
FXDC.new(app)
Les constantes prédéfinies :
Fonctions déterminant le mode de tracé (BITBLT)
: D=Destination, S=Source.
BLT_CLR : D := 0
BLT_SRC_AND_DST : D := S & D
BLT_SRC_AND_NOT_DST : D := S & ~D
BLT_SRC : D := S
BLT_NOT_SRC_AND_DST : D := ~S & D
BLT_DST : D := D
BLT_SRC_XOR_DST : D := S ^ D
BLT_SRC_OR_DST : D := S | D
BLT_NOT_SRC_AND_NOT_DST : D := ~S & ~D == D := ~(S | D)
BLT_NOT_SRC_XOR_DST : D := ~S ^ D
BLT_NOT_DST : D := ~D
BLT_SRC_OR_NOT_DST : D := S | ~D
BLT_NOT_SRC: D := ~S
BLT_NOT_SRC_OR_DST : D := ~S | D
BLT_NOT_SRC_OR_NOT_DST
: D := ~S | ~D == ~(S & D)
BLT_SET : D := 1
Style de lignes :
LINE_SOLID : ligne continue.
LINE_ONOFF_DASH : ligne en pointillés.
LINE_DOUBLE_DASH : ligne en pointillés doubles.
Styles de terminaison des lignes :
CAP_NOT_LAST : sans
CAP_BUTT : la ligne se termine au dernier point et le
bout est carré.
CAP_ROUND : bout arrondi.
CAP_PROJECTING : le bout
dépasse.
Styles de jonction des lignes :
JOIN_MITER : pointu.
JOIN_ROUND : arrondi.
JOIN_BEVEL : tronqué.
Style de remplissage :
FILL_SOLID : avec couleur unie.
FILL_TILED : avec mosaïque.
FILL_STIPPLED : remplissage avec masque de pointillé 1.
FILL_OPAQUESTIPPLED : remplissage avec l'avant-plan où le masque est 1, sinon avec
l'arrière-plan.
Règles de remplissage :
RULE_EVEN_ODD : pair impair.
RULE_WINDING : suivit de contour.
Formes de trame :
+STIPPLE_0+:: STIPPLE_NONE::
STIPPLE_BLACK : tout à 1.
+STIPPLE_1+:: +STIPPLE_2+:: +STIPPLE_3+::
+STIPPLE_4+:: +STIPPLE_5+:: +STIPPLE_6+:: +STIPPLE_7+::+STIPPLE_8+::
STIPPLE_GRAY : 50% gris.
+STIPPLE_9+:: +STIPPLE_10+:: +STIPPLE_11+::
+STIPPLE_12+:: +STIPPLE_13+:: +STIPPLE_14+::+STIPPLE_15+:: +STIPPLE_16+::
STIPPLE_WHITE :
tout à zéro.
STIPPLE_HORZ :
trame horizontale.
STIPPLE_VERT : trame verticale.
STIPPLE_CROSS : trame croisée.
STIPPLE_DIAG : trame en diagonale // .
STIPPLE_REVDIAG :
trame en diagonale inverse \\
STIPPLE_CROSSDIAG :
trame en diagonale croisée.
Les attributs :
app [R] : l'application.
background [RW] : couleur de tracé du fond [FXColor]
clipHeight [R] : hauteur du rectangle de clippage,
en pixels.
clipRectangle [R] : Clip rectangle [FXRectangle]
clipRegion [W] : région de
clippage[FXRegion]
clipWidth
[R] : largeur du rectangle de clippage, en
pixels[Integer]
clipX [R] : coordonnée X du rectangle de clippage [Integer]
clipY [R] : coordonnée Y du rectangle de clippage [Integer]
dashLength [R] : longueur des traits [Integer]
dashOffset [R] : décalage [Integer]
dashPattern [R] : forme des traits [String]
fillRule [RW] :règle de remplissage,
soit RULE_EVEN_ODD soit RULE_WINDING
[Integer]
fillStyle [RW] : style de remplissage,
soit FILL_SOLID, FILL_TILED,
FILL_STIPPLED ou FILL_OPAQUESTIPPLED
[Integer]
foreground [RW] : couleur de tracé de l'avant plan. [FXColor]
function [RW] : fonction du mode de tracé : BLT_CLR, BLT_SRC, BLT_DST, etc.
[Integer]
lineCap [RW] : style de terminaison des lignes, parmi CAP_NOT_LAST, CAP_BUTT,
CAP_ROUND ou CAP_PROJECTING [Integer]
lineJoin [RW] : style de jonction des lignes, parmi JOIN_MITER, JOIN_ROUND ou
JOIN_BEVEL [Integer]
lineStyle [RW] : style des lignes, parmi LINE_SOLID, LINE_ONOFF_DASH oo
LINE_DOUBLE_DASH [Integer]
lineWidth
[RW] : largeur de ligne, une ligne de largeur zéro est
la plus mince possible
et la plus rapide [Integer]
stipple [RW] : forme de trame [FXBitmap or Integer]
textFont [RW] : fonte pour les textes [FXFont]
tile [RW] : image mosaïque [FXImage]
Les méthodes :
readPixel(x,
y) : retourne le pixel situé à la position (x,y)
drawPoint(x,
y) :trace un point en (x,y)
drawPoints(points)
: trace plusieurs points, où ' points' est un tableau
d'instances de FXPoint.
drawPointsRel(points) : trace plusieurs points, relativement au point précédent, où 'points'
est un tableau d'instances FXPoint.
drawLine(x1,
y1, x2, y2) : trace
une ligne de (x1,y1) à (x2,y2).
drawLines(points) : trace des lignes reliées, où 'points' est un tableau d'instances de
FXPoint.
Le
nombre de lignes tracées est égal à la taille du tableau de points moins un.
Traite toutes
les
coordonnées de points relativement à l'origine.
drawLinesRel(points) : trace des lignes reliées, où 'points' est un tableau d'instances de
FXPoint. Le nombre de lignes tracées est égal à
la taille du tableau de points moins un.
Traite toutes les coordonnées de points (après
le premier) relativement au point précédent.
drawLineSegments(segments) : trace des segments de droite, où les segments sont des
instances de FXSegment.
drawRectangle(x,
y, w, h) : trace un rectangle à la coordonnée (x,y) en
haut à gauche, de
largeur 'w' et de hauteur 'h'.
drawRectangles(rectangles) : trace plusieurs rectangles, où 'rectangles' est un tableau
d'instances de FXRectangle.
drawArc(x,
y, w, h, angle1, angle2) : trace des arcs de cercle.
Les arguments 'angle1' et
'angle2' spécifient les points de départ (par
rapport la position "3 heures") et d'arrivée (relativement au point
de départ) de l'arc en unité de "degré*64" . Les arguments 'x,y,w et
h' représentent le rectangle frontière.
drawArcs(arcs) : trace des arcs, où 'arcs' est
un tableau d'instances de FXArc.
fillRectangle(x,
y, w, h) : trace un rectangle plein, ancré en haut à
gauche en (x,y) et de 'w' de
large et 'h' de haut.
fillRectangles(rectangles) : trace des rectangles, où 'rectangles' est un tableau d'instances de
FXRectangle.
fillArc(x,
y, w, h, angle1, angle2) : trace des arcs pleins.
Même description que 'drawArc'.
fillArcs(arcs) : trace des arcs pleins, où 'arcs' est un tableau d'instances de FXArc.
fillPolygon(points) : trace des polygones pleins, où 'points' est un tableau d'instances de
FXPoint.
fillConcavePolygon(points) :
trace des polygones pleins, où 'points' est un tableau d'instances
de FXPoint.
fillComplexPolygon(points) : trace des polygones complexes, où
'points' est un tableau
d'instances de FXPoint.
fillPolygonRel(points) : trace des polygones pleins avec des points "relatifs", où
'points' est un tableau d'instances de FXPoint.
fillConcavePolygonRel(points) : trace des polygones pleins avec des points "relatifs", où
'points' est un tableau d'instances de FXPoint.
fillComplexPolygonRel(points) : trace des polygones pleins avec des points "relatifs", où
'points' est un tableau
d'instances de FXPoint.
drawHashBox(x, y, w, h, borderWidth=1) : Trace une boîte ancrée en (x,y) de largeur 'w'
et hauteur 'h'.
drawFocusRectangle(x, y, w, h) : Trace un rectangle ancré
en (x,y) de largeur 'w'
et hauteur 'h'.
drawArea(source,
sx, sy, sw, sh, dx, dy) : trace une zone à partir de 'source'.
drawImage(image, dx, dy) : trace
une image.
drawBitmap(bitmap,
dx, dy) :trace un bitmap.
drawIcon(icon,
dx, dy) : trace une icône.
drawIconShaded(icon,
dx, dy) : trace une icône ombrée (utilisée pour les
étiquettes et les boutons non valides).
drawIconSunken(icon,
dx, dy) :
trace des icônes en puit.
drawText(x,
y, string) :
trace un texte à la position (x,y).
drawImageText(x,
y, string) : trace la chaîne 'string' à la position (x,y)
setDashes(dashOffset,
dashPattern, dashLength) : établi forme et décalage de
pointillés. Une forme de pointillés de [1 2 3 4] est une forme répétitive de 1
pixel en avant-plan, 2 en arrière-plan, 3 en avant-plan et 4 en arrière-plan.
Le décalage commence là où le système commence à compter. La longueur maximale
du tiret est de 32.
setClipRectangle(x,
y, w, h) : établi le
rectangle de clippage.
setClipRectangle(rectangle) : Change le rectangle de clippage.
clearClipRectangle() : efface le rectangle de clippage.
setClipMask(bitmap, dx=0, dy=0) : applique le masque de clippage à 'bitmap'.
clearClipMask() : efface le
masque de clippage.
clipChildren(yes) : découpe de nouveau les fenêtres enfants (où 'yes' est soit 'true'
soit 'false')
FXDCWindow
FXDCWindow hérite de FXDC.
Un contexte de périphérique permet de tracer
dans un composant 'FXDrawable', tel qu'une fenêtre visible (par exemple un FXWindow et ses dérivés) ou une image non
visible (FXImage et ses dérivés). Du fait des ressources restrictives de
certains matériels, un seul FXDCWindow peut-être utilisé à la fois.
Ancêtre :
FXDC.
Déclaration :
FXDCWindow.
new(drawable, event) {|dc| ...}
Construct for painting in response to expose;
this sets the clip rectangle to the exposed rectangle. If an optional code
block is provided, the new device
context will be passed into the block as an argument and end will be called
automatically when the block terminates.
FXDCWindow.
new(drawable) {|dc| ...}
Construct for normal drawing; this sets clip
rectangle to the whole drawable. If an optional code block is provided, the new
device context will be passed into the block as an argument and end will be
called automatically when the block terminates.
Les méthodes :
begin(drawable) : Lock in a drawable surface.
end()
: Unlock the
drawable surface.
FXDial
Le cadran.
Ancêtre :FXFrame
Déclaration :
FXDial.new(p, tgt=nil, sel=0, opts=DIAL_NORMAL, x=0, y=0, w=0, h=0,
pl=DEFAULT_PAD, pr=DEFAULT_PAD,pt=DEFAULT_PAD, pb=DEFAULT_PAD) {|theDial| ...}
Les constantes prédéfinies :
DIAL_VERTICAL : orientation verticale.
DIAL_HORIZONTAL : orientation horizontale.
DIAL_CYCLIC : valeur cyclique.
DIAL_HAS_NOTCH : le cadran a une encoche centrale.
DIAL_NORMAL : = DIAL_VERTICAL.
Les méthodes :
dialStyle [RW] : style du cadran [Integer]
helpText [RW] : texte d'aide de la ligne de statut [String]
notchColor [RW] : couleur de l'encoche centrale [FXColor]
notchOffset [RW] : le décalage de l'encoche est la position du centre de cette
dernière. La valeur doit être en dixième de degrés dans un intervalle de
[-3600,3600]. [Integer]
notchSpacing [RW] : les espaces pour les petites encoches. Ils doivent être en
dixième de degrés dans un intervalle de [1,3600], et la valeur doit être un diviseur de 3600, de façon à faire
apparaître les encoches régulièrement [Integer]
range [RW] : intervalle [Range]
revolutionIncrement [RW] : l'incrément de révolution est le nombre qui permet de parcourir
tout l'intervalle en restant perceptible [Integer]
tipText [RW] :texte de l'info-bulle
value [RW] : valeur du cadran [Integer]
Les
messages :
Les messages suivants sont envoyés par FXDial à
ses cibles :
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui du bouton gauche de la souris. La donnée du
message est une instance de FXEvent.
SEL_LEFTBUTTONRELEASE : envoyé lors du relâchement du bouton gauche de la souris. La donnée
du message est une instance de FXEvent.
SEL_CHANGED : envoyé quand la valeur du cadran change. La donnée du message est la
nouvelle valeur.
SEL_COMMAND : envoyé lorsque l'utilisateur arrête le changement de valeur en
relachant le bouton de la souris. La donnée du message est la nouvelle valeur.
FXDialogBox
Quand une boîte de dialogue recoit un message
SEL_COMMAND avec l'identifiant ID_CANCEL ou ID_ACCEPT la boîte de dialogue se
ferme et retourne '0' ou '1'
respectivement.
Pour fermer une boîte de dialogue non modale il
suffit d'appeler la méthode 'hide' (FXDialogBox#hide) ou d'envoyer une commande
ID_HIDE.
Ancêtre : FXTopWindow.
Déclaration :
FXDialogBox.new(app, title, opts=DECOR_TITLE|DECOR_BORDER, x=0, y=0, w=0, h=0,
padLeft=10, padRight=10, padTop=10, padBottom=10, hSpacing=4, vSpacing=4)
{|theDialogBox| ...}
Construit une boîte de dialogue indépendante
(rattachée directement à 'app').
ou
FXDialogBox.new (owner, title, opts=DECOR_TITLE|DECOR_BORDER, x=0, y=0, w=0, h=0,
padLeft=10, padRight=10, padTop=10, padBottom=10, hSpacing=4, vSpacing=4)
{|theDialogBox| ...}
Construit une boîte de dialogue sur la fenêtre
propriétaire (owner).
Les constantes prédéfinies :
ID_CANCEL : ferme le dialogue, annule l'entrée.
ID_ACCEPT : ferme le dialogue et accepte l'entrée.
Les méthodes :
execute(placement=PLACEMENT_CURSOR) : exécute une boîte de dialogue modale à l'emplacement indiqué.
FXDirBox
Boîte de répertoire.
Ancêtre :
FXTreeListBox.
Déclaration :
FXDirBox.new(p, nvis, tgt=nil, sel=0,
opts=FRAME_SUNKEN|FRAME_THICK|TREELISTBOX_NORMAL, x=0, y=0, w=0,h=0, pl=DEFAULT_PAD,
pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD) {|theDirBox| ...}
Les attributs :
directory [RW] : répertoire courant [String]
Les
messages :
SEL_CHANGED : envoyé quand l'item courant change; la donnée du message est le
nouveau répertoire courant.
SEL_COMMAND : envoyé quand l'item courant change; la donnée du message est le
nouveau répertoire courant
FXDirDialog
Dialogue de sélection de répertoire.
Ancêtre :
FXDialogBox.
Déclaration :
FXDirDialog.new(owner, name, opts=0, x=0, y=0, w=500, h=300) {|theDirDialog| ...}
Retourne une instance initialisée de
FXDirDialog.
Les attributs :
dirBoxStyle [RW] : style de la liste des répertoires [Integer]
directory [RW] : répertoire [String]
FXDirItem
Item de répertoire.
Ancêtre :
FXTreeItem.
Déclaration :
FXDirItem.new(text, oi=nil, ci=nil, data=nil) {|theDirItem| ...}
Les attributs :
date [R]: date du fichier [Integer]
assoc [R] : association de fichier [FXFileAssoc]
size [R] : taille du fichier [Integer]
Les méthodes :
directory?() : renvoie 'true' si c'est un répertoire.
executable?() : renvoie 'true' si c'est un
exécutable.
symlink?() : renvoie 'true' si c'est un lien symbolique.
chardev?() : renvoie 'true' si c'est un
Return true if this is a character device
blockdev?()
Return true if this is a block device
fifo?()
Return true if this is a FIFO (a
named pipe)
socket?() : renvoie 'true' si c'est un socket.
FXDirList
Liste de répertoire.
Ancêtre :
FXTreeList.
Déclaration :
FXDirList.new(p, nvis, tgt=nil, sel=0, opts=0, x=0, y=0, w=0, h=0) {|theDirList| ...}
Les constantes prédéfinies :
DIRLIST_SHOWFILES : Montre les répertoires et les fichiers.
DIRLIST_SHOWHIDDEN : montre les fichiers et les répertoires cachés.
DIRLIST_NO_OWN_ASSOC : ne crée pas d'association pour les fichiers.
Pour les identifiants de message :
ID_REFRESH
: x
ID_SHOW_FILES
: x
ID_HIDE_FILES
: x
ID_TOGGLE_FILES
: x
ID_SHOW_HIDDEN
: x
ID_HIDE_HIDDEN
: x
ID_TOGGLE_HIDDEN
: x
ID_SET_PATTERN
: x
ID_SORT_REVERSE
: x
Les attributs :
associations [RW] : associations des fichiers [FXFileDict]
currentFile [RW] : fichier courant [String]
directory [RW] : répertoire courant[String]
matchMode [RW] : Wildcard matching mode, some
combination of file matching flags [Integer]
pattern [RW] : Wildcard pattern [String]
Les méthodes :
itemDirectory?(anItem) : retourne 'true' si l'item est
un répertoire.
itemFile?(anItem) : retourne 'true' si l'item est
un fichier.
itemExecutable?(anItem) : retourne 'true' si l'item est un éxécutable.
itemFilename(anItem) : retourne le nom de l'item.
itemPathname(anItem) : retourne le chemin complet de l'item.
filesShown?() : retourne 'true' si les fichiers et les répertoires sont affichés.
filesShown=(state) : si 'state' vaut 'true' les fichiers et les répertoires sont affichés,
sinon ne montre que les répertoires.
hiddenFilesShown?() : retourne 'true' si les fichiers et répertoires cachés sont affichés.
hiddenFilesShown=(state) : si 'state' est à 'true' les fichiers cachés sont affichés sinon non.
.
Les
messages :
SEL_CLOSED : envoyé lorsqu'un item "repliable" est fermé. La donnée du
message est une référence au FXDirItem fermé.
SEL_OPENED : envoyé lorsqu'un item "repliable" est ouvert. La donnée du
message est une référence au FXDirItem ouvert.
FXDragCorner
Un composant "coin de dragage" peut
être placé à l'angle inférieur droit d'une fenêtre pour lui permettre de se
redimensionner plus facilement.
Ancêtre : FXWindow
Déclaration :
FXDragCorner.new(p) {|theDragCorner| ...}
Les attributs :
hiliteColor [RW] : couleur de surbrillance [FXColor]
shadowColor [RW] : couleur de l'ombre [FXColor]
FXDrawable
FXDrawable est une classe abstraite pour les
surfaces sur lesquelles on peut tracer quelque chose, comme FXWindow et FXImage.
Ancêtre :
FXId.
Les attributs :
height
[R] : hauteur en pixels [Integer]
visual [RW] : Visuel [FXVisual]
width [R] : largeur en pixels [Integer]
Les méthodes :
resize(width,
height) : Redimensionne avec la largeur (‘width’) et la hauteur (‘height’) spécifiés.
FXEvent
La classe des évènements FOX.
Ancêtre :
Object.
Les attributs :
click_button [R] : bouton pressé de la souris [Integer]
click_count [R] : nombre de clics [Integer]
click_time [R] : durée de la pression sur le bouton [Integer]
click_x [R] : coordonnée 'x' du curseur souris, relativement à la fenêtre
[Integer]
click_y [R] : coordonnée 'y' du curseur souris, relativement à la fenêtre
[Integer]
code [R] : Button, keysym or mode; DDE source
[Integer]
last_x [R] : coordonnée 'x' précédente du curseur souris, relativement à la
fenêtre [Integer]
last_y [R] : coordonnée 'y' précédente du curseur souris, relativement à la
fenêtre [Integer]
root_x [R] : coordonnée 'x' initiale de la fenêtre [Integer]
root_y [R] : coordonnée 'y' initiale de la fenêtre [Integer]
rootclick_x [R] : Coordonnée 'x' de la souris dans la fenêtre racine [Integer]
rootclick_y [R] : Coordonnée 'y' de la souris dans la fenêtre racine [Integer]
state [R] : état du clavier [Integer]
target [R] : type de cible requis [Integer]
text [R] : texte de l'événement clavier [String]
time [R] : intervalle de temps depuis le dernier évènement [Integer]
type [R] :
win_x [R] : coordonnée 'x' relatif à la fenêtre [Integer]
win_y [R] : coordonnée 'y' relatif à la fenêtre [Integer]
Les méthodes :
moved?() : retourne 'true' si le curseur souris s'est déplacé depuis la dernière
pression d'un
bouton.
rect() : rectangle englobant pour les évènements de "peinture".
synthetic?() : retourne 'true' si c'est un événement
synthétique.
FXFileAssoc
Pour tout savoir sur les extensions et associations
de fichier.
Ancêtre :
object.
Déclaration :
FXFileAssoc.new
Les attributs :
bigicon [RW] : grande icône normale [FXIcon]
bigiconopen [RW] : grande icône d'ouverture[FXIcon]
command [RW] :
dragtype [RW] : type de dragage [FXDragType]
extension [RW] : nom de l'extension [String]
flags [RW] : drapeaux [Integer]
mimetype [RW] : nom du type Mime [String]
miniicon [RW] : mini icône normale [FXIcon]
miniiconopen [RW] : mini icône d'ouverture [FXIcon]
FXFileDialog
Boîte de dialogue pour ouvrir ou sauvegarder
des fichiers.
Ancêtre :
FXDialogBox.
Déclaration :
FXFileDialog.
new(owner, name, opts=0, x=0, y=0, w=500, h=300)
{|theFileDialog| ...}
Les attributs :
currentPattern [RW] : nombre de formats de fichiers [Integer]
directory [RW] : répertoire [String]
fileBoxStyle [RW] : style de la liste des fichiers [Integer]
filename [RW] : nom du fichier [String]
filenames [R] : liste des fichiers
sélectionnés [Array]
itemSpace [RW] : espace, en pixels, entre les items [Integer]
pattern [RW] : format des fichiers [String]
patternList [RW] : liste des formats de
fichiers affichée dans la fenêtre de dialogue [Array]
selectMode [RW] : mode de sélection des fichiers [Integer]
Les méthodes :
getOpenFilename(owner,
caption, path, patterns="*", initial=0) :
renvoie le nom du fichier ouvert.
getOpenFilenames(owner,
caption, path, patterns = "*", initial=0) :
renvoie les noms des fichiers ouverts.
getSaveFilename(owner,
caption, path, patterns="*", initial=0) :
renvoie le nom du fichier à sauvegarder.
getOpenDirectory(owner,
caption, path) : renvoie le nom du répertoire d'ouverture.
Méthodes d'instance publique :
getPatternText(patno) : renvoie le texte des formats
de fichiers.
setPatternText(patno,
text) : change le texte des formats de fichiers.
showReadOnly=(shown) : établit la visibilité du bouton 'en lecture seule', où 'shown' est
soit 'true' soit 'false'.
readOnlyShown?() : retourne 'true' si le bouton 'lecture seule' est visible.
readOnly=(state) : établit l'état initial du bouton de 'lecture seule', où 'state' est
soit 'true' soit 'false'.
readOnly?() : retourne 'true' si en lecture seule.
Note
:
Chaque format dans la liste des formats
comprend un nom optionnel, suivit par un format entre parenthèses. Les formats
sont séparés par des retour à la ligne (\n).
Par exemple :
"*\n*.cpp,*.cc\n*.hpp,*.hh,*.h"
et
"All Files (*)\nC++ Sources (*.cpp,*.cc)\nC++ Headers
(*.hpp,*.hh,*.h)"
indiqueront les mêmes trois formats, mais le
premier ne montre pas le nom des formats.
FXFileItem
Item de fichiers.
Ancêtre :
FXIconItem
Déclaration :
FXFileItem.new(text, bi=nil, mi=nil, ptr=nil) {|theFileItem| ...}
Retourne une instance de FXFileItem
initialisée.
Les attributs :
assoc [R] : l'objet associé à ce fichier [FXFileAssoc]
date [R] : la date pour cet item [Time]
size [R] : la taille du fichier [Integer]
Les méthodes :
file?() :
retourne 'true' si c'est un item de fichier.
directory?()
: retourne 'true' si c'est un item de répertoire.
executable?()
: retourne
'true' si c'est un item de fichier exécutable.
symlink?() :
retourne 'true' si c'est un item de lien symbolique.
chardev?() : Return true if
this is a character device item
blockdev?()
: Return true if this is a block device item
fifo?()
: retourne
'true' si c'est un FIFO.
socket?()
: retourne 'true' si c'est un socket.
FXFileList
Construit une liste de fichier.
Ancêtre :
FXIconList.
Déclaration :
FXFileList.new(p, tgt=nil, sel=0, opts=0, x=0, y=0, w=0, h=0) {|theFileList| ...}
Les constantes prédéfinies :
Pour les options de fichiers :
FILELIST_SHOWHIDDEN : montre les
fichiers et répertoires cachés.
FILELIST_SHOWDIRS : montre seulement
les répertoires.
FILELIST_NO_OWN_ASSOC : ne crée pas les
associations de fichiers.
Pour les identifiants de message :
ID_SORT_BY_NAME : x
ID_SORT_BY_TYPE : x
ID_SORT_BY_SIZE : x
ID_SORT_BY_TIME : x
ID_SORT_BY_USER : x
ID_SORT_BY_GROUP : x
ID_SORT_REVERSE : x
ID_DIRECTORY_UP : x
ID_SET_PATTERN : x
ID_SET_DIRECTORY : x
ID_SHOW_HIDDEN : x
ID_HIDE_HIDDEN : x
ID_TOGGLE_HIDDEN : x
ID_REFRESHTIMER : x
ID_OPENTIMER : x
Les attributs :
associations [RW] : associations de fichiers [FXFileDict]
currentFile [RW] : fichier courant [String]
directory [RW] : répertoire courant [String]
matchMode [RW] :
Wildcard matching mode
[Integer]
pattern [RW] :
Wildcard matching pattern
[String]
Les méthodes :
itemDirectory?(index) : retourne 'true' si l'item est un répertoire. Envoit une erreur
(IndexError) si l'index est hors indice.
itemFile?(index) : retourne 'true' si item est un fichier. Envoit une erreur
(IndexError) si l'index est hors indice.
itemExecutable?(index) : retourne 'true' si l'item est un exécutable. Envoit une erreur
(IndexError) si l'index est hors indice.
itemFilename(index) : retourne le nom de l'item à l'index 'index'. Envoit une erreur
(IndexError) si l'index est hors indice.
itemPathname(index) : retourne le chemin complet de l'item à l'index 'index'. Envoit une
erreur (IndexError) si
l'index est hors indice.
itemAssoc(index) : retourne l'association de l'item à l'index 'index'. Envoit une erreur
(IndexError) si l'index est hors indice.
hiddenFilesShown?() : retourne 'true' si les fichiers cachés sont montrables.
hiddenFilesShown=(shown) : montre ou cache les fichiers
cachés.
onlyDirectoriesShown?() : retourne 'true' si on montre seulement les répertoires.
onlyDirectoriesShown=(shown) : montre ou cache seulement les répertoires.
FXFileStream
Ancêtre :
FXSteam.
Déclaration :
FXFileStream.new(cont=nil) {|theFileStream| ...}
Construit un flux.
FXFileStream.open(filename, save_or_load, container=nil) {|theFileStream| ...}
Construit un nouvel objet FXFileStream avec la
direction du flux (sauver ou charger) et l'objet contenant. Si un bloc de code
est donné, il sera passé à ce flux comme argument, et le flux sera
automatiquement fermé à la fin du bloc. S'il n'y a pas de bloc de code, cette
méthode retourne le nouveau flux dans un état ouvert.
Les méthodes :
open(filename,
save_or_load) : ouvre le flux.
FXFont
Classe des fontes.
Ancêtre : FXId.
Déclaration :
FXFont.
new(app, face, size, weight=FONTWEIGHT_NORMAL,
slant=FONTSLANT_REGULAR, encoding=FONTENCODING_DEFAULT,
setWidth=FONTSETWIDTH_DONTCARE, hints=0) {|theFont| ...}
Construit une fonte avec le nom de la fonte ('face'), la taille ('size')
en points (pixels), la graisse, la pente, character set encoding, setwidth, and hints
Les constantes prédéfinies :
Renseignements sur le style de fonte
influançant la comparaison.
FONTPITCH_DEFAULT : chasse par défaut.
FONTPITCH_FIXED
: chasse fixe, non proportionnelle.
FONTPITCH_VARIABLE : chasse variable, proportionnelle.
FONTHINT_DONTCARE : fonte indifférente.
FONTHINT_DECORATIVE : fonte décorative.
FONTHINT_MODERN : trait d'épaisseur constante.
FONTHINT_ROMAN : largeur variable comme "times", avec sérif.
FONTHINT_SCRIPT : écriture manuelle.
FONTHINT_SWISS : Helvetica/swiss , sans-serif .
FONTHINT_SYSTEM : fonte système.
+FONTHINT_X11+ : X11 Fonte X11 (Unix)
FONTHINT_SCALABLE : Scalable fonts.
FONTHINT_POLYMORPHIC : fonte polymorphique.
Inclinaison des fontes
FONTSLANT_DONTCARE : sans importance.
FONTSLANT_REGULAR : normale.
FONTSLANT_ITALIC : italique.
FONTSLANT_OBLIQUE :oblique.
FONTSLANT_REVERSE_ITALIC : italique inverse.
FONTSLANT_REVERSE_OBLIQUE : oblique inverse.
Codage alphabet disponible :
FONTENCODING_DEFAULT : par défaut
+FONTENCODING_ISO_8859_1+:ISO-8859-1
+FONTENCODING_ISO_8859_2+:ISO-8859-2
+FONTENCODING_ISO_8859_3+: ISO-8859-3
+FONTENCODING_ISO_8859_4+:ISO-8859-4
+FONTENCODING_ISO_8859_5+:ISO-8859-5
+FONTENCODING_ISO_8859_6+:ISO-8859-6
+FONTENCODING_ISO_8859_7+: ISO-8859-7
+FONTENCODING_ISO_8859_8+: ISO-8859-8
+FONTENCODING_ISO_8859_9+: ISO-8859-9
+FONTENCODING_ISO_8859_10+: ISO-8859-10
+FONTENCODING_ISO_8859_11+: ISO-8859-11
+FONTENCODING_ISO_8859_13+:ISO-8859-13
+FONTENCODING_ISO_8859_14+: ISO-8859-14
+FONTENCODING_ISO_8859_15+: ISO-8859-15
+FONTENCODING_ISO_8859_16+:ISO-8859-16
+FONTENCODING_KOI8+:KOI-8
+FONTENCODING_KOI8_R+:Russian
+FONTENCODING_KOI8_U+: Ukrainian
+FONTENCODING_KOI8_UNIFIED+: x
+FONTENCODING_LATIN1+ : identique à +FONTENCODING_ISO_8859_1+,
Latin 1 (West European)
+FONTENCODING_LATIN2+ : identique à+FONTENCODING_ISO_8859_2+,
Latin 2 (East European)
+FONTENCODING_LATIN3+ : identique à+FONTENCODING_ISO_8859_3+,
Latin 3 (South European)
+FONTENCODING_LATIN4+ : identique à+FONTENCODING_ISO_8859_4+,
Latin 4 (North European)
+FONTENCODING_LATIN5+ : identique à+FONTENCODING_ISO_8859_9+,
Latin 5 (Turkish)
+FONTENCODING_LATIN6+ : identique à+FONTENCODING_ISO_8859_10+,
Latin 6 (Nordic)
+FONTENCODING_LATIN7+ : identique à +FONTENCODING_ISO_8859_13+,
Latin 7 (Baltic Rim)
+FONTENCODING_LATIN8+ : identique à +FONTENCODING_ISO_8859_14+,
Latin 8 (Celtic)
+FONTENCODING_LATIN9+ : identique à +FONTENCODING_ISO_8859_15+,
Latin 9 (a.k.a. Latin 0)
+FONTENCODING_LATIN10+ : identique à +FONTENCODING_ISO_8859_16+,
Latin 10
FONTENCODING_USASCII :
identique à +FONTENCODING_ISO_8859_1+, Latin 1
FONTENCODING_WESTEUROPE : identique à +FONTENCODING_ISO_8859_1+,
Latin 1 (West European)
FONTENCODING_EASTEUROPE
: identique à +FONTENCODING_ISO_8859_2+, Latin 2 (East European)
FONTENCODING_SOUTHEUROPE : identique à +FONTENCODING_ISO_8859_3+,
Latin 3 (South European)
FONTENCODING_NORTHEUROPE : identique à +FONTENCODING_ISO_8859_4+,
Latin 4 (North European)
FONTENCODING_CYRILLIC : identique à +FONTENCODING_ISO_8859_5+,
Cyrillic
FONTENCODING_RUSSIAN : identique à +FONTENCODING_KOI8+, Cyrillic
FONTENCODING_ARABIC : identique à +FONTENCODING_ISO_8859_6+,
Arabic
FONTENCODING_GREEK : identique à +FONTENCODING_ISO_8859_7+, Greek
FONTENCODING_HEBREW : identique à +FONTENCODING_ISO_8859_8+,
Hebrew
FONTENCODING_TURKISH : identique à +FONTENCODING_ISO_8859_9+,
Latin 5 (Turkish)
FONTENCODING_NORDIC : identique à +FONTENCODING_ISO_8859_10+, Latin
6 (Nordic)
FONTENCODING_THAI : identique à +FONTENCODING_ISO_8859_11+, Thai
FONTENCODING_BALTIC : identique à +FONTENCODING_ISO_8859_13+,
Latin 7 (Baltic Rim)
FONTENCODING_CELTIC : identique à +FONTENCODING_ISO_8859_14, Latin
8 (Celtic)
Graisse des fontes (poids d'encre)
FONTWEIGHT_DONTCARE : sans importance.
FONTWEIGHT_THIN : mince .
FONTWEIGHT_EXTRALIGHT : extra fine.
FONTWEIGHT_LIGHT : fine.
FONTWEIGHT_NORMAL : normale.
FONTWEIGHT_REGULAR : régulière.
FONTWEIGHT_MEDIUM : medium.
FONTWEIGHT_DEMIBOLD : demi grasse.
FONTWEIGHT_BOLD : grasse.
FONTWEIGHT_EXTRABOLD : extra grasse.
FONTWEIGHT_HEAVY : lourde.
FONTWEIGHT_BLACK : noire.
Largeur relative des fontes :
FONTSETWIDTH_DONTCARE : sans
importance.
FONTSETWIDTH_ULTRACONDENSED : ultra
condensée.
FONTSETWIDTH_EXTRACONDENSED : extra
condensée.
FONTSETWIDTH_CONDENSED : condensée.
FONTSETWIDTH_NARROW : étroite.
FONTSETWIDTH_COMPRESSED : compressée.
FONTSETWIDTH_SEMICONDENSED :
semi-condensée.
FONTSETWIDTH_MEDIUM : médium.
FONTSETWIDTH_NORMAL : normale.
FONTSETWIDTH_REGULAR : régulière.
FONTSETWIDTH_SEMIEXPANDED : semi
étendue.
FONTSETWIDTH_EXPANDED : étendue.
FONTSETWIDTH_WIDE : large.
FONTSETWIDTH_EXTRAEXPANDED : extra
large.
FONTSETWIDTH_ULTRAEXPANDED : ultra
large.
Les attributs :
encoding [R] : codage [Integer]
fontAscent [R] : la plus grande hauteur au dessus de la ligne de base [Integer]
fontDesc [RW] : description de la
fonte[FXFontDesc]
fontDescent [R] : la plus grande hauteur au dessous de la ligne de base [Integer]
fontHeight [R] : hauteur du plus grand caractère de la fonte[Integer]
fontLeading
[R] : Font leading
[Integer]
fontSpacing [R] : interligne [Integer]
fontWidth [R] : largeur du caractère le plus large de la fonte[Integer]
hints [R] : renseignements [Integer]
maxChar [R] : glyphe du dernier caractère de la fonte [Integer]
minChar [R] : glyphe du premier caractère de la fonte [Integer]
name [R] : nom de la fonte [String]
setWidth [R] : largeur [Integer]
size [R] : dimension en decipoints [Integer]
slant [R] : inclianiason [Integer]
weight [R] : poids (graisse) [Integer]
Les méthodes :
listFonts(face,
weight=FONTWEIGHT_DONTCARE, slant=FONTSLANT_DONTCARE,
setWidth=FONTSETWIDTH_DONTCARE,
encoding=FONTENCODING_DEFAULT,
hints=0) : liste les renseignements de toutes les fontes. Retourne un tableau
d'i=objets 'FXFontDesc'
Méthode d'instance publique :
fontMono?() : retourne 'true' si la fonte est non proportionnelle.
hasChar?(ch) : retourne 'true' si la fonte a un glyphe pour 'ch'.
leftBearing(ch) : retourne la distance de l'origine au pixel le plus à gauche du
caractère 'ch'.
rightBearing(ch) : retourne la distance de l'origine au pixel le plus à droite du
caractère 'ch'.
getTextWidth(text) : retourne la largeur du texte dans cette fonte.
getTextHeight(text) : retourne la hauteur du texte dans cette fonte.
FXFrame
Le cadre de base.
Ancêtre :
FXWindow.
Déclaration :
FXFrame.new(parent, opts=FRAME_NORMAL, x=0, y=0, width=0, height=0,
padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD, padTop=DEFAULT_PAD,
padBottom=DEFAULT_PAD) {|theFrame| ...}
Les constantes prédéfinies :
DEFAULT_PAD : passe-partout par défaut.
Les attributs :
baseColor
[RW] : couleur GUI de base [FXColor]
borderColor [RW] : couleur du bord [FXColor]
borderWidth
[R] : largeur du bord en pixels [Integer]
frameStyle
[RW] : style de cadre [Integer]
hiliteColor [RW] : couleur de surbrillance [FXColor]
padBottom [RW] : intérieur bas du passe-partout en pixels [Integer]
padLeft
[RW] : intérieur gauche du passe-partout en pixels
[Integer]
padRight [RW] : intérieur droit du passe-partout en pixels [Integer]
padTop [RW] : intérieur haut du passe-partout en pixels [Integer]
shadowColor [RW] : couleur de l'ombre [FXColor]
Les événements :
Pas de messages, les cadres étant inactifs.
(Hum !, elle ne va pas plaire à tout le monde celle là !)
FXGroupBox
Les boîtes de groupes.
Ancêtre :
FXPacker.
Déclaration :
FXGroupBox.new(parent, text, opts=GROUPBOX_NORMAL, x=0, y=0, width=0, height=0,
padLeft=DEFAULT_SPACING,padRight=DEFAULT_SPACING, padTop=DEFAULT_SPACING,
padBottom=DEFAULT_SPACING,
hSpacing=DEFAULT_SPACING, vSpacing=DEFAULT_SPACING) {|theGroupBox|
...}
Les constantes prédéfinies :
GROUPBOX_TITLE_LEFT : titre justifié à gauche.
GROUPBOX_TITLE_CENTER : titre centré.
GROUPBOX_TITLE_RIGHT : titre justifié à droite.
GROUPBOX_NORMAL : comme GROUPBOX_TITLE_LEFT (!???)
Les attributs :
font [RW] : fonte de titre [FXFont]
groupBoxStyle
[RW] : style de la boîte [Integer]
text
[RW] : texte du titre [String]
textColor
[RW] : couleur du texte de titre. [FXColor]
FXHorizontalFrame
Le composant cadre horizontal est utilisé pour
placer automatiquement les fenêtres enfants horizontalement de gauche à droite
ou de droite à gauche en fonction des renseignements sur l'apparence des
composants enfants.
Ancêtre :
FXPacker.
Déclaration :
FXHorizontalFrame.new(parent, opts=0, x=0, y=0, width=0, height=0,
padLeft=DEFAULT_SPACING,
padRight=DEFAULT_SPACING, padTop=DEFAULT_SPACING, padBottom=DEFAULT_SPACING,
hSpacing=DEFAULT_SPACING, vSpacing=DEFAULT_SPACING) {|theHorizontalFrame|...}
FXIcon
Classe descendant de FXImage.
Ancêtre :
FXImage.
Déclaration :
FXIcon.
new(app, pixels=nil, transparentColor=0, options=0,
width=1, height=1) {|theIcon| ...}
Crée une icône avec un tampon initial en pixels
('pixels'), une couleur transparente ('transparentColor') et des options
('options') comme dans FXImage.
Les attributs :
transparentColor [RW] : couleur de transparence [FXColor]
FXxxxIcon
Sous ce vocable sont réunis les composants
FXBMPIcon, FXGIFIcon etc…
Ancêtre :
FXIcon.
Déclaration :
FXxxxIcon.new(app, pixels=nil, opts=0, width=1, height=1) {|theIcon| ...}
La déclaration est la même pour tous les
formats : BMP, GIF, ICO, JPG, PCX, PNG,TIF, TGA, XPM.
Seul le format JPG possède une propriété :
quality [RW] : qualité de l'image, c'est à dire le degré de compression.
FXIconList
Composant liste d'icônes.
Ancêtre :
FXScrollArea.
Déclaration :
FXIconList.new(parent, target=nil, selector=0, opts=ICONLIST_NORMAL, x=0, y=0,
width=0, height=0) {|theIconList| ...}
Les constantes prédéfinies :
Pour le style
ICONLIST_EXTENDEDSELECT : mode sélection étendue.
ICONLIST_SINGLESELECT : un seul item sélectionné, sur clic souris.
ICONLIST_BROWSESELECT : toujours un seul item sélectionné, mais la sélection suit le curseur
souris.
ICONLIST_MULTIPLESELECT : mode multi-sélection.
ICONLIST_AUTOSIZE : espace entre items automatique.
ICONLIST_DETAILED : mode liste détaillée.
ICONLIST_MINI_ICONS : mode mini icônes.
ICONLIST_BIG_ICONS : mode grande icônes.
ICONLIST_ROWS : mode ligne.
ICONLIST_COLUMNS : mode colonne.
ICONLIST_NORMAL : identique à ICONLIST_EXTENDEDSELECT
Identifiants de messages :
ID_SHOW_DETAILS : x
ID_SHOW_MINI_ICONS : x
ID_SHOW_BIG_ICONS : x
ID_ARRANGE_BY_ROWS : x
ID_ARRANGE_BY_COLUMNS : x
ID_HEADER_CHANGE : x
ID_TIPTIMER : x
ID_LOOKUPTIMER : x
ID_SELECT_ALL : x
ID_DESELECT_ALL : x
ID_SELECT_INVERSE : x
Les attributs :
anchorItem [RW] : index de l'item d'ancrage, ou '-1' s'il n'y en a pas [Integer]
currentItem [RW] : index de l'item courant, ou '-1' s'il n'y en a pas [Integer]
cursorItem [R] : index de l'item sous le curseur, ou '-1' s'il n'y en a pas
[Integer]
font [RW] : fonte du texte [FXFont]
header [R] : le contrôle d'en-tête [FXHeader]
helpText [RW] : texte d'aide de la ligne de statut. [String]
itemHeight [R] : hauteur des items [Integer]
itemSpace
[RW] : espace maximum (en pixels) pour chaque item
[Integer]
itemWidth [R] : largeur de l'item [Integer]
listStyle [RW] : style de la liste [Integer]
numCols [R] : nombre de colonnes [Integer]
numHeaders [R] : nombre d'items d'en-tête dans le contôle d'en-tête [Integer]
numItems [R] : nombre d'items [Integer]
numRows [R] : nombre de lignes [Integer]
selBackColor [RW] : couleur de fond des items sélectionnés [FXColor]
selTextColor [RW] : couleur du texte des items sélectionnés [FXColor]
textColor [RW] : couleur normale du texte [FXColor]
Les méthodes :
appendHeader(text,
icon=nil, size=1) : ajoute un en-tête avec un
texte 'text', une icône 'icon'.
removeHeader(headerIndex)
: enlève l'en-tête située à 'headerIndex'. Produit une
erreur 'IndexError' si l'index est hors limites.
setHeaderText(headerIndex,
text) : change le texte de l'en-tête situé à 'headerIndex' par 'text'. Produit une erreur
'IndexError' si l'index est hors limites.
getHeaderText(headerIndex)
: retourne le texte de l'en-tête situé à l'index
'headerIndex'. Produit une erreur 'IndexError' si l'index est hors limites.
setHeaderIcon(headerIndex,
icon) : change l'icône de l'en-tête situé à l'index
'headerIndex'. Produit une erreur 'IndexError' si l'index est hors limites.
getHeaderIcon(headerIndex)
: retourne l'icône de l'en-tête situé à l'index
'headerIndex'. Produit une erreur 'IndexError' si l'index est hors limites.
setHeaderSize(headerIndex,
size) : change la taille de l'en-tête situé à l'index
'headerIndex'. Produit une erreur 'IndexError' si l'index est hors limites.
getHeaderSize(headerIndex)
: retourne la taille de l'en-tête situé à l'index
'headerIndex'. Produit une erreur 'IndexError' si l'index est hors limites.
retrieveItem(itemIndex)
: retourne l'item situé à l'index 'itemIndex'. Produit
une erreur 'IndexError' si l'index est hors limites.
replaceItem(index,
item, notify=false) : remplace l'item situé à
l'index 'index' par l'item 'item'. Si 'notify' est à 'true' un message
SEL_REPLACED est envoyé à la cible de la liste avant le remplacement de l'item.
Produit une erreur 'IndexError' si l'index est hors limites
replaceItem(index,
text, bigIcon=nil, miniIcon=nil, data=nil, notify=false) : remplace l'item situé à l'index 'index' par de nouveaux texte, grande icône, mini icône, et données. Si
'notify' est à 'true' un message SEL_REPLACED est envoyé à la cible de la liste
avant le remplacement de l'item. Produit une erreur 'IndexError' si l'index est
hors limites
insertItem(index,
item, notify=false) : insère un nouvel item à
l'index 'index'. Si 'notify' est à 'true' un message SEL_INSERTED est envoyé à
la cible de la liste après l'insertion de l'item. Produit une erreur
'IndexError' si l'index est hors limites
insertItem(index,
text, bigIcon=nil, miniIcon=nil, data=nil, notify=false) : insère un nouvel item à l'index 'index' par de nouveaux texte, grande
icône, mini icône, et données. Si 'notify' est à 'true' un message SEL_INSERTED
est envoyé à la cible de la liste après l'insertion de l'item. Produit une
erreur 'IndexError' si l'index est hors limites
appendItem(item,
notify=false) : ajoute un nouvel item à la fin de la liste.
Si 'notify' est à 'true' un message SEL_INSERTED est envoyé à la cible de la
liste après l'ajout de l'item.
appendItem(text,
bigIcon=nil, miniIcon=nil, data=nil, notify=false) :
ajoute un nouvel item à la fin de la liste avec texte, grande icône, mini icône et données . Si 'notify' est à
'true' un message SEL_INSERTED est envoyé à la cible de la liste après l'ajout
de l'item
prependItem(item,
notify=false) : ajoute l'item 'item' au début de la liste. Si
'notify' est à 'true' un message SEL_INSERTED est envoyé à la cible de la liste
après l'ajout de l'item.
prependItem(text,
bigIcon=nil, miniIcon=nil, data=nil, notify=false) :
ajoute un item de texte, grande icône, mini icône et données au début de la
liste. Si 'notify' est à 'true' un message SEL_INSERTED est envoyé à la cible
de la liste après l'ajout de l'item.
removeItem(index,
notify=false) : supprime l'item situé à l'index 'index'. Si
'notify' est à 'true' un message SEL_DELETED est envoyé à la cible de la liste
avant la suppression de l'item. Produit une erreur 'IndexError' si l'index est
hors limites
clearItems(notify=false)
: supprime tous les items de la liste. Si 'notify' est
à 'true' un message SEL_DELETED est envoyé à la cible de la liste avant la
suppression de chaque item.
itemAt(x,
y) : retourne l'index de l'item situé aux coordonnées
(x,y) ou '-1' s'il n'y en a pas.
findItem(text,
start=-1, flags=SEARCH_FORWARD|SEARCH_WRAP) :
cherche un item par nom 'text', en débutant à la position 'start'; l'argument
'flags' indique le sens de la recherche et la sensibilité à la casse.
makeItemVisible(index)
: défile pour rendre l'item, situé à 'index', visible.
Produit une erreur 'IndexError' si l'index est hors limites
setItemText(index,
text) : change le texte de l'item situé à 'index' par
le texte 'text'. Produit une erreur 'IndexError' si l'index est hors limites
getItemText(index)
: retourne le texte de l'item situé à 'index'. Produit
une erreur 'IndexError' si l'index est hors limites.
setItemBigIcon(index,
bigIcon) : change la grande icône de l'item situé à
'index' par 'bigIcon'. Produit une erreur 'IndexError' si l'index est hors limites
getItemBigIcon(index)
: retourne la grande icône de l'item situé à 'index'.
Produit une erreur 'IndexError' si l'index est hors limites
setItemMiniIcon(index,
miniIcon) : change la mini icône de l'item situé à
'index' par 'bigIcon'. Produit une erreur 'IndexError' si l'index est hors
limites
getItemMiniIcon(index)
: retourne la mini icône de l'item situé à 'index'.
Produit une erreur 'IndexError' si l'index est hors limites
setItemData(index,
data) : change les données de l'item situé à 'index'
par 'data'. Produit une erreur 'IndexError' si l'index est hors limites
getItemData(index)
: retourne les données de l'item situé à 'index'.
Produit une erreur 'IndexError' si l'index est hors limites
itemSelected?(index)
: retourne 'true' si l'item situé à 'index' est
sélectionné. Produit une erreur 'IndexError' si l'index est hors limites.
itemCurrent?(index)
: retourne 'true' si l'item situé à 'index' est l'item
courant. Produit une erreur 'IndexError' si l'index est hors limites
itemVisible?(index)
: retourne 'true' si l'item situé à 'index' est
visible. Produit une erreur 'IndexError' si l'index est hors limites
itemEnabled?(index)
: retourne 'true' si l'item situé à 'index' est
activé. Produit une erreur 'IndexError' si l'index est hors limites
hitItem(index,
x, y, ww=1, hh=1) : retourne le code de clic
pour 'index' : 0 en dehors, 1 icône, 2 texte. Produit un 'IndexError' si
'index' est hors limites.
updateItem(index)
: repeint l'item situé à 'index'. Produit une erreur
'IndexError' si l'index est hors limites.
selectInRectangle(x,
y, w, h, notify=false) : sélectionne l'item situé
dans le rectangle déterminé par 'x,y,w,h'. Si 'notify' est à 'true', un message
SEL_SELECTED est envoyé à la cible de la liste après que chaque item
précédemment non sélectionné soit sélectionné.
enableItem(index)
: active l'item situé à 'index'. Produit une erreur
'IndexError' si l'index est hors limites.
disableItem(index)
: désactive l'item situé à 'index'. Produit une erreur
'IndexError' si l'index est hors limites.
selectItem(index,
notify=false) : sélectionne l'item situé à 'index'. . Si
'notify' est à 'true', un message SEL_SELECTED est envoyé à la cible de la
liste après la sélection. Produit une erreur 'IndexError' si l'index est hors
limites.
deselectItem(index,
notify=false) : désélectionne l'item situé à 'index'. . Si
'notify' est à 'true', un message SEL_DESELECTED est envoyé à la cible de la
liste après la désélection. Produit une erreur 'IndexError' si l'index est hors
limites.
toggleItem(index,
notify=false) : bascule l'item situé à 'index'. Si 'notify'
est à 'true', un message SEL_SELECTED ou SEL_DESELECTED est envoyé à la cible
de la liste pour indiqué le nouvel état. Produit une erreur 'IndexError' si
l'index est hors limites.
setCurrentItem(index,
notify=false) : change l'index de l'item courant par 'index'.
Si 'notify' est à 'true', un message SEL_CHANGED est envoyé à la cible de la
liste après le changement. Produit une erreur 'IndexError' si l'index est hors
limites.
extendSelection(index,
notify=false) : étend la sélection de l'index du point
d'ancrage à 'index'. Si 'notify' est à 'true', une série de messages
SEL_SELECTED et SEL_DESELECTED est envoyée à la cible de la liste au changement
d'état. Produit une erreur 'IndexError' si l'index est hors limites
killSelection(notify=false)
: désélectionne tous les items. Si 'notify' est à
'true' un message SEL_DESELECTED est envoyé à la cible de la liste pour tous
les items qui étaient sélectionnés.
sortItems()
: tri les items.
each()
{|anIconItem| ...} : l'itérateur. Appelle le
bloc pour chaque item de la liste, passant une référence de cet item comme
paramètre.
Les
messages :
Les messages suivants sont envoyés par
FXIconList à ses cibles :
SEL_CHANGED : envoyé lors du changement de l'item courant; la donnée du message est
un entier représentant l'index de l'item.
SEL_COMMAND : envoyé lors du changement de l'item courant; la donnée du message est
un entier représentant l'index de l'item.
SEL_KEYPRESS : envoyé lors de l'appui sur une touche; la donnée du message est une instance
de FXEvent.
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche; la donnée du message est une
instance de FXEvent.
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui du bouton gauche de la souris; la donnée du
message est une instance de FXEvent.
SEL_LEFTBUTTONRELEASE : envoyé lors du relâchement du bouton gauche de la souris; la donnée
du message est une instance de FXEvent
SEL_RIGHTBUTTONPRESS : envoyé lors de l'appui du bouton droit de la souris; la donnée du
message est une instance de FXEvent.
SEL_RIGHTBUTTONRELEASE : envoyé lors du relâchement du bouton droit de la souris; la donnée du
message est une instance de FXEvent
SEL_CLICKED : envoyé lors d'un clic simple d'un item; la donnée du message est un
entier indiquant l'index de l'item courant.
SEL_DOUBLECLICKED : envoyé lors d'un double clic d'un item; la donnée du message est un
entier indiquant l'index de l'item courant
SEL_TRIPLECLICKED : envoyé lors d'un triple clic d'un item; la donnée du message est un
entier indiquant l'index de l'item courant
SEL_SELECTED : envoyé lors de la sélection d'un item; la donnée du message est un
entier indiquant l'index de l'item sélectionné.
SEL_DESELECTED : envoyé lors de la désélection d'un item; la donnée du message est un
entier indiquant l'index de l'item désélectionné
SEL_REPLACED : envoyé lorsqu'un item est sur le point d'être remplaçé; la donnée du
message est un entier indiquant l'index de l'item à remplacer.
SEL_INSERTED : envoyé après l'insertion d'un item; la donnée du message est un
entier indiquant l'index de l'item inséré.
SEL_DELETED : envoyé lorsqu'un item est sur le point d'être supprimer; la donnée du
message est un entier indiquant l'index de l'item à supprimer.
FXImage
Classe image.
Ancêtre :
FXDrawable.
Déclaration :
FXImage.
new(app, pixels=nil, options=0, width=1, height=1)
{|theImage| ...}
Les constantes prédéfinies :
Renseignements sur l'aspect de l'image :
IMAGE_KEEP : Keep pixel data in client
IMAGE_OWNED : Pixel
data is owned by image
IMAGE_DITHER : image par juxtaposition
(dithering) pour un meilleur rendu.
IMAGE_NEAREST : suppression de la
juxtaposition au profit de la couleur la plus proche.
IMAGE_ALPHA : les données ont un canal
alpha.
IMAGE_OPAQUE : force à un fond opaque.
IMAGE_ALPHACOLOR : surcharge les
couleurs transparentes.
IMAGE_SHMI : Using
shared memory image
IMAGE_SHMP : Using
shared memory pixmap
IMAGE_ALPHAGUESS : Guess transparency color from corners
Les attributs :
channels [R] : nombre de canaux (3 pour RGB, 4 pour RGBA) [Integer]
data [R] : données des pixels [FXMemoryBuffer]
options [RW] : Option flags [Integer]
Les méthodes :
getPixel(x,
y) : renvoie le pixel de coordonnées (x,y).
setPixel(x,
y, color) : colorie le pixel de coordonnées (x,y) avec
la couleur 'color'.
restore()
: restitue le tampon de pixels à partir de l'image.
render()
: fournit l'image à partir du tampon de pixel.
scale(width,
height) : redimensionne l'image avec la largeur et la
hauteur spécifiés.
mirror(horizontal,
vertical) : effectue une symétrie horizontale et /ou verticale.
rotate(degrees) : Effectue une rotation de
l'image de 'degrees' degrés. (sens anti-horaire)
crop(x,
y, width, height) : recadre l'image suivant le rectangle donné.
savePixels(stream) : sauvegarde les pixels dans un
flux 'stream'.
loadPixels(stream) : charge les pixels çà partir
d'un flux 'stream'.
FXImageView
Le composant
FXImageView affiche une image avec ascenseur éventuel.
Ancêtre :
FXScrollArea.
Déclaration :
FXImageView.
new(p, img=nil, tgt=nil, sel=0, opts=0, x=0, y=0, w=0,
h=0) {|theImageView| ...}
Les attributs :
image [RW] : l'image [FXImage]
Les messages :
SEL_RIGHTBUTTONPRESS : envoyé lors de l'appui du bouton droit de la souris, le message est
une instance FXEvent.
SEL_RIGHTBUTTONRELEASE : envoyé lors du relâchement du bouton droit de la souris. Le message
est une instance FXEvent.
Pour les identifiants de message :
ID_XYZ : x
FXxxxImage
Sous ce vocable sont réunis les composants
FXBMPImage, FXGIFImage etc…
Ancêtre :
FXImage.
Déclaration :
FXxxxImage.new(app, pixels=nil, opts=0, width=1, height=1) {|theImage| ...}
La déclaration est la même pour tous les
formats : BMP, GIF, ICO, JPG, PCX, PNG,TIF, TGA, XPM.
Seul le format JPG possède une propriété :
quality [RW] : qualité de l'image, c'est à dire le degré de compression.
FXInputDialog
Un composant FXInputDialog est un simple
dialogue utilisé pour obtenir un texte, ou un nombre réel de la part de
l'utilisateur. Un mode "mot de passe" permet de cacher l'entrée du
clavier.
Ancêtre :
FXDialogBox.
Déclaration :
FXInputDialog.new(owner, caption, label, ic=nil, opts=INPUTDIALOG_STRING, x=0, y=0, w=0,
h=0) {|theInputDialog| ...}
Construit une boîte de dialogue avec le titre
'caption', l'icône 'ic', et le curseur texte en 'opts'.
Les constantes prédéfinies :
INPUTDIALOG_STRING : attend une chaîne.
INPUTDIALOG_INTEGER : attend un nombre entier.
INPUTDIALOG_REAL : attend un nombre réel.
INPUTDIALOG_PASSWORD : mot de passe; cache la frappe.
Les méthodes :
getString(initial, owner, caption, label, ic=nil) : attend une chaîne avec le texte
spécifié par défaut en 'initial'.
Retourne la valeur entrée si l'utilisateur clique sur 'OK', sinon retourne
'nil' .
getInteger(initial, owner, caption, label, ic=nil, lo=1, hi=0) : Attend un nombre entier, avec le nombre
spécifié par défaut en 'initial'. Retourne la valeur entrée si l'utilisateur
clique sur 'OK', sinon retourne 'nil'. L'entrée doit être comprise entre 'lo'
et 'hi' (mini et maxi), à moins que 'lo' > 'hi', auquel cas l'entrée
peut-être n'importe quel nombre.
getReal(initial, owner, caption, label, ic=nil, lo=1.0, hi=0.0) : Attend un
nombre réel, avec le nombre spécifié par défaut en 'initial'. Retourne la
valeur entrée si l'utilisateur clique sur 'OK', sinon retourne 'nil'. L'entrée
doit être comprise entre 'lo' et 'hi' (mini et maxi), à moins que 'lo' >
'hi', auquel cas l'entrée peut-être n'importe quel nombre.
Méthodes d'instance publique :
setLimits(lo, hi) : change les limites ('lo' et 'hi' sont des nombres).
getLimits() : retourne les limites (un tableau à deux éléments de flottants)
FXLabel
Un composant FXLabel (étiquette) est utilisé pour placer un texte et/ou une icône
explicatif. Le texte peut avoir une aide optionnelle.
Ancêtre : FXFrame.
Déclaration :
FXLabel.new(parent, text, icon=nil, opts=LABEL_NORMAL, x=0, y=0, width=0, height=0,
padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD, padTop=DEFAULT_PAD,
padBottom=DEFAULT_PAD) {|theLabel| ...}
Les constantes prédéfinies :
Pour la justification du texte du label :
JUSTIFY_NORMAL : par défaut le texte est centré
JUSTIFY_CENTER_X : texte centré horizontalement
JUSTIFY_LEFT : texte justifié à gauche
JUSTIFY_RIGHT : texte justifié à droite
JUSTIFY_HZ_APART : combinaison de JUSTIFY_LEFT & JUSTIFY_RIGHT
JUSTIFY_CENTER_Y : texte centré verticalement
JUSTIFY_TOP : texte aligné avec le haut du composant label.
JUSTIFY_BOTTOM : texte aligné avec le bas du composant label.
JUSTIFY_VT_APART : combinaison de JUSTIFY_TOP & JUSTIFY_BOTTOM
Pour la relation entre l'icône éventuelle et le
texte :
ICON_UNDER_TEXT : icône sous le texte.
ICON_AFTER_TEXT : icône après le texte.
ICON_BEFORE_TEXT : icône avant le texte.
ICON_ABOVE_TEXT : icône au dessus du texte.
ICON_BELOW_TEXT : icône au dessous du texte.
TEXT_OVER_ICON : identique à ICON_UNDER_TEXT
TEXT_AFTER_ICON : identique à ICON_BEFORE_TEXT
TEXT_BEFORE_ICON : identique à ICON_AFTER_TEXT
TEXT_ABOVE_ICON : identique à ICON_BELOW_TEXT
TEXT_BELOW_ICON : identique à ICON_ABOVE_TEXT
Manière normale de voir un label :
LABEL_NORMAL : identique à JUSTIFY_NORMAL|ICON_BEFORE_TEXT
Les attributs :
font
[RW] : fonte du texte [FXFont]
helpText
[RW] : texte d'aide sur la ligne de statut.
icon [RW]
: icône du label [FXIcon]
iconPosition [RW]
: position de l'icône [Integer]
justify
[RW] : mode de justification du texte [Integer]
text [RW] : texte du label [String]
textColor [RW]
: couleur du texte [FXColor]
tipText [RW]
: message info-bulle [String]
FXList
Composant liste.
Ancêtre :
FXScrollArea.
Déclaration :
FXList.new(parent, numVisible, target=nil, selector=0, opts=LIST_NORMAL, x=0, y=0,
width=0, height=0) {|theList| ...}
Construit une liste avec 'numVisible' items
visibles; la liste est initialement vide.
Les constantes prédéfinies :
Pour le style :
LIST_EXTENDEDSELECT : mode sélection étendue. Permet la sélection d'une rangée d'items.
LIST_SINGLESELECT : mode sélection
simple. Permet la sélection d'un seul item.
LIST_BROWSESELECT : une sélection
unique suit le curseur souris.
LIST_MULTIPLESELECT : mode sélection multiple. Permet la sélection d'items non contigus.
LIST_AUTOSELECT :
sélection automatique sous le curseur.
LIST_NORMAL : identique à
LIST_EXTENDEDSELECT.
Identifiants de messages :
ID_TIPTIMER::
ID_LOOKUPTIMER::
Les attributs :
anchorItem [R]
: index de l'item d'ancrage, ou '-1' s'il n'y en a pas [Integer]
currentItem
[RW] : index de l'item courant, ou '-1' s'il n'y en a pas [Integer]
cursorItem [R]
: index de l'item situé sous le curseur souris, ou '-1' s'il n'y en a pas
[Integer]
font
[RW] : fonte du texte [FXFont]
helpText [RW] : texte d'aide de la
ligne de statut [String]
listStyle
[RW] : style de la liste [Integer]
numItems [R]
: nombre d'items dans la liste [Integer]
numVisible
[RW] : nombre d'items visibles [Integer]
selBackColor
[RW] : couleur de fond du texte sélectionné [FXColor]
selTextColor
[RW] : couleur du texte sélectionné [FXColor]
textColor
[RW] : couleur normale du texte [FXColor]
Les méthodes :
retrieveItem(index)
: retourne l'item de l'index 'index'; retourne une
référence à une instance de FXListItem. Renvoie un IndexError si 'index' est
hors limites.
replaceItem(index,
item, notify=false) : remplace l'item situé à
l'index 'index' par 'item' . Si
'notify' est à 'true', un message 'SEL_REPLACED' est envoyé à la liste avant
que l'item soit remplacé. Renvoie un IndexError si 'index' est hors limites.
replaceItem(index,
text, icon=nil, data=nil, notify=false) : remplace
le texte, l'icône et les données de l'item situé à l'index 'index' par les
valeurs de 'text', 'icon' et 'data'. Si 'notify' est à 'true', un message
'SEL_REPLACED' est envoyé à la liste avant que l'item soit remplacé. Renvoie un
IndexError si 'index' est hors limites.
insertItem(index,
item, notify=false) : insère un nouvel item
'item' à l'index 'index'. Si 'notify' est à 'true', un message 'SEL_REPLACED' est
envoyé à la liste avant que l'item soit remplacé. Renvoie un IndexError si
'index' est hors limites.
insertItem(index,
text, icon=nil, data=nil, notify=false) : insère
un item situé à 'index' de 'text', 'icon' et 'data' donnés. Si 'notify' est à
'true', un message 'SEL_REPLACED' est envoyé à la liste avant que l'item soit
remplacé. Renvoie un IndexError si 'index' est hors limites.
appendItem(item,
notify=false) : ajoute un item à la liste. Si 'notify' est à 'true', un message 'SEL_REPLACED'
est envoyé à la liste avant que l'item soit remplacé.
appendItem(text,
icon=nil, data=nil, notify=false) : ajoute
un nouvel item avec les 'text' et les optionnels ''icon' et 'data'. Si 'notify'
est à 'true', un message 'SEL_REPLACED' est envoyé à la liste avant que l'item
soit remplacé.
prependItem(item,
notify=false) : ajoute un item au début de la liste . Si 'notify' est à 'true', un message 'SEL_REPLACED'
est envoyé à la liste avant que l'item soit remplacé.
prependItem(text,
icon=nil, data=nil, notify=false) : ajoute un nouvel
item au début de la liste avec les 'text' et les optionnels ''icon' et 'data'.
Si 'notify' est à 'true', un message 'SEL_REPLACED' est envoyé à la liste avant
que l'item soit remplacé.
removeItem(index,
notify=false) : enlève l'item situé à 'index'. Si 'notify' est
à 'true', un message 'SEL_DELETED' est envoyé à la liste avant que l'item soit
enlevé. Renvoie un IndexError si 'index' est hors limites.
clearItems(notify=false)
: enlève tous les items de la liste. Si 'notify' est à
'true', un message 'SEL_DELETED' est envoyé à la liste avant que chaque item
soit enlevé
getItemWidth(index)
: retourne la largeur de l'item situé à 'index'.
Renvoie un IndexError si 'index' est hors limites.
getItemHeight(index)
: retourne la hauteur de l'item situé à 'index'.
Renvoie un IndexError si 'index' est hors limites.
getItemAt(x,
y) : retourne l'index de l'item situé en (x,y), s'il
existe.
hitItem(index,
x, y) : retourne le code de clic de l'item d'index
'index' : 0 pas de clic, 1 sur l'icône, 2 sur le texte.
findItem(text,
start=-1, flags=SEARCH_FORWARD|SEARCH_WRAP) :
recherche les items par nom à partir de l'item 'start' : les arguments 'flags'
indique la direction de recherche et la sensibilité à la casse.
makeItemVisible(index)
: fait défiler pour rendre visible l'item situé à
'index'. Renvoie un IndexError si 'index' est hors limites.
setItemText(index,
text) : change le texte 'text' de l'item situé à
'index'. Renvoie un IndexError si 'index' est hors limites.
getItemText(index)
: retourne le texte de l'item situé à 'index'.
setItemIcon(index,
icon) : change l'icône de l'item situé à 'index'.
Renvoie un 'IndexError' si 'index' est hors limites.
getItemIcon(index)
: renvoie l'icône, si elle existe, de l'item situé à
'index'. Renvoie un 'IndexError' si 'index' est hors limites.
setItemData(index,
data) : change les données utilisateurs de l'item
situé à 'index'. Renvoie un 'IndexError' si 'index' est hors limites.
getItemData(index)
: retourne les données utilisateurs de l'item situé à
'index'. Renvoie un 'IndexError' si 'index' est hors limites.
itemSelected?(index)
: retourne 'true' si l'item situé à 'index' est
sélectionné. Renvoie un 'IndexError' si 'index' est hors limites.
itemCurrent?(index)
: retourne 'true' si l'item situé à 'index' est l'item
courant. Renvoie un 'IndexError' si 'index' est hors limites.
itemVisible?(index)
: retourne 'true' si l'item situé à 'index' est
visible. Renvoie un 'IndexError' si 'index' est hors limites.
itemEnabled?(index)
: retourne 'true' si l'item situé à 'index' est valide.
Renvoie un 'IndexError' si 'index' est hors limites
updateItem(index)
: repeint l'item situé à 'index'. Renvoie un
'IndexError' si 'index' est hors limites
enableItem(index)
: rend l'item situé à 'index' valide. Renvoie un
'IndexError' si 'index' est hors limites
disableItem(index)
: invalide l'item situé à 'index'. Renvoie un
'IndexError' si 'index' est hors limites
selectItem(index,
notify=false) :
sélectionne l'item situé à 'index'. Si 'notify' est 'true', un message
SEL_SELECTED est envoyé à la liste après que l'item a été sélectionné. Renvoie
un 'IndexError' si 'index' est hors limites
deselectItem(index,
notify=false) : désélectionne l'item situé à 'index'. Si
'notify' est 'true', un message SEL_DESELECTED est envoyé à la liste après que
l'item a été désélectionné. Renvoie un 'IndexError' si 'index' est hors limites
toggleItem(index,
notify=false) : bascule l'état de sélection de l'item situé à
'index'. Si 'notify' est 'true', un message SEL_SELECTED or SEL_DESELECTED est
envoyé à la liste pour indiquer le nouvel état. Renvoie un 'IndexError' si
'index' est hors limites
setCurrentItem(index,
notify=false) : change d'item courant. Si 'notify' est
'true', un message SEL_CHANGED est envoyé à la liste après le changement.
Renvoie un 'IndexError' si 'index' est hors limites
extendSelection(index,
notify=false) : étend la sélection du point d'ancrage à
l'item situé à 'index'. Si 'notify' est 'true', une série de messages SEL_SELECTED et SEL_DESELECTED est envoyée à
la liste quand l'état des items change. Renvoie un 'IndexError' si 'index' est
hors limites
killSelection(notify=false)
: déselectionne tout les items. Si 'notify' est
'true', un message SEL_DESELECTED est envoyé à la liste pour chaque item
sélectionné avant l'appel de killSelection.
sortItems()
: tri les items en utilisant la fonction de tri en
cours.
each()
{|aListItem| ...} : itérateur. Appelle le bloc
pour chaque item de la liste passant une référence de cet item comme un
paramètre.
Les évènements :
Les évènements suivants sont envoyés par FXList
à ses cibles :
SEL_CHANGED : envoyé quand l'item de la liste change. La donnée du message est un
entier représentant l'index de l'item courant.
SEL_COMMAND : envoyé quand l'item de la liste change. La donnée du message est un
entier représentant l'index de l'item courant.
SEL_KEYPRESS : envoyé lors de l'appui d'une touche; le message est une instance de
FXEvent.
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche; le message est une instance
de FXEvent.
SEL_LEFTBUTTONPRESS : envoyé lorsque le bouton gauche de la souris est pressé. le message
est une instance de FXEvent.
SEL_LEFTBUTTONRELEASE : envoyé lors du relâchement du bouton gauche de la souris. le message
est une instance de FXEvent.
SEL_RIGHTBUTTONPRESS : envoyé lors de l'appui du bouton droit de la souris. le message est
une instance de FXEvent.
SEL_RIGHTBUTTONRELEASE : envoyé lors du relâchement du bouton droit de la souris. le message
est une instance de FXEvent.
SEL_CLICKED : envoyé lorsqu'un item de la liste est cliqué un fois. Le message est
un 'integer' représentant l'index de l'item courant.
SEL_DOUBLECLICKED : envoyé lors d'un double clic sur un item de la liste. Le message est
un 'integer' représentant l'index de l'item courant.
SEL_TRIPLECLICKED : envoyé lors d'un triple clic sur un item de la liste. Le message est
un 'integer' représentant l'index de l'item courant.
SEL_SELECTED : envoyé lorsqu' un item de la liste est sélectionné. Le message est un
'integer' représentant l'index de l'item courant.
SEL_DESELECTED : envoyé lorsqu'un item de la liste est désélectionné. Le message est
un 'integer' représentant l'index de l'item courant.
SEL_REPLACED : envoyé lorsqu'un item est près d'être remplacé. Le message est un
'integer' représentant l'index de l'item à remplacer.
SEL_INSERTED : envoyé après l'insertion d'un item; Le message est un 'integer'
représentant l'index de l'item inséré.
SEL_DELETED :envoyé lorsqu'un iteest près d'être supprimé; Le message est un
'integer' représentant l'index de l'item à enlever.
FXListBox
Composant visuel boîte de liste.
Ancêtre :
FXPacker.
Module 'enumerable' inclus.
Déclaration :
FXListBox.new(p, nvis, tgt=nil, sel=0, opts=FRAME_SUNKEN|FRAME_THICK|LISTBOX_NORMAL,
x=0, y=0, w=0, h=0,
pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD)
{|theListBox| ...}
Les constantes prédéfinies :
Pour l'apparence :
LISTBOX_NORMAL : style normal.
Identifiants de message :
ID_LIST
ID_FIELD
Les attributs :
backColor [R] : couleur du fond [FXColor]
currentItem [RW] : index de l'item courant,
ou -1 s'il n'y en a pas [Integer]
font [RW] : police du texte [FXFont]
helpText
[RW] : texte
d'aide de la ligne de statut [String]
numItems [R] : nombre d'items dans la liste [Integer]
numVisible [RW] : nombre d'items visibles [Integer]
selBackColor [RW] : couleur de fond pour
l'item sélectionné [FXColor]
selTextColor [RW] : couleur du texte pour
l'item sélectionné [FXColor]
textColor
[RW] : couleur
du texte [FXColor]
tipText [RW] : texte du message info-bulle [String]
Les méthodes :
itemCurrent?(index) : retourne 'true' si 'index'
est l'index de l'item courant. Provoque un 'IndexError' si 'index' est hors
limite.
retrieveItem(index) : retourne le texte de l'item situé à 'index'. Provoque un 'IndexError'
si 'index' est hors limite.
replaceItem(index,
text, icon=nil, ptr=nil) : remplace l'item situé à l'index 'index' par un nouvel item de
texte 'text', d'icône 'icon' et de donnée 'ptr'. Provoque un 'IndexError' si
'index' est hors limite.
insertItem(index,
text, icon=nil, ptr=nil) : insère un nouvel item à
l'index 'index'. de texte 'text', d'icône 'icon' et de donnée 'ptr'. Provoque
un 'IndexError' si 'index' est hors limite.
appendItem(text,
icon=nil, ptr=nil) : ajoute un item à la fin
de la liste de texte 'text', d'icône 'icon' et de donnée 'ptr'.
prependItem(text,
icon=nil, ptr=nil) : ajoute un item au début
de la liste.
removeItem(index) : enlève l'item situé à l'index 'index'. Provoque un 'IndexError' si
'index' est hors limite.
clearItems() : supprime tous les items de la liste.
findItem(text,
start=-1, flags=SEARCH_FORWARD|SEARCH_WRAP) :
cherche un item par nom, la recherche démarrant à l'index 'start', 'flags'
indiquant la direction de recherche et la sensibilité à la casse.
setItemText(index,
text) :
impose le texte 'text' à l'item situé à l'index 'index'. Provoque un
'IndexError' si 'index' est hors limite.
getItemText(index) : retourne le texte de l'item situé à l'index 'index'. Provoque un
'IndexError' si 'index' est hors limite.
setItemIcon(index,
icon) : impose l'icône 'icon' à l'item situé à
l'index 'index'. Provoque un 'IndexError' si 'index' est hors limite.
getItemIcon(index) : retourne l'icône pour l'item situé à l'index 'index'. Provoque un
'IndexError' si 'index' est hors limite.
setItemData(index,
ptr) : l'objet de données est pointé par le
paramètre 'ptr' de l'item situé à l'index 'index'. Provoque un 'IndexError' si
'index' est hors limite.
getItemData(index)
: retourn
l'objet de données pour l'item situé à l'index 'index'. Provoque un
'IndexError' si 'index' est hors limite.
paneShown?()
: retourne 'true' si la sous-fenêtre est affichée.
sortItems() : tri les items en employant la fonction de tri en cours.
each()
{|getItemText(i), getItemIcon(i), getItemData(i)| ...} : itérateur.
Appelle le bloc pour chaque item de la liste, passant en paramètres le texte,
l'icône et les données.
Les événements :
Les messages suivants sont envoyés par
FXListBox à ses cibles :
SEL_COMMAND : envoyé quand un item est cliqué; la donnée du message est l'index de
l'item sélectionné.
SEL_CHANGED : envoyé quand un item est cliqué; la donnée du message est l'index de
l'item sélectionné.
FXListItem
Composant item de liste.
Ancêtre :
FXObject.
Déclaration :
FXListItem.new(text, icon=nil, data=nil) {|theListItem| ...}
Les attributs :
data [RW] : données pour cet item [Object]
draggable [W] : indique si cet item est dragable [Boolean]
enabled [W] : indique si cet item est valide [Boolean]
focus [W] : indique si cet item possède le focus [Boolean]
icon [RW] : icône pour cet item
[FXIcon]
iconOwned
[W] : indique
si cet item possède ses icônes [Boolean]
selected [W] : indique si cet item est sélectionné [Boolean]
text [RW] : texte de cet item [String]
Les méthodes :
hasFocus?()
: retourne 'true' si cet item a le focus.
selected?()
: retourne 'true' si cet item est sélectionné.
enabled?()
: retourne 'true' si cet item est valide.
draggable?()
: retourne 'true' si cet item est dragable
iconOwned?()
: retourne 'true' si propriétaire de l' icône.
getWidth(list)
: retourne la largeur de cet item pour une liste
spécifiée.
getHeight(list)
: retourne la hauteur de cet item pour une liste
spécifiée.
create()
: cré l'item.
detach()
: détache l'item.
destroy(
) : détruit l'item.
<=>(otherItem)
: comparaison.
FXMainWindow
Fenêtre principale de l'application.
Ancêtre :
FXTopWindow.
Déclaration :
FXMainWindow.new(app, title, icon=nil, miniIcon=nil, opts=DECOR_ALL, x=0, y=0, width=0,
height=0, padLeft=0, padRight=0, padTop=0, padBottom=0, hSpacing=4, vSpacing=4)
{|theMainWindow| ...}
Les événements :
SEL_CLOSE : envoyé quand l'utilisateur
clique sur le bouton de fermeture situé en haut et à droite de la fenêtre
principale.
FXMatrix
FXMatrix arrange automatiquement ses fenêtres
enfants en lignes et colonnes. Si le
style de la matrice est MATRIX_BY_ROWS, alors cette dernière aura le nombre de
lignes donné et le nombre de colonnes croîtra à chaque ajout d'une fenêtre
enfant; si le style est MATRIX_BY_COLUMNS, alors c'est le nombre de colonnes
qui est fixé et le nombre de lignes qui augmentera en fonction de l'apparition
de nouvelles fenêtres. Si tous les enfants d'une ligne (colonne) ont les
renseignements LAYOUT_FILL_ROW (LAYOUT_FILL_COLUMN), alors la ligne (colonne)
sera étirable si la matrice elle-même est redimensionnée. Si plus d'une ligne
(colonne) est étirable, l'espace libre est répari proportionnellement entre
chaque ligne(colonne). Il est tenu compte à l'intérieur de chaque cellule de la
matrice, de tous les autres renseigenements d'aspect. Par exemple, un enfant
ayant les options LAYOUT_CENTER_Y et LAYOUT_FILL_X sera centré en hauteur et
étiré en largeur. Des cellules vides peuvent être obtenues simplement en
plaçant un composant FXFrame sans bordure comme bouche-trou.
Ancêtre : FXPacker.
Déclaration :
FXMatrix.new(parent, n=1, opts=MATRIX_BY_ROWS, x=0, y=0, width=0, height=0,
padLeft=DEFAULT_SPACING,padRight=DEFAULT_SPACING,
padTop=DEFAULT_SPACING,padBottom=DEFAULT_SPACING,hSpacing=DEFAULT_SPACING,vSpacing=DEFAULT_SPACING)
{|theMatrix| ...}
Les constantes prédéfinies :
MATRIX_BY_ROWS : nombre fixé de lignes, ajoute des colonnes si nécessaire.
MATRIX_BY_COLUMNS : nombre fixé de colonnes, ajoute des lignes si nécessaire.
Les attributs :
matrixStyle [RW] : style de la matrice
[Integer]
numColumns [RW] : nombre de colonnes [Integer]
numRows [RW] : nombre de lignes [Integer]
Les méthodes :
childAtRowCol(row,
column) : obtient l'enfant placé à la ligne 'row' et à
la colonne 'column'.
rowOfChild(child)
: renvoie la ligne dans laquelle 'child' est placé.
colOfChild(child)
: renvoie la colonne dans laquelle 'child' est placé.
FXMDIChild
La fenêtre enfant MDI contient la zone de
travail dans une application MDI
Ancêtre :
FXComposite.
Déclaration :
FXMDIChild.new(p, name, ic=nil, mn=nil, opts=0, x=0, y=0, w=0, h=0) {|theMDIChild|
...}
Construit une fenêtre enfant MDI de nom
('name') , d'icône donnée ('ic'), de menu MDI ('mn').
Les constantes prédéfinies :
MDI_NORMAL : mode normal.
MDI_MAXIMIZED : fenêtre maximisée.
MDI_MINIMIZED : fenêtre minimisée ou en icône.
Les attributs :
baseColor [RW] : couleur de base [FXColor]
borderColor [RW] : couleur de la bordure [FXColor]
contentWindow [R] : fenêtre contenue [FXWindow]
font [RW] : nom de la fonte [FXFont]
hiliteColor [RW] : couleur de surbrillance [FXColor]
iconHeight [RW] : hauteur de l'icônisation [Integer]
iconWidth [RW] : largeur de l'icônisation [Integer]
iconX [RW] : coordonnée x de l'icônisation [Integer]
iconY [RW] : coordonnée y de l'icônisation [Integer]
normalHeight [RW] : hauteur normale (restauration) [Integer]
normalWidth [RW] : largeur normale (restauration) [Integer]
normalX [RW] : coordonnée x normale (restauration) [Integer]
normalY [RW] : coordonnée y normale (restauration) [Integer]
shadowColor [RW] : couleur de l'ombre [FXColor]
title [RW] :titre de la fenêtre [String]
titleBackColor [RW] : couleur de fond du titre [FXColor]
titleColor [RW] : couleur du titre [FXColor]
windowIcon [RW] : icône de la fenêtre [FXIcon]
windowMenu [RW] : menu de la fenêtre [FXPopup]
Les méthodes :
getMDINext() : pointe sur la prochaine fenêtre enfant.
getMDIPrev() : pointe sur la fenêtre enfant précédente.
minimize(notify=false) : minimise la fenêtre.
maximize(notify=false) : maximise la fenêtre.
restore(notify=false) : Remet la fenêtre dans sa position et taille normale.
maximized?() : retourne 'true' si la fenêtre
est maximisée.
minimized?() : retourne 'true' si la fenêtre
est minimisée.
Les événements :
Les messages suivants sont envoyés par
FXMDIChild à ses cibles.
SEL_LEFTBUTTONPRESS : envoyé quand le bouton gauche de la souris est appuyé, les données du
message sont une instance de FXEvent.
SEL_LEFTBUTTONRELEASE : envoyé quand le bouton gauche de la souris est relaché, les données
du message sont une instance de FXEvent.
SEL_MIDDLEBUTTONPRESS : envoyé quand le bouton central de la souris est appuyé, les données
du message sont une instance de FXEvent.
SEL_MIDDLEBUTTONRELEASE : envoyé quand le bouton central de la souris est relaché, les données
du message sont une instance de FXEvent.
SEL_RIGHTBUTTONPRESS : envoyé quand le bouton droit de la souris est appuyé, les données du
message sont une instance de FXEvent.
SEL_RIGHTBUTTONRELEASE : envoyé quand le bouton droit de la souris est relaché, les données du
message sont une instance de FXEvent.
SEL_SELECTED : envoyé quand la fenêtre est sélectionnée; les données du message sont
une référence à la fenêtre enfant précédemment active du client MDI, ou 'nil'
s'il n'y avait pas de fenêtre enfant active.
SEL_DESELECTED : envoyé quand la fenêtre est désélectionnée; les données du message
sont une référence à la fenêtre enfant active suivante du client MDI, ou 'nil'
s'il n'y a pas de fenêtre enfant active.
SEL_MAXIMIZE : envoyé lors de la maximisation de la fenêtre.
SEL_MINIMIZE : envoyé lorsque la fenêtre est minimisée.
SEL_RESTORE : envoyé lorsque la fenêtre est restorée dans ses anciennes taille et
position.
SEL_CLOSE : envoyé quand l'utilisateur ferme la fenêtre. Le message doit
retourner '1' si la fenêtre est fermable, '0' dans le cas contraire.
SEL_CLOSEALL : envoyé quand l'utilisateur ferme toutes les fenêtres. Le message doit
retourner '1' si les fenêtres sont fermables, '0' dans le cas contraire.
SEL_DELETE : envoyé immédiatement avant que la fenêtre soit détruite.
FXMDIClient
Le client MDI dirige des fenêtres enfants dans
une application MDI (multiple-document interface).
Les fenêtres enfants reçoivent les messages du
GUI via le client MDI, par ex. le client MDI est la cible de la plupart des
commandes GUI, le client filtre quelques messages et fait suivre tous les
autres à la fenêtre enfant active. Le client MDI peut organiser les fenêtres
enfants de différentes façons : il peut maximiser un des enfants, les arranger
horizontallemnt, verticalement ou en cascade ou bien les icônifier. Les autres
fenêtres enfants sont prévenues du
changement par le client MDI.
Ancêtre :
FXScrollArea.
Déclaration :
FXMDIClient.new(p, opts=0, x=0, y=0, w=0, h=0) {|theMDIClient| ...}
Construit un client MDI.
Les attributs :
activeChild [RW] : fenêtre MDI active, nil s'il n'y en a pas. [FXMDIChild].
cascadeX [RW] : offset X de la cascade [Integer]
cascadeY [RW] : offset Y de la cascade [Integer]
Les méthodes :
getMDIChildFirst() : renvoie la première fenêtre MDI.
getMDIChildLast() : renvoie la dernière fenêtre MDI.
forallWindows(sender,
sel, ptr) : passe le message à toutes les fenêtres MDI.
forallDocWindows(document,
sender, sel, ptr) : passe le message à toutes
les fenêtres MDI dont 'document' est la cible.
setActiveChild(child=nil,
notify=true) : rend active la fenêtre 'child'.
Les événements :
Le message suivant est envoyé par FXMDIClient à
ses cibles.
SEL_CHANGED : envoyé quand la fenêtre
active est changée; la donnée du message est une référence à la nouvelle
fenêtre active (ou 'nil' s'il n'y en apas).
FXMDIDeleteButton
Bouton de fermeture situé en haut à droite des
fenêtres Windows.
Ancêtre :
FXButton.
Déclaration :
FXMDIDeleteButton.new(p, tgt=nil, sel=0, opts=FRAME_RAISED, x=0, y=0, w=0, h=0)
{|theMDIDeleteButton| …}
FXMDIMaximizeButton
Bouton d'agrandissement de fenêtre situé en
haut à droite des fenêtres Windows.
Ancêtre :
FXButton.
Déclaration :
FXMDIMaximizeButton.
new(p, tgt=nil, sel=0, opts=FRAME_RAISED, x=0, y=0, w=0,
h=0) {|theMDIMaximizeButton| ...}
FXMDIMenu
Bouton de menu,
en forme d'icône, situé en haut à gauche des fenêtres Windows.
Ancêtre :
FXMenuPane.
Déclaration :
FXMDIMenu.
new(owner, tgt=nil)
FXMDIMinimizeButton
Bouton de réduction situé en haut à droite des
fenêtres Windows.
Ancêtre :
FXButton.
Déclaration :
FXMDIMinimizeButton.
new(p, tgt=nil, sel=0, opts=FRAME_RAISED, x=0, y=0, w=0,
h=0) {|theMDIMinimizeButton| ...}
FXMDIRestoreButton
Bouton de restauration situé en haut à droite
des fenêtres Windows.
Ancêtre :
FXButton.
Déclaration :
FXMDIRestoreButton.new(p, tgt=nil, sel=0, opts=FRAME_RAISED, x=0, y=0, w=0, h=0)
{|theMDIRestoreButton| ...}
FXMDIWindowButton
Bouton de menu situé en haut à gauche des
fenêtres Windows.
Ancêtre :
FXMenuButton.
Déclaration :
FXMDIWindowButton.new(p, tgt=nil, sel=0, opts=0, x=0, y=0, w=0, h=0) {|theMDIWindowButton|
...}
FXMenubar
Composant barre de menu.
Ancêtre :
FXToolBar.
Déclaration :
FXMenubar.new(p, q, opts=LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X, x=0, y=0, width=0,
height=0, padLeft=3, padRight=3, padTop=2, padBottom=2,
hSpacing=DEFAULT_SPACING, vSpacing=DEFAULT_SPACING) {|theMenubar| ...}
Construit une barre de menu déplaçable.
Normalement la barre de menu est ancré sous la fenêtre 'p'. Quand on la déplace
elle peut être ancrée sous la fenêtre 'q', qui est typiquement une fenêtre
FXToolBarShell.
FXMenubar.new(parent, opts=LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X, x=0, y=0, width=0,
height=0, padLeft=3,
padRight=3, padTop=2, padBottom=2, hSpacing=DEFAULT_SPACING,
vSpacing=DEFAULT_SPACING)
{|theMenubar| ...}
Construit une barre de menu non déplaçable.
FXMenuButton
Le composant FXMenuButton fait surgir un menu
lorsqu'on clique dessus. Il y a
plusieurs manières pour contrôler l'emplacement d'apparition du menu. En
premier lieu, le menu furtif peut être situé à un des quatres côtés du bouton,
ce qui est controllé par l'option
'MENUBUTTON_DOWN..' etc…Ensuite viennent
plusieurs modes d'attachement; le bord gauche/bas avec le bord gauche/haut du
bouton, ou le bord haut/droit avec le bord droit/bas du bouton ou bien les
deux. Le menu peut aussi appraitre centré relativement au bouton. Enfin, un
léger décalage de quelques pixels par rapport au bord peut être spécifié.
Normallement le bouton affiche une flèche indiquant la diorection où doit
apparaître le menu. Ceci peut être désactivé à l'aide de l'option
'MENUBUTTON_NOARROWS'.
Ancêtre :
FXLabel.
Déclaration :
FXMenuButton.new(parent, text, icon=nil, popupMenu=nil,
opts=JUSTIFY_NORMAL|ICON_BEFORE_TEXT|MENUBUTTON_DOWN,
x=0,
y=0, width=0, height=0, padLeft=DEFAULT_SPACING, padRight=DEFAULT_SPACING, padTop=DEFAULT_SPACING, padBottom=DEFAULT_SPACING)
{|theMenuButton| ...}
Les constantes prédéfinies :
MENUBUTTON_AUTOGRAY : automatiquement grisé quand n’est pas cible.
MENUBUTTON_AUTOHIDE : automatiquement grisé quand n’est pas cible.
MENUBUTTON_TOOLBAR : style barre à outils.
MENUBUTTON_DOWN : La fenêtre furtive apparaît sous le bouton.
MENUBUTTON_UP : La fenêtre furtive apparaît au dessus du bouton.
MENUBUTTON_LEFT : La fenêtre furtive apparaît à gauche du bouton.
MENUBUTTON_RIGHT : La fenêtre furtive apparaît à droite du bouton.
MENUBUTTON_NOARROWS : Ne montre pas les flèches.
MENUBUTTON_ATTACH_LEFT : La fenêtre furtive est attachée à la gauche du menu bouton.
MENUBUTTON_ATTACH_TOP : La fenêtre furtive est attachée au haut du menu bouton.
MENUBUTTON_ATTACH_RIGHT : La fenêtre furtive est attachée à la droite du menu bouton.
MENUBUTTON_ATTACH_BOTTOM : La fenêtre furtive est attachée au bas du menu bouton.
MENUBUTTON_ATTACH_CENTER : La fenêtre furtive est attachée au centre du menu bouton.
MENUBUTTON_ATTACH_BOTH : La fenêtre furtive est attachée aux deux côtés du menu bouton.
Les attributs :
attachment
[RW] : Attachement [Integer]
buttonStyle
[RW] : Style du menu bouton [Integer]
menu [RW] : Le menu furtif [FXPopup]
popupStyle
[RW] : Style du menu popup [Integer]
xOffset [RW] : Décalage X-relatif par
rapport au bouton [Integer]
yOffset
[RW] : Décalage Y-relatif par rapport au bouton [Integer]
Les événements :
SEL_KEYPRESS : envoyé lorsqu'une touche est enfonçée. Instance de FXEvent.
SEL_KEYRELEASE : envoyé lorsqu'une touche est relachée. Instance de FXEvent.
SEL_LEFTBUTTONPRESS : envoyé lorsque le bouton gauche de la souris est enfonçé.Instance de
FXEvent.
SEL_LEFTBUTTONRELEASE : envoyé lorsque le bouton gauche de la souris est relaché.Instance de
FXEvent.
FXMenuCaption
Le composant FXMenuCaption peut être utilisé
comme une légende au dessus de commandes de menu dans un menu.
Ancêtre : FXWindow.
Déclaration :
FXMenuCaption.new(parent, text, icon=nil, opts=0) {|theMenuCaption| ...}
Les constantes prédéfinies :
MENU_AUTOGRAY : Automatiquement grisé quand non actualisé.
MENU_AUTOHIDE : Automatiquement caché quand non actualisé.
Les attributs :
font [RW] : la fonte du texte. [FXFont]
helpText [RW] : Texte d'aide de la barre
de statut pour ce menu. [String]
hiliteColor [RW] : couleur de surbrillance
[FXColor]
icon [RW] : l'icône pour ce menu [FXIcon]
selBackColor [RW] : couleur de fond de la
sélection [FXColor]
selTextColor [RW] : couleur du texte de la
sélection [FXColor]
shadowColor [RW] : couleur de l'ombre
[FXColor]
text [RW] : le texte du menu [String]
textColor [RW] : couleur du texte
[FXColor]
FXMenuCascade
Le composant FXMenuCascade est utilisé pour
faire apparaître un sous-menu à partir d'un menu "descendant".
Ancêtre :
FxMenuCaption.
Déclaration :
FXMenuCascade.new(parent, text, icon=nil, popupMenu=nil, opts=0) {|theMenuCascade| ...}
Les attributs :
menu [RW] : Le menu furtif [FXPopup]
FXMenuCommand
Le composant FXMenuCommand est utilisé pour
envoyer une commande dans une application à partir d'un menu. Les commandes de
menu peuvent refléter l'état de l'application par un grisé, en se cachant,ou
bien encore par un coché ou une puce.
Ancêtre :
FXMenuCaption.
Déclaration :
FXMenuCommand.new(parent, text, icon=nil, target=nil, selector=0, opts=0)
{|theMenuCommand| ...}
Les attributs :
accelText [RW] : texte d'accélération [String]
Les méthodes :
check()
: place un "coché" à côté du texte.
uncheck()
: décoche l'item.
checked?() : retourne 'true' si l'item est coché.
checkRadio()
: place une puce à côté du texte.
uncheckRadio()
: décoche une puce.
radioChecked?()
: retourne 'true' si la puce est cochée.
Les messages :
SEL_KEYPRESS : envoyé lorsqu'une touche
est enfonçée. Instance de FXEvent
SEL_KEYRELEASE : envoyé lorsqu'une touche est relachée. Instance de FXEvent.
SEL_COMMAND : envoyé quand la commande
est activée.
FXMenuPane
Le composant FXMenuPane est une sous-fenêtre de
menu furtif.
Ancêtre :
FXPopUp.
Déclaration :
FXMenuPane.new(owner, opts=0) {|theMenuPane| ...}
FXMenuSeparator
Le composant FXMenuSeparator est une simple
rainure utilisée pour délimiter les items dans un menu instantané.
Ancêtre :
FXWindow.
Déclaration :
FXMenuSeparator.new(parent, opts=0) {|theMenuSeparator| ...}
Les attributs :
hiliteColor [RW] : Couleur de
surbrillance. FXColor]
ShadowColor RW] : Couleur de l'ombre
[FXColor]
FXMenuTitle
Un composant FXMenuTitle est un enfant d'une
barre de menu qui sert à faire apparaître un menu "descendant".
Ancêtre : FXMenuCaption.
Déclaration :
FXMenuTitle.new(parent, text, icon=nil, popupMenu=nil, opts=0) {|theMenuTitle| ...}
Les attributs :
menu [RW] : le menu furtif [FXPopup]
Les événements :
SEL_KEYPRESS : envoyé lorsqu'une touche est enfonçée. Instance de FXEvent
SEL_KEYRELEASE : envoyé lorsqu'une touche est relachée. Instance de FXEvent.
SEL_LEFTBUTTONPRESS : envoyé lorsque le bouton gauche de la souris est enfonçé.Instance de
FXEvent.
SEL_LEFTBUTTONRELEASE : envoyé lorsque le bouton gauche de la souris est relaché.Instance de
FXEvent.
FXMessageBox
La boîte de message
Ancêtre :
FXDialogBox.
Déclaration :
FXMessageBox.new(owner, caption, text, ic=nil, opts=0, x=0, y=0) {|theMessageBox| ...}
Construit une boîte de message libre flottante
avec le titre, l'icône et le
message donnés.
Les constantes prédéfinies :
MBOX_OK : La boîte de message a un seul bouton 'Ok'.
MBOX_OK_CANCEL : La boîte de message a un bouton 'Ok' et un bouton 'Cancel'.
MBOX_YES_NO : La boîte de message a un bouton 'Yes' et un bouton 'No'.
MBOX_YES_NO_CANCEL : La boîte de message a les boutons 'Ok', 'No' et 'Cancel'.
MBOX_QUIT_CANCEL : La boîte de message a les boutons 'Quit' et 'Cancel'.
MBOX_QUIT_SAVE_CANCEL : La boîte de message a les boutons 'Quit', 'Save' et 'Cancel'.
Les
valeurs de retour :
MBOX_CLICKED_YES : bouton 'Yes' cliqué.
MBOX_CLICKED_NO : bouton 'No' cliqué.
MBOX_CLICKED_OK
: bouton 'Ok' cliqué.
MBOX_CLICKED_CANCEL : bouton 'Cancel' cliqué.
MBOX_CLICKED_QUIT : bouton 'Quit' cliqué.
MBOX_CLICKED_SAVE : bouton 'Save' cliqué.
Les méthodes :
error(owner,
opts, caption, message) : Montre un message modal
d'erreur. Retourne une des valeurs ci-dessus.
warning(owner,
opts, caption, message) : Montre un message modal d'avertissement. Retourne une des valeurs
ci-dessus.
question(owner,
opts, caption, message) : Montre un message modal
interrogateur. Retourne une des valeurs ci-dessus.
information(owner,
opts, caption, message) : Montre un message modal d'information. Retourne une des valeurs
ci-dessus.
FXObject
Ancêtre :
object.
Les méthodes :
handle(sender,
selector, data) : traite un message envoyé de 'sender', avec
le sélecteur 'selector' et les données 'data'.
getClassName() : renvoie le nom de classe C++ pour cet objet.
save(stream) : sauve l'objet dans le flux 'stream'.
load(stream) : charge l'objet du flux 'stream'.
FXOption
Option du menu bouton.
Ancêtre :
FXLabel.
Déclaration :
FXOption.new(p, text, ic=nil, tgt=nil, sel=0,
opts=JUSTIFY_NORMAL|ICON_BEFORE_TEXT|MENUBUTTON_DOWN, x=0, y=0, w=0, h=0,
pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD) {|theOption|
...}
Les évènements :
SEL_KEYPRESS : envoyé quand une touche est enfoncée.
SEL_KEYRELEASE : envoyé quand une touche est relachée..
SEL_LEFTBUTTONPRESS : envoyé lorsque le bouton gauche de la souris est enfoncé.
SEL_LEFTBUTTONRELEASE : envoyé lorsque le bouton gauche de la souris est relaché.
SEL_COMMAND : envoyé si cette option est cliquée.
Toutes les données sont des instances de
FXEvent.
FXOptionMenu
Menu à options.
Ancêtre :
FXLabel.
Déclaration :
FXOptionMenu.new(p, pup=nil, opts=JUSTIFY_NORMAL|ICON_BEFORE_TEXT, x=0, y=0, w=0, h=0,
pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD)
{|theOptionMenu| ...}
Les attributs :
current [RW] : l'option courante, ou 'nil' s'il n'y en a pas [FXOption]
currentNo [RW] : le numéro de l'option courante, ou '-1' s'il n'y en a pas.
[Integer]
popup [RW] : la fenêtre qui a été affichée [FXPopup]
Les méthodes :
popped?() : retourne 'true' si la fenêtre
est affichée.
FXPacker
FXPacker est un aménageur d'espace qui place
ses fenêtres enfants à l'intérieur de sa zone contre le coté gauche, droit,
haut ou bas.Chaque fois qu'un enfant est placé, l'espace restant est diminué de
l'espace occupé par cet enfant. Le coté de placement est déterminé par les constantes
LAYOUT_SIDE_TOP, LAYOUT_SIDE_BOTTOM, LAYOUT_SIDE_LEFT et
LAYOUT_SIDE_RIGHT fournies par la fenêtre
enfant. Les autres options de rangement sont prises en compte dans la mesure du
possibe. Par exemple un enfant placé contre le bord droit, peut avoir aussi
l'option LAYOUT_FILL_Y ou LAYOUT_TOP. Le dernier enfant peut avoir
LAYOUT_FILL_X et LAYOUT_FILL_Y pour remplir l'espace restant.
Ancêtre :
FXComposite
Déclaration :
FXPacker.new(parent, opts=0, x=0, y=0, width=0, height=0, padLeft=DEFAULT_SPACING,
padRight=DEFAULT_SPACING, padTop=DEFAULT_SPACING, padBottom=DEFAULT_SPACING,
hSpacing=DEFAULT_SPACING,
vSpacing=DEFAULT_SPACING) {|thePacker| ...}
Les attributs :
baseColor [RW] : couleur de base GUI [FXColor]
borderColor
[RW] : couleur du bord [FXColor]
borderWidth [R] : largeur du bord en pixels [Integer]
frameStyle [RW] : style de cadre courant [Integer]
hSpacing [RW] : intervalle horizontal entre enfants [Integer]
hiliteColor [RW] : couleur de surbrillance [FXColor]
packingHints [RW] : renseignements d'arrangement [Integer]
padBottom [RW] : largeur du bas du passe-partout, en pixels [Integer]
padLeft [RW] : largeur de la gauche du passe-partout, en pixels [Integer]
padRight [RW] : largeur de la droite du passe-partout, en pixels [Integer]
padTop [RW] : largeur du haut du passe-partout, en pixels [Integer]
shadowColor [RW] : couleur de l'ombre [FXColor]
vSpacing [RW] : espace vertical entre enfants, en pixels [Integer]
FXPoint
Ancêtre :
Object.
FXPoint.new(*args)
Les méthodes :
clone()
==(other)
-@()
+(other)
-(other)
*(other)
/(other)
FXPopup
Fenêtre furtive.
Ancêtre :
FXShell.
Déclaration :
FXPopup.new(owner, opts=POPUP_VERTICAL|FRAME_RAISED|FRAME_THICK, x=0, y=0, w=0,
h=0) {|thePopup| ...}
Les constantes prédéfinies :
POPUP_VERTICAL
: orientation verticale.
POPUP_HORIZONTAL : orientation horizontale.
POPUP_SHRINKWRAP : Shrinkwrap to content
Les attributs :
baseColor [RW] : couleur de base [FXColor]
borderColor [RW] : couleur du bord [FXColor]
borderWidth [R] : largeur du bord [Integer]
frameStyle [RW] : style de cadre [Integer]
grabOwner [R] : propriétaire actuel [FXWindow]
hiliteColor [RW] : couleur de surbrillance [FXColor]
orientation [RW] : orientation du Popup [Integer]
shadowColor [RW] : couleur de l'ombre [FXColor]
shrinkWrap [RW] : mode 'Shrinkwrap' [Boolean]
Les méthodes :
popup(grabto, x, y, w=0, h=0) :
affiche le popup.
popdown() : supprime le popup.
FXProgressBar
Composant barre de progression.
Ancêtre :
FXFrame.
Déclaration :
FXProgressBar.new(p, target=NULL, sel=0, opts=PROGRESSBAR_NORMAL, x=0, y=0, w=0, h=0,
pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD)
{|theProgressBar| ...}
Les constantes prédéfinies :
Pour l'apparence :
PROGRESSBAR_HORIZONTAL : affichage horizontal.
PROGRESSBAR_VERTICAL : affichage vertical.
PROGRESSBAR_PERCENTAGE : affiche le pourcentage effectué.
PROGRESSBAR_DIAL
: style cadran.
PROGRESSBAR_NORMAL : identique à FRAME_SUNKEN|FRAME_THICK
Les attributs :
barBGColor [RW] : couleur de fond de la barre [FXColor]
barColor [RW] : couleur de la barre [FXColor]
barSize [RW] : largeur de la barre [Integer]
barStyle [RW] : style de barre [Integer]
font [RW] : fonte pour le texte [FXFont]
progress [RW] : avancement de la progression [Integer]
textAltColor
[RW] couleur alternative du texte [FXColor]
textColor [RW] : couleur du texte [FXColor]
total [RW] : valeur maximale de la progression [Integer]
Les méthodes :
increment(amount) : incrément de la progression de la valeur de 'amount'.
hideNumber() : cache le pourcentage de progression.
showNumber() : montre le pourcentage de progression.
FXProgressDialog
Un dialogue de progression est un simple
dialogue, utilisé pour tenir informé l'utilisateur de la progression d'une
opération lente dans un programme, et montrer qu'en fait le programme
travaille.
Ancêtre :
FXDialogBox.
Déclaration :
FXProgressDialog.new(owner, caption, label, opts=PROGRESSDIALOG_NORMAL, x=0, y=0, w=0, h=0)
{|theProgressDialog| ...}
Construit un dialogue de progression avec le
titre 'caption' et le message 'label' donnés.
Les constantes prédéfinies :
PROGRESSDIALOG_NOCANCEL : par défaut il n'y a pas de bouton d'annulation.
PROGRESSDIALOG_CANCEL : valide le bouton d'annulation.
PROGRESSDIALOG_NORMAL : identique à DECOR_TITLE|DECOR_BORDER
Les attributs :
message [RW] : message de progression
[String]
progress [RW] : avancement de la progression [Integer]
total [RW] : valeur maximale de la progression [Integer]
Les méthodes :
increment(amount) : incrémente la progression de 'amount'.
cancelled?() : retourne 'true' si
l'opération a été annulée.
FXRadioButton
Un radio-bouton est un bouton à trois états.
Normalement il est positionné soit à
'TRUE' soit à 'FALSE'; un troisième état, 'MAYBE', peut cependant être appliqué
quand la séldection n'a pas encore été faite par l'utilisateur, ou bien quand
l'état est ambigüe.
Ancêtre :
FXLabel.
Déclaration :
FXRadioButton.new(parent, text, target=nil, selector=0, opts=RADIOBUTTON_NORMAL, x=0,
y=0, width=0, height=0, padLeft=DEFAULT_PAD, padRight=DEFAULT_PAD,
padTop=DEFAULT_PAD, padBottom=DEFAULT_PAD) {|theRadioButton| ...}
Les constantes prédéfinies :
Pour l'apparence :
RADIOBUTTON_AUTOGRAY : Automatiquement grisé quand non actualisé.
RADIOBUTTON_AUTOHIDE : Automatiquement caché quand non actualisé.
RADIOBUTTON_NORMAL : identique à JUSTIFY_NORMAL|ICON_BEFORE_TEXT
Les attributs :
checkState
[RW] : état du radio-bouton TRUE, FALSE ou MAYBE [Integer]
radioButtonStyle [RW] : style du radio-bouton
[Integer]
radioColor
[RW] : couleur
de fond du radio-bouton [FXColor]
Les méthodes :
checked?() : Retourne 'true' si le bouton
est coché (état à 'vrai').
unchecked?() : Retourne 'true' si le bouton
n'est pas coché (état à 'faux').
maybe?() : Retourne 'true' si l'état du bouton est MAYBE.
Les événements :
Les
messages suivants sont envoyés par FXRadioButton à la cible.
SEL_COMMAND : envoyé lors d'un clic sur le bouton.
SEL_KEYPRESS : envoyé lors de l'appui d'une touche
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui de la touche gauche de la souris
SEL_LEFTBUTTONRELEASE : envoyé lors de l'appui de la touche droite de la souris.
Les messages sont des instances de FXEvent
FXRecentFiles
Le composant FXRecentFiles gère les fichiers
les plus récemment utilisés et ce en fonction du système d'enregistrement à savoir la base de registres pour Windows.
Connecté à un autre composant tel qu'une
commande de menu, FXRecentFiles met à jour l'étiquette des commandes de menu.
Quand la commande de menu est invoquée, FXRecentFiles envoit à sa cible un
message SEL_COMMAND avec comme donnée le nom du fichier associé (une chaîne
'string'). Les changements apportés à
la liste de fichier sont
automatiquement répercutés au système d'enregistrement.
Ancêtre :
FXObject.
Déclaration :
FXRecentFiles.
new() {|theRecentFiles| ...}
ou
FXRecentFiles.new(group, tgt=nil, sel=0) {|theRecentFiles| ...}
Les constantes prédéfinies :
ID_CLEAR : Vide la liste des fichiers.
ID_ANYFILES : x
ID_FILE_1 : x
ID_FILE_2 : x
ID_FILE_3 : x
ID_FILE_4 : x
ID_FILE_5
: x
ID_FILE_6 : x
ID_FILE_ 7 : x
ID_FILE_8 : x
ID_FILE_9 : x
ID_FILE_10 : x
Les attributs :
groupName
[RW] : nom du
groupe [String]
maxFiles [RW] : nombre maximum de
fichiers [Integer]
selector
[RW] :
identifiant de message [Integer]
target [RW] : cible du message [FXObject]
Les méthodes :
appendFile(filename) : ajoute un fichier à la fin de la liste.
removeFile(filename) : enlève un fichier de la
liste.
clear() : remise à zéro de la liste.
Les évènements :
SEL_COMMAND : envoyé quand un des fichiers récent est sélectionné. Le message est
une chaîne contenant le nom du fichier.
FXRegistry
FXRegistry maintient une base de données
d'initialisation pour une application , ou suite d'applications.
Ancêtre :
FXSettings.
Déclaration :
FXRegistry.new(appKey="", vendorKey="")
Construit un objet de registre; 'appKey' et
'vendorKey' doivent être des constantes. Une application normale DOIT avoir une
clef "vendeur".
Les attributs :
appKey [R] : clef de l'application [String]
asciiMode [W] : utilise un fichier au lieu de la base de registres de Windows
[Boolean]
vendorKey
[R] : clef vendeur [String]
Les méthodes :
read()
: lit un registre.
write()
: écrit un registre.
asciiMode?()
: retourne 'true' si c'est un fichier qui est utilisé,
'false' dans le cas de la base de registres Windows.
FXScrollArea
Le composant FXSCrollArea gère une zone
d'observation et une fenêtre de visée au travers de laquelle est vu le contenu
de la zone. Quand la zone à observer est plus large que la zone d'observation,
des ascenseurs sont placés de manière à faire défiler la zone observée.
Suivant le mode choisi, les ascenceurs peuvent
être affichés en cas de nécessité,toujours
ou jamais.
Normalement les tailles de la zone de
défilement et celle de la zone d'observation sont indépendantes, il est
cependant possible de déconnecter un des ascenseurs. Dans ce cas là la largeur
(ou la hauteur) de la zone observée influence la largeur (hauteur) de la zone
de défilement. Pour une zone d'observation qui doit être repeinte, le
défilement continu doit être désactivé.
Ancêtre :
FXComposite.
Déclaration :
FXScrollArea.
new(parent, opts=0, x=0, y=0, width=0, height=0)
{|theScrollArea| ...}
Les constantes prédéfinies :
Options des ascenseurs ('opts')
SCROLLERS_NORMAL : affiche les ascenseurs si nécessaire.
HSCROLLER_ALWAYS : affiche toujours l'ascenseur horizontal.
HSCROLLER_NEVER : n'affiche jamais l'ascenseur horizontal.
VSCROLLER_ALWAYS : affiche toujours l'ascenseur vertical.
VSCROLLER_NEVER : n'affiche jamais l'ascenseur vertical.
HSCROLLING_ON : défilement horizontal activé (défaut)
HSCROLLING_OFF : défilement horizontal désactivé.
VSCROLLING_ON : défilement vertical activé (défaut)
VSCROLLING_OFF : défilement vertical désactivé.
SCROLLERS_TRACK : le défilement fonctionne continuellement pour un défilement plus fin.
SCROLLERS_DONT_TRACK : le défilement ne fonctionne pas continuellement.
Les attributs :
contentHeight
[R] : hauteur du contenu en pixels [Integer]
contentWidth [R] : largeur du contenu en pixels [Integer]
horizontalScrollbar
[R] : ascenseur horizontal [FXScrollbar]
scrollStyle [RW] : style de défilement [Integer]
verticalScrollbar [R] : ascenseur vertical [FXScrollbar]
viewportHeight [R] : hauteur de la zone de visée en pixels [Integer]
viewportWidth [R] : largeur de la zone de
visée en pixels [Integer]
xPosition [R] : position-x courante [Integer]
yPosition [R] : position-y courante [Integer]
Les méthodes :
horizontalScrollable?() : retourne 'true' si défilement horizontal possible.
verticalScrollable?()
: retourne 'true' si défilement vertical possible.
setPosition(x,
y) : place la position courante en (x,y).
position() : renvoie la position courante dans un tableau [x,y].
moveContents(x,
y) : déplace la zone observée à la position (x,y).
FXSettings
FXSettings est une base de données
d'initialisation. Normalement utilisé comme partie de FXRegistry, ce composant
peut-être utilisé indépendemment par une application nécessitant
le maintient d'une base en propre.
Ancêtre :
FXDict.
Déclaration :
FXSettings.new()
Construit une base de données.
Les méthodes :
parseFile(filename,
mark) : analyse un fichier contenant des données de
paramètrage.
unparseFile(filename)
: Unparse settings database
into given file.
data(pos)
: récupère le dictionnaire de chaîne pour la section
donnée
find(section)
: fournit le dictionnaire de chaîne pour la section
donnée.
each_section()
{|aStringDict| ...} : itère les sections (où
chaque section est un dictionnaire).
readStringEntry(section,
key, default="") : lit une entrée chaîne dans la section et clef spécifiées. Si
aucune valeur n'est trouvée, retourne la valeur par défaut.
readIntEntry(section,
key, default=0) : lit
un entier dans la 'section' et la clef 'key' données. Si aucune valeur n'est
trouvée, la valeur par défaut est retournée.
readUnsignedEntry(section,
key, default=0) : lit un entier non signé dans la 'section' et
la clef 'key' données. Si aucune valeur n'est trouvée, la valeur par défaut est
retournée..
readRealEntry(section,
key, default=0.0) : lit un réel dans la
'section' et la clef 'key' données. Si aucune valeur n'est trouvée, la valeur
par défaut est retournée.
readColorEntry(section,
key, default=0) : lit une valeur de couleur dans la 'section'
et la clef 'key' données. Si aucune valeur n'est trouvée, la valeur par défaut
est retournée.
writeStringEntry(section,
key, value) : écrit une chaîne 'value' dans la 'section' et clef 'key' spécifiées.
writeIntEntry(section,
key, value) : écrit un entier 'value' dans la 'section' et clef 'key' spécifiées.
writeUnsignedEntry(section,
key, value) : écrit un entier non signé 'value' dans la 'section' et clef 'key' spécifiées.
writeRealEntry(section,
key, value) : écrit un réel 'value' dans la 'section' et clef 'key' spécifiées.
writeColorEntry(section,
key, value) : écrit une couleur 'value' dans la 'section' et clef 'key' spécifiées.
deleteEntry(section,
key) : supprime l'entrée de registre pour la
'section' et clef 'key' spécifiées.
existingEntry?(section,
key) : retourne 'true' s'il existe une entrée de
registre de 'section' et de clef 'key'
spécifiés.
deleteSection(section)
: supprime la section entière.
existingSection?(section)
: retourne 'true' si la 'section' existe.
modified=(mdfy=true)
: marquée comme changé.
modified?()
: retourne 'true' si
cet objet d'initialisation a été modifié.
readBoolEntry(section,
key, default=false) : lit une valeur booléenne
dans la 'section' et la clef 'key' données. Si aucune valeur n'est trouvée, la
valeur par défaut est retournée
writeBoolEntry(section,
key, value) : écrit une valeur booléenne 'value' dans la
'section' et clef 'key' données.
FXSplitter
Une fenêtre "fractionneuse" est
utilisée pour répartir interactivement deux ou plusieurs sous-fenêtres.
L'espace peut être divisé horizontalement ou verticalement. Quand le
fractionneur est lui-même redimensionné, la fenêtre la plus à droite (ou la
plus vers le bas) est elle aussi redimensionnée sans renversement de
l'aménageur FXSplitter; si FXSplitter est inversé, la fenêtre la plus à gauche
(ou la plus haute) sera aussi redimensionnée. Le composant FXSplitter envoie un
message SEL_CHANGED à ses cibles durant le redimensionnement des sous-fenêtres;
à la fin de l'action il envoie un message SEL_COMMAND pour signifié que l'opération
est terminée. Normallement, les enfants sont redimensionnables à partir de la
dimension '0', cependant, dans le cas d'un aménageur orienté horizontalement
d'une combinaison de LAYOUT_FILL_X et
de LAYOUT_FIX_WIDTH ils ne seront pas rendus moins large que leur largeur par
défaut, excepté quand l'enfant est le dernier composant visible (ou le premier
si l'option SPLITTER_REVERSED a été
passée à FXSplitter). Dans un aménageur à orientation verticale, les enfants munis
des options LAYOUT_FILL_Y et LAYOUT_FIX_HEIGHT se comportent de façon analogue.
Ces options affectent uniquement le redimensionnement interactif.
Ancêtre :
FXComposite.
Déclaration :
FXSplitter.new(p, opts=SPLITTER_NORMAL, x=0, y=0, w=0, h=0) {|theSplitter| ...}
Construit un nouveau composant diviseur.
Ou bien
FXSplitter.new (p, tgt, sel,
opts=SPLITTER_NORMAL, x=0, y=0, w=0, h=0) {|theSplitter| ...}
Construit un nouveau composant diviseur qui
notifie tout changement de taille à ses cibles.
Les constantes prédéfinies :
Pour les options 'opts'
SPLITTER_HORIZONTAL : fractionnement horizontal.
SPLITTER_VERTICAL :
fractionnement vertical.
SPLITTER_REVERSED :
ancrage inverse.
SPLITTER_TRACKING :
trace continue durant le fractionnement.
SPLITTER_NORMAL :
identique à SPLITTER_HORIZONTAL
Les attributs :
barSize [RW] : dimension de la barre, en pixels[Integer]
splitterStyle
[RW] : style de FXSplitter [Integer]
FXStatusBar
Composant barre de statut.
Ancêtre :
FXHorizontalFrame.
Déclaration :
FXStatusBar.new(p, opts=0, x=0, y=0, w=0, h=0, pl=3, pr=3, pt=2, pb=2, hs=4, vs=0)
{|theStatusbar| ...}
Les constantes prédéfinies :
STATUSBAR_WITH_DRAGCORNER : montre le coin de dragage.
Les attributs :
cornerStyle [RW] : si 'true', le coin de dragage pour 'drag and drop' est affiché
[Boolean]
dragCorner [R] : le composant coin de dragage [FXDragCorner]
statusline [R] : le composant ligne de statut [FXStatusline]
FXStatusline
La ligne de statut montre normalement son
message permanent ou "normal". Quand le curseur de la souris passe
sur un composant possédant une aide "en ligne", la ligne de statut
remplace son message permanent par l'information d'aide; la ligne de statut
obtient ce message d'aide en envoyant au composant un message 'ID_QUERY_HELP' avec le type ' SEL_UPDATE'. Si cette
demande ne conduit pas à un nouveau texte de statut, la cible de la ligne de
statut est tentée via un message 'SEL_UPDATE' ordinaire. Si rien de tout cela
ne fonctionne, la ligne de statut affiche le texte normal . Si le message
contient un caractère de nouvelle ligne, alors la partie située avant ce
caractère sera affichée en surbrillance, tandis que la partie située après le
sera dans la couleur normale.
Ancêtre :
FXFrame.
Déclaration :
FXStatusline.new(p, tgt=nil, sel=0) {|theStatusline| ...}
Les attributs :
font
[RW] : fonte du texte [FXFont]
normalText
[RW] : message permanent [String]
text
[RW] : message temporaire [String]
textColor
[RW] : couleur du texte [FXColor]
textHighlightColor [RW] : couleur du texte en surbrillance [FXColor]
Les méthodes :
to_s()
: retourne le message temporaire (identique à text())
Les évènements :
Le message suivant est envoyé par FXStatusLine
à ses cibles :
SEL_UPDATE : envoyé quand le composant situé sous le curseur de la souris ne
répond pas à un message SEL_UPDATE avecl'identifiant ID_QUERY_HELP comme décrit
ci-dessus.
FXStream
Ancêtre :
object
Déclaration :
FXStream.new(cont=nil) {|theStream| ...}
Les constantes prédéfinies :
Codes de statut
FXStreamOK : OK
FXStreamEnd : tente de lire au delà du flux.
FXStreamFull : tampon de flux plein ou disque plein.
FXStreamNoWrite : incapable d'ouvrir en écriture.
FXStreamNoRead : incapable d'ouvrir en lecture.
FXStreamFormat : erreur de format de flux.
FXStreamUnknown : tente de lire un classe inconnue.
FXStreamAlloc : échec d'allocation.
FXStreamFailure : échec général.
Direction des données
FXStreamDead : flux non ouvert.
FXStreamSave : sauvegarde.
FXStreamLoad : chargement.
Les attributs :
container [R] : objet parent [FXObject]
direction [R] : sens du flux, soit FXStreamSave, FXStreamLoad ou FXStreamDead. .
position [RW] : position du flux (un décalage à partir du début du flux)
[Integer]
status [R] : code de statut.
Les méthodes :
open(save_or_load)
: ouvre un flux et retourne 'true' si tout c'est bien
passé. Le paramètre 'save_or_load' est soit FXStreamSave soit FXStreamLoad.
close()
: ferme un flux, retourne 'true' en cas de succès.
error=(err)
: code de statut, où 'err' est un des codes de statut
ci-dessus.
bytesSwapped=(swapBytes)
: positionne
le drapeau de "byte-swapped" à 'true' ou 'false'.
bytesSwapped?()
: retourne 'true' si les octets sont échangés pour ce flux.
FXText
Composant texte multilignes
Ancêtre :
FXScrollArea.
Déclaration :
FXText.new(aComposite, target=nil, selector=0, opts=0, x=0, y=0, w=0, h=0)
{|theText| ...}
Les constantes prédéfinies :
Options :
TEXT_READONLY :
texte en lecture seulement.
TEXT_WORDWRAP : retour chariot automatique.
TEXT_OVERSTRIKE : mode remplacement.
TEXT_FIXEDWRAP :
colonnes de retour chariot fixes.
TEXT_NO_TABS : insère des espaces de
tabulation.
TEXT_AUTOINDENT :
auto-indentation.
TEXT_SHOWACTIVE : montre la ligne
active.
Modes de sélection :
SELECT_CHARS
: sélection de caractères.
SELECT_WORDS
: sélection de mots.
SELECT_LINES : sélection de lignes.
Style du texte
STYLE_UNDERLINE :
texte souligné.
STYLE_STRIKEOUT :
texte barré.
Identifiants de message :
ID_BACKSPACE::
ID_BACKSPACE_BOL::
ID_BACKSPACE_WORD::
ID_BLINK::
ID_CLEAN_INDENT::
ID_COPY_SEL::
ID_CURSOR_BOTTOM::
ID_CURSOR_COLUMN::
ID_CURSOR_DOWN::
ID_CURSOR_END::
ID_CURSOR_HOME::
ID_CURSOR_LEFT::
ID_CURSOR_PAGEDOWN::
ID_CURSOR_PAGEUP::
ID_CURSOR_PAR_END::
ID_CURSOR_PAR_HOME::
ID_CURSOR_RIGHT::
ID_CURSOR_ROW::
ID_CURSOR_SCRNBTM::
ID_CURSOR_SCRNCTR::
ID_CURSOR_SCRNTOP::
ID_CURSOR_TOP::
ID_CURSOR_UP::
ID_CURSOR_WORD_LEFT::
ID_CURSOR_WORD_RIGHT::
ID_CUT_SEL::
ID_DELETE::
ID_DELETE_EOL::
ID_DELETE_LINE::
ID_DELETE_SEL::
ID_DELETE_WORD::
ID_DESELECT_ALL::
ID_EXTEND::
ID_FLASH::
ID_GOTO_LINE::
ID_GOTO_MATCHING::
ID_GOTO_SELECTED::
ID_INSERT_NEWLINE::
ID_INSERT_STRING::
ID_INSERT_TAB::
ID_LEFT_ANG::
ID_LEFT_BRACE::
ID_LEFT_BRACK::
ID_LEFT_PAREN::
ID_LOWER_CASE::
ID_MARK::
ID_OVERST_STRING::
ID_PASTE_SEL::
ID_REPLACE::
ID_RIGHT_ANG::
ID_RIGHT_BRACE::
ID_RIGHT_BRACK::
ID_RIGHT_PAREN::
ID_SCROLL_DOWN::
ID_SCROLL_UP::
ID_SEARCH::
ID_SEARCH_BACK_SEL::
ID_SEARCH_FORW_SEL::
ID_SELECT_ALL::
ID_SELECT_ANG::
ID_SELECT_BRACE::
ID_SELECT_BRACK::
ID_SELECT_CHAR::
ID_SELECT_LINE::
ID_SELECT_MATCHING::
ID_SELECT_PAREN::
ID_SELECT_WORD::
ID_SHIFT_LEFT::
ID_SHIFT_RIGHT::
ID_SHIFT_TABLEFT::
ID_SHIFT_TABRIGHT::
ID_TOGGLE_EDITABLE::
ID_TOGGLE_OVERSTRIKE::
ID_UPPER_CASE::
Les attributs :
activeBackColor
[RW] : couleur du fond actif [FXColor]
anchorPos
[RW] : position d'ancrage [Integer]
barColor
[RW] : couleur de la barre [FXColor]
barColumns
[RW] nombre de colonnes utilisées pour le nombre de lignes [Integer]
cursorCol
[RW] : colonne du curseur [Integer]
cursorColor
[RW] : couleur du curseur [FXColor]
cursorPos [R]
: position du curseur [Integer]
cursorRow
[RW] : ligne du curseur Integer]
delimiters
[RW] : délimiteur de mot [String]
editable [W]
: indique si le texte est éditable [Boolean]
font [RW] : fonte du texte [FXFont]
helpText
[RW] : texte d'aide de la ligne de statut [String]
hiliteBackColor [RW] : couleur de
surbrillance du fond du texte [FXColor]
hiliteMatchTime
[RW] : accolades et parenthèses peuvent être mises en surbrillance durant un
certain temps en millisecondes [Integer]. Un 'hiliteMatchTime' de 0 désactive le processus.
hiliteStyles
[RW] : tableau de styles de
surbrillance [un tableau d'instances de FXHiliteStyle]
hiliteTextColor
[RW] : couleur de surbrillance du texte
[FXColor]
length
[R] : la longueur du tampon de texte
[Integer]
marginBottom
[RW] : marge du bas [Integer]
marginLeft [RW] : marge de gauche
[Integer]
marginRight [RW] : marge de droite [Integer]
marginTop
[RW] : marge du haut [Integer]
modified
[W] : indique si le texte a été modifié
[Boolean]
numberColor
[RW] : couleur du numéro de ligne [FXColor]
selBackColor
[RW] : couleur de fond du texte sélectionné [FXColor]
selEndPos
[R] : position de la fin de la
sélection [Integer]
selStartPos [R] : position du début de la sélection
[Integer]
selTextColor
[RW] : couleur du texte sélectionné
[FXColor]
styled
[W] : indique si le texte possède un
style [Boolean]
tabColumns [RW] :
colonnes de tabulation [Integer]
text [RW] : le tampon du texte
[String]
textColor [RW] : couleur du texte [FXColor]
textStyle [RW] : style du composant Texte [Integer]
tipText [RW] : message de l'info-bulle [String]
visCols
[RW] : nombre de colonnes visibles
[Integer]
visRows
[RW] : nombre de lignes visibles
[Integer]
wrapColumns
[RW] :
colonnes de retour chariot [Integer]
Les méthodes :
modified?()
: retourne 'true' si le texte a été modifié.
editable?()
: retourne 'true' si le texte est éditable.
styled?()
: retourne 'true' si le texte a un style.
getChar(pos) : renvoie
le caractère situé à la position 'pos' dans le tampon texte.
getStyle(pos)
: renvoie le style à la position 'pos' dans le tampon
texte.
extractText(pos,
n) : extrait 'n' caractères au texte à partir de la
position 'pos' dans le tampon texte.
extractStyle(pos,
n) : extrait 'n'
caractères de style à partir de la position 'pos' dans le tampon style.
replaceText(pos,
m, text, notify=false) : remplace les 'm'
caractères à la position 'pos' par 'text'. Si 'notify' est à 'true', un message
SEL_DELETED est envoyé à la cible du composant texte avant que l'ancien texte
ne soit enlevé, et des messages SEL_INSERTED et SEL_CHANGED sont adressés après que le nouveau texte soit inséré.
replaceStyledText(pos,
m, text, style=0, notify=false) : remplace 'm'
caractères à partir de 'pos' avec 'text' et 'style'. Si 'notify' est à 'true'
un message SEL_DELETED est envoyé à la cible avant que l'ancien texte soit
supprimé, et puis un SEL_INSERTED et SEL_CHANGED après l'insertion du nouveau
texte.
appendText(text,
notify=false) : ajoute 'text' à la fin du tampon texte.Si
'notify' est à 'true' les messages SEL_INSERTED et SEL_CHANGED sont envoyés à
la cible après l'ajout du nouveau texte.
appendStyledText(text,
style=0, notify=false) : ajoute 'text' à la fin du tampon texte avec précision du style.
Si 'notify' est à 'true' les messages SEL_INSERTED et SEL_CHANGED sont envoyés
à la cible après l'ajout du nouveau texte.
insertText(pos,
text, notify=false) : insère le texte 'text' à la position 'pos' dans le tampon du texte. Si
'noitify' est à 'true' les messages SEL_INSERTED et SEL_CHANGED sont envoyés à
la cible après l'insertion du nouveau texte.
insertStyledText(pos,
text, style=0, notify=false) : insère le texte 'text' à la position 'pos' avec le style 'style' dans
le tampon du texte. Si 'noitify' est à 'true' les messages SEL_INSERTED et
SEL_CHANGED sont envoyés à la cibleaprès l'insertion du nouveau texte.
removeText(pos,
n, notify=false) : Supprime 'n' caractères au texte à la position 'pos' dans le tampon.
Si 'notify' est à 'true' un message SEL_DELETED est envoyé à la cible avant la
suppression du texte et un message SEL_CHANGED est envoyé après le changement.
changeStyle(pos,
n, style) : change le style de 'n' caractères en 'style' à la position 'pos' dans le
tampon du texte. Ici 'style' est soit un entier de la table de style, soit une
chaîne ('string').
setText(text,
notify=false) :
change le texte. Si 'notify' est à 'true', les messages insère le texte 'text'
à la position 'pos' dans le tampon du texte. Si 'noitify' est à 'true' les
messages SEL_INSERTED et SEL_CHANGED sont envoyés à la cible après la mise en
place du nouveau texte.
setStyledText(text,
style=0, notify=false) : change le texte du tampon avec 'text' et 'style'. Si 'notify' est à
'true', les messages insère le texte 'text' à la position 'pos' dans le tampon
du texte. Si 'notify' est à 'true' les messages SEL_INSERTED et SEL_CHANGED
sont envoyés à la cible après la mise en place du nouveau texte.
shiftText(startPos,
endPos, amount, notify=false) : change le bloc de lignes à partir de 'startPos' jusqu'à 'endPos' par
le texte 'amount'. Si 'notify' est à 'true', un message SEL_DELETED est envoyé
à la cible avant la suppression de l'ancien texte, et les messages SEL_INSERTED
et SEL_CHANGED après l'insertion du nouveau texte.
findText(string,
beg=nil, end=nil, start=0, flags=SEARCH_FORWARD|SEARCH_WRAP|SEARCH_EXACT,
npar=1) :
cherche la chaîne 'string' dans le tampon du texte et retourne le début dans
'beg' et la fin dans 'end'. La recherche démarre à la position 'start', dans le
sens défini dans 'flags' : en avant (SEARCH_FORWARD) ou en arrière
(SEARCH_BACKWARD), et retourne si SEARCH_WRAP a été
spécifié.. Le type de recherche est soit intégrale (SEARCH_EXACT),
soit insensible à la casse (SEARCH_IGNORECASE),
ou cherche des expressions rationnelles
(SEARCH_REGEX). Pour ces dernières, des parenthèses sont
utilisées si 'npar' est supérieur à 1; dans ce cas le nombre d'entrées dans les
tableaux 'beg' et 'end' doit être aussi de 'npar'. Si 'beg' et 'end' sont à
'nil' les tableaux internes sont utilisés.
positionSelected?(pos)
: retourne 'true' si la position 'pos' est
sélectionnée.
positionVisible?(pos) :
retourne 'true' si la position 'pos' est entièrement visible.
positionAt(x,
y) :
retourne le texte de la position visible (x,y) donnée.
lineStart(pos) :
retourne la position du début de la ligne contenant la position 'pos'.
lineEnd(pos) :
retourne la position de la fin de la ligne contenant la position 'pos'.
nextLine(pos,
nl=1) :
retourne le début de la ligne suivante contenant la position 'pos'.
prevLine(pos,
nl=1) : retourne
le début de la ligne précédente contenant la position 'pos'.
rowStart(pos) :
retourne le début de la ligne.
rowEnd(pos) :
retourne la fin de la ligne.
nextRow(pos,
nr=1) :
retourne le début de la ligne suivante.
prevRow(pos,
nr=1) :
retourne le début de la ligne précédente.
leftWord(pos) :
retourne la fin du mot précédent.
rightWord(pos) :retourne
le début du mot suivant.
wordStart(pos) :
retourne le début du mot.
wordEnd(pos) :
retourne la fin du mot.
validPos(pos) :
retourne la position validée.
setTopLine(pos) :
fait de la ligne contenant 'pos' la ligne la plus haute.
getTopLine() :
retourne la position de la ligne la plus haute.
setBottomLine(pos) :
fait de la ligne contenant 'pos' la ligne du bas.
getBottomLine() :
retourne la position de la ligne du bas.
setCenterLine(pos) :
fait de la ligne contenant 'pos' la
ligne du milieu.
setCursorRow(row,
notify=false) : met
le curseur à la ligne 'row'. Si 'notify' est à 'true' un message
SEL_CHANGED est envoyé à la cible après
le changement.
setCursorCol(col,
notify=false) : met le curseur à la colonne 'col'. Si 'notify' est à 'true' un message
SEL_CHANGED est envoyé à la cible après
le changement.
setCursorPos(pos,
notify=false) : met le curseur à la position 'pos'. Si 'notify' est à 'true' un
message SEL_CHANGED est envoyé à la
cible après le changement.
selectAll(notify=false) :
sélectionne tout le texte. Si 'notify' est à 'true' un message SEL_DESELECTED
est envoyé à la cible avant qu'un texte sélectionné auparavant ne soit
désélectionné, puis un message SEL_SELECTED est envoyé après la nouvelle
sélection .
setSelection(pos,
len, notify=false) : sélectionne 'len' caractères à partir de la position 'pos'. Si 'notify'
est à 'true' un message SEL_DESELECTED est envoyé à la cible avant qu'un texte
sélectionné auparavant ne soit désélectionné, puis un message SEL_SELECTED est
envoyé après la nouvelle sélection .
extendSelection(pos,
textSelectionMode=SELECT_CHARS, notify=false)
: étend la sélection jusqu'à 'pos'. Si 'notify'
est à 'true' un message SEL_DESELECTED est envoyé à la cible avant qu'un texte
sélectionné auparavant ne soit désélectionné, puis un message SEL_SELECTED est
envoyé après la nouvelle sélection .
killSelection(notify=false) :
supprime la sélection. Si 'notify' est à 'true' un message SEL_DESELECTED est
envoyé à la cible avant la désélection.
setHighlight(pos,
len) :
met en surbrillance 'len' caractères à partir de la position 'pos'.
killHighlight() :
enlève la surbrillance du texte.
makePositionVisible(pos) :
fait défiler le texte pour rendre la position 'pos' visible.
Les évènements :
Les événements suivants sont envoyés par FXText
à ses cibles.
SEL_KEYPRESS : envoyé lors de l'appui d'une touche; la donnée du message est une
instance de FXEvent.
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche; la donnée du message est une
instance de FXEvent.
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui du bouton gauche de la souris; la donnée du
message est une instance de FXEvent.
SEL_LEFTBUTTONRELEASE : envoyé lors du relâchement du bouton gauche de la souris; la donnée
du message est une instance de FXEvent.
SEL_MIDDLEBUTTONPRESS : envoyé lors de l'appui du bouton central de la souris; la donnée du
message est une instance de FXEvent.
SEL_MIDDLEBUTTONRELEASE : envoyé lors du relâchement du bouton central de la souris; la donnée
du message est une instance de FXEvent.
SEL_RIGHTBUTTONPRESS : envoyé lorsque le bouton droit est enfonçé.
SEL_RIGHTBUTTONRELEASE : envoyé lorsque le bouton droit est relâché.
SEL_INSERTED
: envoyé après l'insertion du texte dans le tampon de
texte; la donnée du message est un tableau de deux éléments indiquant la position d'insertion et le nombre de
caractères insérés.
SEL_DELETED
: envoyé avant le retrait du texte dans le tampon de
texte; la donnée du message est un tableau à deux éléments indiquant la
position de retrait et le nombre de caractères supprimés.
SEL_CHANGED
: envoyé quand le contenu du tampon de texte change de
quelque façon que ce soit; la donnée du message est un entier indiquant la
position du curseur.
SEL_SELECTED
: envoyé après la sélection du texte; la donnée du
message est un tableau de deux éléments indiquant la position de début de sélection et le nombre de caractères
sélectionnés.
SEL_DESELECTED
: envoyé avant la désélection du texte; la donnée du
message est un tableau à deux éléments indiquant la position de début du texte désélectionné et le nombre de
caractères à désélectionner.
FXTextField
Un composant
zone de texte sert en entrer des caractères sur une simple ligne. Il supporte
les opérations du presse-papier, copier, coller, couper.
Ancêtre :
FXFrame.
Déclaration :
FXTextField.new(p, numColumns, tgt=nil, sel=0, opts=TEXTFIELD_NORMAL, x=0, y=0, w=0,
h=0, pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD)
{|theTextField| ...}
Les constantes prédéfinies :
Pour
le style du texte :
TEXTFIELD_PASSWD : mode mot de passe.
TEXTFIELD_INTEGER : mode entier.
TEXTFIELD_REAL : mode réel.
TEXTFIELD_READONLY : non éditable.
TEXTFIELD_ENTER_ONLY : ne répond qu'a la touche 'ENTER' (pas 'TAB')
TEXTFIELD_LIMITED : limité au nombre de colonnes donné.
TEXTFIELD_OVERSTRIKE
: mode remplacement (opposé au mode insertion).
TEXTFIELD_NORMAL : FRAME_SUNKEN|FRAME_THICK
Pour
les messages :
ID_CURSOR_HOME::
ID_CURSOR_END::
ID_CURSOR_RIGHT::
ID_CURSOR_LEFT::
ID_MARK::
ID_EXTEND::
ID_SELECT_ALL::
ID_DESELECT_ALL::
ID_CUT_SEL::
ID_COPY_SEL::
ID_PASTE_SEL::
ID_DELETE_SEL::
ID_OVERST_STRING::
ID_INSERT_STRING::
ID_BACKSPACE::
ID_DELETE::
ID_TOGGLE_EDITABLE::
ID_TOGGLE_OVERSTRIKE::
ID_BLINK::
Les attributs :
anchorPos [RW] : position d'ancrage [Integer]
cursorPos
[RW] : position du curseur [Integer]
editable [W] : rend le composant
éditable ou non [Boolean]
font [RW] : fonte du texte [FXFont]
helpText
[RW] texte d'aide de la ligne de statut [String]
justify [RW] : mode de justification du texte [Integer]
numColumns [RW] : largeur du texte en terme de colonnes *'m' [Integer]
selBackColor [RW] : couleur du fond pour le texte sélectionné [FXColor]
selTextColor [RW] : couleur du premier plan pour le texte sélectionné [FXColor]
text
[RW] : le texte [String]
textColor [RW] : couleur du texte
[FXColor]
textStyle [RW] : style du texte [Integer]
tipText [RW] : texte de l' info-bulle [String]
Les méthodes :
editable?() : renvoie 'true' si le texte peut être édité.
selectAll() : sélectionne tout le texte.
setSelection(pos,
len) : sélectionne 'len' caractères à partir de la
position 'pos'.
extendSelection(pos) : étend la sélection de la position d'ancrage à la position 'pos'.
killSelection() : désélectionne le texte.
posSelected?(pos) : renvoie 'true' si la position 'pos' est sélectionnée.
posVisible?(pos) : renvoie 'true' si la position 'pos' est entièrement visible.
makePositionVisible(pos) : fait défiler le texte pour rendre la position 'pos' visible
.
Les évènements :
SEL_COMMAND : envoyé lors de l'appui de la touche 'Enter' ou de la touche 'Tab'; la
donnée du message est une chaîne 'string' contenant le texte.
SEL_CHANGED : envoyé quand le texte change; la donnée du message est une chaîne
'string' contenant le texte.
SEL_VERIFY : envoyé lorsque l'utilisateur entre un nouveau texte; la donnée du
message est une 'string' contenant le nouveau texte.
SEL_KEYPRESS : envoyé lors de l'appui d'une touche; la donnée du message est une
instance de FXEvent.
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche; la donnée du message est une
instance de FXEvent.
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui du bouton gauche de la souris; la donnée du
message est une instance de FXEvent.
SEL_LEFTBUTTONRELEASE : envoyé lors du relâchement du bouton gauche de la souris; la donnée
du message est une instance de FXEvent.
SEL_MIDDLEBUTTONPRESS : envoyé lors de l'appui du bouton central de la souris; la donnée du
message est une instance de FXEvent.
SEL_MIDDLEBUTTONRELEASE : envoyé lors du relâchement du bouton central de la souris; la donnée
du message est une instance de FXEvent.
FXToggleButton
Le bouton FXToggleButton est un bouton à deux
état, qui bascule entre les "On" et
"Off" habituels chaque fois qu'il est pressé. Pour chaque état
il y a une icône et un label spécifique.
Ancêtre :
FXLabel.
Déclaration :
FXToggleButton.new(p, text1, text2, icon1=nil, icon2=nil, tgt=nil, sel=0,
opts=TOGGLEBUTTON_NORMAL, x=0, y=0, w=0, h=0,
pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD)
{|theToggleButton| ...}
Construit un bouton bascule avec deux textes
d'étiquettes ('text1' et 'text2'), et deux icônes ('icon1' et 'icon2').
Les constantes prédéfinies :
TOGGLEBUTTON_AUTOGRAY
: automatiquement grisé quand non mis à jour.
TOGGLEBUTTON_AUTOHIDE : automatiquement caché quand non mis à jour.
TOGGLEBUTTON_TOOLBAR : style barre à outils (sans cadre
apparent)
TOGGLEBUTTON_NORMAL :
=FRAME_RAISED|FRAME_THICK|JUSTIFY_NORMAL|ICON_BEFORE_TEXT
Les attributs :
altHelpText [RW] : texte d'aide alternatif de la ligne de statut, montré lors du
basculement [String]
altIcon [RW] : icône alternative
[FXIcon]
altText [RW] : texte alternatif [String]
altTipText [RW] : message alternatif de l' info-bulle [String]
state [RW] : état de bascule ('true'
ou 'false')
toggleStyle
[RW]: style du bouton [Integer]
Les événements :
Les messages suivants sont envoyés par le
FXTogglebutton à ses cibles :
SEL_COMMAND : envoyé quand le bouton est pressé.
SEL_KEYPRESS : envoyé lors de l'appui d'une touche
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui de la touche gauche de la souris
SEL_LEFTBUTTONRELEASE : envoyé lors de l'appui de la touche droite de la souris.
FXToolBar
Contrôle barre d'outils.
Ancêtre :
FXPacker.
Déclaration :
FXToolBar.new(p, q, opts=LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X, x=0, y=0, width=0,
height=0, padLeft=3, padRight=3, padTop=2, padBottom=2,
hSpacing=DEFAULT_SPACING, vSpacing=DEFAULT_SPACING) {|theToolbar| ...}
Ou
FXToolBar.
new(parentComposite,
opts=LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X, x=0, y=0, width=0, height=0,
padLeft=3, padRight=3, padTop=2, padBottom=2,
hSpacing=DEFAULT_SPACING, vSpacing=DEFAULT_SPACING) {|theToolbar| ...}
Dans la première déclaration c'est une barre
flottante qui est créée. Normalement la barre est arrimée sous la fenêtre 'p'.
Quand elle flotte elle peut être
arrimée sous la fenêtre 'q', qui est
typiquement une fenêtre FXToolBarShell.
Dans la deuxième déclaration la barre est non
flottante et ne peut donc être désarrimée.
Les constantes prédéfinies :
ID_UNDOCK :
désarrime.
ID_DOCK_TOP :
arrime en haut.
ID_DOCK_BOTTOM :
arrime en bas.
ID_DOCK_LEFT :
arrime à gauche.
ID_DOCK_RIGHT : arrime à droite.
ID_TOOLBARGRIP :
notifications de la poignée.
Les attributs :
dockingSide [RW] : côté d'arrimage suivant les constantes LAYOUT_SIDE_LEFT,
LAYOUT_SIDE_RIGHT, LAYOUT_SIDE_TOP ouLAYOUT_SIDE_BOTTOM [Integer]
dryDock [R] : fenêtre parent quand arrimée [FXComposite]
wetDock [R] : fenêtre parent quand désarrimée (ou 'flottante') [FXComposite]
Les méthodes :
dock(side=LAYOUT_SIDE_TOP,
after=-1) : arrime la barre contre le côté désigné
('side') après d'autres composants. Cependant si 'after' vaut '-1' elle sera
arrimée comme une barre d'outils interne juste avant la zone de travail, tandis
que si 'after' vaut '0' elle sera arrimée comme barre externe.
undock() : désarrime la barre. La position initiale d'arrimage se situe quelques
pixels en dessous et à droite de la position d'origine.
setDryDock(dryDock) : fixe le parent quand la barre est arrimée. Si la barre était arrimée,
le nouveau parent est la nouvelle fenêtre d'arrimage.
setWetDock(wetDock)
: fixe le parent quand la barre flotte. Si elle n'était
pas arrimée, le nouveau parent est la nouvelle fenêtre flottante.
docked?() : retourne 'true' si la barre est arrimée.
FXToolBarGrip
Une poignée de barre d'outils est utilisée pour
déplacer son parent (un FXToolbar). La poignée est soit simple, soit
double. Il est d'usage d'utiliser la
simple pour les barre à réarranger, et la double pour les barres destinées à
flotter ou à être arrimées quelque part. La poignée est automatiquement
orientée par le composant barre d'outils.
Ancêtre :
FXWindow.
Déclaration :
FXToolBarGrip.new(parent, target=nil, selector=0, opts=TOOLBARGRIP_SINGLE, x=0, y=0,
width=0, height=0) {|theToolbarGrip| ...}
Les constantes prédéfinies :
TOOLBARGRIP_SINGLE : mode barre simple pour barres déplaçables.
TOOLBARGRIP_DOUBLE : mode barre double pour barres arrimables.
TOOLBARGRIP_SEPARATOR : mode séparateur.
Les attributs :
activeColor [RW]
: couleur active [FXColor]
doubleBar [W] : indique si la
poignée est affichée comme une double barre [Boolean]
hiliteColor
[RW] : couleur de surbrillance [FXColor]
shadowColor
[RW] : couleur de l'ombre
[FXColor]
Les méthodes :
doubleBar?() : retourne 'true' si la poignée
est affichée comme une double barre, c'est à dire par opposition à une barre
simple.
FXToolBarShell
FXToolBarShell est un composant visuel pouvant
naviguer autour de la fenêtre principale. Il contient typiquement une barre
d'outils non arrimée.
Ancêtre :
FXTopWindow.
Déclaration :
FXToolBarShell.
new(owner, opts=FRAME_RAISED|FRAME_THICK, x=0, y=0,
width=0, height=0, hSpacing=4, vSpacing=4) {|theToolbarShell| ...}
Les attributs :
baseColor [RW] : couleur de base GUI [FXColor]
borderColor [RW] : couleur du bord [FXColor]
borderWidth [R] : largeur du bord [Integer]
frameStyle [RW] : style de cadre [Integer]
hiliteColor [RW] : couleur de surbrillance [FXColor]
shadowColor [RW] : couleur de l'ombre [FXColor]
FXToolTip
Le système d'aide par info-bulles.
Ancêtre :
FXShell.
Déclaration :
FXToolTip.new(app, opts=TOOLTIP_NORMAL, x=0, y=0, width=0, height=0) {|theTooltip|
...}
Les constantes prédéfinies :
ID_TIP_SHOW : montre l' info-bulle.
ID_TIP_HIDE : cache l' info-bulle.
Pour les options
TOOLTIP_PERMANENT : l' info-bulle demeure indéfiniment.
TOOLTIP_VARIABLE : l' info-bulle demeure durant un temps dépendant de la longueur de son
texte.
TOOLTIP_NORMAL : info-bulle tout à fait normale.
Les attributs :
font
[RW] : fonte de l' info-bulle [String]
text
[RW] : texte de l' info-bulle [String]
textColor [RW] : couleur du texte
[FXColor]
FXTopWindow
Base abstraite pour les fenêtres. Contient les
déclarations de constantes dont héritent tous les descendants.
Ancêtre :
FXShell.
Déclaration :
Il n'y en a pas, du moins en partie publique, puisqu'il s'agit d'une base abstraite.
Les constantes prédéfinies :
Pour le titre et la bordure :
DECOR_NONE : fenêtre sans bordure.
DECOR_TITLE : titre de la fenêtre.
DECOR_MINIMIZE : bouton de réduction de la fenêtre.
DECOR_MAXIMIZE : bouton d'agrandissement de la fenêtre.
DECOR_CLOSE : bouton de fermeture.
DECOR_BORDER : bordure.
DECOR_RESIZE : poignées de redimensionnement.
DECOR_MENU : menu de la fenêtre.
DECOR_ALL : tout sur le dessus.
Pour les options d'emplacement de la fenêtre à
l'écran.
PLACEMENT_DEFAULT : placement à la dimension et à la place par défaut.
PLACEMENT_VISIBLE
: place la fenêtre pour être entièrement visible.
PLACEMENT_CURSOR : place la fenêtre sous le curseur.
PLACEMENT_OWNER : centre la fenêtre dans son propriétaire.
PLACEMENT_SCREEN : place la fenêtre au centre de l'écran.
PLACEMENT_MAXIMIZED : remplit l'écran.
Pour les messages :
ID_ICONIFY : met la fenêtre en icône.
ID_DEICONIFY
: rétabli la fenêtre à sa taille normale.
ID_QUERY_DOCK : demande d'ancrage de la barre d'outils.
Les attributs :
decorations
[RW] : titre
et décorations [Integer]
hSpacing [RW] : espace horizontal entre
les composants enfants, en pixels [Integer]
icon [RW] : icône de la fenêtre [FXIcon]
miniIcon [RW] : mini icône (pour le titre) [FXIcon]
packingHints
[RW] : renseignements d'aménagement pour les
composants enfants [Integer]
padBottom [RW] : largeur du bas du passe-partout, en pixels [Integer]
padLeft
[RW] : largeur du côté gauche du passe-partout, en
pixels [Integer]
padRight [RW] : largeur du côté droit du passe-partout, en pixels [Integer]
padTop [RW] : largeur du haut du passe-partout, en pixels [Integer]
title [RW] : titre de la fenêtre [String]
vSpacing [RW] : espace vertical entre les composants enfants, en pixels
[Integer]
Les méthodes :
show(placement) : montre la fenêtre à l'emplacement indiqué en paramètre
place(placement) : Positionne la fenêtre à l'emplacement indiqué par le paramètre.
iconify() : met la fenêtre en icône.
deiconify() : supprime l'icône.
iconified?()
: renvoie
'true' si la fenêtre a été mise en icône.
Les évènements :
SEL_CLOSE
: envoyé quand l'utilisateur clique sur le bouton de
fermeture en haut à droite de la fenêtre.
FXTreeItem
Item de liste arborescente.
Ancêtre : FXObject.
Déclaration :
FXTreeItem.new(text, openIcon=nil, closedIcon=nil, data=nil) {|theItem| ...}
Construit un nouvel item.
Les attributs :
above [R] : item logiquement au dessus de cet item [FXTreeItem]
below [R] : item logiquement au dessous de cet item [FXTreeItem]
closedIcon [RW] : icône de fermeture [FXIcon]
data [RW] : donnée utilisateur [Object]
draggable [W] : indique si l'item est draguable [Boolean]
enabled [W] : indique si l'item est valide [Boolean]
expanded [W] : indique si l'item est étendu
[Boolean]
first [R] : premier item enfant
[FXTreeItem]
last [R] : dernier item enfant
[FXTreeItem]
next [R] : noeud suivant [FXTreeItem]
numChildren [R] : nombre d'items enfants [Integer]
openIcon [RW] : icône d'ouverture
[FXIcon]
opened [W] : indique si l'item est ouvert [Boolean]
parent [R] : item parent [FXTreeItem]
prev [R] : noeud précédent [FXTreeItem]
selected [W] : indique si l'item est sélectionné [Boolean]
text [RW] : texte de l'item [String]
Les méthodes :
setFocus(focus)
: fixe le focus sur cet item ('focus' est soit 'true',
soit 'false')
hasFocus?()
: retourne 'true' si cet item a le focus.
selected?()
: retourne 'true' si cet item est sélectionné.
opened?()
: retourne 'true' si cet item est ouvert.
expanded?()
: retourne 'true' si cet item est étendu.
enabled?()
: retourne 'true' si cet item est valide.
draggable?()
: retourne 'true' si cet item est draguable.
iconOwned?()
: retourne 'true' si cet item a ses icônes.
to_s()
: retourne le texte de l'item.
getWidth(treeList)
: renvoie la largeur de cet item.
getHeight(treeList)
: renvoie la hauteur de cet item.
create()
: crée cet item.
detach()
: détache cet item.
destroy()
: détruit cet item.
<=>(otherItem)
each() {|aTreeItem| ...} : itérateur. Appelle le bloc pour chaque enfant de
cet item d'arborescence, passant une référence à l'item enfant comme un
paramètre.
FXTreeList
Liste arborescente.
Ancêtre :
FXScrollArea.
Déclaration :
FXTreeList.new(aComposite, numVisible, target=nil, selector=0, opts=TREELIST_NORMAL,
x=0, y=0, w=0, h=0) {|theTreeList| ...}
Construit un arbre liste avec 'numVisible'
items visibles; l'arbre liste est initialement vide.
Les constantes prédéfinies :
TREELIST_EXTENDEDSELECT : mode sélection étendue pour sélection d'une rangée d'items.
TREELIST_SINGLESELECT : mode sélection unique pour un item à la fois.
TREELIST_BROWSESELECT : la sélection suit le curseur souris, un seul item à la fois. l
TREELIST_MULTIPLESELECT : mode sélection multiple pour des items non contigüs.
TREELIST_AUTOSELECT : sélection automatique sous le curseur.
TREELIST_SHOWS_LINES : montre les lignes.
TREELIST_SHOWS_BOXES : montre les boîtes de développement d'arbre.
TREELIST_ROOT_BOXES : affiche aussi les boîtes racines.
TREELIST_NORMAL : identique à TREELIST_EXTENDEDSELECT.
Les attributs :
anchorItem [RW] : item d'ancrage, s'il existe [FXTreeItem]
currentItem [RW] : item courant, s'il existe [FXTreeItem]
cursorItem [R] : item sous le curseur, s'il existe [FXTreeItem]
firstItem [R] : premier item de bas-niveau [FXTreeItem]
font [RW] : fonte du texte [FXFont]
helpText [RW] : texte d'aide de la ligne
de statut pour cette liste [String]
indent [RW] : indentation
parent-enfant en pixels [Integer]
lastItem [R] : dernier item de bas niveau [FXTreeItem]
lineColor [RW] : couleur de ligne [FXColor]
listStyle [RW] : style de la liste [Integer]
numItems [R] : nombre d'items [Integer]
numVisible [RW] : nombre d'items visibles
[Integer]
selBackColor [RW] : couleur de fond du texte sélectionné [FXColor]
selTextColor [RW] : couleur du texte sélectionné [FXColor]
textColor [RW] : couleur du texte normal
[FXColor]
Les méthodes :
addItemFirst(parentItem,
item, notify=false) : ajoute au début un nouvel
item comme premier enfant de 'parentItem'. Retourne une référence du nouvel item (une instance de FXTreeItem).
Si 'notify' est à 'true', un message SEL_INSERTED est envoyé à la cible après
l'ajout de l'item.
addItemFirst(parentItem,
text, openIcon=nil, closedIcon=nil, data=nil, notify=false) : ajoute au début un nouvel item comme premier enfant de 'parentItem' avec
en options une icône d'ouverture('openicon'), une icône de fermeture
('closedicon'), et des données utilisateur. Retourne une référence du nouvel item (une instance de FXTreeItem).
Si 'notify' est à 'true', un message SEL_INSERTED est envoyé à la cible après
l'ajout de l'item
addItemLast(parentItem,
item, notify=false) : ajoute un nouvel item 'item' comme dernier enfant de 'parentItem'.
Retourne une référence du nouvel item
(une instance de FXTreeItem). Si 'notify' est à 'true', un message SEL_INSERTED
est envoyé à la cible après l'ajout de l'item
addItemLast(parentItem,
text, openIcon=nil, closedIcon=nil, data=nil, notify=false) : ajoute un nouvel item 'item' comme dernier enfant de 'parentItem' avec
en options une icône d'ouverture('openicon'), une icône de fermeture
('closedicon'), et des données utilisateur. Retourne une référence du nouvel item (une instance de FXTreeItem).
Si 'notify' est à 'true', un message SEL_INSERTED est envoyé à la cible après
l'ajout de l'item
addItemAfter(otherItem,
item, notify=false) : ajoute un nouvel item 'item'
après 'otherItem'. Retourne une référence
du nouvel item (une instance de FXTreeItem). Si 'notify' est à 'true',
un message SEL_INSERTED est envoyé à la cible après l'ajout de l'item.
addItemAfter(otherItem,
text, openIcon=nil, closedIcon=nil, data=nil, notify=false) : ajoute
un nouvel item 'item' après 'otherItem' avec en options une icône
d'ouverture('openicon'), une icône de fermeture ('closedicon'), et des données
utilisateur. Retourne une référence du
nouvel item (une instance de FXTreeItem). Si 'notify' est à 'true', un message
SEL_INSERTED est envoyé à la cible après l'ajout de l'item
addItemBefore(otherItem,
item, notify=false) : ajoute au début un nouvel
item 'item' avant 'otherItem'. Retourne une référence du nouvel item (une instance de FXTreeItem). Si 'notify' est à
'true', un message SEL_INSERTED est envoyé à la cible après l'ajout de l'item
addItemBefore(otherItem,
text, openIcon=nil, closedIcon=nil, data=nil, notify=false) : ajoute au début un nouvel item
'item' avant 'otherItem' avec en options une icône d'ouverture('openicon'), une
icône de fermeture ('closedicon'), et des données utilisateur. Retourne une
référence du nouvel item (une instance
de FXTreeItem). Si 'notify' est à 'true', un message SEL_INSERTED est envoyé à
la cible après l'ajout de l'item
removeItem(item,
notify=false) : supprime 'item'. Si 'notify' est à 'true' un
message SEL_DELETED est envoyé à la cible une fois l'item enlevé.
removeItems(fromItem,
toItem, notify=false) : supprime les items de
l'intervalle 'fromItem' à 'toItem' inclus. Si 'notify' est à 'true' un message
SEL_DELETED est envoyé à la cible à chaque item enlevé.
clearItems(notify=false)
: enlève tous les items de la liste. Si 'notify' est à
'true' un message SEL_DELETED est envoyé à la cible à chaque item enlevé.
getItemWidth(item)
: retourne la largeur de l'item.
getItemHeight(item)
: retourne la hauteur de l'item.
findItem(text,
startItem=nil, flags=SEARCH_FORWARD|SEARCH_WRAP) :
cherche item après item par 'text', à partir de 'startItem', 'flags' désignant
le sens de recherche et la sensibilité à la casse. Retourne une référence vers
l'item visé, ou 'nil' s'il n'est pas trouvé.
makeItemVisible(item)
: fait défiler la liste pour rendre visible l'item
'item'.
setItemText(item,
text) : change le texte de 'item' par 'text'.
getItemText(item)
: retourne le texte de 'item'.
setItemOpenIcon(item,
openIcon) : change l'icône d'ouverture de 'item' par
'openIcon'.
getItemOpenIcon(item)
: retourne l'icône d'ouverture de 'item'.
setItemClosedIcon(item,
closedIcon) : change l'icône de fermeture de 'item' par
'closedIcon'.
getItemClosedIcon(item)
: retourne l'icône de fermeture de 'item'.
setItemData(item,
data) : change la donnée utilisateur de 'item' par
'data'.
getItemData(item)
: retourne la donnée utilisateur de 'item'.
itemSelected?(item)
: retourne 'true' si 'item' est sélectionné.
itemCurrent?(item)
: retourne 'true' si 'item' est l'item courant.
itemVisible?(item)
: retourne 'true' si 'item' est visible.
itemOpened?(item)
: retourne 'true' si 'item' est ouvert.
itemExpanded?(item)
: retourne 'true' si 'item' est étendu.
itemLeaf?(item)
: retourne 'true' si 'item' est un item
"feuille", c'est à dire sans enfant.
itemEnabled?(item)
: retourne 'true' si 'item' est valide.
hitItem(item,
x, y) : retourne le code de frappe sur l'item : 0 en
dehors, 1 sur l'icône, 2 sur le texte, 3 sur la boîte.
updateItem(item)
: repeint l'item 'item'.
enableItem(item)
: rend valide l'item 'item'.
disableItem(item)
: rend invalide l'item 'item'.
selectItem(item,
notify=false) : sélectionne 'item'. Si 'notify' est à 'true'
un message SEL_SELECTED est envoyé à la cible après la sélection.
deselectItem(item,
notify=false) : désélectionne l'item 'item'. Si 'notify' est
à 'true' un message SEL_DESELECTED est envoyé à la cible après la désélection.
toggleItem(item,
notify=false) : sélection "bascule" de 'item'. Si
'notify' est à 'true' des messages
SEL_SELECTED et SEL_DESELECTED sont envoyés à
la cible pour indiquer le changement..
openItem(item,
notify=false) : ouvre 'item'. Si 'notify' est à 'true' un
message SEL_OPENED est envoyé à la cible après l'ouverture.
closeItem(item,
notify=false) : ferme 'item'. Si 'notify' est à 'true' un
message SEL_CLOSED est envoyé à la cible après la fermeture.
collapseTree(tree,
notify=false) : rabat la branche 'tree'. ouvre 'item'. Si
'notify' est à 'true' un message SEL_COLLAPSED est envoyé à la cible après le
rabat de la branche.
expandTree(tree,
notify=false) : développe la branche. Si 'notify' est à
'true' un message SEL_EXPANDED est envoyé à la cible après l'extension de la
branche.
reparentItem(item,
parentItem) : refixe 'item' sous 'parentItem.
setCurrentItem(item,
notify=false) : change l'item courant par 'item'. Si 'notify'
est à 'true' un message SEL_CHANGED est envoyé à la cible après le changement.
extendSelection(item,
notify=false) : étend la sélection de l'item d'ancrage à
'item'. Si 'notify' est à 'true' des messages SEL_SELECTED et SEL_DESELECTED
sont envoyés à la cible pour indiquer
le changement.
killSelection(notify=false)
: désélectionne tous les items. Si 'notify' est à
'true' un message SEL_DESELECTED est envoyé à la cible pour chaque item.
sortItems()
: tri les items racine.
sortChildItems(item)
: tri les enfants des items.
each()
{|aTreeItem| ...}
: itérateur. Appelle le bloc pour chaque item de niveau racine, en passant
une référenceà cet item comme paramètre.
Les évènements :
Les messages suivants sont envoyés par
FXTreeList à ses cibles :
SEL_KEYPRESS : envoyé lors de l'appui d'une touche; la donnée du message est une
instance de FXEvent.
SEL_KEYRELEASE : envoyé lors du relâchement d'une touche; la donnée du message est une
instance de FXEvent.
SEL_LEFTBUTTONPRESS : envoyé lors de l'appui du bouton gauche de la souris; la donnée du
message est une instance de FXEvent.
SEL_LEFTBUTTONRELEASE : envoyé lors du relâchement du bouton gauche de la souris; la donnée
du message est une instance de FXEvent.
SEL_RIGHTBUTTONPRESS : envoyé lorsque le bouton droit est enfonçé.
SEL_RIGHTBUTTONRELEASE : envoyé lorsque le bouton droit est relâché.
SEL_COMMAND : envoyé lors d'un clic sur un item; la donnée du message est une
référence à l'item (une instance de FXTreeItem)
SEL_CLICKED
: envoyé lors d'un clic simple du bouton gauche de la
souris; la donnée du message est une référence à l'item (une instance de
FXTreeItem) ou 'nil' si aucun item n'a été cliqué.
SEL_DOUBLECLICKED
: envoyé lors d'un clic double du bouton gauche de la
souris; la donnée du message est une référence à l'item (une instance de
FXTreeItem) ou 'nil' si aucun item n'a été cliqué.
SEL_TRIPLECLICKED
: envoyé lors d'un clic triple du bouton gauche de la
souris; la donnée du message est une référence à l'item (une instance de
FXTreeItem) ou 'nil' si aucun item n'a été cliqué.
SEL_OPENED
: envoyé lorsqu'un item est ouvert; la donnée du message
est une référence à l'item (une instance de FXTreeItem)
SEL_CLOSED
: envoyé lorsqu'un item est fermé; la donnée du message
est une référence à l'item (une instance de FXTreeItem)
SEL_EXPANDED
: envoyé lorsqu'une branche est étendue; la donnée du
message est une référence à l'item racine pour la branche (une instance FXTreeItem ).
SEL_COLLAPSED
: envoyé lorsqu'une branche se referme; la donnée du
message est une référence à l'item racine pour la branche (une instance FXTreeItem ).
SEL_SELECTED
: envoyé lorsqu'un item est sélectionné; la donnée du
message est une référence à l'item (une instance FXTreeItem).
SEL_DESELECTED
: envoyé lorsqu'un item est désélectionné; la donnée du
message est une référence à l'item (une instance FXTreeItem).
SEL_CHANGED
: envoyé lorsque l'item courant change; la donnée du
message est une référence à l'item courant (une instance FXTreeItem).
SEL_INSERTED
: envoyé lorsqu'un item est ajouté à la liste; la donnée
du message est une référence à l'item (une instance FXTreeItem).
SEL_DELETED
: envoyé lorsqu'un item est supprimé de la liste; la
donnée du message est une référence à l'item (une instance FXTreeItem).
FXTreeListBox
Ancêtre :
Object.
Les méthodes :
each() {|aTreeItem| ...} : appelle le
bloc pour chaque item de bas niveau de l'arbre, en passant une référence à cet
item comme paramètre.
FXUndoList
La
liste d'annulation dirige une liste de commandes annulables (et rétablissables)
pour une application Fox; elle marche main dans la main avec les sous-classes
de FXCommand et est une application de la figure célèbre 'Command'. Votre code
d'application doit implémenter un certain nombre de classes de commandes. Et
les ajouter à une instance de FXUndoList. Pour savoir comment cela fonctionne,
voir l'exemple TextEdit dans la distribution de FXRuby.
Ancêtre :
FXObject.
Déclaration :
FXUndoList.new()
Retourne une instance de FXUndoList
initialisée.
Les constantes prédéfinies :
FXUndoList::ID_UNDO
:identifiant de message pour la méthode 'undo'. Quand
un message SEL_COMMAND est envoyé à une liste d'annulation avec cet
identifiant, la dernière commande est annulée. FXUndoList propose aussi
SEL_UPDATE pour cet identifiant, qui active ou désactive l'expéditeur en
fonction de sa possibilité d'annulation.
FXUndoList::ID_UNDO_ALL
: identifiant de message pour l'annulation totale.
FXUndoList gère les deux messages SEL_COMMAND et SEL_UPDATE pour cet
identifiant.
FXUndoList::ID_REDO : identifiant de message pour la méthode de restauration. Quand un message
SEL_COMMAND est envoyé à une liste d'annulation avec cet identifiant, la
dernière commande est restaurée. FXUndoList propose aussi SEL_UPDATE pour cet
identifiant, qui active ou désactive l'expéditeur en fonction de sa possibilité
de restauration.
FXUndoList::ID_REDO_ALL : identifiant de message pour la méthode de restauration générale.
FXUndoList gère les deux messages SEL_COMMAND et SEL_UPDATE pour cet
identifiant.
FXUndoList::ID_CLEAR
: identifiant de message pour la méthode de remise à
zéro FXUndoList gère les deux messages SEL_COMMAND et SEL_UPDATE pour cet
identifiant.
FXUndoList::ID_REVERT
: identifiant de message pour la méthode 'revert'. FXUndoList gère les deux messages
SEL_COMMAND et SEL_UPDATE pour cet identifiant.
Les méthodes :
cut() : coupe la liste de rétablissement.
add(command,
doit=false) : ajoute une nouvelle commande 'command' (une
FXCommand instance) à la liste. Si 'doit' est vrai, la commande est aussi
exécutée.
undo() : annule la dernière commande.
redo()
: rétabli la commande suivante.
undoAll() : annule toutes les commandes.
redoAll() : rétabli toutes les commandes.
revert() : revient au "marqué".
canUndo?() : retourne 'true' si nous
pouvons annuler une commande (c'est à dire que la liste n'est pas vide).
canRedo?()
: retourne
'true' si nous pouvons rétablir une commande (c'est à dire que la liste n'est
pas vide).
canRevert?() : retourne 'true' s'il existe un état précédent marqué, vers lequel
nous pouvons revenir.
current() : retourne la commande courante d'annulation.
undoCount() : retourne le nombre d'enregistrements annulés.
undoSize() : retourne la taille totale de l'information d'annulation.
clear() : nettoie la liste.
trimCount(nc) : réduit la liste d'annulation à la taille de 'nc' commandes.
trimSize(sz) : réduit la liste d'annulation à la taille 'sz'.
mark() : marque l'état actuel.
unmark() : enlève le marquage de la liste d'annulation.
marked?() : retourne 'true' si la liste d'annulation est marquée.
FXVerticalFrame
Le composant cadre vertical est utilisé pour
placer automatiquement les fenêtres enfants verticalement de haut en bas ou de
bas en haut en fonction des renseignements d'aspect des fenêtres enfants.
Ancêtre :
FXPacker.
Déclaration :
FXVerticalFrame.new(parent, opts=0, x=0, y=0, width=0, height=0, padLeft=DEFAULT_SPACING,
padRight=DEFAULT_SPACING,
padTop=DEFAULT_SPACING,
padBottom=DEFAULT_SPACING, hSpacing=DEFAULT_SPACING,vSpacing=DEFAULT_SPACING)
{|theVerticalFrame| ...}
FXWindow
C'est un des plus gros morceaux, la plupart des
constantes étant déclarées dans la classe FXWindow, et FXWindow ayant pas mal
de descendants.
Ancêtre :
FXDrawable.
Déclaration :
FXWindow.new(parent, opts=0, x=0, y=0, w=0, h=0) {|theWindow| ...}
Les constantes prédéfinies :
# Renseignements d'aspect pour les composants
enfants.
LAYOUT_NORMAL = 0, # Mode par défaut
LAYOUT_SIDE_TOP = 0, # Taqué vers le haut (défaut)
LAYOUT_SIDE_BOTTOM = 0x00000001,
# Taqué vers le bas
LAYOUT_SIDE_LEFT
=
0x00000002, #
Taqué à gauche
LAYOUT_SIDE_RIGHT =
LAYOUT_SIDE_LEFT|LAYOUT_SIDE_BOTTOM, # Taqué à droite
LAYOUT_FILL_COLUMN = 0x00000001, # la
matrice de colonnes est étirable LAYOUT_FILL_ROW = 0x00000002, # la matrice
de lignes est étirable
LAYOUT_LEFT = 0, # placé à
gauche (défaut)
LAYOUT_RIGHT = 0x00000004, # placé à droite.
LAYOUT_CENTER_X = 0x00000008, # centré horizontalement
LAYOUT_FIX_X =
LAYOUT_RIGHT|LAYOUT_CENTER_X, # X
fixé
LAYOUT_TOP
=
0, #
placé en haut (défaut)
LAYOUT_BOTTOM
=
0x00000010, #
placé en bas.
LAYOUT_CENTER_Y = 0x00000020, # Centré
verticalement
LAYOUT_FIX_Y =
LAYOUT_BOTTOM|LAYOUT_CENTER_Y, # Y
fixé
LAYOUT_RESERVED_1
= 0x00000040,
LAYOUT_RESERVED_2 = 0x00000080,
LAYOUT_FIX_WIDTH = 0x00000100, # largeur fixée
LAYOUT_FIX_HEIGHT = 0x00000200, # hauteur fixée
LAYOUT_MIN_WIDTH = 0, # largeur minimum par défaut
LAYOUT_MIN_HEIGHT = 0, # hauteur minimum par défaut
LAYOUT_FILL_X
=
0x00000400, #
étiré ou retréci horizontalement
LAYOUT_FILL_Y
=
0x00000800, #
étiré ou retréci verticalement
LAYOUT_EXPLICIT =
LAYOUT_FIX_X|LAYOUT_FIX_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT # placement explicite
# Styles des cadres (pour les sous-classes)
FRAME_NONE = 0, # Par défaut pas de
cadre
FRAME_SUNKEN = 0x00001000,
# Bord en creux
FRAME_RAISED = 0x00002000, # Bord surélevé
FRAME_THICK = 0x00004000, # Bord épais
FRAME_GROOVE = FRAME_THICK, #
un bord rainuré ou gravé
FRAME_RIDGE =
FRAME_THICK|FRAME_RAISED|FRAME_SUNKEN, # crête ou bord en relief
FRAME_LINE
=
FRAME_RAISED|FRAME_SUNKEN, #
bordure simple.
FRAME_NORMAL = FRAME_SUNKEN|FRAME_THICK
# bord normal
# style d'emballage(pour les "packers")
PACK_NORMAL
=
0, # par défaut chacun a sa taille.
PACK_UNIFORM_HEIGHT = 0x00008000, # hauteur
uniforme
PACK_UNIFORM_WIDTH = 0x00010000 # largeur uniforme
# Identifiants pour les fenêtres
ID_NONE,
ID_HIDE,
ID_SHOW,
ID_TOGGLESHOWN,
ID_LOWER,
ID_RAISE,
ID_DELETE,
ID_DISABLE,
ID_ENABLE,
ID_UNCHECK,
ID_CHECK,
ID_UNKNOWN,
ID_UPDATE,
ID_AUTOSCROLL,
ID_HSCROLLED,
ID_VSCROLLED,
ID_SETVALUE,
ID_SETINTVALUE,
ID_SETREALVALUE,
ID_SETSTRINGVALUE,
ID_SETINTRANGE,
ID_SETREALRANGE,
ID_GETINTVALUE,
ID_GETREALVALUE,
ID_GETSTRINGVALUE,
ID_GETINTRANGE,
ID_GETREALRANGE,
ID_QUERY_TIP,
ID_QUERY_HELP,
ID_QUERY_MENU,
ID_HOTKEY,
ID_ACCEL,
ID_UNPOST,
ID_POST,
ID_MDI_TILEHORIZONTAL,
ID_MDI_TILEVERTICAL,
ID_MDI_CASCADE,
ID_MDI_MAXIMIZE,
ID_MDI_MINIMIZE,
ID_MDI_RESTORE,
ID_MDI_CLOSE,
ID_MDI_WINDOW,
ID_MDI_MENUWINDOW,
ID_MDI_MENUMINIMIZE,
ID_MDI_MENURESTORE,
ID_MDI_MENUCLOSE,
ID_MDI_NEXT,
ID_MDI_PREV,
ID_CLOSE_DOCUMENT,
ID_CLOSE_ALL_DOCUMENTS,
ID_LAST
Les attributs :
accelTable
[RW] :la table d'accélération pour cette fenêtre [FXAccelTable]
backColor
[RW] : couleur de fond de la fenêtre [FXColor]
defaultCursorRW]
: curseur par défaut de la fenêtre [FXCursor]
dragCursor
[RW] : curseur de dragage pour cette fenêtre [FXCursor]
first [R]
: première fenêtre enfant pour cette fenêtre, s'il y en a une [FXWindow]
focus [R]
: fenêtre enfant ayant le focus, s'il y en a une [FXWindow]
height
[RW] : hauteur de la fenêtre, en pixels [Integer]
key
[RW] : clé de la fenêtre [Integer]
last [R]
: dernière fenêtre enfant, si elle existe [FXWindow]
layoutHints [RW]
: renseignements d'aspect pour cette fenêtre [Integer]
next [R]
: fenêtre suivante (soeur) si elle existe
[FXWindow]
numChildren[R]
: nombre de fenêtre enfant, pour cette fenêtre [Integer]
owner [R]
: le propriétaire de cette fenêtre [FXWindow]
parent [R] : la fenêtre parent de cette
fenêtre [FXWindow]
prev [R]
: fenêtre précédente (soeur) si elle existe [FXWindow]
root [R]
: fenêtre racine [FXWindow]
selector
[RW] : identifiant de message pour la fenêtre [Integer]
shell [R] :
la fenêtre de commande pour cette fenêtre [FXWindow]
target [RW] : objet cible des messages
pour cette fenêtre [FXObject]
width [RW] : largeur de la fenêtre en
pixels [Integer]
x [RW] : coordonnée "x", dans
le système de coordonnée du parent[Integer]
y [RW] : coordonnée "y", dans
le système de coordonnée du parent [Integer]
Les méthodes :
Méthodes publiques :
Dans ce qui suit "DND" signifie
"Drag And Drop" = dragage et
tirage.
deleteType() : type DND commun : requête de destruction
textType()
: type DND commun : texte ASCII
stringType()
: type DND commun: type texte presse-papiers
(pré-enregistré)
colorType() : type DND commun : Couleur
urilistType() : type DND commun : liste URI
deleteTypeName() : nom du type DND commun: requête de destruction
textTypeName() : nom du type DND commun : texte ASCII
colorTypeName() : nom du type DND commun : couleur
urilistTypeName() : nom du type DND commun : liste URI
commonAncestor(a,
b) : retourne l'ancêtre commun des fenêtres 'a' et 'b'.
Méthode Publiques d' Instance :
defaultWidth() : retourne la largeur par défaut de la fenêtre.
defaultHeight() : retourne la hauteur par défaut de la fenêtre.
getWidthForHeight(givenHeight) : retourne la largeur pour la hauteur donnée.
getHeightForWidth(givenWidth) : retourne la hauteur pour la largeur donnée.
addHotKey(code) : ajoute le raccourci 'code' à
la table d'accélération de l'ancêtre le plus proche.
remHotKey(code) : supprime le raccourci 'code' de la table d'accélération de l'ancêtre
le plus proche.
shell?() : retourne 'true' si c'est une fenêtre de commande.
childOf?(window) : retourne 'true' si 'window' est le parent de la fenêtre.
containsChild?(child) : retourne 'true' si 'child' est un enfant de cette fenêtre.
getChildAt(x,
y) : retourne la fenêtre enfant à la coordonnée (x,y).
indexOfChild(window) : retourne l'index (début à zéro) de la fenêtre enfant 'window' ou '-1'
si 'window' n'est pas un enfant de cette fenêtre.
removeChild(child) : enlève la fenêtre enfant 'child'.
children(): retourne un tableau contenant toutes les fenêtres enfants.
childAtIndex(index)
: retourne la fenêtre enfant pointée par 'index'. Si
index est hors limite renvoie un 'IndexError'.
cursorPosition() : retourne la position du curseur et l'état du bouton sourisen un
tableau tridimentionnel.
setCursorPosition(x,
y) : place le curseur à la position (x,y).
enabled?() : retourne 'true' si la fenêtre
en question est admise à recevoir les évènements souris et clavier.
active?() : retourne 'true' si cette fenêtre est active.
canFocus?() : retourne 'true' si cette fenêtre est un contrôle capable de recevoir
le focus.
hasFocus?()
: retourne 'true' si la fenêtre a le focus.
setFocus() : attribue le focus à la
fenêtre.
killFocus() : enlève le focus à la fenêtre.
setDefault(enable=TRUE) : change la fenêtre qui par défaut répond à la touche 'Enter' dans
un dialogue. Si 'enable' est à 'true',
cette fenêtre devient la fenêtre par défaut. Dans le cas contraire ('enable' =
'false') la fenêtre ne peut plus être la fenêtre par défaut. Finalement, quand
'enable' est à 'MAYBE', la fenêtre par défaut redevient celle qui l'était
initialement.
default?() : retourne 'true' si c'est la fenêtre par défaut.
setInitial(enable=true) : fait de cette fenêtre la fenêtre initiale par défaut.
initial?() : retourne 'true' si c'est la fenêtre initiale par défaut.
enable() : autorise la fenêtre à recevoir les évènements souris et clavier.
disable() : interdit à la fenêtre de recevoir les évènements souris et clavier.
create() : crée toutes les ressources côté-serveur pour cette fenêtre.
detach() : ôte les ressources coté serveur pour cette fenêtre.
destroy()
: détruit les
ressources coté serveur pour cette fenêtre
raiseWindow() : place cette fenêtre au sommet de la pile.
lower() : place cette fenêtre au bas de la pile.
move(x,
y) : déplace la fenêtre à la position (x,y) dans les
coordonnées de la fenêtre parent.
resize(w, h) : redimentionne la fenêtre aux largeur ('w') et hauteur ('h')
spécifiées.
position(x,
y, w, h) :
déplace et redimentionne la fenêtre dans les coordonnées
"parent".
recalc() : marque l'aspect de cette fenêtre comme sali.
forceRefresh() : force une mise à jour de GUI pour la fenêtre et ses enfants.
reparent(newParent) : change le parent de la fenêtre par
'newParent'.
scroll(x,
y, w, h, dx, dy) : fait défiler un rectangle (x, y, w, h) d'un
delta (dx, dy)
update() : marque la zone client de la fenêtre comme salie.
update(x,
y, w, h) :
marque le rectangle spécifié comme sali.
repaint(x,
y, w, h) : si elle est marquée mais pas encore peinte,
peint la zone donnée.
repaint()
: si marquée mais non peinte, peint la fenêtre
entière.
grab() : capture les évènements souris. Les futurs événements souris seront
reportés à cette fenêtre même si le curseur en sort.
ungrab() : désactive la capture des évènements de la souris.
grabbed?() : retourne 'true' si la fenêtre capture les évènements souris.
grabKeyboard()
: capte les évènements clavier.
ungrabKeyboard() : désactive la capture des évènements clavier.
grabbedKeyboard?() : retourne 'true' si la capture des évènements clavier en fonction.
show() : montre la fenêtre.
hide()
: cache la fenêtre.
shown?()
: retourne 'true' si la fenêtre est montrée.
composite?() : retourne 'true' si cette fenêtre est une fenêtre composée.
underCursor?() : retourne 'true' si cette fenêtre est sous le curseur.
hasSelection?()
: retpourne 'true' si cette fenêtre possède la
sélection primaire.
acquireSelection(typesArray) : tente d'acquérir la sélection primaire, avec un tableau de types de
dragage.
releaseSelection() : libère la sélection primaire.
hasClipboard?() : retourne 'true' si la fenêtre "possède" le clavier.
acquireClipboard(typesArray) : tente d'acquérir le clavier, avec un tableau de types de dragage.
releaseClipboard() : abandonne le clavier.
dropEnable() : valide cette fenêtre pour recevoir les largages.
dropDisable() : invalide cette fenêtre pour recevoir les largages.
dropEnabled?() : retourne 'true' si cette fenêtre est autorisée à recevoir un largage.
dragging?() : retourne 'true' si une opération de dragage est en cours pour cette
fenêtre.
beginDrag(typesArray) : débute une opération de dragage avec un tableau de type de dragage
précédemment définis.
handleDrag(x,
y, action=DRAG_COPY) : durant le dragage informe la cible de largage de la nouvelle
position et de l'action de dragage. L'action est une des constantes suivantes :
·
DRAG_REJECT: refuse tout largage.
·
DRAG_ACCEPT: accepte tout largage.
·
DRAG_COPY: accepte ce largage comme une copie.
·
DRAG_MOVE: accepte ce largage comme un déplacement.
·
DRAG_LINK: accepte ce largage comme un lien.
·
DRAG_PRIVATE: privé.
endDrag(drop=true) : achève l'opération de dragage avec ou sans largage de données.
dropTarget?() : retourne 'true' si cette fenêtre est la cible d'un largage.
setDragRectangle(x,
y, w, h, wantUpdates=true) : pendant le dragage ,
indique qu'aucun autre message SEL_DND_MOTION n'est nécessaire pendant que le
curseur est à l'intérieur du rectangle donné.
clearDragRectangle() : pendant le dragage, indique que nous devons recevoir un message
SEL_DND_MOTION à chaque mouvement du
curseur. acceptDrop(action=DRAG_ACCEPT)
: pendant le dragage, indique l'acceptation ou le refus des données draguées.
L'action est une des constantes suivantes :
·
DRAG_REJECT: refuse tout largage.
·
DRAG_ACCEPT: accepte tout largage.
·
DRAG_COPY: accepte ce largage comme une copie.
·
DRAG_MOVE: accepte ce largage comme un
déplacement.
·
DRAG_LINK: accepte ce largage comme un lien.
·
DRAG_PRIVATE: privé.
didAccept()
: renvoie un DRAG_REJECT quand la cible refuse le
largage; sinon indique l'acceptation par DRAG_ACCEPT, DRAG_COPY, DRAG_MOVE ou
DRAG_LINK.
inquireDNDTypes(origin) : pendant le dragage, s'informe du type de dragage. 'origin' est une
des constantes indiquant l'origine des données : FROM_SELECTION, FROM_CLIPBOARD
ou FROM_DRAGNDROP. Retourne un tableau de type de données.
offeredDNDType?(origin,
type) : pendant le dragage, retourne 'true' si nous
offrons le type de dragage donné. 'origin' est une des constantes suivantes
indiquant l'origine des données :
FROM_SELECTION, FROM_CLIPBOARD ou
FROM_DRAGNDROP. 'type' est type de dragage précédemment enregistré.
inquireDNDAction()
: pendant le dragage, retourne l'action de dragage.
getDNDData(origin,
type) : retourne les données DND; l'appelant devient
le propriétaire du tableau. 'origin' est une constante indiquant l'origine des
données, parmi
FROM_SELECTION, FROM_CLIPBOARD or FROM_DRAGNDROP. 'type' est un type de dragage
précédemment enregistré.
setDNDData(origin,
type, data) : établi les données DND; le propriétaire est
transferré au système. 'origin' est une constante indiquant l'origine des
données, parmi
FROM_SELECTION, FROM_CLIPBOARD or FROM_DRAGNDROP. 'type' est un type de dragage
précédemment enregistré.
contains?(parentX,
parentY) : retourne 'true' si cette fenêtre contient
logiquement le point donné (parentX, parentY).
translateCoordinatesFrom(fromWindow,
fromX, fromY) : translate les coordonnées ('fromX', 'fromY')
du système de coordonnées de
'fromWindow’au système de coordonnées de la fenêtre. Retourne un tableau
à deux éléments contenant les coordonnées dans le système de coordonnées de
cette fenêtre.
translateCoordinatesTo(toWindow,
fromX, fromY) : translate les coordonnées ('fromX', 'fromY')
du système de coordonnées de cette fenêtre au système de coordonnées de la
fenêtre 'toWindow'. Retourne un tableau bi-dimentionnel contenant les
coordonnées dans le système de 'toWindow'.
linkBefore(sibling) : rattache cette fenêtre avant 'sibling' dans la liste de la fenêtre
parent.
linkAfter(sibling)
: rattache cette fenêtre après 'sibling' dans la liste
de la fenêtre parent
doesSaveUnder?() : retourne 'true' si cette fenêtre doît sauver ce qui est en dessous.
each_child()
{|child| ...} itère le bloc pour chaque fenêtre enfant de
cette fenêtre.
Les événements :
Les messages suivant sont envoyés par FXWindow
aux cibles :
SEL_MAP :
sent when the window is mapped to the screen; the message data is an
FXEvent instance.
SEL_UNMAP:
sent when the window is unmapped; the message data is an FXEvent
instance.
SEL_CONFIGURE : envoyé quand la fenêtre
change de taille.Le message est une instance FXEvent.
SEL_ENTER : envoyé quand le curseur
souris pénètre la fenêtre.
SEL_LEAVE : envoyé quand le curseur de
la souris quitte la fenêtre.
SEL_FOCUSIN : envoyé lorsque la fenêtre
acquière le focus.
SEL_FOCUSOUT : envoyé lorsque la
fenêtre perd le focus.
SEL_UPDATE : envoyé quand la fenêtre
nécessite une mise à jour.
SEL_UNGRABBED : envoyé lorsque la
fenêtre perd la capture de la souris.
Pour les événements clavier suivant, la donnée
du message est une instance de FXEvent :
SEL_KEYPRESS : envoyé lorsqu'une touche
est pressée.
SEL_KEYRELEASE : envoyé lorsqu'une
touche est relâchée.
Pour les évènements souris suivant, la donnée
du message est une instance de FXEvent :
SEL_MOTION : envoyé lorsque la souris
bouge.
SEL_LEFTBUTTONPRESS : envoyé lorsque le
bouton gauche est enfonçé.
SEL_LEFTBUTTONRELEASE : envoyé lorsque
le bouton gauche est relâché.
SEL_MIDDLEBUTTONPRESS : envoyé lorsque
le bouton central est enfonçé
SEL_MIDDLEBUTTONRELEASE : envoyé
lorsque le bouton central est relâché.
SEL_RIGHTBUTTONPRESS : envoyé lorsque
le bouton droit est enfonçé.
SEL_RIGHTBUTTONRELEASE : envoyé lorsque
le bouton droit est relâché.
SEL_MOUSEWHEEL : envoyé lorsque la
roulette est activée.
Pour
les évènements de sélection suivants, la donnée du message est une instance de
FXEvent :
SEL_SELECTION_GAINED : envoyé lorsque la fenêtre acquiert la
sélection.
SEL_SELECTION_LOST : envoyé lorsque la fenêtre perd la
sélection.
SEL_SELECTION_REQUEST : envoyé lorsque
la sélection de la fenêtre est requise.
Pour les évènements presse-papiers, la donnée
du message est une instance de FXEvent :
SEL_CLIPBOARD_GAINED : envoyé lorsque la fenêtre
acquiert le presse-papiers.
SEL_CLIPBOARD_LOST : envoyé lorsque la
fenêtre perd le presse-papiers.
SEL_CLIPBOARD_REQUEST : envoyé lorsque la donnée du presse-papiers de la fenêtre est demandée.
Pour les évènements drag and drop, la donnée du
message est une instance de FXEvent :
SEL_BEGINDRAG :
envoyé au début de l'opération de tirage.
SEL_DRAGGED : envoyé pendant
l'opération DND (drag and drop, tirage et lachâge)
SEL_ENDDRAG : envoyé lors à la fin de
l'opération de tirage.
SEL_DND_ENTER : envoyé lors de l'entrée en
mode DND.
SEL_DND_LEAVE : envoyé lorsqu'on quitte le
mode DND.
SEL_DND_MOTION : envoyé lors du mouvement.
SEL_DND_DROP : envoyé lors du lachâge.
SEL_DND_REQUEST : envoyé lors de la demande de DND.
Module Responder2
Le
module Responder2 fournit la méthode 'connect' à toutes les classes qui ont une
cible message ( par ex. Fox::FXDataTarget, Fox::FXRecentFiles et
Fox::FXWindow).
Déclaration
:
connect(messageType,
callableObject=nil, &block)
Attribue
une "poignée" pour tous les messages FOX de type 'messageType' envoyé
de ce composant. Quand il est appelé avec seulement un argument, un bloc est
attendu :
aButton.connect(SEL_COMMAND) { |sender,
selector, data|
...code pour gérer cet événement...
}
Les
arguments passés dans le bloc sont l'expéditeur du message (le composant), le
sélecteur pour le message et d'éventuellees données spécifiques.
Quand
'connect' est appelé avec 2 arguments, le second argument doit être un objet
appelable tel qu'une méthode (Method ) ou procédure (Proc) d'instance :
aButton.connect(SEL_COMMAND,
method(:onCommand))
Comme
avec la forme à un argument, l'objet appelable doît être "appelé"
avec trois arguments (l'expéditeur, le sélecteur et les données du message).
Les constantes d'aspect des
composants visuels.
Constantes |
Composants gestionnaires |
Effet |
LAYOUT_SIDE_TOP (defaut) LAYOUT_SIDE_BOTTOMLAYOUT_SIDE_LEFT LAYOUT_SIDE_RIGHT |
FXPacker, FXGroupBox,
FXTopWindow,
seulement. |
Ces
options placent les composants enfants en haut, en bas, à gauche ou à droite
de l'espace du conteneur gestionnaire. |
LAYOUT_FILL_ROWLAYOUT_FILL_COLUMN |
FXMatrix
seulement. |
Suivant
le choix, c'est soit la ligne qui est étirée à chaque ajout de composant,
soit la colonne. |
LAYOUT_LEFT (defaut) LAYOUT_RIGHT |
Tous |
Les
composants seront placés à gauche ou à droite. Pour les enfants de FXPacker,
FXGroupBox ou FXTopWindow, le renseignement sera ignoré sauf si LAYOUT_SIDE_TOP
ou
LAYOUT_SIDE_BOTTOM est spécifié. |
LAYOUT_TOP (defaut) LAYOUT_BOTTOM |
Tous |
Les
composants sont placés en haut ou en bas du conteneur. Pour les enfants de
FXPacker etc.. le renseignement sera ignoré sauf si LAYOUT_SIDE_RIGHT ou
LAYOUT_SIDE_LEFT est spécifié. |
LAYOUT_FIX_XLAYOUT_FIX_Y |
Tous |
Place
le composant enfant à la coordonnée x et/ou y, spécifiée dans le
constructeur, dans le système de coordonnée
du parent.. |
LAYOUT_FIX_WIDTH
LAYOUT_FIX_HEIGHT |
Tous |
Donne
au composant enfant la largeur et /ou la hauteur, spécifiée dans le
constructeur. |
LAYOUT_MIN_WIDTH (defaut) LAYOUT_MIN_HEIGHT (defaut) |
Tous |
Utilisés
si LAYOUT_FIX_WIDTH ou LAYOUT_FIX_HEIGHT ne sont pas spécifiés. |
LAYOUT_CENTER_XLAYOUT_CENTER_Y |
Tous |
Le
composant sera centré horizontalement ou verticalement à l'intérieur du
composant parent. La taille du composant sera celle par défaut, sauf si sa
largeur ou sa hauteur a été spécifiée. |
LAYOUT_FILL_XLAYOUT_FILL_Y |
Tous |
Le
parent va étirer le composant de telle sorte qu'il remplisse l'espace
disponible, en largeur ou en hauteur. Pour plusieurs composants l'espace est
divisé proportionnellement à leuur taille par défaut. |
1.
PACK_UNIFORM_HEIGHT : impose
au composant conteneur de mettre ses enfants à
une hauteur identique. C'est le plus grand qui gagne...
2.
PACK_UNIFORM_WIDTH :
la même chose pour la largeur et c'est le plus large qui l'emporte.
Fin de ce livre.
Ce livre a pour source principale le travail de Lyle Johnson que l’on trouve dans la distribution de Ruby.
C’est la première publication de ce livre sur un site Web et il n’a été ni relu ni corrigé par quiconque et il en a certainement besoin… Certains passages sont d’ailleurs encore en caractères de couleur rouge parce que je ne savais comment les traduire correctement en français. Toutes les suggestions sont donc les bienvenues. Les critiques aussi, mais allez-y doucement tout de même…
Jean-Pierre
ANGHEL.
anghel-pierre@wanadoo.fr