]> Pileus Git - ~andy/gtk/commitdiff
applied gtk-hamann_jeske-980311-0.patch.gz.
authorTim Janik <timj@gimp.org>
Wed, 11 Mar 1998 06:11:52 +0000 (06:11 +0000)
committerTim Janik <timj@src.gnome.org>
Wed, 11 Mar 1998 06:11:52 +0000 (06:11 +0000)
Wed Mar 11 07:10:11 1998  Tim Janik  <timj@gimp.org>

        * gtk/gtkspinbutton.h:
        * gtk/gtkspinbutton.c: applied gtk-hamann_jeske-980311-0.patch.gz.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkspinbutton.c
gtk/gtkspinbutton.h
gtk/testgtk.c
tests/testgtk.c

index ceb7e4e017f5222a258b4f29b476d2c574f12ff7..544d31ea70484060adbcf68114aab7c78269c7e1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Mar 11 07:10:11 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkspinbutton.h: 
+       * gtk/gtkspinbutton.c: applied gtk-hamann_jeske-980311-0.patch.gz.
+
 Wed Mar 11 04:35:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtklist.c:
index ceb7e4e017f5222a258b4f29b476d2c574f12ff7..544d31ea70484060adbcf68114aab7c78269c7e1 100644 (file)
@@ -1,3 +1,8 @@
+Wed Mar 11 07:10:11 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkspinbutton.h: 
+       * gtk/gtkspinbutton.c: applied gtk-hamann_jeske-980311-0.patch.gz.
+
 Wed Mar 11 04:35:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtklist.c:
index ceb7e4e017f5222a258b4f29b476d2c574f12ff7..544d31ea70484060adbcf68114aab7c78269c7e1 100644 (file)
@@ -1,3 +1,8 @@
+Wed Mar 11 07:10:11 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkspinbutton.h: 
+       * gtk/gtkspinbutton.c: applied gtk-hamann_jeske-980311-0.patch.gz.
+
 Wed Mar 11 04:35:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtklist.c:
index ceb7e4e017f5222a258b4f29b476d2c574f12ff7..544d31ea70484060adbcf68114aab7c78269c7e1 100644 (file)
@@ -1,3 +1,8 @@
+Wed Mar 11 07:10:11 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkspinbutton.h: 
+       * gtk/gtkspinbutton.c: applied gtk-hamann_jeske-980311-0.patch.gz.
+
 Wed Mar 11 04:35:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtklist.c:
index ceb7e4e017f5222a258b4f29b476d2c574f12ff7..544d31ea70484060adbcf68114aab7c78269c7e1 100644 (file)
@@ -1,3 +1,8 @@
+Wed Mar 11 07:10:11 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkspinbutton.h: 
+       * gtk/gtkspinbutton.c: applied gtk-hamann_jeske-980311-0.patch.gz.
+
 Wed Mar 11 04:35:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtklist.c:
index ceb7e4e017f5222a258b4f29b476d2c574f12ff7..544d31ea70484060adbcf68114aab7c78269c7e1 100644 (file)
@@ -1,3 +1,8 @@
+Wed Mar 11 07:10:11 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkspinbutton.h: 
+       * gtk/gtkspinbutton.c: applied gtk-hamann_jeske-980311-0.patch.gz.
+
 Wed Mar 11 04:35:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtklist.c:
index ceb7e4e017f5222a258b4f29b476d2c574f12ff7..544d31ea70484060adbcf68114aab7c78269c7e1 100644 (file)
@@ -1,3 +1,8 @@
+Wed Mar 11 07:10:11 1998  Tim Janik  <timj@gimp.org>
+
+       * gtk/gtkspinbutton.h: 
+       * gtk/gtkspinbutton.c: applied gtk-hamann_jeske-980311-0.patch.gz.
+
 Wed Mar 11 04:35:06 1998  Tim Janik  <timj@gimp.org>
 
        * gtk/gtklist.c:
