- if ( row == -1 || column == -1)
- return;
-
- psppire_data_store_set_string (de->data_store, text, row, column);
-}
-
-static void on_activate (PsppireDataEditor *de);
-static gboolean on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p, gint pagenum, gpointer data);
-static void on_select_range (PsppireDataEditor *de);
-
-static void on_select_row (PsppireSheet *, gint, PsppireDataEditor *);
-static void on_select_variable (PsppireSheet *, gint, PsppireDataEditor *);
-
-
-static void on_owner_change (GtkClipboard *,
- GdkEventOwnerChange *, gpointer);
-
-static void
-on_map (GtkWidget *w)
-{
- GtkClipboard *clip = gtk_widget_get_clipboard (w, GDK_SELECTION_CLIPBOARD);
-
- g_signal_connect (clip, "owner-change", G_CALLBACK (on_owner_change), w);
-}
-
-
-static void
-init_sheet (PsppireDataEditor *de, int i,
- GtkAdjustment *hadj, GtkAdjustment *vadj,
- PsppireAxis *vaxis,
- PsppireAxis *haxis
- )
-{
- de->sheet_bin[i] = gtk_scrolled_window_new (hadj, vadj);
-
- de->data_sheet[i] = psppire_sheet_new (NULL);
-
- g_object_set (de->sheet_bin[i],
- "border-width", 3,
- "shadow-type", GTK_SHADOW_ETCHED_IN,
- NULL);
-
- g_object_set (haxis, "default-size", 75, NULL);
- g_object_set (vaxis, "default-size", 25, NULL);
-
- g_object_set (de->data_sheet[i],
- "horizontal-axis", haxis,
- "vertical-axis", vaxis,
- NULL);
-
- gtk_container_add (GTK_CONTAINER (de->sheet_bin[i]), de->data_sheet[i]);
-
- g_signal_connect (de->data_sheet[i], "traverse",
- G_CALLBACK (traverse_cell_callback), de);
-
- gtk_widget_show (de->sheet_bin[i]);
-}
-
-
-static void
-init_data_sheet (PsppireDataEditor *de)
-{
- GtkAdjustment *vadj0, *hadj0;
- GtkAdjustment *vadj1, *hadj1;
- GtkWidget *sheet ;
-
- de->vaxis[0] = psppire_axis_new ();
- de->vaxis[1] = psppire_axis_new ();
-
- /* There's only one horizontal axis, since the
- column widths are parameters of the variables */
- de->haxis = psppire_axis_new ();
-
- de->split = TRUE;
- de->paned = gtk_xpaned_new ();
-
- init_sheet (de, 0, NULL, NULL, de->vaxis[0], de->haxis);
- gtk_widget_show (de->sheet_bin[0]);
- vadj0 = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[0]));
- hadj0 = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[0]));
-
- g_object_set (de->sheet_bin[0], "vscrollbar-policy", GTK_POLICY_NEVER, NULL);
- g_object_set (de->sheet_bin[0], "hscrollbar-policy", GTK_POLICY_NEVER, NULL);
-
- init_sheet (de, 1, NULL, vadj0, de->vaxis[0], de->haxis);
- gtk_widget_show (de->sheet_bin[1]);
- sheet = gtk_bin_get_child (GTK_BIN (de->sheet_bin[1]));
- psppire_sheet_hide_row_titles (PSPPIRE_SHEET (sheet));
- hadj1 = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[1]));
- g_object_set (de->sheet_bin[1], "vscrollbar-policy", GTK_POLICY_ALWAYS, NULL);
- g_object_set (de->sheet_bin[1], "hscrollbar-policy", GTK_POLICY_NEVER, NULL);
-
- init_sheet (de, 2, hadj0, NULL, de->vaxis[1], de->haxis);
- gtk_widget_show (de->sheet_bin[2]);
- sheet = gtk_bin_get_child (GTK_BIN (de->sheet_bin[2]));
- psppire_sheet_hide_column_titles (PSPPIRE_SHEET (sheet));
- g_object_set (de->sheet_bin[2], "vscrollbar-policy", GTK_POLICY_NEVER, NULL);
- g_object_set (de->sheet_bin[2], "hscrollbar-policy", GTK_POLICY_ALWAYS, NULL);
- vadj1 = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (de->sheet_bin[2]));
-
- init_sheet (de, 3, hadj1, vadj1, de->vaxis[1], de->haxis);
- gtk_widget_show (de->sheet_bin[3]);
- sheet = gtk_bin_get_child (GTK_BIN (de->sheet_bin[3]));
- psppire_sheet_hide_column_titles (PSPPIRE_SHEET (sheet));
- psppire_sheet_hide_row_titles (PSPPIRE_SHEET (sheet));
- g_object_set (de->sheet_bin[3], "vscrollbar-policy", GTK_POLICY_ALWAYS, NULL);
- g_object_set (de->sheet_bin[3], "hscrollbar-policy", GTK_POLICY_ALWAYS, NULL);
-
- gtk_xpaned_pack_top_left (GTK_XPANED (de->paned), de->sheet_bin[0], TRUE, TRUE);
- gtk_xpaned_pack_top_right (GTK_XPANED (de->paned), de->sheet_bin[1], TRUE, TRUE);
- gtk_xpaned_pack_bottom_left (GTK_XPANED (de->paned), de->sheet_bin[2], TRUE, TRUE);
- gtk_xpaned_pack_bottom_right (GTK_XPANED (de->paned), de->sheet_bin[3], TRUE, TRUE);
-
- gtk_xpaned_set_position_y (GTK_XPANED (de->paned), 150);
- gtk_xpaned_set_position_x (GTK_XPANED (de->paned), 350);
-}
-
-
-static void
-psppire_data_editor_init (PsppireDataEditor *de)
-{
- GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
- GtkWidget *sw_vs = gtk_scrolled_window_new (NULL, NULL);
-
- init_data_sheet (de);
-
- de->data_vbox = gtk_vbox_new (FALSE, 0);
- de->var_sheet = psppire_var_sheet_new ();
-
- g_object_set (de, "tab-pos", GTK_POS_BOTTOM, NULL);
-
- de->datum_entry = gtk_entry_new ();
- de->cell_ref_entry = gtk_entry_new ();
-
- g_object_set (de->cell_ref_entry,
- "sensitive", FALSE,
- "editable", FALSE,
- "width_chars", 25,
- NULL);
-
- gtk_box_pack_start (GTK_BOX (hbox), de->cell_ref_entry, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), de->datum_entry, TRUE, TRUE, 0);
-
-
- gtk_container_add (GTK_CONTAINER (sw_vs), de->var_sheet);
- gtk_widget_show_all (sw_vs);
-
-
- gtk_box_pack_start (GTK_BOX (de->data_vbox), hbox, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (de->data_vbox), de->paned, TRUE, TRUE, 0);
-
-
- psppire_data_editor_remove_split (de);
-
- gtk_widget_show_all (de->data_vbox);
-
- gtk_notebook_append_page (GTK_NOTEBOOK (de), de->data_vbox,
- gtk_label_new_with_mnemonic (_("Data View")));
-
- gtk_notebook_append_page (GTK_NOTEBOOK (de), sw_vs,
- gtk_label_new_with_mnemonic (_("Variable View")));
-
- g_signal_connect (de->data_sheet[0], "activate",
- G_CALLBACK (update_data_ref_entry),
- de);
-
- g_signal_connect (de->datum_entry, "activate",
- G_CALLBACK (datum_entry_activate),
- de);
-
-
- g_signal_connect_swapped (de->data_sheet[0],
- "double-click-column",
- G_CALLBACK (on_data_column_clicked),
- de);
-
- g_signal_connect_swapped (de->var_sheet,
- "double-click-row",
- G_CALLBACK (on_var_row_clicked),
- de);
-
- g_signal_connect_swapped (de->data_sheet[0], "activate",
- G_CALLBACK (on_activate),
- de);
-
- g_signal_connect_swapped (de->data_sheet[0], "select-range",
- G_CALLBACK (on_select_range),
- de);
-
- g_signal_connect (de->data_sheet[0], "select-row",
- G_CALLBACK (on_select_row), de);
-
- g_signal_connect (de->data_sheet[0], "select-column",
- G_CALLBACK (on_select_variable), de);
-
-
- g_signal_connect (de->var_sheet, "select-row",
- G_CALLBACK (on_select_variable), de);
-
-
- g_signal_connect_after (de, "switch-page",
- G_CALLBACK (on_switch_page),
- NULL);
-
- g_object_set (de, "can-focus", FALSE, NULL);
-
- g_signal_connect (de, "map", G_CALLBACK (on_map), NULL);
-
-
- // psppire_sheet_hide_column_titles (de->var_sheet);
- // psppire_sheet_hide_row_titles (de->data_sheet);
-
-
- de->dispose_has_run = FALSE;
-}
-
-
-GtkWidget*
-psppire_data_editor_new (PsppireVarStore *var_store,
- PsppireDataStore *data_store)
-{
- return g_object_new (PSPPIRE_DATA_EDITOR_TYPE,
- "var-store", var_store,
- "data-store", data_store,
- NULL);
-}
-
-
-static void
-psppire_data_editor_remove_split (PsppireDataEditor *de)
-{
- if ( !de->split ) return;
- de->split = FALSE;
-
- g_object_ref (de->sheet_bin[0]);
- gtk_container_remove (GTK_CONTAINER (de->paned), de->sheet_bin[0]);
-
- g_object_ref (de->paned);
- gtk_container_remove (GTK_CONTAINER (de->data_vbox), de->paned);
-
- gtk_box_pack_start (GTK_BOX (de->data_vbox), de->sheet_bin[0],
- TRUE, TRUE, 0);
-
- g_object_unref (de->sheet_bin[0]);
-
- g_object_set (de->sheet_bin[0], "vscrollbar-policy",
- GTK_POLICY_ALWAYS, NULL);
-
- g_object_set (de->sheet_bin[0], "hscrollbar-policy",
- GTK_POLICY_ALWAYS, NULL);
-}
-
-
-static void
-psppire_data_editor_set_split (PsppireDataEditor *de)
-{
- if ( de->split ) return;
- de->split = TRUE;
-
- g_object_ref (de->sheet_bin[0]);
- gtk_container_remove (GTK_CONTAINER (de->data_vbox), de->sheet_bin[0]);
-
- gtk_xpaned_pack_top_left (GTK_XPANED (de->paned), de->sheet_bin [0],
- TRUE, TRUE);
-
- gtk_box_pack_start (GTK_BOX (de->data_vbox), de->paned,
- TRUE, TRUE, 0);
-
- g_object_unref (de->paned);
-
- g_object_set (de->sheet_bin[0], "vscrollbar-policy",
- GTK_POLICY_NEVER, NULL);
-
- g_object_set (de->sheet_bin[0], "hscrollbar-policy",
- GTK_POLICY_NEVER, NULL);
-}
-
-void
-psppire_data_editor_split_window (PsppireDataEditor *de, gboolean split)
-{
- if (split )
- psppire_data_editor_set_split (de);
- else
- psppire_data_editor_remove_split (de);
-
- gtk_widget_show_all (de->data_vbox);
-}
-
-static void data_sheet_set_clip (PsppireSheet *sheet);
-static void data_sheet_contents_received_callback (GtkClipboard *clipboard,
- GtkSelectionData *sd,
- gpointer data);
-
-
-void
-psppire_data_editor_clip_copy (PsppireDataEditor *de)
-{
- data_sheet_set_clip (PSPPIRE_SHEET (de->data_sheet[0]));
-}
-
-void
-psppire_data_editor_clip_paste (PsppireDataEditor *de)
-{
- GdkDisplay *display = gtk_widget_get_display ( GTK_WIDGET (de));
- GtkClipboard *clipboard =
- gtk_clipboard_get_for_display (display, GDK_SELECTION_CLIPBOARD);
-
- gtk_clipboard_request_contents (clipboard,
- gdk_atom_intern ("UTF8_STRING", TRUE),
- data_sheet_contents_received_callback,
- de);
-}
-
-
-
-void
-psppire_data_editor_clip_cut (PsppireDataEditor *de)
-{
- gint max_rows, max_columns;
- gint r;
- PsppireSheetRange range;
- PsppireDataStore *ds = de->data_store;
-
- data_sheet_set_clip (PSPPIRE_SHEET (de->data_sheet[0]));
-
- /* Now blank all the cells */
- psppire_sheet_get_selected_range (PSPPIRE_SHEET (de->data_sheet[0]), &range);
-
- /* If nothing selected, then use active cell */
- if ( range.row0 < 0 || range.col0 < 0 )
- {
- gint row, col;
- psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &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 */
- psppire_sheet_unselect_range (PSPPIRE_SHEET (de->data_sheet[0]));
-}
-
-
-\f
-
-/* Popup menu related stuff */
-
-static void
-popup_variable_column_menu (PsppireSheet *sheet, gint column,
- GdkEventButton *event, gpointer data)
-{
- GtkMenu *menu = GTK_MENU (data);
-
- PsppireDataStore *data_store =
- PSPPIRE_DATA_STORE (psppire_sheet_get_model (sheet));
-
- const struct variable *v =
- psppire_dict_get_variable (data_store->dict, column);
-
- if ( v && event->button == 3)
- {
- psppire_sheet_select_column (sheet, column);
-
- gtk_menu_popup (menu,
- NULL, NULL, NULL, NULL,
- event->button, event->time);
- }
-}
-
-
-static void
-popup_variable_row_menu (PsppireSheet *sheet, gint row,
- GdkEventButton *event, gpointer data)
-{
- GtkMenu *menu = GTK_MENU (data);
-
- PsppireVarStore *var_store =
- PSPPIRE_VAR_STORE (psppire_sheet_get_model (sheet));
-
- const struct variable *v =
- psppire_dict_get_variable (var_store->dict, row);
-
- if ( v && event->button == 3)
- {
- psppire_sheet_select_row (sheet, row);
-
- gtk_menu_popup (menu,
- NULL, NULL, NULL, NULL,
- event->button, event->time);