Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 15 GTK+
  gp 15.1 Was ist GTK+?
    gp 15.1.1 Was sind GDK und Glib?
    gp 15.1.2 Schnittstellen von GTK+ zu anderen Programmiersprachen
    gp 15.1.3 GTK+ und GNOME
    gp 15.1.4 GTK+ Version 1.2 und 2.x
    gp 15.1.5 GTK+-Aufbau des Kapitels
  gp 15.2 GTK+-Anwendungen übersetzen
  gp 15.3 Eine Einführung in die Glib-Bibliothek
    gp 15.3.1 Datentypen
    gp 15.3.2 Routinen
    gp 15.3.3 Assertions-Funktionen
    gp 15.3.4 Speicherverwaltung
    gp 15.3.5 Stringbearbeitung
    gp 15.3.6 Selbstverwaltender Stringpuffer
    gp 15.3.7 Timer
    gp 15.3.8 Dynamische Arrays
    gp 15.3.9 Listen, Hashtabellen und binäre Bäume
    gp 15.3.10 Ausblick Glib
  gp 15.4 Grundlagen der GTK+-Programmierung
    gp 15.4.1 Die Umgebung initialisieren
    gp 15.4.2 Widgets erzeugen und ggf. die Attribute setzen
    gp 15.4.3 Eine Callback-Funktion einrichten, um Events abzufangen
    gp 15.4.4 Eine GTK+-Anwendung beenden
    gp 15.4.5 Die hierarchische Anordnung der Widgets definieren
    gp 15.4.6 Widgets anzeigen
    gp 15.4.7 Signale und Events abfangen und bearbeiten – (Events-)Verarbeitungsschleife
    gp 15.4.8 GTK+ und Umlaute (Zeichenkodierung)
  gp 15.5 Fenster – GtkWindow
    gp 15.5.1 Dialogfenster (Dialogboxen)
    gp 15.5.2 GtkMessageDialog
  gp 15.6 Anzeige-Elemente
    gp 15.6.1 Text – GtkLabel
    gp 15.6.2 Trennlinie – GtkSeparator
    gp 15.6.3 Grafiken – GtkImage
    gp 15.6.4 Statusleiste – GtkStatusbar
    gp 15.6.5 Fortschrittsbalken – GtkProgressBar
  gp 15.7 Behälter
    gp 15.7.1 Boxen – GtkBox
    gp 15.7.2 Aufteilungen, Register und Button-Box
    gp 15.7.3 Tabellen – GtkTable
    gp 15.7.4 Ausrichtung – GtkAlignment
  gp 15.8 Buttons und Toogled-Buttons
    gp 15.8.1 Buttons allgemein
    gp 15.8.2 Radio-Buttons (GtkRadioButton)
    gp 15.8.3 GtkRadioButton, GtkCheckButton und GtkToggleButton
    gp 15.8.4 Signale für Buttons (GtkButton)
  gp 15.9 Dateneingabe
    gp 15.9.1 Textfelder – GtkEntry
    gp 15.9.2 Schieberegler – GtkScale
    gp 15.9.3 Zahlenfelder – GtkSpinButton
    gp 15.9.4 Einstellungen – GtkAdjustment
    gp 15.9.5 GtkEditable
  gp 15.10 Menü und Toolbar
    gp 15.10.1 Menü – GtkItemFactory
    gp 15.10.2 Toolbar – GtkToolbar
    gp 15.10.3 Options-Menü – GtkOptionsMenu
    gp 15.10.4 Combo-Boxen – GtkCombo
  gp 15.11 Mehrzeiliger Text
    gp 15.11.1 Text(editor) – GtkTextView, GtkTextBuffer
    gp 15.11.2 Scrollendes Fenster – GtkScrolledWindow
  gp 15.12 Auswählen (Selection)
    gp 15.12.1 Dateiauswahl – GtkFileSelection
  gp 15.13 Events
  gp 15.14 Weitere Widget- und GTK+-Elemente im Überblick


Rheinwerk Computing