index 69d97f3bdef5886eba54a1c9c22c6fda4317dddc..beffd0a9c5aac475223216af1f73a62eab9dce0c 100644 (file)
@@ -1,6 +1,9 @@
 /* GTK - The GIMP Toolkit
  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
  *
+ * GtkSpinButton widget for GTK+
+ * Copyright (C) 1998 Lars Hamann and Stefan Jeske
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
  * License as published by the Free Software Foundation; either
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
+#include <string.h>
+#include <locale.h>
 #include "gdk/gdkkeysyms.h"
 #include "gtkspinbutton.h"
 #include "gtkmain.h"
 #include "gtksignal.h"
 
 
-#define MIN_SPIN_BUTTON_WIDTH           30
-#define ARROW_SIZE                      11
-#define SPIN_BUTTON_INITIAL_TIMER_DELAY 200
-#define SPIN_BUTTON_TIMER_DELAY         20
-#define MAX_TEXT_LENGTH                 256
-#define MAX_TIMER_CALLS                 5
+#define MIN_SPIN_BUTTON_WIDTH              30
+#define ARROW_SIZE                         11
+#define SPIN_BUTTON_INITIAL_TIMER_DELAY    200
+#define SPIN_BUTTON_TIMER_DELAY            20
+#define MAX_TEXT_LENGTH                    256
+#define MAX_TIMER_CALLS                    5
 
 
 static void gtk_spin_button_class_init     (GtkSpinButtonClass *klass);
@@ -73,8 +78,13 @@ static void gtk_spin_button_value_changed  (GtkWidget          *widget,
 static gint gtk_spin_button_key_press      (GtkWidget          *widget,
                                            GdkEventKey        *event);
 static void gtk_spin_button_update         (GtkSpinButton      *spin_button);
-static void gtk_spin_button_changed        (GtkEditable        *editable);
 static void gtk_spin_button_activate       (GtkEditable        *editable);
+static void gtk_spin_button_snap           (GtkSpinButton      *spin_button,
+                                           gfloat              val);
+static void gtk_spin_button_insert_text    (GtkEditable        *editable,
+                                           const gchar        *new_text,
+                                           gint               new_text_length,
+                                           gint               *position);
 
 
 static GtkWidgetClass *parent_class = NULL;
@@ -107,13 +117,13 @@ gtk_spin_button_get_type ()
 static void
 gtk_spin_button_class_init (GtkSpinButtonClass *class)
 {
-  GtkObjectClass *object_class;
-  GtkWidgetClass *widget_class;
+  GtkObjectClass   *object_class;
+  GtkWidgetClass   *widget_class;
   GtkEditableClass *editable_class;
 
-  object_class = (GtkObjectClass*) class;
-  widget_class = (GtkWidgetClass*) class;
-  editable_class  = (GtkEditableClass*)  class; 
+  object_class   = (GtkObjectClass*)   class;
+  widget_class   = (GtkWidgetClass*)   class;
+  editable_class = (GtkEditableClass*) class; 
 
   parent_class = gtk_type_class (gtk_entry_get_type ());
 
@@ -135,7 +145,7 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
   widget_class->leave_notify_event = gtk_spin_button_leave_notify;
   widget_class->focus_out_event = gtk_spin_button_focus_out;
 
-  editable_class->changed = gtk_spin_button_changed;
+  editable_class->insert_text = gtk_spin_button_insert_text;
   editable_class->activate = gtk_spin_button_activate;
 }
 
@@ -143,34 +153,31 @@ static void
 gtk_spin_button_init (GtkSpinButton *spin_button)
 {
   spin_button->adjustment = NULL;
-  spin_button->panel      = NULL;
-
+  spin_button->panel = NULL;
   spin_button->timer = 0;
   spin_button->climb_rate = 0.0;
   spin_button->timer_step = 0.0;
-  
   spin_button->update_policy = GTK_UPDATE_ALWAYS | GTK_UPDATE_SNAP_TO_TICKS;
-
-  spin_button->snapped = 0;
   spin_button->in_child = 2;
   spin_button->click_child = 2;
   spin_button->button = 0;
   spin_button->need_timer = 0;
   spin_button->timer_calls = 0;
   spin_button->digits = 0;
+  spin_button->numeric = 0;
 }
 
 void
 gtk_spin_button_construct (GtkSpinButton  *spin_button,
-                           GtkAdjustment  *adjustment,
-                           gfloat          climb_rate,
-                           gint            digits)
+                          GtkAdjustment  *adjustment,
+                          gfloat          climb_rate,
+                          gint            digits)
 {
   char buf[MAX_TEXT_LENGTH];
 
   g_return_if_fail (spin_button != NULL);
   g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
-  g_return_if_fail (digits >= 0 && digits < 128);
+  g_return_if_fail (digits >= 0 && digits < 6);
 
   if (!adjustment)
     adjustment = (GtkAdjustment*) gtk_adjustment_new (0, 0, 0, 0, 0, 0);
@@ -189,7 +196,7 @@ gtk_spin_button_new (GtkAdjustment *adjustment,
 {
   GtkSpinButton *spin;
 
-  g_return_val_if_fail (digits >= 0 && digits < 128, NULL);
+  g_return_val_if_fail (digits >= 0 && digits < 6, NULL);
 
   spin = gtk_type_new (gtk_spin_button_get_type ());
 
@@ -330,7 +337,8 @@ gtk_spin_button_size_allocate (GtkWidget     *widget,
 
   if (GTK_WIDGET_REALIZED (widget))
     {
-      child_allocation.width = ARROW_SIZE + 2 * widget->style->klass->xthickness;
+      child_allocation.width = ARROW_SIZE
+       + 2 * widget->style->klass->xthickness;
       child_allocation.height = widget->requisition.height;  
       child_allocation.x = (allocation->x + allocation->width - ARROW_SIZE - 
                            2 * widget->style->klass->xthickness);
@@ -378,7 +386,6 @@ gtk_spin_button_draw (GtkWidget    *widget,
   g_return_if_fail (GTK_IS_SPIN_BUTTON (widget));
   g_return_if_fail (area != NULL);
 
-
   if (GTK_WIDGET_DRAWABLE (widget))
     gtk_spin_button_paint (widget, area);
 }
@@ -517,19 +524,13 @@ static gint
 gtk_spin_button_focus_out (GtkWidget     *widget,
                           GdkEventFocus *event)
 {
-  GtkSpinButton *spin;
-
   g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
-  spin = GTK_SPIN_BUTTON (widget);
-  if ((spin->update_policy & GTK_UPDATE_SNAP_TO_TICKS) && !spin->snapped)
-    gtk_spin_button_update (spin);
+  gtk_spin_button_update (GTK_SPIN_BUTTON (widget));
 
-  GTK_WIDGET_CLASS (parent_class)->focus_out_event (widget, event);
-  
-  return FALSE;
+  return GTK_WIDGET_CLASS (parent_class)->focus_out_event (widget, event);
 }
 
 static gint
@@ -552,7 +553,9 @@ gtk_spin_button_button_press (GtkWidget      *widget,
            gtk_widget_grab_focus (widget);
          gtk_grab_add (widget);
          spin->button = event->button;
-
+         
+         gtk_spin_button_update (spin);
+         
          if (event->y <= widget->requisition.height / 2)
            {
              spin->click_child = GTK_ARROW_UP;
@@ -616,7 +619,7 @@ gtk_spin_button_button_press (GtkWidget      *widget,
              gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN);
            }
        }
-      else 
+      else
        GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);
     }
   return FALSE;
@@ -632,9 +635,6 @@ gtk_spin_button_button_release (GtkWidget      *widget,
   g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
-  if (event->type != GDK_BUTTON_RELEASE)
-    return FALSE;
-
   spin = GTK_SPIN_BUTTON (widget);
 
   if (event->button == spin->button)
@@ -658,19 +658,13 @@ gtk_spin_button_button_release (GtkWidget      *widget,
              if (spin->click_child == GTK_ARROW_UP &&
                  spin->adjustment->value < spin->adjustment->upper &&
                  event->y <= widget->requisition.height / 2)
-               {
-                 spin->adjustment->value = spin->adjustment->upper;
-                 gtk_signal_emit_by_name (GTK_OBJECT (spin->adjustment), 
-                                          "value_changed");
-               }
+               gtk_adjustment_set_value (spin->adjustment, 
+                                         spin->adjustment->upper);
              else if (spin->click_child == GTK_ARROW_DOWN &&
                       spin->adjustment->value > spin->adjustment->lower &&
                       event->y > widget->requisition.height / 2)
-               {
-                 spin->adjustment->value = spin->adjustment->lower;
-                 gtk_signal_emit_by_name (GTK_OBJECT (spin->adjustment), 
-                                          "value_changed");
-               }
+               gtk_adjustment_set_value (spin->adjustment, 
+                                         spin->adjustment->lower);
            }
        }                 
       gtk_grab_remove (widget);
@@ -725,9 +719,7 @@ gtk_spin_button_motion_notify (GtkWidget      *widget,
       return FALSE;
     }
          
-  GTK_WIDGET_CLASS (parent_class)->motion_notify_event (widget, event);
-
-  return FALSE;
+  return GTK_WIDGET_CLASS (parent_class)->motion_notify_event (widget, event);
 }
 
 static gint
@@ -773,7 +765,7 @@ gtk_spin_button_spin (GtkSpinButton *spin_button,
 
   g_return_if_fail (spin_button != NULL);
   g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
-
+  
   if (direction == GTK_ARROW_UP)
     {
       new_value = MIN (spin_button->adjustment->value + step,
@@ -786,11 +778,7 @@ gtk_spin_button_spin (GtkSpinButton *spin_button,
     }
 
   if (new_value != spin_button->adjustment->value)
-    {  
-      spin_button->adjustment->value = new_value;
-      gtk_signal_emit_by_name (GTK_OBJECT (spin_button->adjustment),
-                              "value_changed");
-    }
+    gtk_adjustment_set_value (spin_button->adjustment, new_value);
 }
 
 static void
@@ -803,22 +791,29 @@ gtk_spin_button_value_changed (GtkWidget     *widget,
   g_return_if_fail (GTK_IS_ADJUSTMENT (widget));
 
   sprintf (buf, "%0.*f", spin_button->digits, spin_button->adjustment->value);
+
   gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
 }
-  
+
 static gint
 gtk_spin_button_key_press (GtkWidget     *widget,
                           GdkEventKey   *event)
 {
   GtkSpinButton *spin;
-  
+  gint key;
+
   g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
   
   spin = GTK_SPIN_BUTTON (widget);
+  key = event->keyval;
 
-  switch (event->keyval)
+  if (key == GDK_Up || key == GDK_Down || 
+      key == GDK_Page_Up || key == GDK_Page_Down)
+    gtk_spin_button_update (spin);
+
+  switch (key)
     {
     case GDK_Up:
       if (GTK_WIDGET_HAS_FOCUS (widget))
@@ -842,22 +837,14 @@ gtk_spin_button_key_press (GtkWidget     *widget,
       return FALSE;
     case GDK_Page_Up:
       if (event->state & GDK_CONTROL_MASK)
-       {
-         spin->adjustment->value = spin->adjustment->upper;
-         gtk_signal_emit_by_name (GTK_OBJECT (spin->adjustment),
-                                  "value_changed");
-       }
+       gtk_adjustment_set_value (spin->adjustment, spin->adjustment->upper);
       else
        gtk_spin_button_spin (spin, GTK_ARROW_UP,
                              spin->adjustment->page_increment);
       return TRUE;
     case GDK_Page_Down:
       if (event->state & GDK_CONTROL_MASK)
-       {
-         spin->adjustment->value = spin->adjustment->lower;
-         gtk_signal_emit_by_name (GTK_OBJECT (spin->adjustment),
-                                  "value_changed");
-       }
+       gtk_adjustment_set_value (spin->adjustment, spin->adjustment->lower);
       else
        gtk_spin_button_spin (spin, GTK_ARROW_DOWN,
                              spin->adjustment->page_increment);
@@ -868,17 +855,32 @@ gtk_spin_button_key_press (GtkWidget     *widget,
   return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
 }
 
+static void
+gtk_spin_button_snap (GtkSpinButton *spin_button,
+                     gfloat         val)
+{
+  gfloat inc;
+  gfloat tmp;
+  
+  inc = spin_button->adjustment->step_increment;
+  tmp = (val - spin_button->adjustment->lower) / inc;
+  if (tmp - floor (tmp) < ceil (tmp) - tmp)
+    val = spin_button->adjustment->lower + floor (tmp) * inc;
+  else
+    val = spin_button->adjustment->lower + ceil (tmp) * inc;
+  gtk_adjustment_set_value (spin_button->adjustment, val);
+}
+
 static void 
 gtk_spin_button_update (GtkSpinButton *spin_button)
 {
-  gfloat tmp;
   gfloat val;
   gchar *error = NULL;
 
   g_return_if_fail (spin_button != NULL);
   g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
 
-  val = strtod (GTK_ENTRY (spin_button)->text, &error);
+  val = strtod (gtk_entry_get_text (GTK_ENTRY (spin_button)), &error);
   
   if (spin_button->update_policy & GTK_UPDATE_ALWAYS)
     {
@@ -898,45 +900,9 @@ gtk_spin_button_update (GtkSpinButton *spin_button)
     }
 
   if (spin_button->update_policy & GTK_UPDATE_SNAP_TO_TICKS)
-    {
-      gfloat inc;
-
-      inc = spin_button->adjustment->step_increment;
-      tmp = (val - spin_button->adjustment->lower) / inc;
-      if (tmp - floor (tmp) < ceil (tmp) - tmp)
-       val = spin_button->adjustment->lower + floor (tmp) * inc;
-      else
-       val = spin_button->adjustment->lower + ceil (tmp) * inc;
-      spin_button->snapped = 1;
-    }
-  spin_button->adjustment->value = val;
-  gtk_signal_emit_by_name (GTK_OBJECT (spin_button->adjustment),
-                          "value_changed"); 
-}
-
-static void
-gtk_spin_button_changed (GtkEditable *editable)
-{
-  g_return_if_fail (editable != NULL);
-  g_return_if_fail (GTK_IS_SPIN_BUTTON (editable));
-
-  GTK_EDITABLE_CLASS (parent_class)->changed (editable);
-  if (GTK_WIDGET_VISIBLE (GTK_WIDGET (editable)))
-    {
-      GtkSpinButton *spin;
-      gfloat val;
-      gchar *error = NULL;
-
-      spin = GTK_SPIN_BUTTON (editable);
-      spin->snapped = 0;
-
-      val = strtod (GTK_ENTRY (editable)->text, &error);
-      if (val < spin->adjustment->lower)
-       val = spin->adjustment->lower;
-      else if (val > spin->adjustment->upper)
-       val = spin->adjustment->upper;
-      spin->adjustment->value = val;
-    }
+    gtk_spin_button_snap (spin_button, val);
+  else
+    gtk_adjustment_set_value (spin_button->adjustment, val);
 }
 
 static void
@@ -992,14 +958,13 @@ gtk_spin_button_set_digits (GtkSpinButton *spin_button,
 {
   g_return_if_fail (spin_button != NULL);
   g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
-  g_return_if_fail (digits >= 0 || digits < 128);
+  g_return_if_fail (digits >= 0 || digits < 6);
 
   if (spin_button->digits != digits)
     {
       spin_button->digits = digits;
-      if (GTK_WIDGET_VISIBLE (spin_button) && GTK_WIDGET_MAPPED (spin_button))
-        gtk_signal_emit_by_name (GTK_OBJECT (spin_button->adjustment),
-                                "value_changed"); 
+      gtk_signal_emit_by_name (GTK_OBJECT (spin_button->adjustment),
+                              "value_changed"); 
     }
 }
 
@@ -1035,12 +1000,7 @@ gtk_spin_button_set_value (GtkSpinButton *spin_button,
   g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
 
   if (spin_button->adjustment->value != value)
-    {
-      spin_button->adjustment->value = value;
-      if (GTK_WIDGET_VISIBLE (spin_button) && GTK_WIDGET_MAPPED (spin_button))
-        gtk_signal_emit_by_name (GTK_OBJECT (spin_button->adjustment),
-                                "value_changed"); 
-    }
+    gtk_adjustment_set_value (spin_button->adjustment, value);
 }
 
 void
@@ -1051,4 +1011,81 @@ gtk_spin_button_set_update_policy (GtkSpinButton             *spin_button,
   g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
 
   spin_button->update_policy = policy;
+  if (policy & GTK_UPDATE_SNAP_TO_TICKS)
+    {
+      gchar *error = NULL;
+      gfloat val;
+
+      val = strtod (gtk_entry_get_text (GTK_ENTRY (spin_button)), &error);
+      gtk_spin_button_snap (spin_button, val);
+    }
+}
+
+void
+gtk_spin_button_set_numeric (GtkSpinButton  *spin_button,
+                            gint            numeric)
+{
+  g_return_if_fail (spin_button != NULL);
+  g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button));
+
+  spin_button->numeric = (numeric != 0);
+}
+
+static void
+gtk_spin_button_insert_text (GtkEditable *editable,
+                            const gchar *new_text,
+                            gint         new_text_length,
+                            gint        *position)
+{
+  GtkEntry *entry;
+  GtkSpinButton *spin;
+  g_return_if_fail (editable != NULL);
+  g_return_if_fail (GTK_IS_SPIN_BUTTON (editable));
+
+  entry = GTK_ENTRY (editable);
+  spin  = GTK_SPIN_BUTTON (editable);
+
+  if (spin->numeric)
+    {
+      struct lconv *lc;
+      gboolean minus;
+      gint dotpos = -1;
+      gint i;
+
+      lc = localeconv ();
+
+      minus = (strchr (entry->text, *(lc->negative_sign)) != 0) ;
+      if (minus && !(*position))
+       return;
+
+      dotpos = strchr (entry->text, *(lc->decimal_point)) - entry->text;
+      
+      if (dotpos > -1 && *position > dotpos &&
+         spin->digits - entry->text_length + dotpos - new_text_length + 1 < 0)
+       return;
+
+      for (i = 0; i < new_text_length; i++)
+       {
+         if (new_text[i] == *(lc->negative_sign))
+           {
+             if (minus || (*position) || i)
+               return;
+             minus = TRUE;
+           }
+         else if (new_text[i] == *(lc->decimal_point))
+           {
+             if (!spin->digits || dotpos > -1 || 
+                 (new_text_length - 1 - i + entry->text_length - *position > 
+                  spin->digits)) 
+               return;
+             dotpos = *position + i;
+           }
+         else if (new_text[i] < 0x30 || new_text[i] > 0x39)
+           return;
+       }
+    }
+
+  GTK_EDITABLE_CLASS (parent_class)->insert_text (editable, new_text,
+                                                 new_text_length, position);
 }
index b9aed002a6fcf9809a2b61077f05430fc930dbb6..710a53988b801c86872eb410d662c39bea3e9b5e 100644 (file)
@@ -1,6 +1,9 @@
 /* GTK - The GIMP Toolkit
  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
  *
+ * GtkSpinButton widget for GTK+
+ * Copyright (C) 1998 Lars Hamann and Stefan Jeske
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
  * License as published by the Free Software Foundation; either
@@ -62,13 +65,13 @@ struct _GtkSpinButton
 
   guint8 update_policy;
 
-  guint snapped : 1;
   guint in_child : 2;
   guint click_child : 2;
   guint button : 2;
   guint need_timer : 1;
   guint timer_calls : 3;
-  guint digits : 7;
+  guint digits : 3;
+  guint numeric : 1;
 };
 
 struct _GtkSpinButtonClass
@@ -115,6 +118,10 @@ void
 gtk_spin_button_set_update_policy  (GtkSpinButton             *spin_button,
                                    GtkSpinButtonUpdatePolicy  policy);
 
+void
+gtk_spin_button_set_numeric        (GtkSpinButton  *spin_button,
+                                   gint            numeric);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 1722553e8d13b08cd2d0a28dac9d90cbc8f9f9cf..31afd7af391128bcbbff551ba1f51c6c530e939d 100644 (file)
@@ -2208,7 +2208,11 @@ create_entry ()
     gtk_widget_destroy (window);
 }
 
-GtkWidget *spinner1;
+/*
+ * GtkSpinButton
+ */
+
+static GtkWidget *spinner1;
 
 static void
 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
