+
+static void
+sort_down (GtkMenuItem *item, gpointer data)
+{
+ GtkSheet *sheet = data;
+ GtkSheetRange range;
+ gtk_sheet_get_selected_range (sheet, &range);
+
+ do_sort (PSPPIRE_DATA_STORE (gtk_sheet_get_model(sheet)),
+ range.col0, TRUE);
+}
+
+
+
+
+static void
+create_data_sheet_variable_popup_menu (struct data_editor *de)
+{
+ GtkSheet *sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
+ GtkWidget *menu = gtk_menu_new ();
+
+ GtkWidget *sort_ascending =
+ gtk_menu_item_new_with_label (_("Sort Ascending"));
+
+ GtkWidget *sort_descending =
+ gtk_menu_item_new_with_label (_("Sort Descending"));
+
+
+ GtkWidget *insert_variable =
+ gtk_menu_item_new_with_label (_("Insert Variable"));
+
+ GtkWidget *clear_variable =
+ gtk_menu_item_new_with_label (_("Clear"));
+
+
+ gtk_action_connect_proxy (de->insert_variable,
+ insert_variable );
+
+
+ gtk_action_connect_proxy (de->delete_variables,
+ clear_variable );
+
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), insert_variable);
+
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu),
+ gtk_separator_menu_item_new ());
+
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), clear_variable);
+
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu),
+ gtk_separator_menu_item_new ());
+
+
+ g_signal_connect (G_OBJECT (sort_ascending), "activate",
+ G_CALLBACK (sort_up), sheet);
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), sort_ascending);
+
+
+ g_signal_connect (G_OBJECT (sort_descending), "activate",
+ G_CALLBACK (sort_down), sheet);
+
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), sort_descending);
+
+ gtk_widget_show_all (menu);
+
+
+ de->data_sheet_variable_popup_menu = GTK_MENU(menu);
+}
+
+
+static void
+create_data_sheet_cases_popup_menu (struct data_editor *de)
+{
+ GtkWidget *menu = gtk_menu_new ();
+
+ GtkWidget *insert_case =
+ gtk_menu_item_new_with_label (_("Insert Case"));
+
+ GtkWidget *delete_case =
+ gtk_menu_item_new_with_label (_("Clear"));
+
+
+ gtk_action_connect_proxy (de->insert_case,
+ insert_case);
+
+
+ gtk_action_connect_proxy (de->delete_cases,
+ delete_case);
+
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), insert_case);
+
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu),
+ gtk_separator_menu_item_new ());
+
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), delete_case);
+
+
+ gtk_widget_show_all (menu);
+
+
+ de->data_sheet_cases_popup_menu = GTK_MENU (menu);
+}
+
+
+static void
+popup_variable_menu (GtkSheet *sheet, gint column,
+ GdkEventButton *event, gpointer data)
+{
+ struct data_editor *de = data;
+
+ PsppireDataStore *data_store =
+ PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+
+ const struct variable *v =
+ psppire_dict_get_variable (data_store->dict, column);
+
+ if ( v && event->button == 3)
+ {
+
+ gtk_sheet_select_column (sheet, column);
+
+ gtk_menu_popup (GTK_MENU (de->data_sheet_variable_popup_menu),
+ NULL, NULL, NULL, NULL,
+ event->button, event->time);
+ }
+}
+
+
+static void
+popup_cases_menu (GtkSheet *sheet, gint row,
+ GdkEventButton *event, gpointer data)
+{
+ struct data_editor *de = data;
+
+ PsppireDataStore *data_store =
+ PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+
+ if ( row <= psppire_data_store_get_case_count (data_store) &&
+ event->button == 3)
+ {
+ gtk_sheet_select_row (sheet, row);
+
+ gtk_menu_popup (GTK_MENU (de->data_sheet_cases_popup_menu),
+ NULL, NULL, NULL, NULL,
+ event->button, event->time);
+ }
+}
+
+
+static void
+on_edit_paste (GtkAction *a, gpointer data)
+{
+ GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+
+ gtk_clipboard_request_contents (clipboard,
+ gdk_atom_intern ("UTF8_STRING", TRUE),
+ data_sheet_contents_received_callback,
+ data);
+}
+
+
+static void
+on_edit_copy (GtkMenuItem *m, gpointer data)
+{
+ struct data_editor *de = data;
+
+ GtkSheet *data_sheet = GTK_SHEET (get_widget_assert (de->xml,
+ "data_sheet"));
+
+ data_sheet_set_clip (data_sheet);
+}
+
+
+
+static void
+on_edit_cut (GtkMenuItem *m, gpointer data)
+{
+ struct data_editor *de = data;
+ gint max_rows, max_columns;
+ gint r;
+ GtkSheetRange range;
+ PsppireDataStore *ds;
+ GtkSheet *data_sheet = GTK_SHEET (get_widget_assert (de->xml,
+ "data_sheet"));
+
+ data_sheet_set_clip (data_sheet);
+
+
+ /* Now blank all the cells */
+ gtk_sheet_get_selected_range (data_sheet, &range);
+
+ ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
+
+
+ /* If nothing selected, then use active cell */
+ if ( range.row0 < 0 || range.col0 < 0 )
+ {
+ gint row, col;
+ gtk_sheet_get_active_cell (data_sheet, &row, &col);
+
+ range.row0 = range.rowi = row;
+ range.col0 = range.coli = col;
+ }
+
+ /* The sheet range can include cells that do not include data.
+ Exclude them from the range. */
+ max_rows = psppire_data_store_get_case_count (ds);
+ if (range.rowi >= max_rows)
+ {
+ if (max_rows == 0)
+ return;
+ range.rowi = max_rows - 1;
+ }
+
+ max_columns = dict_get_var_cnt (ds->dict->dict);
+ if (range.coli >= max_columns)
+ {
+ if (max_columns == 0)
+ return;
+ range.coli = max_columns - 1;
+ }
+
+ g_return_if_fail (range.rowi >= range.row0);
+ g_return_if_fail (range.row0 >= 0);
+ g_return_if_fail (range.coli >= range.col0);
+ g_return_if_fail (range.col0 >= 0);
+
+
+ for (r = range.row0; r <= range.rowi ; ++r )
+ {
+ gint c;
+
+ for (c = range.col0 ; c <= range.coli; ++c)
+ {
+ psppire_data_store_set_string (ds, "", r, c);
+ }
+ }
+
+ /* and remove the selection */
+ gtk_sheet_unselect_range (data_sheet);
+}
+
+