Fixed some boundary conditions displaying row/column data
[pspp-builds.git] / src / ui / gui / psppire-data-editor.c
index ac90bd1df6ca82d294e791969c288bc39b911e17..79682fe0789b9a0e4960ceefa40a5f92bdf93ba2 100644 (file)
@@ -109,8 +109,12 @@ psppire_data_editor_finalize (GObject *obj)
 
 
 
-static void popup_variable_menu (GtkSheet *sheet, gint column,
-                                GdkEventButton *event, gpointer data);
+static void popup_variable_column_menu (GtkSheet *sheet, gint column,
+                                       GdkEventButton *event, gpointer data);
+
+static void popup_variable_row_menu (GtkSheet *sheet, gint row,
+                                    GdkEventButton *event, gpointer data);
+
 
 static void popup_cases_menu (GtkSheet *sheet, gint row,
                              GdkEventButton *event, gpointer data);
@@ -118,6 +122,7 @@ static void popup_cases_menu (GtkSheet *sheet, gint row,
 
 
 
+
 /* Callback which occurs when the data sheet's column title
    is double clicked */
 static gboolean
@@ -193,6 +198,7 @@ enum
     PROP_0,
     PROP_DATA_STORE,
     PROP_VAR_STORE,
+    PROP_VS_ROW_MENU,
     PROP_DS_COLUMN_MENU,
     PROP_DS_ROW_MENU,
     PROP_VALUE_LABELS,
@@ -221,11 +227,28 @@ new_data_callback (PsppireDataStore *ds, gpointer data)
     }
 }
 
+/* Return the width (in pixels) of an upper case M when rendered in the
+   current font of W
+*/
+static gint
+width_of_m (GtkWidget *w)
+{
+  PangoRectangle rect;
+  PangoLayout *layout = gtk_widget_create_pango_layout (w, "M");
+
+  pango_layout_get_pixel_extents (layout, NULL, &rect);
+
+  g_object_unref (layout);
+
+  return rect.width;
+}
+
 static void
 new_variables_callback (PsppireDict *dict, gpointer data)
 {
   gint v, i;
   PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+  gint m_width = width_of_m (GTK_WIDGET (de));
 
   PsppireAxisHetero *vaxis;
   g_object_get (de->var_sheet, "vertical-axis", &vaxis, NULL);
@@ -246,27 +269,11 @@ new_variables_callback (PsppireDict *dict, gpointer data)
        {
          const struct variable *var = psppire_dict_get_variable (dict, v);
 
-         psppire_axis_hetero_append (haxis, 10 * var_get_display_width (var));
+         psppire_axis_hetero_append (haxis, m_width * var_get_display_width (var));
        }
     }
 }
 
-/* Return the width (in pixels) of an upper case M when rendered in the
-   current font of W
-*/
-static gint
-width_of_m (GtkWidget *w)
-{
-  PangoRectangle rect;
-  PangoLayout *layout = gtk_widget_create_pango_layout (w, "M");
-
-  pango_layout_get_pixel_extents (layout, NULL, &rect);
-
-  g_object_unref (layout);
-
-  return rect.width;
-}
-
 static void
 insert_variable_callback (PsppireDict *dict, gint x, gpointer data)
 {
@@ -374,12 +381,20 @@ psppire_data_editor_set_property (GObject         *object,
                    "model", de->var_store,
                    NULL);
       break;
+    case PROP_VS_ROW_MENU:
+      {
+       GObject *menu = g_value_get_object (value);
+
+       g_signal_connect (de->var_sheet, "button-event-row",
+                         G_CALLBACK (popup_variable_row_menu), menu);
+      }
+      break;
     case PROP_DS_COLUMN_MENU:
       {
        GObject *menu = g_value_get_object (value);
 
        g_signal_connect (de->data_sheet[0], "button-event-column",
-                         G_CALLBACK (popup_variable_menu), menu);
+                         G_CALLBACK (popup_variable_column_menu), menu);
       }
       break;
     case PROP_DS_ROW_MENU:
@@ -482,7 +497,8 @@ psppire_data_editor_class_init (PsppireDataEditorClass *klass)
   GParamSpec *data_store_spec ;
   GParamSpec *var_store_spec ;
   GParamSpec *column_menu_spec;
-  GParamSpec *row_menu_spec;
+  GParamSpec *ds_row_menu_spec;
+  GParamSpec *vs_row_menu_spec;
   GParamSpec *value_labels_spec;
   GParamSpec *current_case_spec;
   GParamSpec *current_var_spec;
@@ -530,7 +546,7 @@ psppire_data_editor_class_init (PsppireDataEditorClass *klass)
                                    column_menu_spec);
 
 
-  row_menu_spec =
+  ds_row_menu_spec =
     g_param_spec_object ("datasheet-row-menu",
                         "Data Sheet Row Menu",
                         "A menu to be displayed when button 3 is pressed in the data sheet's row title buttons",
@@ -539,7 +555,20 @@ psppire_data_editor_class_init (PsppireDataEditorClass *klass)
 
   g_object_class_install_property (object_class,
                                    PROP_DS_ROW_MENU,
-                                   row_menu_spec);
+                                   ds_row_menu_spec);
+
+
+  vs_row_menu_spec =
+    g_param_spec_object ("varsheet-row-menu",
+                        "Variable Sheet Row Menu",
+                        "A menu to be displayed when button 3 is pressed in the variable sheet's row title buttons",
+                        GTK_TYPE_MENU,
+                        G_PARAM_WRITABLE);
+
+  g_object_class_install_property (object_class,
+                                   PROP_VS_ROW_MENU,
+                                   vs_row_menu_spec);
+
 
   value_labels_spec =
     g_param_spec_boolean ("value-labels",
@@ -1096,7 +1125,7 @@ psppire_data_editor_clip_cut (PsppireDataEditor *de)
 /* Popup menu related stuff */
 
 static void
-popup_variable_menu (GtkSheet *sheet, gint column,
+popup_variable_column_menu (GtkSheet *sheet, gint column,
                     GdkEventButton *event, gpointer data)
 {
   GtkMenu *menu = GTK_MENU (data);
@@ -1118,6 +1147,29 @@ popup_variable_menu (GtkSheet *sheet, gint column,
 }
 
 
+static void
+popup_variable_row_menu (GtkSheet *sheet, gint row,
+                    GdkEventButton *event, gpointer data)
+{
+  GtkMenu *menu = GTK_MENU (data);
+
+  PsppireVarStore *var_store =
+    PSPPIRE_VAR_STORE (gtk_sheet_get_model (sheet));
+
+  const struct variable *v =
+    psppire_dict_get_variable (var_store->dict, row);
+
+  if ( v && event->button == 3)
+    {
+      gtk_sheet_select_row (sheet, row);
+
+      gtk_menu_popup (menu,
+                     NULL, NULL, NULL, NULL,
+                     event->button, event->time);
+    }
+}
+
+
 static void
 popup_cases_menu (GtkSheet *sheet, gint row,
                  GdkEventButton *event, gpointer data)