@@ -2220,13 +2224,36 @@ toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
     gtk_spin_button_set_update_policy (spin, GTK_UPDATE_ALWAYS);
 }
 
+static void
+toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
+{
+  gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
+}
+
 static void
 change_digits (GtkWidget *widget, GtkSpinButton *spin)
 {
-  gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1), 
+  gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
                              gtk_spin_button_get_value_as_int (spin));
 }
 
+static void
+get_value (GtkWidget *widget, gint data)
+{
+  gchar buf[32];
+  GtkLabel *label;
+  GtkSpinButton *spin;
+
+  spin = GTK_SPIN_BUTTON (spinner1);
+  label = GTK_LABEL (gtk_object_get_user_data (GTK_OBJECT (widget)));
+  if (data == 1)
+    sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
+  else
+    sprintf (buf, "%0.*f", spin->digits,
+            gtk_spin_button_get_value_as_float (spin));
+  gtk_label_set (label, buf);
+}
+
 static void
 create_spins ()
 {
@@ -2240,6 +2267,7 @@ create_spins ()
   GtkWidget *spinner;
   GtkWidget *button;
   GtkWidget *label;
+  GtkWidget *val_label;
   GtkAdjustment *adj;
 
   if (!window)
@@ -2272,7 +2300,7 @@ create_spins ()
       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
       
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 5);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
       
       label = gtk_label_new ("Day :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
@@ -2284,7 +2312,7 @@ create_spins ()
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
 
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 5);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
       
       label = gtk_label_new ("Month :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
@@ -2296,7 +2324,7 @@ create_spins ()
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
       
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 5);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
 
       label = gtk_label_new ("Year :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
@@ -2319,45 +2347,70 @@ create_spins ()
       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
       
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 5);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
       
       label = gtk_label_new ("Value :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
 
-      adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 10000.0,
-                                                 1.0, 100.0, 0.0);
-      spinner1 = gtk_spin_button_new (adj, 1.0, 3);
-      gtk_widget_set_usize (spinner1, 120, 0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
+                                                 0.5, 100.0, 0.0);
+      spinner1 = gtk_spin_button_new (adj, 1.0, 2);
+      gtk_widget_set_usize (spinner1, 100, 0);
       gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner1),
                                         GTK_UPDATE_ALWAYS);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
 
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
 
       label = gtk_label_new ("Digits :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
 
-      adj = (GtkAdjustment *) gtk_adjustment_new (3.0, 0.0, 8.0,
-                                                 1.0, 3.0, 0.0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 5, 1, 1, 0);
       spinner2 = gtk_spin_button_new (adj, 0.0, 0);
       gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
                          GTK_SIGNAL_FUNC (change_digits),
                          (gpointer) spinner2);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
 