15.11 Mehrzeiliger Text  downtop

Das Text-Widget-System von GTK+ ist so umfangreich, dass selbst dieser Abschnitt hier nicht einmal ein Anriss dessen ist, was es bietet. Dennoch soll hier wenigstens ein Überblick zu den Widgets gegeben werden, damit Sie mit mithilfe der Referenz wissen, wo Sie was finden bzw. wonach Sie Ausschau halten müssen.

Grundsätzlich unterscheidet man dabei zwischen dem sichtbaren Bereich und dem internen Bereich (wie dem Textpuffer). Um überhaupt einen Text darstellen zu können, benötigen Sie mindestens das Widget zur Textansicht (GtkTextView; Typenkennung: GTK_TYPE_TEXT_VIEW) und das Widget zum Textpuffer (GtkTextBuffer; Typenkennung: GTK_TYPE_TEXT_BUFFER).

Weitere Widgets, die in Verbindung mit dem Textpuffer (GtkTextBuffer) verwendet werden, sind:

gp  GtkTextIter – Text-Iteratoren werden verwendet, wenn eine Position in einem Textpuffer dargestellt werden muss – genauer eine Stelle zwischen zwei Zeichen (Typenkennung: GTK_TYPE_TEXT_ITER).
gp  GtkTextMark – Ebenso wie die Iteratoren werden Marken dazu verwendet, um eine bestimmte Position zwischen zwei Zeichen darzustellen. Im Gegensatz zu den Iteratoren ist es mit Marken möglich, eine Textposition dauerhaft festzuhalten. Das hat zur Folge, dass selbst bei einer Änderung des Puffers die Marke nicht ungültig wird. Eine Marke ist ein unsichtbarer Cursor im Text (Typenkennung: GTK_TYPE_TEXT_MARK).
gp  GtkTextTag – Hiermit werden Informationen zur Formatierung oder zu anderen Eigenschaften des Textes eingestellt und in einem Tag gespeichert. Ein Tag legt einen Satz von Eigenschaften für einen Text fest und kann sich auch nur auf Teilstücke des Textes beziehen (Typenkennung: GTK_TYPE_TEXT_TAG).
gp  GtkTextTagTable – Eine Sammlung von Tags, die alle zusammen verwendet werden können (Typenkennung: GTK_TYPE_TEXT_TAG_TABLE).
gp  GtkClipboard – Es handelt sich hierbei zwar nicht um ein direktes Widget in Verbindung mit den Text-Widgets, doch sollte das Widget hier erwähnt werden (Typenkennung: GTK_TYPE_CLIPBOARD), da es hier auch einige Funktionen gibt, die eine Schnittstelle zwischen dem Textpuffer und der Zwischenablage bieten.

Zur Demonstration folgt hier ein minimalistisches Beispiel zum GtkTextView- und GtkTextBuffer-Widget.

/* gkt7.c */
/* Mehrzeiliger Text     */
/*        GtkTextView    */
/*        GtkTextBuffer  */
/*        GtkScrolledWindow */
#include <gtk/gtk.h>
/* Funktionsprototypen */
static GtkWindow *create_window (void);
static void create_tags (GtkTextBuffer * buffer);
static void on_button_clear_clicked (
                   GtkButton * button, gpointer user_data );
static void on_button_cut_clicked (
                   GtkButton * button, gpointer user_data );
static void on_button_copy_clicked (
                   GtkButton * button, gpointer user_data );
static void on_button_paste_clicked (
                   GtkButton * button, gpointer user_data);
static void on_button_bold_clicked (
                   GtkButton * button, gpointer user_data);
static void on_button_underline_clicked (
                   GtkButton * button, gpointer user_data);
static void on_button_strike_clicked (
                   GtkButton * button, gpointer user_data );
static void on_button_color_clicked (
                   GtkButton * button, gpointer user_data );
