Fixed a problem redrawing the active cell.
[pspp-builds.git] / lib / gtksheet / gtksheet.c
index be86de258480b7af113208c98cd11ffba28d4bba..555984ad508d120f497785be14047620f8255b8f 100644 (file)
@@ -95,7 +95,7 @@ static void draw_row_title_buttons_range (GtkSheet *sheet, gint first, gint n);
 
 static void set_row_height (GtkSheet *sheet,
                            gint row,
-                           guint height);
+                           gint height);
 
 static void destroy_hover_window (GtkSheetHoverTitle *);
 static GtkSheetHoverTitle *create_hover_window (void);
@@ -503,12 +503,6 @@ static void draw_xor_hline                          (GtkSheet *sheet);
 static void draw_xor_rectangle                  (GtkSheet *sheet,
                                                  GtkSheetRange range);
 
-static guint new_column_width                   (GtkSheet *sheet,
-                                                 gint column,
-                                                 gint *x);
-static guint new_row_height                     (GtkSheet *sheet,
-                                                 gint row,
-                                                 gint *y);
 /* Sheet Button */
 
 static void create_global_button                (GtkSheet *sheet);
@@ -535,9 +529,6 @@ static void gtk_sheet_real_cell_clear                (GtkSheet *sheet,
                                                  gint column);
 
 
-static void gtk_sheet_column_size_request (GtkSheet *sheet,
-                                          gint col,
-                                          guint *requisition);
 static void gtk_sheet_row_size_request (GtkSheet *sheet,
                                        gint row,
                                        guint *requisition);
@@ -1070,7 +1061,6 @@ gtk_sheet_init (GtkSheet *sheet)
 
   sheet->sheet_window = NULL;
   sheet->entry_widget = NULL;
-  sheet->entry_handler_id = 0;
   sheet->button = NULL;
 
   sheet->hadjustment = NULL;
@@ -1326,10 +1316,9 @@ gtk_sheet_get_columns_count (GtkSheet *sheet)
   return psppire_axis_unit_count (sheet->haxis);
 }
 
-static void
-set_column_width (GtkSheet *sheet,
-                           gint column,
-                           guint width);
+static void set_column_width (GtkSheet *sheet,
+                             gint column,
+                             gint width);
 
 
 void
@@ -1811,8 +1800,8 @@ gtk_sheet_realize (GtkWidget *widget)
   sheet->fg_gc = gdk_gc_new (widget->window);
   sheet->bg_gc = gdk_gc_new (widget->window);
 
-  values.foreground = widget->style->black;
-  values.function = GDK_COPY;
+  values.foreground = widget->style->white;
+  values.function = GDK_INVERT;
   values.subwindow_mode = GDK_INCLUDE_INFERIORS;
   values.line_width = BORDER_WIDTH;
 
@@ -2134,7 +2123,7 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
   g_return_if_fail (drawing_range.rowi >= drawing_range.row0);
   g_return_if_fail (drawing_range.coli >= drawing_range.col0);
 
-  gdk_window_begin_paint_rect (sheet->sheet_window, &area);
+  //  gdk_window_begin_paint_rect (sheet->sheet_window, &area);
 
   for (i = drawing_range.row0; i <= drawing_range.rowi; i++)
     for (j = drawing_range.col0; j <= drawing_range.coli; j++)
@@ -2153,7 +2142,7 @@ gtk_sheet_range_draw (GtkSheet *sheet, const GtkSheetRange *range)
       sheet->active_cell.col <= drawing_range.coli)
     gtk_sheet_show_entry_widget (sheet);
 
-  gdk_window_end_paint (sheet->sheet_window);
+  //  gdk_window_end_paint (sheet->sheet_window);
 }
 
 static void
@@ -2535,7 +2524,6 @@ static void
 change_active_cell (GtkSheet *sheet, gint row, gint col)
 {
   gint old_row, old_col;
-  glong old_handler_id = sheet->entry_handler_id;
 
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
@@ -2552,29 +2540,11 @@ change_active_cell (GtkSheet *sheet, gint row, gint col)
       gtk_sheet_real_unselect_range (sheet, NULL);
     }
 
-
-  g_signal_handler_block   (sheet->entry_widget, sheet->entry_handler_id);
-
   old_row = sheet->active_cell.row;
   old_col = sheet->active_cell.col;
 