-      hbox = gtk_hbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
-
-      button = gtk_check_button_new_with_label ("Snap to ticks");
+      button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
       gtk_signal_connect (GTK_OBJECT (button), "clicked",
                          GTK_SIGNAL_FUNC (toggle_snap),
                          spinner1);
-      gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
+      gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), TRUE);
+
+      button = gtk_check_button_new_with_label ("Numeric only input mode");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (toggle_numeric),
+                         spinner1);
+      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
       gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), TRUE);
 
+      val_label = gtk_label_new ("");
+
+      hbox = gtk_hbox_new (FALSE, 0);
+      gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
+
+      button = gtk_button_new_with_label ("Value as Int");
+      gtk_object_set_user_data (GTK_OBJECT (button), val_label);
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (get_value),
+                         (gpointer) 1);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
+
+      button = gtk_button_new_with_label ("Value as Float");
+      gtk_object_set_user_data (GTK_OBJECT (button), val_label);
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (get_value),
+                         (gpointer) 2);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
+
+      gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
+      gtk_label_set (GTK_LABEL (val_label), "0");
+
       hbox = gtk_hbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
   
index 1722553e8d13b08cd2d0a28dac9d90cbc8f9f9cf..31afd7af391128bcbbff551ba1f51c6c530e939d 100644 (file)
@@ -2208,7 +2208,11 @@ create_entry ()
     gtk_widget_destroy (window);
 }
 
