]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktext.c
Added properties. Based on patch by Lee Mallabone.
[~andy/gtk] / gtk / gtktext.c
index 66c1a4824e7f211a7f3da91976f7b9154db40200..1851b3698e58b06a6a390f101a20f39da590467a 100644 (file)
@@ -35,6 +35,7 @@
 #include "gtktext.h"
 #include "line-wrap.xbm"
 #include "line-arrow.xbm"
+#include "gtkintl.h"
 
 
 #define INITIAL_BUFFER_SIZE      1024
 #define CACHE_DATA(c)               (*(LineParams*)(c)->data)
 
 enum {
-  ARG_0,
-  ARG_HADJUSTMENT,
-  ARG_VADJUSTMENT,
-  ARG_LINE_WRAP,
-  ARG_WORD_WRAP
+  PROP_0,
+  PROP_HADJUSTMENT,
+  PROP_VADJUSTMENT,
+  PROP_LINE_WRAP,
+  PROP_WORD_WRAP
 };
 
 typedef struct _TextProperty          TextProperty;
@@ -195,12 +196,14 @@ struct _LineParams
 
 
 static void  gtk_text_class_init     (GtkTextClass   *klass);
-static void  gtk_text_set_arg        (GtkObject      *object,
-                                     GtkArg         *arg,
-                                     guint           arg_id);
-static void  gtk_text_get_arg        (GtkObject      *object,
-                                     GtkArg         *arg,
-                                     guint           arg_id);
+static void  gtk_text_set_property   (GObject         *object,
+                                     guint            prop_id,
+                                     const GValue    *value,
+                                     GParamSpec      *pspec);
+static void  gtk_text_get_property   (GObject         *object,
+                                     guint            prop_id,
+                                     GValue          *value,
+                                     GParamSpec      *pspec);
 static void  gtk_text_init           (GtkText        *text);
 static void  gtk_text_destroy        (GtkObject      *object);
 static void  gtk_text_finalize       (GObject        *object);
