Change traverse signal to take GtkSheetCell instead of gint,gint
[pspp-builds.git] / lib / gtksheet / gtksheet.c
index ad6d6165f8229df084dc00fa3434e4ac0e774a43..c4556e3e7c8c28cdbda65b5910460a482e0a9af8 100644 (file)
@@ -1,6 +1,3 @@
-#define GLIB_DISABLE_DEPRECATED 1
-#define GDK_DISABLE_DEPRECATED 1
-#define GTK_DISABLE_DEPRECATED 1
 /*
  * Copyright (C) 2006, 2008 Free Software Foundation
  *
@@ -59,6 +56,7 @@
 #include "gtkextra-marshal.h"
 #include "gsheetmodel.h"
 #include <libpspp/misc.h>
+#include <math.h>
 
 /* sheet flags */
 enum
@@ -86,6 +84,7 @@ enum
 #define COLUMN_MIN_WIDTH 10
 #define COLUMN_TITLES_HEIGHT 4
 #define DEFAULT_COLUMN_WIDTH 80
+#define DEFAULT_ROW_HEIGHT 25
 
 static void gtk_sheet_update_primary_selection (GtkSheet *sheet);
 static void gtk_sheet_column_title_button_draw (GtkSheet *sheet, gint column);
@@ -114,30 +113,6 @@ dispose_string (const GtkSheet *sheet, gchar *text)
     g_free (text);
 }
 
-static guint
-default_row_height (const GtkSheet *sheet)
-{
-  GtkWidget *widget = GTK_WIDGET (sheet);
-
-  if (! GTK_WIDGET_REALIZED (widget) || !widget->style->font_desc)
-    return 25;
-  else
-    {
-      PangoContext *context = gtk_widget_get_pango_context (widget);
-      PangoFontMetrics *metrics =
-       pango_context_get_metrics (context,
-                                  widget->style->font_desc,
-                                  pango_context_get_language (context));
-
-      guint val = pango_font_metrics_get_descent (metrics) +
-       pango_font_metrics_get_ascent (metrics);
-
-      pango_font_metrics_unref (metrics);
-
-      return PANGO_PIXELS (val) + 2 * COLUMN_TITLES_HEIGHT;
-    }
-}
-
 static
 guint STRING_WIDTH (GtkWidget *widget,
                    const PangoFontDescription *font, const gchar *text)
@@ -426,14 +401,14 @@ rectangle_from_range (GtkSheet *sheet, const GtkSheetRange *range,
   g_return_val_if_fail (range, FALSE);
 
   r->x = g_sheet_column_start_pixel (sheet->column_geometry, range->col0);
-  r->x -= sheet->hadjustment->value;
+  r->x -= round (sheet->hadjustment->value);
 
   if ( sheet->row_titles_visible)
     r->x += sheet->row_title_area.width;
 
 
   r->y = g_sheet_row_start_pixel (sheet->row_geometry, range->row0);
-  r->y -= sheet->vadjustment->value;
+  r->y -= round (sheet->vadjustment->value);
 
   if ( sheet->column_titles_visible)
     r->y += sheet->column_title_area.height;
@@ -653,6 +628,8 @@ gtk_sheet_get_type ()
   return sheet_type;
 }
 
+\f
+
 static GtkSheetRange*
 gtk_sheet_range_copy (const GtkSheetRange *range)
 {
@@ -691,6 +668,44 @@ gtk_sheet_range_get_type (void)
   return sheet_range_type;
 }
 
+static GtkSheetCell*
+gtk_sheet_cell_copy (const GtkSheetCell *cell)
+{
+  GtkSheetCell *new_cell;
+
+  g_return_val_if_fail (cell != NULL, NULL);
+
+  new_cell = g_new (GtkSheetCell, 1);
+
+  *new_cell = *cell;
+
+  return new_cell;
+}
+
+static void
+gtk_sheet_cell_free (GtkSheetCell *cell)
+{
+  g_return_if_fail (cell != NULL);
+
+  g_free (cell);
+}
+
+GType
+gtk_sheet_cell_get_type (void)
+{
+  static GType sheet_cell_type = 0;
+
+  if (!sheet_cell_type)
+    {
+      sheet_cell_type =
+       g_boxed_type_register_static ("GtkSheetCell",
+                                     (GBoxedCopyFunc) gtk_sheet_cell_copy,
+                                     (GBoxedFreeFunc) gtk_sheet_cell_free);
+    }
+
+  return sheet_cell_type;
+}
+\f
 
 static void column_titles_changed (GtkWidget *w, gint first, gint n_columns,
                                   gpointer data);
@@ -954,9 +969,10 @@ gtk_sheet_class_init (GtkSheetClass *klass)
                  G_SIGNAL_RUN_LAST,
                  offsetof (GtkSheetClass, traverse),
                  NULL, NULL,
-                 gtkextra_BOOLEAN__INT_INT_POINTER_POINTER,
-                 G_TYPE_BOOLEAN, 4, G_TYPE_INT, G_TYPE_INT,
-                 G_TYPE_POINTER, G_TYPE_POINTER);
+                 gtkextra_BOOLEAN__BOXED_POINTER,
+                 G_TYPE_BOOLEAN, 2,
+                 GTK_TYPE_SHEET_CELL,
+                 G_TYPE_POINTER);
 
 
   sheet_signals[ACTIVATE] =
@@ -1078,7 +1094,7 @@ gtk_sheet_init (GtkSheet *sheet)
   sheet->column_title_area.x = 0;
   sheet->column_title_area.y = 0;
   sheet->column_title_area.width = 0;
-  sheet->column_title_area.height = default_row_height (sheet);
+  sheet->column_title_area.height = DEFAULT_ROW_HEIGHT;
 
   sheet->row_title_window = NULL;
   sheet->row_title_area.x = 0;