-GtkWidget *spinner1;
+/*
+ * GtkSpinButton
+ */
+
+static GtkWidget *spinner1;
 
 static void
 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
@@ -2220,13 +2224,36 @@ toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
     gtk_spin_button_set_update_policy (spin, GTK_UPDATE_ALWAYS);
 }
 
+static void
+toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
+{
+  gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
+}
+
 static void
 change_digits (GtkWidget *widget, GtkSpinButton *spin)
 {
-  gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1), 
+  gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
                              gtk_spin_button_get_value_as_int (spin));
 }
 
+static void
+get_value (GtkWidget *widget, gint data)
+{
+  gchar buf[32];
+  GtkLabel *label;
+  GtkSpinButton *spin;
+
+  spin = GTK_SPIN_BUTTON (spinner1);
+  label = GTK_LABEL (gtk_object_get_user_data (GTK_OBJECT (widget)));
+  if (data == 1)
+    sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
+  else
+    sprintf (buf, "%0.*f", spin->digits,
+            gtk_spin_button_get_value_as_float (spin));
+  gtk_label_set (label, buf);
+}
+
 static void
 create_spins ()
 {
@@ -2240,6 +2267,7 @@ create_spins ()
   GtkWidget *spinner;
   GtkWidget *button;
   GtkWidget *label;
+  GtkWidget *val_label;
   GtkAdjustment *adj;
 
   if (!window)
@@ -2272,7 +2300,7 @@ create_spins ()
       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
       
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 5);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
       
       label = gtk_label_new ("Day :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
@@ -2284,7 +2312,7 @@ create_spins ()
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
 
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 5);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
       
       label = gtk_label_new ("Month :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
@@ -2296,7 +2324,7 @@ create_spins ()
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
       
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 5);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
 
       label = gtk_label_new ("Year :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
@@ -2319,45 +2347,70 @@ create_spins ()
       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
       
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 5);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
       
       label = gtk_label_new ("Value :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
 
-      adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 10000.0,
-                                                 1.0, 100.0, 0.0);
-      spinner1 = gtk_spin_button_new (adj, 1.0, 3);
-      gtk_widget_set_usize (spinner1, 120, 0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
+                                                 0.5, 100.0, 0.0);
+      spinner1 = gtk_spin_button_new (adj, 1.0, 2);
+      gtk_widget_set_usize (spinner1, 100, 0);
       gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner1),
                                         GTK_UPDATE_ALWAYS);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
 
       vbox2 = gtk_vbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