static GtkWindow *create_window (void) {
  GtkWindow *window;
  GdkPixbuf  *pic;
  GtkVBox *vbox_main;
  GtkToolbar *toolbar;
  GtkWidget *button_clear, *button_cut, *button_copy,
  *button_paste, *button_bold, *button_underline,
  *button_strike, *button_color;
  GtkScrolledWindow *scrolledwindow;
  GtkTextView *textview;
  GtkTextBuffer *buffer;
  /* Eine Grafik in einen Pixbuf laden */
  pic = gdk_pixbuf_new_from_file("icon/at-work.gif", NULL );
  /* Fenster mit folgenden Eigenschaften anlegen */
  window = g_object_new( GTK_TYPE_WINDOW,
                         "title", "Textansicht und Textpuffer",
                         "default-width",  300,
                         "default-height", 200,
                         "resizable", TRUE,
                         "window-position", GTK_WIN_POS_CENTER,
                         "border-width", 0,
                         "icon", pic,
                         NULL );
  /* eine vertikale Box erzeugen */
  vbox_main = g_object_new( GTK_TYPE_VBOX,
                            "spacing", 0,
                            NULL);
  /* Eine neue Toolbar erzeugen */
  toolbar = g_object_new (GTK_TYPE_TOOLBAR,  NULL);
  /* Buttons mit Stock-Icons für die Toolbar erzeugen */
  button_clear=gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
                                        "gtk-clear",
                                        "Text loeschen",
                                        NULL,NULL,NULL,-1);
  button_cut = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
                                        "gtk-cut",
                                        "Text ausschneiden",
                                        NULL, NULL, NULL, -1);
  button_copy=gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
                                        "gtk-copy",
                                        "Text kopieren",
                                        NULL, NULL, NULL, -1);
  button_paste=gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
                                        "gtk-paste",
                                        "Text einfuegen",
                                        NULL, NULL, NULL, -1);
  gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
  button_bold=gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
                                        "gtk-bold",
                                        "Fette Schriftart",
                                        NULL, NULL, NULL, -1);
  button_underline=gtk_toolbar_insert_stock(
                                        GTK_TOOLBAR (toolbar),
                                        "gtk-underline",
                                        "Schrift unterstreichen",
                                        NULL, NULL, NULL, -1);
  button_strike=gtk_toolbar_insert_stock(GTK_TOOLBAR (toolbar),
                                        "gtk-strikethrough",
                                        "Schrift durchstreichen",
                                        NULL, NULL, NULL, -1);
  button_color=gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
                                        "gtk-select-color",
                                        "farbige Schrift (Blau)",
                                        NULL, NULL, NULL, -1);
  /* Rollbalken erzeugen */
  scrolledwindow = g_object_new( GTK_TYPE_SCROLLED_WINDOW,
                     "hscrollbar_policy", GTK_POLICY_AUTOMATIC,
                     "vscrollbar_policy", GTK_POLICY_AUTOMATIC,
                     "window_placement" , GTK_CORNER_TOP_LEFT,
                     NULL);
  /* Eine Textansicht erzeugen */
  textview = g_object_new( GTK_TYPE_TEXT_VIEW, NULL);
  /* Aktuellen Puffer für die Textansicht ermitteln */
  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
  /* Einige einfache Tags zur Formatierung anlegen */
  create_tags (buffer);
  /* Signalhandler einrichten */
  g_signal_connect ( (gpointer) window, "delete_event",
                     G_CALLBACK (gtk_main_quit), NULL);
  g_signal_connect ( (gpointer) button_clear, "clicked",
                     G_CALLBACK (on_button_clear_clicked),
                     (gpointer) textview);
  g_signal_connect ( (gpointer) button_cut, "clicked",
                     G_CALLBACK (on_button_cut_clicked),
                     (gpointer) textview);
  g_signal_connect ( (gpointer) button_copy, "clicked",
                     G_CALLBACK (on_button_copy_clicked),
                     (gpointer) textview);
  g_signal_connect ( (gpointer) button_paste, "clicked",
                     G_CALLBACK (on_button_paste_clicked),
                     (gpointer) textview);
  g_signal_connect ( (gpointer) button_bold, "clicked",
                     G_CALLBACK (on_button_bold_clicked),
                     (gpointer) textview);
  g_signal_connect ( (gpointer) button_underline, "clicked",
                     G_CALLBACK (on_button_underline_clicked),
                     (gpointer) textview);
  g_signal_connect ( (gpointer) button_strike, "clicked",
                     G_CALLBACK (on_button_strike_clicked),
                     (gpointer) textview);
  g_signal_connect ( (gpointer) button_color, "clicked",
                     G_CALLBACK (on_button_color_clicked),
                     (gpointer) textview);
  /* Alles packen */
  gtk_container_add ( GTK_CONTAINER(window),
                      GTK_WIDGET(vbox_main));
  gtk_box_pack_start ( GTK_BOX (vbox_main),
                       GTK_WIDGET(toolbar),
                       FALSE, FALSE,0);
  gtk_box_pack_start ( GTK_BOX (vbox_main),
                       GTK_WIDGET(scrolledwindow),
                       TRUE,TRUE, 0);
  gtk_container_add ( GTK_CONTAINER (scrolledwindow),
                      GTK_WIDGET(textview) );
  /* Erzeugtes Fenster zurückgegeben */
  return window;
}
/* "Markierten" Text im Puffer löschen */
static void
on_button_clear_clicked(GtkButton * button, gpointer user_data) {
  GtkTextBuffer *textbuffer = NULL;
  g_assert (GTK_IS_TEXT_VIEW (user_data));
  /* Aktuellen Puffer für die Textansicht ermitteln */
  textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(user_data));
  /* Markierten Text löschen */
  gtk_text_buffer_delete_selection (textbuffer, TRUE, TRUE);
}
/* Text ausschneiden und in Zwischenablage legen */
static void
on_button_cut_clicked (GtkButton * button, gpointer user_data) {
  GtkTextBuffer *textbuffer = NULL;
  g_assert (GTK_IS_TEXT_VIEW (user_data));
  /* Aktuellen Puffer für die Textansicht ermitteln */
  textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(user_data));
  /* Text im Puffer löschen und in Zwischenablage legen */
  gtk_text_buffer_cut_clipboard (textbuffer,
                             gtk_clipboard_get (GDK_NONE), TRUE);
}
/* Text vom Puffer kopieren und in Zwischenablage legen */
static void
on_button_copy_clicked (GtkButton * button, gpointer user_data) {
  GtkTextBuffer *textbuffer = NULL;
  g_assert (GTK_IS_TEXT_VIEW (user_data));
  /* Aktuellen Puffer für die Textansicht ermitteln */
  textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(user_data));
  /* Text im Puffer in die Zwischenablage kopieren */
  gtk_text_buffer_copy_clipboard (textbuffer,
                                  gtk_clipboard_get (GDK_NONE));
}
/* Text aus der Zwischenablage in den Puffer legen */
static void
on_button_paste_clicked(GtkButton * button, gpointer user_data) {
  GtkTextBuffer *textbuffer = NULL;
  g_assert (GTK_IS_TEXT_VIEW (user_data));
  /* Aktuellen Puffer für die Textansicht ermitteln */
  textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(user_data));
  /* Text aus der Zwischenablage  (falls vorhanden) */
  /*  in den Puffer kopieren                        */
  gtk_text_buffer_paste_clipboard (textbuffer,
                                   gtk_clipboard_get (GDK_NONE),
                                   NULL, TRUE);
}
/* Markierten Text im Puffer in Fett-Schrift darstellen */
static void
on_button_bold_clicked (GtkButton * button, gpointer user_data) {
  GtkTextBuffer *textbuffer = NULL;
  GtkTextIter start, end;
  g_assert (GTK_IS_TEXT_VIEW (user_data));
  /* Aktuellen Puffer für die Textansicht ermitteln */
  textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(user_data));
  /* Markierte Auswahl im Puffer ermitteln */
  gtk_text_buffer_get_selection_bounds(textbuffer,&start, &end);
  /* Markierte Auswahl im Puffer mit neuer Formatierung */
  /* belegen                                            */
  gtk_text_buffer_apply_tag_by_name ( textbuffer, "bold",
                                      &start, &end);
}
/* Markierten Text im Puffer mit Unterstrich darstellen */
static void
on_button_underline_clicked ( GtkButton * button,
                              gpointer user_data ) {
  GtkTextBuffer *textbuffer = NULL;
  GtkTextIter start, end;
  g_assert (GTK_IS_TEXT_VIEW (user_data));
  /* Aktuellen Puffer für die Textansicht ermitteln */
  textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(user_data));
  /* Markierte Auswahl im Puffer ermitteln */
  gtk_text_buffer_get_selection_bounds (textbuffer,&start,&end);
  /* Markierte Auswahl im Puffer mit neuer Formatierung */
  /*  belegen                                           */
  gtk_text_buffer_apply_tag_by_name ( textbuffer, "underline",
                                      &start, &end);
}
/* Markierten Text im Puffer durchstreichen */
static void
on_button_strike_clicked(GtkButton *button, gpointer user_data) {
  GtkTextBuffer *textbuffer = NULL;
  GtkTextIter start, end;
  g_assert (GTK_IS_TEXT_VIEW (user_data));
  /* Aktuellen Puffer für die Textansicht ermitteln */
  textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(user_data));
  /* Markierte Auswahl im Puffer ermitteln */
  gtk_text_buffer_get_selection_bounds(textbuffer,&start,&end);
  /* Markierte Auswahl im Puffer mit neuer Formatierung */
  /* belegen                                            */
  gtk_text_buffer_apply_tag_by_name ( textbuffer, "strike",
                                      &start, &end);
}
/* Markierten Text im Puffer mit neuer Farbe */
/* (hier Blau) versehen                      */
static void
on_button_color_clicked(GtkButton * button, gpointer user_data) {
  GtkTextBuffer *textbuffer = NULL;
  GtkTextIter start, end;
  g_assert (GTK_IS_TEXT_VIEW (user_data));
  /* Aktuellen Puffer für die Textansicht ermitteln */
  textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(user_data));
  /* Markierte Auswahl im Puffer ermitteln */
  gtk_text_buffer_get_selection_bounds (textbuffer,&start,&end);
  /* Markierte Auswahl im Puffer mit neuer Formatierung */
  /* belegen                                            */
  gtk_text_buffer_apply_tag_by_name ( textbuffer, "color",
                                      &start, &end);
}
/* Einige Textformatierungen (Tags) erstellen */
static void create_tags (GtkTextBuffer * buffer) {
  g_assert (GTK_IS_TEXT_BUFFER (buffer));
  /* Fette Schrift */
  gtk_text_buffer_create_tag (buffer, "bold",
                              "weight", PANGO_WEIGHT_BOLD, NULL);
  /* Unterstrichene Schrift */
  gtk_text_buffer_create_tag (buffer, "underline",
                             "underline", PANGO_UNDERLINE_SINGLE,
                             NULL);
  /* Durchgestrichene Schrift */
  gtk_text_buffer_create_tag (buffer, "strike",
                              "strikethrough", TRUE,
                              NULL);
  /* Schrift in blauer Farbe */
  gtk_text_buffer_create_tag (buffer, "color",
                              "foreground", "blue",
                              NULL);
}
int main (int argc, char **argv) {
  GtkWindow *window;
  gtk_init (&argc, &argv);
  window = create_window ();
  gtk_widget_show_all (GTK_WIDGET(window));
  gtk_main ();
  return 0;
}

