Object +-- Widget +-- Editable +-- Text
Le widget Texte permet d'afficher et d'éditer un texte de plusieurs lignes. Il supporte à la fois les textes multicouleurs multi polices de caractères, permettant de les mélanger comme vous le souhaitez. Il existe aussi un large éventail de raccourcis claviers qui sont compatibles avec l'éditeur Emacs. Le widget Texte supporte les facilités de couper-coller incluant l'utilisation du double clic et du triple clic, pour sélectionner respectivement un mot ou une ligne complète.
Une seule fonction pour créer un nouveau widget Texte :
$text = new Gtk::Text( $hadj, $vadj );
Les arguments nous permettent de donner au widget Texte des ajustements qui peuvent être utilisés pour chercher à régler le widget. Si aucun valeur n'est passée en argument, la fonction \verb+new()+ choisira les siens.
$text->set_adjustments( $hadj, $vadj );
La fonction précédente permet aux ajustements horizontaux et verticaux d'être changés à n'importe quel moment. Le widget Texte ne créera pas automatiquement ses propres barres de défilements si la quantité de texte à afficher est trop grande pour la fenêtre. Nous aurons donc à les créer et à les ajouter nous même :
$vscrollbar = new Gtk::VScrollbar( $text->$vadj ); $hbox->pack_start( $vscrollbar, $false, $false, 0 ); $vscrollbar->show();
Le code ci-dessus crée une nouvelle barre de défilement à l'attache à l'ajustement vertical du widget Texte. Il est ensuite mis dans une boîte de manière classique. Souvent les widget Texte ne supportent pas les barres de défilements horizontales.
Il y a deux manières d'utiliser le widget Texte : permettre à l'utilisateur d'éditer un texte ou nous permettre d'afficher un texte multiligne pour l'utilisateur. Afin de passer d'un mode à l'autre, il y a la fonction :
$text->set_editable( $editable );
L'argument editable est une valeur vraie ou fausse qui précise si l'utilisateur
est autorisé ou non à éditer le contenu du widget Texte. Si le widget Texte
est éditable, un curseur est affiché au point d'insertion.
Vous n'êtes pas obligés de vous limiter à l'un de ces deux modes et vous pouvez changer d'état en cours d'utilisation.
Le widget Texte délimite les lignes de texte qui sont trop longues pour tenir sur une ligne d'affichage. Son comportement par défaut est de couper les mots au niveau du changement de ligne. Cela peut être changé par :
$text->set_word_wrap( $word_wrap );
Cette fonction nous permet de spécifier que le widget Texte doit délimiter les
lignes à la fin des mots. L'argument $word_wrap est une valeur vraie
ou fausse.
Vous pouvez également choisir le comportement d'une ligne quand elle atteint la fin du widget, sans s'occuper de la longueurs des mots avec :
$text->set_line_wrap( $line_wrap );
Le point d'insertion d'un widget texte peut être déclaré par :
$text->set_point( $index );
Ou $index correspond à la position du point d'insertion.
De manière analogue, on peut obtenir la position du point d'insertion à l'aide de :
$text->get_point();
Une fonction utile en combinaison avec les deux précédente :
$text->get_length();
qui retourne la longueur du widget texte. La longueur est le nombre de caractère
contenu dans le bloc texte incluant les caractères comme 'newline'.
Afin d'insérer du texte au point d'insertion, la fonction insert() est
utilisée ce qui permet aussi de préciser la couleur du fond, du texte et la
police.
$text->insert( $font, $foreground, $background, $string );
Le passage de valeurs indéfinies donnera que les valeurs contenues dans widget Style seront utilisées.
Le widget Texte est l'un des quelques widgets GTK qui change d'aspect dynamiquement
en dehors de main Gtk. Cela signifie que tout changement du contenu
du widget prend effet immédiatement. Cela peut être indésirable quand on pratique
de multiples changements sur un widget Texte. Afin de nous permettre de faire
plusieurs mises à jour au widget texte sans le redessiner continuellement, on
peut geler le widget ce qui l'empêche temporairement de se redessiner à chaque
changement. Nous pouvons alors redessiner le widget quand le mise à jour est
complète. Les fonctions qui permettent le changement d'état sont :
$tree->freeze() $tree->thaw();
Le texte est effacé relativement au point d'insertion à l'aide des fonctions suivantes :
$text->backward_delete( $num_chars ); $text->forward_delete( $num_chars );
Si vous désirez retrouver le contenu d'un widget Texte alors utiliser index($index)
qui vous permet de retrouver le caractère qui est la position $index.
Le widget Texte possède un nombre préinstallé de raccourcis pour les fonctions courantes d'édition et de sélection. On y accède avec une combinaison de touches Control et Alt.
En plus de tout cela, appuyer sur la touche Control tout en utilisant les touches de déplacement du curseur permet de faire des déplacements de mot en mot. Appuyer sur le touche Alt tout en bougeant le curseur étend la sélection.
Raccourcis de déplacements
Ctrl-A Début de ligneCtrl-E Fin de ligne
Ctrl-N Ligne suivante
Ctrl-P Ligne précédente
Ctrl-B Recule d'un caractère
Ctrl-F Avance d'un caractère
Alt-B Recule d'un mot
Alt-F Avance d'un mot
Raccourcis d'édition
Ctrl-H Efface le caractère précédentCtrl-D Efface le caractère suivant
Ctrl-W Efface le mot précédent
Alt-D Efface le mot suivant
Ctrl-K Efface jusqu'à la fin de la ligne
Ctrl-U Efface la ligne
Raccourcis de sélection
Ctrl-X CouperCtrl-C Copier
Ctrl-V Coller
#!/usr/bin/perl -wuse Gtk;
use strict;
init Gtk;
my $false = 0;
my $true = 1;
my $line;
my $window;
my $main_vbox;
my $vbox;
my $hbox;
my $button;
my $check;
my $separator;
my $table;
my $vscrollbar;
my $text;
my $cmap;
my $color;
my $fixed_font;
$window = new Gtk::Window( 'toplevel' );
$window->set_usize( 600, 500 );
$window->set_policy( $true, $true, $false );
$window->signal_connect( 'destroy', sub { Gtk->exit( 0 ); } );
$window->set_title( "Text Widget Example" );
$window->border_width( 0 );
$main_vbox = new Gtk::VBox( $false, 0 );
$window->add( $main_vbox );
$main_vbox->show();
$vbox = new Gtk::VBox( $false, 10 );
$vbox->border_width( 10 );
$main_vbox->pack_start( $vbox, $true, $true, 0 );
$vbox->show();
$table = new Gtk::Table( 2, 2, $false );
$table->set_row_spacing( 0, 2 );
$table->set_col_spacing( 0, 2 );
$vbox->pack_start( $table, $true, $true, 0 );
$table->show();
# Crée un nouveau widget GtkText
$text = new Gtk::Text( undef, undef );
$text->set_editable( $true );
$table->attach( $text, 0, 1, 0, 1, [ 'expand', 'shrink', 'fill' ], [ 'expand', 'shrink', 'fill' ], 0, 0 );
$text->show();
# Ajoute un barre de défilement verticale au widget Texte
$vscrollbar = new Gtk::VScrollbar( $text->vadj );
$table->attach( $vscrollbar, 1, 2, 0, 1, 'fill', [ 'expand', 'shrink', 'fill' ], 0, 0 );
$vscrollbar->show();
# Sollicite la carte couleur du système et alloue la couleur rouge
$cmap = Gtk::Gdk::Colormap->get_system();
$color->{ 'red' } = 0xFFFF;
$color->{ 'green' } = 0;
$color->{ 'blue' } = 0;
warn( "Couldn't allocate color\n" ) unless ( defined( $cmap->color_alloc( $color ) ) );
# Charge une police fixed
$fixed_font = Gtk::Gdk::Font->load("-misc-fixed-medium-r-*-*-*-140-*-*-*-*-*-*");
# Réaliser un widget crée une fenêtre pour lui,
# nous sommes prêts à insérer du texte.
$text->realize();
# Gèle le widget texte afin que l'on puisse faire les mises à jour.
$text->freeze();
# Insère du texte coloré
$text->insert( undef, $text->style->black, undef, "Supports " );
$text->insert( undef, $color, undef, "colored " );
$text->insert( undef, $text->style->black, undef, "text and different " );
$text->insert( $fixed_font, $text->style->black, undef, "fonts\n\n" );
#Charge le fichier text.c dans la fenêtre texte
open( FILE, "text" );
foreach $line ( <FILE> ) { $text->insert( $fixed_font, undef, undef, $line ); }
close( FILE );
# Dégel du widget texte ce qui rend les changements visibles
$text->thaw();
$hbox = new Gtk::HButtonBox();
$vbox->pack_start( $hbox, $false, $false, 0 );
$hbox->show();
$check = new Gtk::CheckButton( "Editable" );
$hbox->pack_start( $check, $false, $false, 0 );
$check->signal_connect( 'toggled', sub { $text->set_editable( $check->active ); } );
$check->set_active( $true );
$check->show();
$check = new Gtk::CheckButton( "Wrap Words" );
$hbox->pack_start( $check, $false, $true, 0 );
$check->signal_connect( 'toggled', sub { $text->set_word_wrap( $check->active ); } );
$check->set_active( $false );
$check->show();
$separator = new Gtk::HSeparator();
$main_vbox->pack_start( $separator, $false, $true, 0 );
$separator->show();
$vbox = new Gtk::VBox( $false, 10 );
$vbox->border_width( 10 );
$main_vbox->pack_start( $vbox, $false, $true, 0 );
$vbox->show();
$button = new Gtk::Button( "Close" );
$button->signal_connect( 'clicked', sub { Gtk->exit( 0 ); } );
$vbox->pack_start( $button, $true, $true, 0 );
$button->can_default( $true );
$button->grab_default();
$button->show();
$window->show();
main Gtk;
exit( 0 );