+      gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
 
       label = gtk_label_new ("Digits :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
 
-      adj = (GtkAdjustment *) gtk_adjustment_new (3.0, 0.0, 8.0,
-                                                 1.0, 3.0, 0.0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 5, 1, 1, 0);
       spinner2 = gtk_spin_button_new (adj, 0.0, 0);
       gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
                          GTK_SIGNAL_FUNC (change_digits),
                          (gpointer) spinner2);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
 
-      hbox = gtk_hbox_new (FALSE, 0);
-      gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
-
-      button = gtk_check_button_new_with_label ("Snap to ticks");
+      button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
       gtk_signal_connect (GTK_OBJECT (button), "clicked",
                          GTK_SIGNAL_FUNC (toggle_snap),
                          spinner1);
-      gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
+      gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), TRUE);
+
+      button = gtk_check_button_new_with_label ("Numeric only input mode");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (toggle_numeric),
+                         spinner1);
+      gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
       gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), TRUE);
 
+      val_label = gtk_label_new ("");
+
+      hbox = gtk_hbox_new (FALSE, 0);
+      gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
+
+      button = gtk_button_new_with_label ("Value as Int");
+      gtk_object_set_user_data (GTK_OBJECT (button), val_label);
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (get_value),
+                         (gpointer) 1);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
+
+      button = gtk_button_new_with_label ("Value as Float");
+      gtk_object_set_user_data (GTK_OBJECT (button), val_label);
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC (get_value),
+                         (gpointer) 2);
+      gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
+
+      gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
+      gtk_label_set (GTK_LABEL (val_label), "0");
+
       hbox = gtk_hbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);