Das Programm bei der Ausführung:

$ gcc -Wall -o gtk7 gtk7.c `pkg-config gtk+-2.0 --cflags --libs`
$ ./gtk7

Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 15.16    Ein einfacher Texteditor



Hinweis   Aus drucktechnischen Gründen wurde die Toolbar des Listings auf dem Screenshot mit der Eigenschaft "toolbar-style", GTK_TOOLBAR_ICONS versehen, also ohne den Text unter dem Icon.



Rheinwerk Computing

15.11.1 Text(editor) – GtkTextView, GtkTextBuffer  downtop

Zur Ansicht des Textes auf dem Bildschirm (im Fenster) wird das Widget der Klasse GtkTextView verwendet (Typenkennung: GTK_TYPE_TEXT_VIEW). Im Beispiel wird gleich nach der Erzeugung des sichtbaren Text-Widgets eine Verbindung zum Puffer GtkTextBuffer mit der Funktion gtk_text_view_get_buffer() hergestellt.

GtkTextBuffer* gtk_text_view_get_buffer (GtkTextView *text_view);

Diese Funktion gibt einen Puffer (GtkTextBuffer) unter Angabe des sichtbaren Textfeldes (erstes und einziges Argument) zurück. Mithilfe dieses Puffers werden anschießend mit der Funktion create_tags() einige einfache Tags festgelegt.

