Avanti Indietro Indice

## 11. Widget "Testo" (Text Widget)

Il widget di testo permette di mostrare e modificare del testo disposto su più linee. Questo widget supporta sia la presenza di diversi colori che di diversi font contemporaneamente, permettendo di mischiarli nel modo in cui si desidera. Mette poi a disposizione un ampio gruppo di comandi basati sulla tastiera, che sono compatibili con Emacs.

Il widget di testo dà la possibilità di fare taglia e incolla in modo completo, compreso l'uso del doppio e triplo click per selezionare un'intera parola o un'intera linea.

## 11.1 Creazione e configurazione di una casella di testo

Esiste un'unica funzione per la creazione di un nuovo widget di testo:

> `

>     GtkWidget* gtk_text_new (GtkAdjustment *hadj,
>                              GtkAdjustment *vadj);

> `

Gli argomenti di questa chiamata ci permettono di assegnare dei puntatori a dei valori che stabiliscono il punto di vista del widget. Passare dei valori NULL all'uno o all'altro o ad entrambi questi argomenti, fà sì che gtk_text_new li crei automaticamente.

> `

>     void gtk_text_set_adjustments (GtkText       *text,
>                                    GtkAdjustment *hadj,
>                                    GtkAdjustment *vadj);

> `

La funzione precedente permette di cambiare gli aggiustamenti orizzontale e verticale di un widget di testo i ogni momento.

Il widget di testo non \ di creare delle barre di scorrimento quando la quantità è troppo grande per la finestra. Dobbiamo quindi crearle e aggiungerle alla finestra noi stessi.

> `

>       vscrollbar = gtk_vscrollbar_new (GTK_TEXT(text)->vadj);
>       gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0);
>       gtk_widget_show (vscrollbar);

> `

Il pezzetto di codice precedente crea una nuova barra di scorrimento verticale e la collega all'aggiustamento verticale del widget di testo, `text`, dopodiché la impacchetta nella hbox al solito modo.

Ci sono due modi principali di utilizzo di un widget di testo: per permettere all'utente di editare del testo, oppure per permettere a noi di mostrare all'utente del testo disposto su più righe. Per passare dall'una all'altra di queste modalità, il widget di testo ci mette a disposizione la seguente funzione:

> `

>     void gtk_text_set_editable    (GtkText *text,
>                                    gint    editable);

> `

L'argomento `editable` è un valore TRUE o FALSE che specifica se l'utente può modificare o meno il contenuto del widgte. Quando il widget è modificabile, mostrerà un cursore nel punto di inserimento corrente.

Niente però vi obbliga ad usare il widget di testo in questi due soli modi. Si può passare dall'una all'altra delle due modalità in qualsiasi momento, e si può inserire del testo in ogni momento.

Il widget di testo è in grado di andare a capo automaticamente quando delle linee di testo sono troppo lunghe per stare su una sola linea della finestra. Il comportamento predefinito è di andare a capo automaticamente al termine della linea. Questo può essere cambiato con la seguente funzione:

> `

>     void gtk_text_set_word_wrap (GtkText *text,
>                                  gint    word_wrap);

> `

L'uso di questa funzione ci permette di specificare se il widget di testo deve spezzare o no le linee lunghe ai bordi della finestra. L'argomento `word_wrap` è un valore di tipo TRUE o FALSE.

## 11.2 Manipolazione del testo

Il punto di inserimento corrente del widget può essere stabilito usando

> `

>     void gtk_text_set_point (GtkText *text,
>                              guint   index);

> `

in cui `index` è la posizione in cui mettere il punto di inserimento.

La funzione per ottenere la posizione di inserimento corrente è analoga:

> `

>     guint gtk_text_get_point (GtkText *text);

> `

Una funzione che è utile in combinazione con le precedenti due è

> `

>     guint gtk_text_get_length (GtkText *text);

> `

la quale restituisce la lunghezza corrente del widget di testo. La lunghezza è definita come il numero di caratteri che si trovano nel blocco di testo della finestra, compresi i caratteri tipo CR, che marcano la fine delle linee.

