Merge psppire-axis and psppire-axis-impl
[pspp-builds.git] / lib / gtk-contrib / psppire-sheet.c
index 31ecbcbf5b17dfb30e9ff9590632d0d4157fa6de..4119037d9c0ef02ed74e4cf69bb8c35ccdc9f609 100644 (file)
@@ -1,5 +1,5 @@
 /*
-   Copyright (C) 2006, 2008 Free Software Foundation
+   Copyright (C) 2006, 2008, 2009 Free Software Foundation
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -69,7 +69,9 @@
 #include "psppire-sheet.h"
 #include <ui/gui/psppire-marshal.h>
 #include <ui/gui/sheet/psppire-sheetmodel.h>
+#include <ui/gui/sheet/psppire-axis.h>
 #include <libpspp/misc.h>
+
 #include <math.h>
 
 /* sheet flags */
@@ -477,9 +479,7 @@ static void psppire_sheet_size_allocate              (GtkWidget *widget,
                                                  GtkAllocation *allocation);
 
 static gboolean psppire_sheet_focus_in               (GtkWidget     *widget,
-                                                     GdkEventFocus *event,
-                                                     gpointer       user_data);
-
+                                                     GdkEventFocus *event);
 
 /* Sheet queries */
 
@@ -1015,6 +1015,7 @@ psppire_sheet_class_init (PsppireSheetClass *klass)
   container_class->add = NULL;
   container_class->remove = NULL;
   container_class->forall = psppire_sheet_forall;
+  container_class->set_focus_child = NULL;
 
   object_class->dispose = psppire_sheet_dispose;
   object_class->finalize = psppire_sheet_finalize;
@@ -2099,6 +2100,13 @@ psppire_sheet_unmap (GtkWidget *widget)
     gtk_widget_unmap (sheet->button);
 }
 
+/* get cell attributes of the given cell */
+/* TRUE means that the cell is currently allocated */
+static gboolean psppire_sheet_get_attributes (const PsppireSheet *sheet,
+                                             gint row, gint col,
+                                             PsppireSheetCellAttr *attributes);
+
+
 
 static void
 psppire_sheet_cell_draw (PsppireSheet *sheet, gint row, gint col)
@@ -4060,8 +4068,7 @@ psppire_sheet_crossing_notify (GtkWidget *widget,
 
 static gboolean
 psppire_sheet_focus_in (GtkWidget     *w,
-                       GdkEventFocus *event,
-                       gpointer       user_data)
+                       GdkEventFocus *event)
 {
   PsppireSheet *sheet = PSPPIRE_SHEET (w);
 
@@ -4204,12 +4211,29 @@ step_sheet (PsppireSheet *sheet, GtkScrollType dir)
     case GTK_SCROLL_STEP_LEFT:
       new_cell.col--;
       break;
+    case GTK_SCROLL_STEP_FORWARD:
+      new_cell.col++;
+      if (new_cell.col >=
+         psppire_sheet_model_get_column_count (sheet->model))
+       {
+         new_cell.col = 0;
+         new_cell.row++;
+       }
+      break;
+    case GTK_SCROLL_STEP_BACKWARD:
+      new_cell.col--;
+      if (new_cell.col < 0)
+       {
+         new_cell.col =
+           psppire_sheet_model_get_column_count (sheet->model) - 1;
+         new_cell.row--;
+       }
+      break;
     default:
       g_assert_not_reached ();
       break;
     }
 
-
   g_signal_emit (sheet, sheet_signals[TRAVERSE], 0,
                 &sheet->active_cell,
                 &new_cell,
@@ -4287,10 +4311,14 @@ psppire_sheet_key_press (GtkWidget *widget,
   switch (key->keyval)
     {
     case GDK_Tab:
+      step_sheet (sheet, GTK_SCROLL_STEP_FORWARD);
+      break;
     case GDK_Right:
       step_sheet (sheet, GTK_SCROLL_STEP_RIGHT);
       break;
     case GDK_ISO_Left_Tab:
+      step_sheet (sheet, GTK_SCROLL_STEP_BACKWARD);
+      break;
     case GDK_Left:
       step_sheet (sheet, GTK_SCROLL_STEP_LEFT);
       break;
@@ -4728,6 +4756,26 @@ draw_button (PsppireSheet *sheet, GdkWindow *window,
                   allocation.x, allocation.y,
                   allocation.width, allocation.height);
 
+  if ( button->overstruck)
+    {
+      GdkPoint points[2] = {
+       {allocation.x,  allocation.y},
+       {allocation.x + allocation.width,
+        allocation.y + allocation.height}
+      };
+
+      gtk_paint_polygon (sheet->button->style,
+                        window,
+                        button->state,
+                        shadow_type,
+                        NULL,
+                        GTK_WIDGET (sheet),
+                        "button",
+                        points,
+                        2,
+                        TRUE);
+    }
+
   if (button->label_visible)
     {
       text_height = DEFAULT_ROW_HEIGHT -
@@ -5209,7 +5257,7 @@ set_row_height (PsppireSheet *sheet,
     }
 }
 
-gboolean
+static gboolean
 psppire_sheet_get_attributes (const PsppireSheet *sheet, gint row, gint col,
                          PsppireSheetCellAttr *attr)
 {
@@ -5232,8 +5280,6 @@ psppire_sheet_get_attributes (const PsppireSheet *sheet, gint row, gint col,
   attr->border.mask = 0;
   attr->border.color = GTK_WIDGET (sheet)->style->black;
 
-  attr->is_editable = psppire_sheet_model_is_editable (sheet->model, row, col);
-
   colormap = gtk_widget_get_colormap (GTK_WIDGET (sheet));
   fg = psppire_sheet_model_get_foreground (sheet->model, row, col);
   if ( fg )
@@ -5316,6 +5362,7 @@ psppire_sheet_button_new (void)
   button->label = NULL;
   button->label_visible = TRUE;
   button->justification = GTK_JUSTIFY_FILL;
+  button->overstruck = FALSE;
 
   return button;
 }