GTK-Workshop VI: Scrollbars und Textboxes
Vorwort
Im letzten Teil des GTK-Workshops ging es um Adjustments. In diesem Kapitel kamen aber auch schon Widgets zur Sprache, von denen noch keine Rede war. Das waren Textboxen und Scrollbars. Ich werde beide in einem Teil erklären, da sie eng miteinander zu tun haben, oder können Sie eine Textbox gebrauchen, wo keine Scrollbar dran ist? Also! In diesem Teil werden wir uns zuerst mit den Textboxen beschäftigen.
Textboxen erstellen
Wie immer werde ich Ihnen erst einmal sagen, wie das Widget erstellt wird, über das wir gerade reden. Dazu ist folgende Funktion nicht schlecht:
GtkWidget* gtk_text_new (GtkAdjustment *hadj, GtkAdjustment *vadj);
hadj ist der Parameter, wo das Adjustment angegeben wird, welches für das horizontale Scrollen zuständig ist. Hier kann NULL angegeben werden, um die Textbox dazu zu veranlassen, ihr eigenes Adjustment zu erstellen. An dieses kann dann evtl. eine Scrollbar oder ein Spinbutton angehängt werden, um das Adjustment zu regulieren und somit die Textbox zu scrollen. Das gleiche gilt für den vadj-Parameter, nur ist er für das Scrollen in vertikaler Richtung zuständig.
Einstellungen für die Textbox
Es stehen viele Dinge zur Verfügung, um eine Textbox zu konfigurieren. Ein Blick in /usr/inlcude/gtk/gtktext.h vermag fast Schrecken aufkommen zu lassen, wieviele verschiedene Funktionen es gibt. Hinweis: es lassen sich zu jedem Widget viele Funktionen herausfinden, indem man einen Blick in /usr/include/gtk/gtk[widgetname].h wirft. Jetzt wieder zurück zum Thema:
Es läßt sich für Textboxen ändern, ob sie editierbar sind oder nicht, was nützlich sein kann, wenn eine Textbox nur zur Anzeige von z.B. einer Hilfedatei da ist und der User dort nichts reinschreiben soll. Das bewirkt man mit folgender Funktion:
void gtk_text_set_editable (GtkText *text, gboolean editable);
wobei text natürlich die Textbox ist, für die die Einstellung geändert werden soll, und editable entweder TRUE, für editierbar, oder FALSE, für nicht-editierbar, sein kann.
Es ist auch möglich, bei einer Textbox zu ändern, ob irgendwo im Text umgebrochen werden soll, oder ob dabei Wörter beachtet werden und erst nach ihnen umgebrochen wird. Dazu ist folgende Funktion da:
void gtk_text_set_word_wrap (GtkText *text, gint word_wrap);
Hier gilt wieder: text ist die Textbox und word_wrap ist entweder TRUE, wobei auf Wörter geachtet wird, oder FALSE, wobei auch in den Wörtern umgebrochen wird.
Weiterhin ist änderbar, ob überhaupt ein Umbruch stattfindet. Dies wird mit folgender Funktion verwirklicht:
void gtk_text_set_line_wrap (GtkText *text, gint line_wrap);
text ist wieder die Textbox und line_wrap ist wieder entweder TRUE, wobei umgebrochen wird, oder FALSE, womit Sie die Textbox nie und nimmer zum Umbrechen bringen werden, es sei denn, Sie wenden diese Funktion wieder an und benutzen TRUE *g*.
Nun kann es auch ausgesprochen nützlich sein, von der Textbox die Adjustments zu ändern. Sie möchten zum Beispiel die Textbox von einer Scrollbar scrollen lassen, und wenn der User es in den Einstellungen ändert, soll die Textbox über eine andere Scrollbar gescrollt werden. Die Funktion kann auch Nutzen erweisen, wenn Sie die Textbox ihre eigenen Adjustments erstellen lassen und danach richtige Widgets dafür festlegen. Hier jedenfalls kommt die Funktion:
void gtk_text_set_adjustments (GtkText *text, GtkAdjustment *hadj, GtkAdjustment *vadj);
text ist die Textbox, von der die Adjustments geändert werden sollen, hadj ist das für das horizontale Scrollen zuständige Adjustment und vadj ist für das vertikale Scrollen zuständig. Wenn Sie nur ein Adjustment neu vergeben möchten, dann können Sie für das andere einfach NULL einsetzen.
Man kann auch die Position der Eingabemarke verändern, vielleicht um den Benutzer zu ärgern, indem sie, wenn er die Eingabemarke mit der Tastatur oder Maus verrückt, von dem Programm in die genau entgegengesetzte Richtung geschoben wird. :-) Und hier ist die Funktion:
void gtk_text_set_point (GtkText *text, guint index);
text ist die Textbox und index ist die Position, an die der Cursor geschoben werden soll.
Daten von der Textbox holen
Wenn wir schon Einstellungen ändern können, wollen wir natürlich im Laufe des Programmes auch irgendwo herausfinden, welche Einstellungen gerade gemacht sind. Sicherlich wäre es doch schön zu wissen, an welcher Stelle der Cursor gerade steht, damit er in die entgegengesetzte Richtung verfrachtet werden kann (um wieder beim obigen Beispiel zu sein). Um herauszufinden, an welcher Stelle der Cursor steht, benutzt man folgende Funktion:
guint gtk_text_get_point (GtkText *text);
In dieser Funktion ist text wieder das GtkText-Widget (die Textbox). Diese Funktion gibt dann einen guint (das gleiche wie unsigned int) zurück, welcher die Position des Cursors darstellt.
Um herauszufinden, wie lang der Text ist, der in der Textbox steht, nimmt man die folgende Funktion:
guint gtk_text_get_length (GtkText *text);
text ist wieder die Textbox. Die Funktion gibt einen guint zurück, welcher die Anzahl der Zeichen im Text in der Textbox enthält.
Da ein GtkText-Widget auch ein GtkEditable ist, können wir auch dessen Funktionen benutzen :-). Mit der folgenden Funktion lässt sich eine bestimmte Zeichenfolge auslesen:
gchar* gtk_editable_get_chars (GtkEditable *editable, gint start_pos, gint end_pos);
Hier ist editable die TextBox. Achten Sie bitte darauf, daß Sie hier keinen GtkText übergeben dürfen, sondern unbedingt Ihre Text-Box nach GtkEditable casten. Das geht, wenn Sie GTK_EDITABLE(ihre_textbox) übergeben. start_pos ist die Anfangsposition, an der die auszulesende Zeichenfolge beginnt. end_pos ist die Endposition der Zeichenfolge. Die Funktion liefert uns dann einen String zurück.