Einen solchen Tag können Sie recht einfach mit der Funktion gtk_text_buffer_create_tag() erstellen.

GtkTextTag* gtk_text_buffer_create_tag (
                         GtkTextBuffer *buffer,
                         const gchar *tag_name,
                         const gchar *first_property_name, ...);

Als erstes Argument wird der Puffer erwartet, auf den sich die neue Formatierung beziehen soll. Als zweites Argument legen Sie den Tag-Namen fest, auf den Sie im Laufe der Anwendung zurückgreifen können. Es kann aber auch mit NULL ein anonymes Tag erstellt werden. Jetzt folgt eine mit NULL abgeschlossene Liste von Eigenschaften mit Namen-/Wertepaaren, wie Sie diese schon beim Erstellen vieler anderer Widgets verwendet haben. Hierzu einige wenige der über 60 (!) Eigenschaften, mit denen Sie den Text entsprechend formatieren können.


Tabelle 15.25    Einige der über 60 Eigenschaften von Tags

Eigenschaft Datentyp Bedeutung
"name" gchararray Bezeichner des Tags (kann nicht mehr nachträglich geändert werden)
"background" gchararray Hintergrundfarbe
"foreground" gchararray Vordergrundfarbe
"font" gchararray Schriftbeschreibung
"family" gchararray Schriftname
"style"   Schriftneigung, mögliche Werte: PANGO_STYLE_NORMAL – normal PANGO_STYLE_OBLIQUE – geschrägt PANGO_STYLE_ITALIC – kursiv
"weight" gint Schriftstärke
"size" gint Schriftgröße (Pixel)
"size-points" gdouble Schriftgröße (Punkte)
"scale" gdouble Schriftgröße relativ zum umgebenden Text
"strikethrough" gboolean bei TRUE ist der Text durchgestrichen
"underline"   Text unterstreichen, mögliche Werte: PANGO_UNDERLINE_NONE – gar nicht PANGO_UNDERLINE_SINGLE – einfach PANGO_UNDERLINE_DOUBLE – doppelt PANGO_UNDERLINE_LOW – tief
"invisible" gboolean bei TRUE ist der mit dem Tag belegte Text unsichtbar

