Change traverse signal to take GtkSheetCell instead of gint,gint
[pspp-builds.git] / lib / gtksheet / gtksheet.c
index aefffe2d9853403008e35aa9e9c41350d8b653e3..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,29 +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 (!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)
@@ -425,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;
@@ -523,8 +499,6 @@ static void gtk_sheet_range_draw_selection   (GtkSheet *sheet,
 
 /* Selection */
 
-static gboolean gtk_sheet_move_query                    (GtkSheet *sheet,
-                                                 gint row, gint column);
 static void gtk_sheet_real_select_range         (GtkSheet *sheet,
                                                  const GtkSheetRange *range);
 static void gtk_sheet_real_unselect_range       (GtkSheet *sheet,
@@ -654,6 +628,8 @@ gtk_sheet_get_type ()
   return sheet_type;
 }
 
+\f
+
 static GtkSheetRange*
 gtk_sheet_range_copy (const GtkSheetRange *range)
 {
@@ -692,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);
@@ -955,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] =
@@ -1079,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;
@@ -1219,13 +1234,14 @@ range_update_callback (GSheetModel *m, gint row0, gint col0,
   range.rowi = rowi;
   range.coli = coli;
 
-  if ( max_visible_row (sheet) >
-       g_sheet_model_get_row_count (sheet->model)
+  if ( !GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
+    return;
+
+  if ( max_visible_row (sheet) > g_sheet_model_get_row_count (sheet->model)
        ||
-       max_visible_column (sheet) >
-       g_sheet_model_get_column_count (sheet->model))
+       max_visible_column (sheet) > g_sheet_model_get_column_count (sheet->model))
     {
-      gtk_sheet_move_query (sheet, 0, 0);
+      gtk_sheet_moveto (sheet, 0, 0, 0, 0);
     }
 
   if ( ( row0 < 0 && col0 < 0 ) || ( rowi < 0 && coli < 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)
     {
@@ -4178,71 +4200,6 @@ gtk_sheet_crossing_notify (GtkWidget *widget,
   return TRUE;
 }
 
-
-static gboolean
-gtk_sheet_move_query (GtkSheet *sheet, gint row, gint column)
-{
-  gint height, width;
-  gint new_row = row;
-  gint new_col = column;
-
-  gint row_move = FALSE;
-  gint column_move = FALSE;
-  gfloat row_align = -1.0;
-  gfloat col_align = -1.0;
-
-  if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
-    return FALSE;
-
-  gdk_drawable_get_size (sheet->sheet_window, &width, &height);
-
-  if (row >= max_visible_row (sheet) &&
-      sheet->state != GTK_SHEET_COLUMN_SELECTED)
-    {
-      row_align = 1.;
-      new_row = MIN (g_sheet_row_get_row_count (sheet->row_geometry) - 1, row + 1);
-      row_move = TRUE;
-      if (max_visible_row (sheet) == g_sheet_row_get_row_count (sheet->row_geometry) - 1 &&
-         g_sheet_row_start_pixel (sheet->row_geometry, g_sheet_row_get_row_count (sheet->row_geometry) - 1) +
-         g_sheet_row_get_height (sheet->row_geometry, g_sheet_row_get_row_count (sheet->row_geometry) - 1) < height)
-       {
-         row_move = FALSE;
-         row_align = -1.;
-       }
-    }
-
-  if (row < min_visible_row (sheet) && sheet->state != GTK_SHEET_COLUMN_SELECTED)
-    {
-      row_align= 0.;
-      row_move = TRUE;
-    }
-  if (column >= max_visible_column (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED)
-    {
-      col_align = 1.;
-      new_col = MIN (g_sheet_column_get_column_count (sheet->column_geometry) - 1, column + 1);
-      column_move = TRUE;
-      if (max_visible_column (sheet) == (g_sheet_column_get_column_count (sheet->column_geometry) - 1) &&
-         g_sheet_column_start_pixel (sheet->column_geometry, g_sheet_column_get_column_count (sheet->column_geometry) - 1) +
-         g_sheet_column_get_width (sheet->column_geometry, g_sheet_column_get_column_count (sheet->column_geometry) - 1) < width)
-       {
-         column_move = FALSE;
-         col_align = -1.;
-       }
-    }
-  if (column < min_visible_column (sheet) && sheet->state != GTK_SHEET_ROW_SELECTED)
-    {
-      col_align = 0.0;
-      column_move = TRUE;
-    }
-
-  if (row_move || column_move)
-    {
-      gtk_sheet_moveto (sheet, new_row, new_col, row_align, col_align);
-    }
-
-  return (row_move || column_move);
-}
-
 static void
 gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column)
 {
@@ -4255,7 +4212,6 @@ gtk_sheet_extend_selection (GtkSheet *sheet, gint row, gint column)
 
   if (sheet->selection_mode == GTK_SELECTION_SINGLE) return;
 
-  gtk_sheet_move_query (sheet, row, column);
   gtk_widget_grab_focus (GTK_WIDGET (sheet));
 
   if (GTK_SHEET_IN_DRAG (sheet)) return;
@@ -4357,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 ();
@@ -4381,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);
@@ -4520,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)
@@ -4919,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],
@@ -5473,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;