Per inserire del testo alla posizione corrente del widget di testo, si usa la funzione gtk_text_insert, che permette anche di specificare i colori di primo piano e di sfondo per il testo, oltre al font da usare.

> `

>     void gtk_text_insert (GtkText    *text,
>                           GdkFont    *font,
>                           GdkColor   *fore,
>                           GdkColor   *back,
>                           const char *chars,
>                           gint       length);

> `

Passare un valore di NULL come valore per il colore di primo piano (fore), di sfondo (back) o per il font, farà sì che vengano usati i valori che sono specifici dello stile del widget. Usare un valore di `-1` per il parametro lunghezza (length) avrà come risultato l'inserzione dell'intera stringa di testo.

Il widget di testo è uno dei pochi in GTK che vengono disegnati dinamicamente, fuori dalla funzione gtk_main. Ciò significa che tutti i cambiamenti al suo contenuto avranno effetto immediato. Questo può essere un comportamento indesiderabile quando si stanno facendo delle modifiche multiple al contenuto del widget. Per permettere di operare cambiamenti multipli sul widget senza che esso si ridisegni continuamente, si può congelare il contenuto della finestra, in modo che esso interrompa temporaneamente di ridisegnarsi. Potremo poi sbloccare il widget una volta che tutte le modifiche sono state completate.

Le due seguenti funzioni fanno il congelamento e lo sbloccaggio (thaw) del widget:

> `

>     void gtk_text_freeze (GtkText *text);
>     void gtk_text_thaw   (GtkText *text);

> `

Il testo può essere cancellato nel widget di testo a partire dal punto di inserimento corrente usando le seguenti due funzioni, andando all'indietro (backward) o all'avanti (forward):

> `

>     gint gtk_text_backward_delete (GtkText *text,
>                                    guint   nchars);
>     gint gtk_text_forward_delete  (GtkText *text,
>                                    guint   nchars);

> `

Quando si vuole recuperare il contenuto del widget di testo, è disponibile la macro `GTK_TEXT_INDEX(t, index)`, che permette di ottenere il crattere alla posizione `index` all'interno del widget `t`.

Per ecuperare un blocco di testo più ampio, si usa la funzione:

> `

>     gchar *gtk_editable_get_chars (GtkEditable *editable,
>                                    gint        start_pos,
>                                    gint        end_pos);

> `

Questa è una funzione della classe madre del widget di testo. Un valore di -1 per `end_pos`, sta ad indicare la fine del testo. L'indice per il testo parte da 0.

Questa funzione alloca una nuova porzione di memoria per il blocco di testo, per cui non dimenticate di liberarla con una chiamata a g_free quando non ne avete più bisogno.

## 11.3 Keyboard Shortcuts

Il widget di testo mette a disposizione un certo numero di scorciatoie da tastiera per le più comuni operazioni di modifica, movimento e selezione. Si possono utilizzare con delle combinazioni che comprendono i tasti Control e Alt.

Oltre a queste, mantenendo premuto il pulsante Control mentre si usano i tasti di movimento del cursore, causerà lo spostamento parola per parola invece che carattere per carattere. Mantenere invece premuto il tasto Shift mentre si sposta il cursore, causerà l'estensione della selezione.

### Scorciatoie per il movimento

- Ctrl-A Inizio della linea
- Ctrl-E Fine della linea
- Ctrl-N Prossima linea
- Ctrl-P Linea precedente
- Ctrl-B Indietro di un carattere
- Ctrl-F Avanti di un carattere
- Alt-B Indietro di una parola
- Alt-F Avanti di una parola

### Scorciatoie per la modifica

- Ctrl-H Cancella il carattere precedente (Backspace)
- Ctrl-D Cancella il carattere successivo (Delete)
- Ctrl-W Cancella la parola precedente
- Alt-D Cancella la parola successiva
- Ctrl-K Cancella fino alla fine della linea
- Ctrl-U Cancella la linea

### Scorciatoie per la selezione

- Ctrl-X Taglia
- Ctrl-C Copia
- Ctrl-V Incolla

Avanti Indietro Indice