Fix bug resizing rows/columns
[pspp-builds.git] / lib / gtksheet / psppire-axis.c
index 92eba59ba1043afba7c10e8175521a32f0449150..d5750fffd6cfd20a5c67626d17ef64b118251094 100644 (file)
 
 #include <libpspp/tower.h>
 #include <libpspp/pool.h>
+#include <libpspp/misc.h>
 #include "psppire-axis.h"
+#include "psppire-marshal.h"
 #include <gtk/gtk.h>
 
 
+
+/* Signals */
+enum
+  {
+    RESIZE_UNIT,
+    n_signals
+  };
+
+static guint signals[n_signals] ;
+
+
 #define PSPPIRE_AXIS_GET_IFACE(obj) \
   (G_TYPE_INSTANCE_GET_INTERFACE ((obj), PSPPIRE_TYPE_AXIS_IFACE, PsppireAxisIface))
 
@@ -162,6 +175,20 @@ psppire_axis_class_init (PsppireAxisClass *class)
   parent_class = g_type_class_peek_parent (class);
 
   object_class->finalize = psppire_axis_finalize;
+
+
+  signals[RESIZE_UNIT] =
+    g_signal_new ("resize-unit",
+                 G_TYPE_FROM_CLASS (object_class),
+                 G_SIGNAL_RUN_LAST,
+                 0,
+                 NULL, NULL,
+                 psppire_marshal_VOID__INT_LONG,
+                 G_TYPE_NONE,
+                 2,
+                 G_TYPE_INT,
+                 G_TYPE_LONG
+                 );
 }
 
 
@@ -203,7 +230,7 @@ psppire_axis_unit_count (const PsppireAxis *a)
   actual_size = PSPPIRE_AXIS_GET_IFACE (a)->total_size (a);
 
   if ( actual_size < a->min_extent )
-    padding = (a->min_extent - actual_size) / a->default_size;
+    padding = DIV_RND_UP (a->min_extent - actual_size, a->default_size);
 
   return PSPPIRE_AXIS_GET_IFACE (a)->unit_count (a) + padding;
 }
@@ -211,7 +238,7 @@ psppire_axis_unit_count (const PsppireAxis *a)
 
 /* Return the starting pixel of UNIT */
 glong
-psppire_axis_pixel_start (const PsppireAxis *a, gint unit)
+psppire_axis_start_pixel (const PsppireAxis *a, gint unit)
 {
   gint the_count, total_size ;
   g_return_val_if_fail (PSPPIRE_IS_AXIS (a), -1);
@@ -224,15 +251,13 @@ psppire_axis_pixel_start (const PsppireAxis *a, gint unit)
       return  total_size + (unit - the_count) * a->default_size;
     }
 
-  //  g_print ("%s %d\n", __FUNCTION__, unit);
-
-  return PSPPIRE_AXIS_GET_IFACE (a)->pixel_start (a, unit);
+  return PSPPIRE_AXIS_GET_IFACE (a)->start_pixel (a, unit);
 }
 
 
 /* Return the unit covered by PIXEL */
 gint
-psppire_axis_get_unit_at_pixel (const PsppireAxis *a, glong pixel)
+psppire_axis_unit_at_pixel (const PsppireAxis *a, glong pixel)
 {
   glong total_size;
 
@@ -240,7 +265,7 @@ psppire_axis_get_unit_at_pixel (const PsppireAxis *a, glong pixel)
 
   g_return_val_if_fail (PSPPIRE_AXIS_GET_IFACE (a), -1);
 
-  g_return_val_if_fail (PSPPIRE_AXIS_GET_IFACE (a)->get_unit_at_pixel, -1);
+  g_return_val_if_fail (PSPPIRE_AXIS_GET_IFACE (a)->unit_at_pixel, -1);
 
   total_size = PSPPIRE_AXIS_GET_IFACE (a)->total_size (a);
 
@@ -249,8 +274,28 @@ psppire_axis_get_unit_at_pixel (const PsppireAxis *a, glong pixel)
       gint n_items = PSPPIRE_AXIS_GET_IFACE (a)->unit_count (a);
       glong extra = pixel - total_size;
 
-      return n_items - 1 + extra / a->default_size;
+      return n_items - 1 + DIV_RND_UP (extra,  a->default_size);
     }
 
-  return PSPPIRE_AXIS_GET_IFACE (a)->get_unit_at_pixel (a, pixel);
+  return PSPPIRE_AXIS_GET_IFACE (a)->unit_at_pixel (a, pixel);
 }
+
+
+/* Set UNIT to size SIZE */
+void
+psppire_axis_resize (PsppireAxis *a, gint unit, glong size)
+{
+  g_return_if_fail (PSPPIRE_IS_AXIS (a));
+
+  g_return_if_fail (PSPPIRE_AXIS_GET_IFACE (a));
+
+  g_return_if_fail (size > 0);
+
+  if (PSPPIRE_AXIS_GET_IFACE (a)->resize)
+    PSPPIRE_AXIS_GET_IFACE (a)->resize (a, unit, size);
+
+
+  g_signal_emit (a, signals [RESIZE_UNIT], 0, unit, size);
+}
+
+