-  {
-    /* Redraw the neighbourhood of the old active cell */
-    GtkSheetRange r;
-    r.col0 = old_col - 1;
-    r.coli = old_col + 1;
-    r.row0 = old_row - 1;
-    r.rowi = old_row + 1;
-
-    maximize_int (&r.row0, 0);
-    maximize_int (&r.col0, 0);
-    minimize_int (&r.rowi, psppire_axis_unit_count (sheet->vaxis) - 1);
-    minimize_int (&r.coli, psppire_axis_unit_count (sheet->haxis) - 1);
-
-
-    if (  gtk_sheet_range_isvisible (sheet, &r))
-      gtk_sheet_range_draw (sheet, &r);
-  }
+  /* Erase the old cell */
+  gtk_sheet_draw_active_cell (sheet);
 
   sheet->range.row0 = row;
   sheet->range.col0 = col;
@@ -2594,8 +2564,6 @@ change_active_cell (GtkSheet *sheet, gint row, gint col)
   g_signal_emit (sheet, sheet_signals [ACTIVATE], 0,
                 row, col, old_row, old_col);
 
-  if ( old_handler_id == sheet->entry_handler_id)
-    g_signal_handler_unblock   (sheet->entry_widget, sheet->entry_handler_id);
 }
 
 static void
@@ -3056,15 +3024,10 @@ static gint
 gtk_sheet_expose (GtkWidget *widget,
                  GdkEventExpose *event)
 {
-  GtkSheet *sheet;
-  GtkSheetRange range;
+  GtkSheet *sheet = GTK_SHEET (widget);
 
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
-  sheet = GTK_SHEET (widget);
-
   if (!GTK_WIDGET_DRAWABLE (widget))
     return FALSE;
 
@@ -3085,33 +3048,33 @@ gtk_sheet_expose (GtkWidget *widget,
                                       max_visible_column (sheet));
     }
 
+  if (event->window == sheet->sheet_window)
+    {
+      GtkSheetRange range;
 
-  {
-    gint y = event->area.y + sheet->vadjustment->value;
-    gint x = event->area.x + sheet->hadjustment->value;
+      gint y = event->area.y + sheet->vadjustment->value;
+      gint x = event->area.x + sheet->hadjustment->value;
 
-    if ( sheet->column_titles_visible)
-      y -= sheet->column_title_area.height;
+      if ( sheet->column_titles_visible)
+       y -= sheet->column_title_area.height;
 
-    if ( sheet->row_titles_visible)
-      x -= sheet->row_title_area.width;
+      if ( sheet->row_titles_visible)
+       x -= sheet->row_title_area.width;
 
-    maximize_int (&x, 0);
-    maximize_int (&y, 0);
+      maximize_int (&x, 0);
+      maximize_int (&y, 0);
 
-    range.row0 = row_from_ypixel (sheet, y);
+      range.row0 = row_from_ypixel (sheet, y);
 
-    range.rowi = row_from_ypixel (sheet, y + event->area.height);
+      range.rowi = row_from_ypixel (sheet, y + event->area.height);
 
-    range.col0 = column_from_xpixel (sheet, x);
+      range.col0 = column_from_xpixel (sheet, x);
 
-    range.coli = column_from_xpixel (sheet, x + event->area.width);
-  }
+      range.coli = column_from_xpixel (sheet, x + event->area.width);
 
-  if (event->window == sheet->sheet_window)
-    {
       gtk_sheet_range_draw (sheet, &range);
 
+#if 0
       if (sheet->state != GTK_SHEET_NORMAL)
        {
          if (gtk_sheet_range_isvisible (sheet, &sheet->range))
@@ -3125,12 +3088,19 @@ gtk_sheet_expose (GtkWidget *widget,
          if (GTK_SHEET_IN_RESIZE (sheet) || GTK_SHEET_IN_DRAG (sheet))
            draw_xor_rectangle (sheet, sheet->drag_range);
        }
+#endif
 
       if ((!GTK_SHEET_IN_XDRAG (sheet)) && (!GTK_SHEET_IN_YDRAG (sheet)))
        {
-         if (sheet->state == GTK_SHEET_NORMAL)
-           g_idle_add (gtk_sheet_draw_active_cell, sheet);
+         if (range.row0 <= sheet->active_cell.row &&
+             range.rowi >= sheet->active_cell.row &&
+             range.col0 <= sheet->active_cell.col &&
+             range.coli >= sheet->active_cell.col)
+           {
+             gtk_sheet_draw_active_cell (sheet);
+           }
        }
+
     }
 
   (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
@@ -3168,6 +3138,7 @@ gtk_sheet_button_press (GtkWidget *widget,
 
   if (event->window == sheet->column_title_window)
     {
+      sheet->x_drag = event->x;
       g_signal_emit (sheet,
                     sheet_signals[BUTTON_EVENT_COLUMN], 0,
                     column, event);
@@ -3205,8 +3176,6 @@ gtk_sheet_button_press (GtkWidget *widget,
 
       if (on_column_boundary (sheet, sheet->x_drag, &sheet->drag_cell.col))
        {
-         guint req;
-         gtk_sheet_column_size_request (sheet, sheet->drag_cell.col, &req);
          GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
          gdk_pointer_grab (sheet->column_title_window, FALSE,
                            GDK_POINTER_MOTION_HINT_MASK |
@@ -3225,8 +3194,6 @@ gtk_sheet_button_press (GtkWidget *widget,
 
       if (on_row_boundary (sheet, sheet->y_drag, &sheet->drag_cell.row))
        {
-         guint req;
-         gtk_sheet_row_size_request (sheet, sheet->drag_cell.row, &req);
          GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_YDRAG);
          gdk_pointer_grab (sheet->row_title_window, FALSE,
                            GDK_POINTER_MOTION_HINT_MASK |
@@ -3431,8 +3398,6 @@ gtk_sheet_click_cell (GtkSheet *sheet, gint row, gint column)
   sheet->state = GTK_SHEET_NORMAL;
   GTK_SHEET_SET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
 
-  gtk_sheet_draw_active_cell (sheet);
-
   gtk_widget_grab_focus (GTK_WIDGET (sheet->entry_widget));
 
   return TRUE;
@@ -3449,7 +3414,6 @@ gtk_sheet_button_release (GtkWidget *widget,
   /* release on resize windows */
   if (GTK_SHEET_IN_XDRAG (sheet))
     {
-      gint xpos = event->x;
       gint width;
       GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
       GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
@@ -3457,15 +3421,17 @@ gtk_sheet_button_release (GtkWidget *widget,
       gdk_display_pointer_ungrab (display, event->time);
       draw_xor_vline (sheet);
 
-      width = new_column_width (sheet, sheet->drag_cell.col, &xpos);
+      width = event->x -
+       psppire_axis_start_pixel (sheet->haxis, sheet->drag_cell.col)
+       + sheet->hadjustment->value;
 
       set_column_width (sheet, sheet->drag_cell.col, width);
+
       return TRUE;
     }
 
   if (GTK_SHEET_IN_YDRAG (sheet))
     {
-      gint ypos = event->y;
       gint height;
       GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_YDRAG);
       GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
@@ -3473,8 +3439,12 @@ gtk_sheet_button_release (GtkWidget *widget,
       gdk_display_pointer_ungrab (display, event->time);
       draw_xor_hline (sheet);
 
-      height = new_row_height (sheet, sheet->drag_cell.row, &ypos);
+      height = event->y -
+       psppire_axis_start_pixel (sheet->vaxis, sheet->drag_cell.row) +
+       sheet->vadjustment->value;
+
       set_row_height (sheet, sheet->drag_cell.row, height);
+
       return TRUE;
     }
 
@@ -3699,19 +3669,15 @@ motion_timeout_callback (gpointer data)
 static gboolean
 gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
 {
-  GtkSheet *sheet;
+  GtkSheet *sheet = GTK_SHEET (widget);
   GdkModifierType mods;
   GdkCursorType new_cursor;
   gint x, y;
   gint row, column;
   GdkDisplay *display;
 
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
-  sheet = GTK_SHEET (widget);
-
   display = gtk_widget_get_display (widget);
 
   /* selections on the sheet */
@@ -3846,34 +3812,25 @@ gtk_sheet_motion (GtkWidget *widget,  GdkEventMotion *event)
 
   if (GTK_SHEET_IN_XDRAG (sheet))
     {
-      x = event->x;
-
-      new_column_width (sheet, sheet->drag_cell.col, &x);
-#if 0
-      if (x != sheet->x_drag)
+      if (event->x != sheet->x_drag)
        {
          draw_xor_vline (sheet);
-         sheet->x_drag = x;
+         sheet->x_drag = event->x;
          draw_xor_vline (sheet);
        }
-#endif
+
       return TRUE;
     }
 
   if (GTK_SHEET_IN_YDRAG (sheet))
     {
-      if (event->is_hint || event->window != widget->window)
-       gtk_widget_get_pointer (widget, NULL, &y);
-      else
-       y = event->y;
-
-      new_row_height (sheet, sheet->drag_cell.row, &y);
-      if (y != sheet->y_drag)
+      if (event->y != sheet->y_drag)
        {
          draw_xor_hline (sheet);
-         sheet->y_drag = y;
+         sheet->y_drag = event->y;
          draw_xor_hline (sheet);
        }
+
       return TRUE;
     }
 
@@ -4573,8 +4530,7 @@ create_sheet_entry (GtkSheet *sheet)
                            G_CALLBACK (gtk_sheet_entry_key_press),
                            sheet);
 
-  sheet->entry_handler_id =
-    g_signal_connect (sheet->entry_widget,
+  g_signal_connect (sheet->entry_widget,
                      "changed",
                      G_CALLBACK (gtk_sheet_entry_changed),
                      sheet);
@@ -4990,7 +4946,6 @@ draw_xor_vline (GtkSheet *sheet)
   gdk_drawable_get_size (sheet->sheet_window,
                         NULL, &height);
 
-
   if (sheet->row_titles_visible)
     xpos += sheet->row_title_area.width;
 
@@ -5082,83 +5037,18 @@ draw_xor_rectangle (GtkSheet *sheet, GtkSheetRange range)
 }
 
 
-/* this function returns the new width of the column being resized given
- * the COLUMN and X position of the cursor; the x cursor position is passed
- * in as a pointer and automaticaly corrected if it's outside the acceptable
- * range */
-static guint
-new_column_width (GtkSheet *sheet, gint column, gint *x)
-{
-  gint left_pos = psppire_axis_start_pixel (sheet->haxis, column)
-    - sheet->hadjustment->value;
-
-  gint width = *x - left_pos;
-
-  if ( width < sheet->column_requisition)
-    {
-      width = sheet->column_requisition;
-      *x = left_pos + width;
-    }
-
-#if AXIS_TRANSITION
-  g_sheet_column_set_width (sheet->column_geometry, column, width);
-#endif
-
-  draw_column_title_buttons (sheet);
-
-  return width;
-}
-
-/* this function returns the new height of the row being resized given
- * the row and y position of the cursor; the y cursor position is passed
- * in as a pointer and automaticaly corrected if it's beyond min / max limits */
-static guint
-new_row_height (GtkSheet *sheet, gint row, gint *y)
-{
-  gint height;
-  guint min_height;
-
-  gint cy = *y;
-  min_height = sheet->row_requisition;
-
-  /* you can't shrink a row to less than its minimum height */
-  if (cy < psppire_axis_start_pixel (sheet->vaxis, row) + min_height)
-
-    {
-      *y = cy = psppire_axis_start_pixel (sheet->vaxis, row) + min_height;
-    }
-
-  /* calculate new row height making sure it doesn't end up
-   * less than the minimum height */
-  height = (cy - psppire_axis_start_pixel (sheet->vaxis, row));
-  if (height < min_height)
-    height = min_height;
-
-#if AXIS_TRANSITION
-  g_sheet_row_set_height (sheet->row_geometry, row, height);
-#endif
-  draw_row_title_buttons (sheet);
-
-  return height;
-}
-
 static void
 set_column_width (GtkSheet *sheet,
                  gint column,
-                 guint width)
+                 gint width)
 {
-  guint min_width;
-
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
   if (column < 0 || column >= psppire_axis_unit_count (sheet->haxis))
     return;
 
-  gtk_sheet_column_size_request (sheet, column, &min_width);
-  if (width < min_width) return;
-
-  psppire_axis_impl_resize (sheet->haxis, column, width);
+  psppire_axis_resize (sheet->haxis, column, width);
 
   if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
     {
@@ -5169,24 +5059,18 @@ set_column_width (GtkSheet *sheet,
     }
 }
 
-
 static void
 set_row_height (GtkSheet *sheet,
                gint row,
-               guint height)
+               gint height)
 {
-  guint min_height;
-
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
   if (row < 0 || row >= psppire_axis_unit_count (sheet->vaxis))
     return;
 
-  gtk_sheet_row_size_request (sheet, row, &min_height);
-  if (height < min_height) return;
-
-  psppire_axis_impl_resize (sheet->vaxis, row, height);
+  psppire_axis_resize (sheet->vaxis, row, height);
 
   if (GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)) )
     {
@@ -5268,43 +5152,6 @@ gtk_sheet_button_size_request     (GtkSheet *sheet,
 
 }
 
-static void
-gtk_sheet_row_size_request (GtkSheet *sheet,
-                           gint row,
-                           guint *requisition)
-{
-  GtkRequisition button_requisition;
-
-  gtk_sheet_button_size_request (sheet,
-                                g_sheet_model_get_row_button (sheet->model, row),
-                                &button_requisition);
-
-  *requisition = button_requisition.height;
-
-  sheet->row_requisition = *requisition;
-}
-
-static void
-gtk_sheet_column_size_request (GtkSheet *sheet,
-                              gint col,
-                              guint *requisition)
-{
-  GtkRequisition button_requisition;
-
-  GtkSheetButton *button = g_sheet_model_get_column_button (sheet->model, col);
-
-  gtk_sheet_button_size_request (sheet,
-                                button,
-                                &button_requisition);
-
-  gtk_sheet_button_free (button);
-
-  *requisition = button_requisition.width;
-
-  sheet->column_requisition = *requisition;
-}
-
-
 static void
 gtk_sheet_forall (GtkContainer *container,
                  gboolean include_internals,