Ferner wurden im Listing weitere Funktionen der wirklich enorm vielen Routinen, die sich auf den Inhalt des Puffers (GtkTextBuffer) beziehen, verwendet. Wichtig ist bei all diesen Funktionen, dass eine Beziehung zum sichtbaren Teil des Textes mit der bereits bekannten Funktion gtk_text_view_get_buffer() hergestellt wurde. Hierzu eine Auflistung der Syntax der im Beispiel verwendeten Funktionen mit einer anschießenden kurzen Erläuterung.

gboolean gtk_text_buffer_delete_selection (
                                 GtkTextBuffer *buffer,
                                 gboolean interactive,
                                 gboolean default_editable );
void gtk_text_buffer_paste_clipboard ( 
                                 GtkTextBuffer *buffer,
                                 GtkClipboard *clipboard,
                                 GtkTextIter *override_location,
                                 gboolean default_editable);
void gtk_text_buffer_copy_clipboard (
                                 GtkTextBuffer *buffer,
                                 GtkClipboard *clipboard );
void gtk_text_buffer_cut_clipboard (
                                 GtkTextBuffer *buffer,
                                 GtkClipboard *clipboard,
                                 gboolean default_editable );
gboolean gtk_text_buffer_get_selection_bounds( 
                                 GtkTextBuffer *buffer,
                                 GtkTextIter *start,
                                 GtkTextIter *end );