@@ -533,20 +536,21 @@ gtk_text_get_type (void)
 static void
 gtk_text_class_init (GtkTextClass *class)
 {
-  GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+  GObjectClass *gobject_class;
   GtkObjectClass *object_class;
   GtkWidgetClass *widget_class;
   GtkOldEditableClass *old_editable_class;
-  
+
+  gobject_class = G_OBJECT_CLASS (class);
   object_class = (GtkObjectClass*) class;
   widget_class = (GtkWidgetClass*) class;
   old_editable_class = (GtkOldEditableClass*) class;
   parent_class = gtk_type_class (GTK_TYPE_OLD_EDITABLE);
 
   gobject_class->finalize = gtk_text_finalize;
-
-  object_class->set_arg = gtk_text_set_arg;
-  object_class->get_arg = gtk_text_get_arg;
+  gobject_class->set_property = gtk_text_set_property;
+  gobject_class->get_property = gtk_text_get_property;
+  
   object_class->destroy = gtk_text_destroy;
   
   widget_class->realize = gtk_text_realize;
@@ -584,23 +588,38 @@ gtk_text_class_init (GtkTextClass *class)
 
   class->set_scroll_adjustments = gtk_text_set_adjustments;
 
-  gtk_object_add_arg_type ("GtkText::hadjustment",
-                          GTK_TYPE_ADJUSTMENT,
-                          GTK_ARG_READWRITE,
-                          ARG_HADJUSTMENT);
-  gtk_object_add_arg_type ("GtkText::vadjustment",
-                          GTK_TYPE_ADJUSTMENT,
-                          GTK_ARG_READWRITE,
-                          ARG_VADJUSTMENT);
-  gtk_object_add_arg_type ("GtkText::line_wrap",
-                          GTK_TYPE_BOOL,
-                          GTK_ARG_READWRITE,
-                          ARG_LINE_WRAP);
-  gtk_object_add_arg_type ("GtkText::word_wrap",
-                          GTK_TYPE_BOOL,
-                          GTK_ARG_READWRITE,
-                          ARG_WORD_WRAP);
-  
+  g_object_class_install_property (gobject_class,
+                                   PROP_HADJUSTMENT,
+                                   g_param_spec_object ("hadjustment",
+                                                        _("Horizontal Adjustment"),
+                                                        _("Horizontal adjustment for the text widget"),
+                                                        GTK_TYPE_ADJUSTMENT,
+                                                        G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_VADJUSTMENT,
+                                   g_param_spec_object ("vadjustment",
+                                                        _("Vertical Adjustment"),
+                                                        _("Vertical adjustment for the text widget"),
+                                                        GTK_TYPE_ADJUSTMENT,
+                                                        G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_LINE_WRAP,
+                                   g_param_spec_boolean ("line_wrap",
+                                                        _("Line Wrap"),
+                                                        _("Whether lines are wrapped at widget edges"),
+                                                        TRUE,
+                                                        G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_WORD_WRAP,
+                                   g_param_spec_boolean ("word_wrap",
+                                                        _("Word Wrap"),
+                                                        _("Whether words are wrapped at widget edges"),
+                                                        FALSE,
+                                                        G_PARAM_READWRITE));
+
   widget_class->set_scroll_adjustments_signal =
     gtk_signal_new ("set_scroll_adjustments",
                    GTK_RUN_LAST,
@@ -611,62 +630,65 @@ gtk_text_class_init (GtkTextClass *class)
 }
 
 static void
-gtk_text_set_arg (GtkObject        *object,
-                 GtkArg           *arg,
-                 guint             arg_id)
+gtk_text_set_property (GObject         *object,
+                      guint            prop_id,
+                      const GValue    *value,
+                      GParamSpec      *pspec)
 {
   GtkText *text;
   
   text = GTK_TEXT (object);
   
-  switch (arg_id)
+  switch (prop_id)
     {
-    case ARG_HADJUSTMENT:
+    case PROP_HADJUSTMENT:
       gtk_text_set_adjustments (text,
-                               GTK_VALUE_POINTER (*arg),
+                               g_value_get_object (value),
                                text->vadj);
       break;
-    case ARG_VADJUSTMENT:
+    case PROP_VADJUSTMENT:
       gtk_text_set_adjustments (text,
                                text->hadj,
-                               GTK_VALUE_POINTER (*arg));
+                               g_value_get_object (value));
       break;
-    case ARG_LINE_WRAP:
-      gtk_text_set_line_wrap (text, GTK_VALUE_BOOL (*arg));
+    case PROP_LINE_WRAP:
+      gtk_text_set_line_wrap (text, g_value_get_boolean (value));
       break;
-    case ARG_WORD_WRAP:
-      gtk_text_set_word_wrap (text, GTK_VALUE_BOOL (*arg));
+    case PROP_WORD_WRAP:
+      gtk_text_set_word_wrap (text, g_value_get_boolean (value));
       break;
     default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     }
 }
 
 static void
-gtk_text_get_arg (GtkObject        *object,
-                 GtkArg           *arg,
-                 guint             arg_id)
+gtk_text_get_property (GObject         *object,
+                      guint            prop_id,
+                      GValue          *value,
+                      GParamSpec      *pspec)
 {
   GtkText *text;
   
   text = GTK_TEXT (object);
   
-  switch (arg_id)
+  switch (prop_id)
     {
-    case ARG_HADJUSTMENT:
-      GTK_VALUE_POINTER (*arg) = text->hadj;
+    case PROP_HADJUSTMENT:
+      g_value_set_object (value, text->hadj);
       break;
-    case ARG_VADJUSTMENT:
-      GTK_VALUE_POINTER (*arg) = text->vadj;
+    case PROP_VADJUSTMENT:
+      g_value_set_object (value, text->vadj);
       break;
-    case ARG_LINE_WRAP:
-      GTK_VALUE_BOOL (*arg) = text->line_wrap;
+    case PROP_LINE_WRAP:
+      g_value_set_boolean (value, text->line_wrap);
       break;
-    case ARG_WORD_WRAP:
-      GTK_VALUE_BOOL (*arg) = text->word_wrap;
+    case PROP_WORD_WRAP:
+      g_value_set_boolean (value, text->word_wrap);
       break;
     default:
-      arg->type = GTK_TYPE_INVALID;
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     }
 }
@@ -757,6 +779,8 @@ gtk_text_set_word_wrap (GtkText *text,
       recompute_geometry (text);
       gtk_widget_queue_draw (GTK_WIDGET (text));
     }
+  
+  g_object_notify (G_OBJECT (text), "word_wrap");
 }
 
 void
@@ -773,6 +797,8 @@ gtk_text_set_line_wrap (GtkText *text,
       recompute_geometry (text);
       gtk_widget_queue_draw (GTK_WIDGET (text));
     }
+  
+  g_object_notify (G_OBJECT (text), "line_wrap");
 }
 
 void
@@ -848,6 +874,8 @@ gtk_text_set_adjustments (GtkText       *text,
                          (GtkSignalFunc) gtk_text_adjustment_destroyed,
                          text);
       gtk_text_adjustment (hadj, text);
+
+      g_object_notify (G_OBJECT (text), "hadjustment");
     }
   
   if (text->vadj != vadj)
@@ -866,6 +894,8 @@ gtk_text_set_adjustments (GtkText       *text,
                          (GtkSignalFunc) gtk_text_adjustment_destroyed,
                          text);
       gtk_text_adjustment (vadj, text);
+
+      g_object_notify (G_OBJECT (text), "vadjustment");
     }
 }
 
@@ -1452,7 +1482,7 @@ clear_focus_area (GtkText *text, gint area_x, gint area_y, gint area_width, gint
        gc = text->bg_gc;
     }
   else
-    gc = widget->style->bg_gc[widget->state];
+    gc = widget->style->base_gc[widget->state];
 
   gdk_draw_rectangle (GTK_WIDGET (text)->window, gc, TRUE,
                      area_x, area_y, area_width, area_height);
@@ -1970,29 +2000,37 @@ gtk_text_key_press (GtkWidget   *widget,
       
       switch (event->keyval)
        {
+        case GDK_KP_Home:
        case GDK_Home:
          if (event->state & GDK_CONTROL_MASK)
            move_cursor_buffer_ver (text, -1);
          else
            gtk_text_move_beginning_of_line (text);
          break;
+        case GDK_KP_End:
        case GDK_End:
          if (event->state & GDK_CONTROL_MASK)
            move_cursor_buffer_ver (text, +1);
          else
            gtk_text_move_end_of_line (text);
          break;
+        case GDK_KP_Page_Up:
        case GDK_Page_Up:   move_cursor_page_ver (text, -1); break;
+        case GDK_KP_Page_Down:
        case GDK_Page_Down: move_cursor_page_ver (text, +1); break;
          /* CUA has Ctrl-Up/Ctrl-Down as paragraph up down */
+        case GDK_KP_Up:
        case GDK_Up:        move_cursor_ver (text, -1); break;
+        case GDK_KP_Down:
        case GDK_Down:      move_cursor_ver (text, +1); break;
+        case GDK_KP_Left:
        case GDK_Left:
          if (event->state & GDK_CONTROL_MASK)
            gtk_text_move_backward_word (text);
          else
            move_cursor_hor (text, -1); 
          break;
+        case GDK_KP_Right:
        case GDK_Right:     
          if (event->state & GDK_CONTROL_MASK)
            gtk_text_move_forward_word (text);
@@ -2025,6 +2063,7 @@ gtk_text_key_press (GtkWidget   *widget,
            }
          break;
        case GDK_Delete:
+        case GDK_KP_Delete:
          if (event->state & GDK_CONTROL_MASK)
            gtk_text_delete_forward_word (text);
          else if (event->state & GDK_SHIFT_MASK)
@@ -2036,9 +2075,11 @@ gtk_text_key_press (GtkWidget   *widget,
            gtk_text_delete_forward_character (text);
          break;
        case GDK_Tab:
+        case GDK_ISO_Left_Tab:
          position = text->point.index;
          gtk_editable_insert_text (GTK_EDITABLE (old_editable), "\t", 1, &position);
          break;
+        case GDK_KP_Enter:
        case GDK_Return:
          if (event->state & GDK_CONTROL_MASK)
            gtk_signal_emit_by_name (GTK_OBJECT (text), "activate");
@@ -4896,9 +4937,9 @@ draw_line (GtkText* text,
              (mark.index < selection_end_pos))
            {
              if (old_editable->has_selection)
-               fg_gc = GTK_WIDGET(text)->style->fg_gc[GTK_STATE_SELECTED];
+               fg_gc = GTK_WIDGET(text)->style->text_gc[GTK_STATE_SELECTED];
              else
-               fg_gc = GTK_WIDGET(text)->style->fg_gc[GTK_STATE_ACTIVE];
+               fg_gc = GTK_WIDGET(text)->style->text_gc[GTK_STATE_ACTIVE];
            }
          else
            {