@@ -3538,17 +3554,23 @@ gtk_sheet_button_press (GtkWidget *widget,
 static gboolean
 gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column)
 {
+  GtkSheetCell cell;
   gboolean forbid_move;
 
+  cell.row = row;
+  cell.col = column;
+
   if (row >= g_sheet_row_get_row_count (sheet->row_geometry)
       || column >= g_sheet_column_get_column_count (sheet->column_geometry))
     {
       return FALSE;
     }
 
+  
   g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
-                sheet->active_cell.row, sheet->active_cell.col,
-                &row, &column, &forbid_move);
+                sheet->active_cell, 
+                &cell,
+                &forbid_move);
 
   if (forbid_move)
     {
@@ -4291,23 +4313,25 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
 {
   gint current_row = sheet->active_cell.row;
   gint current_col = sheet->active_cell.col;
-  gint new_row = current_row;
-  gint new_col = current_col;
+  GtkSheetCell new_cell ;
   gboolean forbidden = FALSE;
 
+  new_cell.row = current_row;
+  new_cell.col = current_col;
+
   switch ( dir)
     {
     case GTK_SCROLL_STEP_DOWN:
-      new_row++;
+      new_cell.row++;
       break;
     case GTK_SCROLL_STEP_UP:
-      new_row--;
+      new_cell.row--;
       break;
     case GTK_SCROLL_STEP_RIGHT:
-      new_col++;
+      new_cell.col++;
       break;
     case GTK_SCROLL_STEP_LEFT:
-      new_col--;
+      new_cell.col--;
       break;
     default:
       g_assert_not_reached ();
@@ -4315,60 +4339,61 @@ step_sheet (GtkSheet *sheet, GtkScrollType dir)
     }
 
 
-  maximize_int (&new_row, 0);
-  maximize_int (&new_col, 0);
+  maximize_int (&new_cell.row, 0);
+  maximize_int (&new_cell.col, 0);
 
-  minimize_int (&new_row,
+  minimize_int (&new_cell.row,
                g_sheet_row_get_row_count (sheet->row_geometry) - 1);
 
-  minimize_int (&new_col,
+  minimize_int (&new_cell.col,
                g_sheet_column_get_column_count (sheet->column_geometry) - 1);
 
   g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
-                current_row, current_col,
-                &new_row, &new_col, &forbidden);
+                &sheet->active_cell,
+                &new_cell,
+               &forbidden);
 
   if (forbidden)
     return;
 
-  change_active_cell (sheet, new_row, new_col);
+  change_active_cell (sheet, new_cell.row, new_cell.col);
 
-  if ( new_col > max_fully_visible_column (sheet))
+  if ( new_cell.col > max_fully_visible_column (sheet))
     {
       glong hpos  =
        g_sheet_column_start_pixel (sheet->column_geometry,
-                                   new_col + 1);
+                                   new_cell.col + 1);
       hpos -= sheet->hadjustment->page_size;
 
       gtk_adjustment_set_value (sheet->hadjustment,
                                hpos);
     }
-  else if ( new_col < min_fully_visible_column (sheet))
+  else if ( new_cell.col < min_fully_visible_column (sheet))
     {
       glong hpos  =
        g_sheet_column_start_pixel (sheet->column_geometry,
-                                   new_col);
+                                   new_cell.col);
 
       gtk_adjustment_set_value (sheet->hadjustment,
                                hpos);
     }
 
 
-  if ( new_row > max_fully_visible_row (sheet))
+  if ( new_cell.row > max_fully_visible_row (sheet))
     {
       glong vpos  =
        g_sheet_row_start_pixel (sheet->row_geometry,
-                                   new_row + 1);
+                                   new_cell.row + 1);
       vpos -= sheet->vadjustment->page_size;
 
       gtk_adjustment_set_value (sheet->vadjustment,
                                vpos);
     }
-  else if ( new_row < min_fully_visible_row (sheet))
+  else if ( new_cell.row < min_fully_visible_row (sheet))
     {
       glong vpos  =
        g_sheet_row_start_pixel (sheet->row_geometry,
-                                   new_row);
+                                   new_cell.row);
 
       gtk_adjustment_set_value (sheet->vadjustment,
                                vpos);
@@ -4454,7 +4479,7 @@ gtk_sheet_size_request (GtkWidget *widget,
   sheet = GTK_SHEET (widget);
 
   requisition->width = 3 * DEFAULT_COLUMN_WIDTH;
-  requisition->height = 3 * default_row_height (sheet);
+  requisition->height = 3 * DEFAULT_ROW_HEIGHT;
 
   /* compute the size of the column title area */
   if (sheet->column_titles_visible)
@@ -4853,7 +4878,7 @@ gtk_sheet_button_draw (GtkSheet *sheet, GdkWindow *window,
   if (button->label_visible)
     {
 
-      text_height = default_row_height (sheet) -
+      text_height = DEFAULT_ROW_HEIGHT - 
        2 * COLUMN_TITLES_HEIGHT;
 
       gdk_gc_set_clip_rectangle (GTK_WIDGET (sheet)->style->fg_gc[button->state],
@@ -5407,10 +5432,10 @@ gtk_sheet_button_size_request    (GtkSheet *sheet,
   GtkRequisition requisition;
   GtkRequisition label_requisition;
 
-  label_requisition.height = default_row_height (sheet);
+  label_requisition.height = DEFAULT_ROW_HEIGHT;
   label_requisition.width = COLUMN_MIN_WIDTH;
 
-  requisition.height = default_row_height (sheet);
+  requisition.height = DEFAULT_ROW_HEIGHT;
   requisition.width = COLUMN_MIN_WIDTH;