void gtk_text_buffer_apply_tag_by_name( 
                                 GtkTextBuffer *buffer,
                                 const gchar *name,
                                 const GtkTextIter *start,
                                 const GtkTextIter *end );

Mit gtk_text_buffer_delete_selection() wird eine Auswahl aus dem Puffer zwischen den Marken "insert" und "selection-bound" gelöscht. Wird interactive auf TRUE gesetzt, wird die Veränderung auch beachtet, und das dritte Argument default_editable hat auch hier eine Bedeutung. Wird dieser Wert auf TRUE gesetzt, gibt diese Funktion erst wirklich TRUE zurück, wenn auch tatsächlich eine Löschung stattgefunden hat.

Die nächsten drei Funktionen gtk_text_buffer_paste_clipboard(), gtk_text_buffer_cut_clipboard() und gtk_text_buffer_copy_clipboard() dienen alle als Schnittstelle zwischen der Zwischenablage und dem Textpuffer. Alle drei Funktionen haben ein Argument der Klasse GtkClipboard (Typenkennung: GTK_TYPE_CLIPBOARD). Im Beispiel wurde mithilfe des Funktionsaufrufs gtk_clipboard_get(GDK_NONE) als Argument dafür gesorgt, dass keine eigene Zwischenablage verwendet wird, sondern die systemweite Standard-Zwischenablage. Ebenfalls erhalten alle Funktionen als erstes Argument den Textpuffer vom Typ GtkTextBuffer.

Ansonsten wird mit der Funktion gtk_text_buffer_paste_clipboard() ein Text aus der Zwischenablage in den Puffer kopiert. Mit dem Argument override_location der Klasse GtkTextIter wurde im Beispiel NULL verwendet, was bedeutet, dass der Text an der Position des Cursors eingefügt wird. Mit default_editable geben Sie an, ob der Text editierbar sein soll – was gewöhnlich mit TRUE besetzt ist.

Mit gtk_text_buffer_copy_clipboard() wird ein ausgewählter Text im Textpuffer in die Zwischenablage kopiert.

gtk_text_buffer_cut_clipboard() fügt einen Text aus der Zwischenablage wieder in den Puffer ein. Auch hier wird mit default_editable angegeben, ob der Text editierbar sein soll.

Mit gtk_text_buffer_get_selection_bounds() initialisieren Sie die Argumente start und end mit der Anfangs- und Endposition des markierten Textes im Textpuffer (erstes Argument). Den so ermittelten Wert verwenden Sie anschließend zum Formatieren des Textes mit der Funktion gtk_text_buffer_apply_tag_by_name(), um einen Textpuffer (erstes Argument) mit einem Tag-Namen zu versehen, den Sie im Beispiel mit der Funktion create_tag() erzeugt haben.

Wie schon erwähnt, stellt dieser Überblick nur einen kleinen Abriss der Funktionen dar, die Ihnen mit dem Text-Widget-System zur Verfügung stehen. Wichtig erscheint mir noch ein Überblick über die Eigenschaften des GtkTextView-Widgets. Wobei es sich bei den Eigenschaften keineswegs um die Textformatierungen handelt, sondern um reine Darstellungsoptionen des Widgets GtkTextView selbst!


Tabelle 15.26    Eigenschaften GtkTextView

