Added popup menus to column and row title areas in datasheet.
[pspp-builds.git] / lib / gtksheet / gtksheet.c
index b96bb32291f2d71ad3a48d681ddb9dbc2e1f8c9c..05cc5fd43c3407f17b6fe235cf0b811fbecec7be 100644 (file)
@@ -761,12 +761,11 @@ static void init_attributes                        (const GtkSheet *sheet, gint col,
 
 /* Memory allocation routines */
 static void gtk_sheet_real_range_clear                  (GtkSheet *sheet,
-                                                 const GtkSheetRange *range,
-                                                 gboolean delete);
+                                                 const GtkSheetRange *range);
+
 static void gtk_sheet_real_cell_clear           (GtkSheet *sheet,
                                                  gint row,
-                                                 gint column,
-                                                 gboolean delete);
+                                                 gint column);
 
 
 /* Container Functions */
@@ -798,6 +797,8 @@ enum
     SELECT_COLUMN,
     DOUBLE_CLICK_ROW,
     DOUBLE_CLICK_COLUMN,
+    BUTTON_EVENT_ROW,
+    BUTTON_EVENT_COLUMN,
     SELECT_RANGE,
     CLIP_RANGE,
     RESIZE_RANGE,
@@ -935,7 +936,7 @@ gtk_sheet_class_init (GtkSheetClass * klass)
 
 
   /**
-   * GtkSheet::double - click - row
+   * GtkSheet::double-click-row
    * @sheet: the sheet widget that emitted the signal
    * @row: the row that was double clicked.
    *
@@ -954,7 +955,7 @@ gtk_sheet_class_init (GtkSheetClass * klass)
 
 
   /**
-   * GtkSheet::double - click - column
+   * GtkSheet::double-click-column
    * @sheet: the sheet widget that emitted the signal
    * @column: the column that was double clicked.
    *
@@ -972,6 +973,48 @@ gtk_sheet_class_init (GtkSheetClass * klass)
                  G_TYPE_INT);
 
 
+  /**
+   * GtkSheet::button-event-column
+   * @sheet: the sheet widget that emitted the signal
+   * @column: the column on which the event occured.
+   *
+   * A button event occured on a column title button
+   */
+  sheet_signals[BUTTON_EVENT_COLUMN] =
+    g_signal_new ("button-event-column",
+                 G_TYPE_FROM_CLASS (object_class),
+                 G_SIGNAL_RUN_LAST,
+                 0,
+                 NULL, NULL,
+                 gtkextra_VOID__INT_POINTER,
+                 G_TYPE_NONE,
+                 2,
+                 G_TYPE_INT,
+                 G_TYPE_POINTER
+                 );
+
+
+  /**
+   * GtkSheet::button-event-row
+   * @sheet: the sheet widget that emitted the signal
+   * @column: the column on which the event occured.
+   *
+   * A button event occured on a row title button
+   */
+  sheet_signals[BUTTON_EVENT_ROW] =
+    g_signal_new ("button-event-row",
+                 G_TYPE_FROM_CLASS (object_class),
+                 G_SIGNAL_RUN_LAST,
+                 0,
+                 NULL, NULL,
+                 gtkextra_VOID__INT_POINTER,
+                 G_TYPE_NONE,
+                 2,
+                 G_TYPE_INT,
+                 G_TYPE_POINTER
+                 );
+
+
   sheet_signals[SELECT_RANGE] =
     g_signal_new ("select-range",
                  G_TYPE_FROM_CLASS (object_class),
@@ -1210,7 +1253,7 @@ gtk_sheet_init (GtkSheet *sheet)
   gdk_color_alloc (gdk_colormap_get_system (), &sheet->grid_color);
   sheet->show_grid = TRUE;
 
-  sheet->motion_events = 0;
+  sheet->motion_timer = 0;
 }
 
 
@@ -2612,10 +2655,6 @@ gtk_sheet_finalize (GObject * object)
 
   sheet = GTK_SHEET (object);
 
-  /* get rid of all the cells */
-  gtk_sheet_range_clear (sheet, NULL);
-  gtk_sheet_range_delete (sheet, NULL);
-
   if (sheet->name)
     {
       g_free (sheet->name);
@@ -3671,30 +3710,7 @@ gtk_sheet_cell_clear (GtkSheet *sheet, gint row, gint column)
   range.col0 = MIN_VISIBLE_COLUMN (sheet);
   range.coli = MAX_VISIBLE_COLUMN (sheet);
 
-  gtk_sheet_real_cell_clear (sheet, row, column, FALSE);
-
-  if (!GTK_SHEET_IS_FROZEN (sheet))
-    {
-      gtk_sheet_range_draw (sheet, &range);
-    }
-}
-
-void
-gtk_sheet_cell_delete (GtkSheet *sheet, gint row, gint column)
-{
-  GtkSheetRange range;
-
-  g_return_if_fail (sheet != NULL);
-  g_return_if_fail (GTK_IS_SHEET (sheet));
-  if (column >= xxx_column_count (sheet) || row >= yyy_row_count (sheet)) return;
-  if (column < 0 || row < 0) return;
-
-  range.row0 = row;
-  range.rowi = row;
-  range.col0 = MIN_VISIBLE_COLUMN (sheet);
-  range.coli = MAX_VISIBLE_COLUMN (sheet);
-
-  gtk_sheet_real_cell_clear (sheet, row, column, TRUE);
+  gtk_sheet_real_cell_clear (sheet, row, column);
 
   if (!GTK_SHEET_IS_FROZEN (sheet))
     {
@@ -3703,7 +3719,7 @@ gtk_sheet_cell_delete (GtkSheet *sheet, gint row, gint column)
 }
 
 static void
-gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column, gboolean delete)
+gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column)
 {
   GSheetModel *model = gtk_sheet_get_model (sheet);
 
@@ -3727,22 +3743,11 @@ gtk_sheet_range_clear (GtkSheet *sheet, const GtkSheetRange *range)
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
-  gtk_sheet_real_range_clear (sheet, range, FALSE);
-}
-
-void
-gtk_sheet_range_delete (GtkSheet *sheet, const GtkSheetRange *range)
-{
-  g_return_if_fail (sheet != NULL);
-  g_return_if_fail (GTK_IS_SHEET (sheet));
-
-  gtk_sheet_real_range_clear (sheet, range, TRUE);
+  gtk_sheet_real_range_clear (sheet, range);
 }
 
-
 static void
-gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range,
-                           gboolean delete)
+gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range)
 {
   gint i, j;
   GtkSheetRange clear;
@@ -3765,7 +3770,7 @@ gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range,
   for (i = clear.row0; i <= clear.rowi; i++)
     for (j = clear.col0; j <= clear.coli; j++)
       {
-       gtk_sheet_real_cell_clear (sheet, i, j, delete);
+       gtk_sheet_real_cell_clear (sheet, i, j);
       }
 
   gtk_sheet_range_draw (sheet, NULL);
@@ -4793,6 +4798,7 @@ gtk_sheet_unselect_range (GtkSheet * sheet)
 {
   gtk_sheet_real_unselect_range (sheet, NULL);
   sheet->state = GTK_STATE_NORMAL;
+
   gtk_sheet_activate_cell (sheet,
                           sheet->active_cell.row, sheet->active_cell.col);
 }
@@ -4811,6 +4817,9 @@ gtk_sheet_real_unselect_range (GtkSheet * sheet,
   if (range->row0 < 0 || range->rowi < 0) return;
   if (range->col0 < 0 || range->coli < 0) return;
 
+  g_signal_emit (G_OBJECT (sheet), sheet_signals[SELECT_COLUMN], 0, -1);
+  g_signal_emit (G_OBJECT (sheet), sheet_signals[SELECT_ROW], 0, -1);
+
   if (gtk_sheet_range_isvisible (sheet, *range))
     gtk_sheet_draw_backing_pixmap (sheet, *range);
 
@@ -4914,21 +4923,37 @@ gtk_sheet_button_press (GtkWidget * widget,
 
   sheet = GTK_SHEET (widget);
 
-  if ( event->type == GDK_2BUTTON_PRESS)
+  /* Cancel any pending tooltips */
+  if (sheet->motion_timer)
     {
-      gtk_widget_get_pointer (widget, &x, &y);
-      gtk_sheet_get_pixel_info (sheet, x, y, &row, &column);
+      g_source_remove (sheet->motion_timer);
+      sheet->motion_timer = 0;
+    }
+
+  gtk_widget_get_pointer (widget, &x, &y);
+  gtk_sheet_get_pixel_info (sheet, x, y, &row, &column);
+
+
+  if (event->window == sheet->column_title_window)
+    {
+      g_signal_emit (G_OBJECT (sheet),
+                    sheet_signals[BUTTON_EVENT_COLUMN], 0,
+                    column, event);
+
+      if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
+       g_signal_emit (G_OBJECT (sheet),
+                      sheet_signals[DOUBLE_CLICK_COLUMN], 0, column);
 
-      if (event->window == sheet->column_title_window)
-       {
-         g_signal_emit (G_OBJECT (sheet),
-                        sheet_signals[DOUBLE_CLICK_COLUMN], 0, column);
-       }
-      else if (event->window == sheet->row_title_window)
-       {
-         g_signal_emit (G_OBJECT (sheet),
-                        sheet_signals[DOUBLE_CLICK_ROW], 0, row);
-       }
+    }
+  else if (event->window == sheet->row_title_window)
+    {
+      g_signal_emit (G_OBJECT (sheet),
+                    sheet_signals[BUTTON_EVENT_ROW], 0,
+                    row, event);
+
+      if ( event->type == GDK_2BUTTON_PRESS && event->button == 1)
+       g_signal_emit (G_OBJECT (sheet),
+                      sheet_signals[DOUBLE_CLICK_ROW], 0, row);
     }
 
 
@@ -5457,39 +5482,36 @@ static gboolean
 motion_timeout_callback (gpointer data)
 {
   GtkSheet *sheet = GTK_SHEET (data);
-  if ( --sheet->motion_events == 0 )
+  gint x, y;
+  gint row, column;
+  gtk_widget_get_pointer (GTK_WIDGET (sheet), &x, &y);
+
+  if ( gtk_sheet_get_pixel_info (sheet, x, y, &row, &column) )
     {
-      gint x, y;
-      gint row, column;
-      gtk_widget_get_pointer (GTK_WIDGET (sheet), &x, &y);
+      if ( column == -1 && row == -1 )
+       return FALSE;
 
-      if ( gtk_sheet_get_pixel_info (sheet, x, y, &row, &column) )
+      if ( column == -1)
        {
-         if ( column == -1 && row == -1 )
-           return FALSE;
-
-         if ( column == -1)
-           {
-             GSheetRow *row_geo = sheet->row_geometry;
-             gchar *text;
+         GSheetRow *row_geo = sheet->row_geometry;
+         gchar *text;
 
-             text = g_sheet_row_get_subtitle (row_geo, row);
+         text = g_sheet_row_get_subtitle (row_geo, row);
 
-             show_subtitle (sheet, row, column, text);
-             g_free (text);
-           }
+         show_subtitle (sheet, row, column, text);
+         g_free (text);
+       }
 
-         if ( row == -1)
-           {
-             GSheetColumn *col_geo = sheet->column_geometry;
-             gchar *text;
+      if ( row == -1)
+       {
+         GSheetColumn *col_geo = sheet->column_geometry;
+         gchar *text;
 
-             text = g_sheet_column_get_subtitle (col_geo, column);
+         text = g_sheet_column_get_subtitle (col_geo, column);
 
-             show_subtitle (sheet, row, column, text );
+         show_subtitle (sheet, row, column, text );
 
-             g_free (text);
-           }
+         g_free (text);
        }
     }
 
@@ -5518,8 +5540,9 @@ gtk_sheet_motion (GtkWidget * widget,
 
   if (!sheet->hover_window || ! GTK_WIDGET_VISIBLE (sheet->hover_window->window))
     {
-      sheet->motion_events++;
-      g_timeout_add (TIMEOUT_HOVER, motion_timeout_callback, sheet);
+      if ( sheet->motion_timer > 0 )
+       g_source_remove (sheet->motion_timer);
+      sheet->motion_timer = g_timeout_add (TIMEOUT_HOVER, motion_timeout_callback, sheet);
     }
   else
     {