Eigenschaft Datentyp Bedeutung
"buffer" GtkTextBuffer Der Puffer, der angezeigt wird
"pixels-above-lines" gint Abstand vor einem Absatz
"pixels-below-lines" gint Abstand nach einem Absatz
"pixels-inside-wrap" gint Abstand zwischen den ungebrochenen Zeilen in einem Absatz
"wrap-mode" GtkWrapMode Art des Zeilenumbruchs. Mögliche Werte: GTK_WRAP_NONE kein Umbruch; Widget wird breiter GTK_WRAP_CHAR Umbruch zeichenweise GTK_WRAP_WORD Umbruch wortweise
"justification" GtkJustification Art der Satzausrichtung. Mögliche Werte: GTK_JUSTIFY_LEFT linksbündig GTK_JUSTIFY_RIGHT rechtsbündig GTK_JUSTIFY_CENTER zentriert GTK_JUSTIFY_FILL Blocksatz
"editable" gboolean Darf Text verändert werden?
"left-margin" gint Breite, linker Rand
"right-margin" gint Breite, rechter Rand.
"indent" gint Einrücktiefe von Absätzen
"accepts-tab" gboolean Werden Tabulator-Zeichen mit einer typischen 8-Leerzeichen-Einrückung akzeptiert?
"overwrite" gboolean Darf neu eingefügter Text den existierenden überschreiben?
"cursor-visible" gboolean Mauscursor sichtbar?


Rheinwerk Computing

15.11.2 Scrollendes Fenster – GtkScrolledWindow  toptop

Im Beispiel wurde auch GtkScrolledWindow (Typenkennung: GTK_TYPE_SCROLLED_WINDOW) verwendet. Dabei handelt es sich um ein Behälter-Widget, das genau ein Widget aufnehmen kann. Dieses wird z. B. verwendet, wenn etwas auf dem Bildschirm (Hauptfenster) nicht auf einmal vertikal bzw. horizontal darstellbar ist. Ist das Widget in diesem Behälter (GtkScrolledWindow) größer als darstellbar, findet der Anwender hierzu einen automatischen Rollbalken an einer von der Eigenschaft "window-placement" angegebenen Position. Damit lässt sich das Kind-Widget vertikal und/oder horizontal rollen. Folgende Eigenschaften können Sie für GtkScrolledWindow verwenden.


Tabelle 15.27    Eigenschaften für GtkScrolledWindow (GTK_TYPE_SCROLLED_WINDOW)

Eigenschaften Datentyp Bedeutung
"hadjustment" GtkAdjustment Stellgröße (Typ: GtkAdjustment), welche die horizontale Position des Kind-Widgets im Fenster kontrolliert.
"hscrollbar-policy" GtkPolicyType Darstellungsmethode des horizontalen Balkens. Mögliche Werte: GTK_POLICY_ALWAYS Rollbalken immer anzeigen GTK_POLICY_AUTOMATIC Rollbalken nur dann anzeigen, wenn das Kind-Widget größer als das Fenster ist. GTK_POLICY_NEVER Rollbalken niemals anzeigen
"shadow-type" GtkShadowType Schattierungen des Rollbalkens um das Kind-Widget. Mögliche selbst redende Werte: GTK_SHADOW_NONE, GTK_SHADOW_IN, GTK_SHADOW_OUT, GTK_SHADOW_ETCHED_IN, GTK_SHADOW_ETCHED_OUT
"vadjustment" GtkAdjustment Stellgröße (Typ GtkAdjustment), welche die vertikale Position des Kind-Widgets im Fenster kontrolliert.
"vscrollbar-policy" GtkPolicyType Darstellungsmethode des vertikalen Balkens. Mögliche Werte: siehe hscrollbar-policy
"window-placement" GtkCornerType Relative Platzierung des Kind-Widgets zu den Rollbalken. Mögliche Werte: GTK_CORNER_TOP_LEFT- – Rollbalken rechts und unten (Standard) GTK_CORNER_BOTTOM_LEFT – Rollbalken rechts und oben GTK_CORNER_TOP_RIGHT – Rollbalken links und unten GTK_CORNER_BOTTOM_RIGHT – Rollbalken links und oben

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern