/* PSPPIRE - a graphical user interface for PSPP.
- Copyright (C) 2008 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2009 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <config.h>
#include <gtk/gtksignal.h>
#include <gtk/gtk.h>
-#include <gtksheet/gtkextra-sheet.h>
+#include <gtk-contrib/gtkextra-sheet.h>
#include "psppire-data-editor.h"
#include "psppire-var-sheet.h"
#include <language/syntax-string-source.h>
#include "psppire-data-store.h"
-#include <gtksheet/psppire-axis-impl.h>
-#include "helper.h"
+#include <libpspp/i18n.h>
+#include <ui/gui/sheet/psppire-axis.h>
+#include "executor.h"
-#include <gtksheet/gtkxpaned.h>
+#include <gtk-contrib/gtkxpaned.h>
#include <gettext.h>
#define _(msgid) gettext (msgid)
#define N_(msgid) msgid
-static void popup_variable_column_menu (GtkSheet *sheet, gint column,
+static void popup_variable_column_menu (PsppireSheet *sheet, gint column,
GdkEventButton *event, gpointer data);
-static void popup_variable_row_menu (GtkSheet *sheet, gint row,
+static void popup_variable_row_menu (PsppireSheet *sheet, gint row,
GdkEventButton *event, gpointer data);
-static void popup_cases_menu (GtkSheet *sheet, gint row,
+static void popup_cases_menu (PsppireSheet *sheet, gint row,
GdkEventButton *event, gpointer data);
static gboolean
on_data_column_clicked (PsppireDataEditor *de, gint col, gpointer data)
{
- GtkSheetRange visible_range;
+ PsppireSheetRange visible_range;
gint current_row, current_column;
gtk_notebook_set_current_page (GTK_NOTEBOOK (de),
PSPPIRE_DATA_EDITOR_VARIABLE_VIEW);
- gtk_sheet_get_active_cell (GTK_SHEET (de->var_sheet),
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->var_sheet),
¤t_row, ¤t_column);
- gtk_sheet_set_active_cell (GTK_SHEET (de->var_sheet), col, current_column);
+ psppire_sheet_set_active_cell (PSPPIRE_SHEET (de->var_sheet), col, current_column);
- gtk_sheet_get_visible_range (GTK_SHEET (de->var_sheet), &visible_range);
+ psppire_sheet_get_visible_range (PSPPIRE_SHEET (de->var_sheet), &visible_range);
if ( col < visible_range.row0 || col > visible_range.rowi)
- gtk_sheet_moveto (GTK_SHEET (de->var_sheet), col, current_column, 0.5, 0.5);
+ psppire_sheet_moveto (PSPPIRE_SHEET (de->var_sheet), col, current_column, 0.5, 0.5);
return FALSE;
static gboolean
on_var_row_clicked (PsppireDataEditor *de, gint row, gpointer data)
{
- GtkSheetRange visible_range;
+ PsppireSheetRange visible_range;
gint current_row, current_column;
gtk_notebook_set_current_page (GTK_NOTEBOOK(de), PSPPIRE_DATA_EDITOR_DATA_VIEW);
- gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]),
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]),
¤t_row, ¤t_column);
- gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet[0]), current_row, row);
+ psppire_sheet_set_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), current_row, row);
- gtk_sheet_get_visible_range (GTK_SHEET (de->data_sheet[0]), &visible_range);
+ psppire_sheet_get_visible_range (PSPPIRE_SHEET (de->data_sheet[0]), &visible_range);
if ( row < visible_range.col0 || row > visible_range.coli)
- gtk_sheet_moveto (GTK_SHEET (de->data_sheet[0]), -1, row, 0.5, 0.5);
+ psppire_sheet_moveto (PSPPIRE_SHEET (de->data_sheet[0]), -1, row, 0.5, 0.5);
return FALSE;
}
/* Moves the focus to a new cell.
Returns TRUE iff the move should be disallowed */
static gboolean
-traverse_cell_callback (GtkSheet *sheet,
- GtkSheetCell *existing_cell,
- GtkSheetCell *new_cell,
+traverse_cell_callback (PsppireSheet *sheet,
+ PsppireSheetCell *existing_cell,
+ PsppireSheetCell *new_cell,
gpointer data)
{
PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
static void
new_data_callback (PsppireDataStore *ds, gpointer data)
{
- PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
gint i;
- for (i = 0 ; i < 4 ; ++i)
- {
- PsppireAxisImpl *vaxis;
- casenumber n_cases = psppire_data_store_get_case_count (ds);
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
- g_object_get (de->data_sheet[i], "vertical-axis", &vaxis, NULL);
+ casenumber n_cases = psppire_data_store_get_case_count (ds);
- psppire_axis_impl_clear (vaxis);
- psppire_axis_impl_append_n (vaxis, n_cases, DEFAULT_ROW_HEIGHT);
+ for (i = 0; i < 2; ++i)
+ {
+ psppire_axis_clear (de->vaxis[i]);
+ psppire_axis_append_n (de->vaxis[i], n_cases, DEFAULT_ROW_HEIGHT);
}
}
static void
case_inserted_callback (PsppireDataStore *ds, gint before, gpointer data)
{
- PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
-
gint i;
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
- for (i = 0 ; i < 4 ; ++i)
- {
- PsppireAxisImpl *vaxis;
-
- g_object_get (de->data_sheet[i], "vertical-axis", &vaxis, NULL);
-
- psppire_axis_impl_insert (vaxis, before, DEFAULT_ROW_HEIGHT);
- }
+ for (i = 0; i < 2; ++i)
+ psppire_axis_insert (de->vaxis[i], before, DEFAULT_ROW_HEIGHT);
}
static void
cases_deleted_callback (PsppireDataStore *ds, gint first, gint n_cases, gpointer data)
{
- PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
-
gint i;
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
- for (i = 0 ; i < 4 ; ++i)
- {
- PsppireAxisImpl *vaxis;
-
- g_object_get (de->data_sheet[i], "vertical-axis", &vaxis, NULL);
-
- psppire_axis_impl_delete (vaxis, first, n_cases);
- }
+ for (i = 0; i < 2; ++i)
+ psppire_axis_delete (de->vaxis[0], first, n_cases);
}
/* Callback for the axis' resize signal.
Changes the variable's display width */
static void
-rewidth_variable (PsppireDataEditor *de, gint unit, glong size)
+rewidth_variable (GtkWidget *w, gint unit, glong size)
{
+ PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (w);
+
const PsppireDict *dict = de->data_store->dict;
struct variable *var = psppire_dict_get_variable (dict, unit);
- var_set_display_width (var, size / (float) width_of_m (de));
+ if (NULL == var)
+ return;
+
+ var_set_display_width (var, size / (float) width_of_m (w));
}
static void
new_variables_callback (PsppireDict *dict, gpointer data)
{
- gint v, i;
+ gint v;
PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
gint m_width = width_of_m (GTK_WIDGET (de));
- PsppireAxisImpl *vaxis;
+ PsppireAxis *vaxis;
g_object_get (de->var_sheet, "vertical-axis", &vaxis, NULL);
- psppire_axis_impl_clear (vaxis);
- psppire_axis_impl_append_n (vaxis, 1 + psppire_dict_get_var_cnt (dict), DEFAULT_ROW_HEIGHT);
-
- for (i = 0 ; i < 4 ; ++i)
- {
- PsppireAxisImpl *haxis;
- g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL);
+ psppire_axis_clear (vaxis);
+ psppire_axis_append_n (vaxis, 1 + psppire_dict_get_var_cnt (dict), DEFAULT_ROW_HEIGHT);
- g_signal_connect_swapped (haxis, "resize-unit",
- G_CALLBACK (rewidth_variable), de);
+ g_signal_connect_swapped (de->haxis, "resize-unit",
+ G_CALLBACK (rewidth_variable), de);
- psppire_axis_impl_clear (haxis);
+ psppire_axis_clear (de->haxis);
- for (v = 0 ; v < psppire_dict_get_var_cnt (dict); ++v)
- {
- const struct variable *var = psppire_dict_get_variable (dict, v);
+ for (v = 0 ; v < psppire_dict_get_var_cnt (dict); ++v)
+ {
+ const struct variable *var = psppire_dict_get_variable (dict, v);
- psppire_axis_impl_append (haxis, m_width * var_get_display_width (var));
- }
+ psppire_axis_append (de->haxis, m_width * var_get_display_width (var));
}
}
static void
insert_variable_callback (PsppireDict *dict, gint x, gpointer data)
{
- gint i;
-
PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
gint m_width = width_of_m (GTK_WIDGET (de));
- PsppireAxisImpl *var_vaxis;
+ PsppireAxis *var_vaxis;
+
+ const struct variable *var = psppire_dict_get_variable (dict, x);
+
g_object_get (de->var_sheet, "vertical-axis", &var_vaxis, NULL);
- psppire_axis_impl_insert (var_vaxis, x, DEFAULT_ROW_HEIGHT);
+ psppire_axis_insert (var_vaxis, x, DEFAULT_ROW_HEIGHT);
- for (i = 0 ; i < 4 ; ++i)
- {
- const struct variable *var = psppire_dict_get_variable (dict, x);
- PsppireAxisImpl *haxis;
- g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL);
- psppire_axis_impl_insert (haxis, x, m_width * var_get_display_width (var));
- }
+ psppire_axis_insert (de->haxis, x, m_width * var_get_display_width (var));
}
delete_variable_callback (PsppireDict *dict, gint posn,
gint x UNUSED, gint y UNUSED, gpointer data)
{
- gint i;
PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
- PsppireAxisImpl *var_vaxis;
+ PsppireAxis *var_vaxis;
g_object_get (de->var_sheet, "vertical-axis", &var_vaxis, NULL);
- psppire_axis_impl_delete (var_vaxis, posn, 1);
+ psppire_axis_delete (var_vaxis, posn, 1);
-
- {
- PsppireAxisImpl *haxis;
- g_object_get (de->data_sheet[0], "horizontal-axis", &haxis, NULL);
-
- psppire_axis_impl_delete (haxis, posn, 1);
- }
+ psppire_axis_delete (de->haxis, posn, 1);
}
static void
rewidth_variable_callback (PsppireDict *dict, gint posn, gpointer data)
{
- gint i;
PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
gint m_width = width_of_m (GTK_WIDGET (de));
- for (i = 0 ; i < 4 ; ++i)
- {
- const struct variable *var = psppire_dict_get_variable (dict, posn);
- PsppireAxisImpl *haxis;
- g_object_get (de->data_sheet[i], "horizontal-axis", &haxis, NULL);
+ const struct variable *var = psppire_dict_get_variable (dict, posn);
- psppire_axis_impl_resize (haxis, posn, m_width *
- var_get_display_width (var));
- }
+ gint var_width = var_get_display_width (var);
+
+ /* Don't allow zero width */
+ if ( var_width < 1 )
+ var_width = 1;
+
+ psppire_axis_resize (de->haxis, posn, m_width * var_width);
}
g_object_ref (de->data_store);
for (i = 0 ; i < 4 ; ++i )
- g_object_set (de->data_sheet[i],
- "model", de->data_store,
- NULL);
+ {
+ g_object_set (de->data_sheet[i],
+ "model", de->data_store,
+ NULL);
+
+ g_signal_connect_swapped (de->data_store->dict, "filter-changed",
+ G_CALLBACK (gtk_widget_queue_draw),
+ de->data_sheet[i]);
+ }
g_signal_connect (de->data_store->dict, "backend-changed",
G_CALLBACK (new_variables_callback), de);
switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (object)))
{
case PSPPIRE_DATA_EDITOR_DATA_VIEW:
- gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &col);
- gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet[0]), row, var);
- gtk_sheet_moveto (GTK_SHEET (de->data_sheet[0]), -1, var, 0.5, 0.5);
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &col);
+ psppire_sheet_set_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), row, var);
+ psppire_sheet_moveto (PSPPIRE_SHEET (de->data_sheet[0]), -1, var, 0.5, 0.5);
break;
case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
- gtk_sheet_get_active_cell (GTK_SHEET (de->var_sheet), &row, &col);
- gtk_sheet_set_active_cell (GTK_SHEET (de->var_sheet), var, col);
- gtk_sheet_moveto (GTK_SHEET (de->var_sheet), var, -1, 0.5, 0.5);
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->var_sheet), &row, &col);
+ psppire_sheet_set_active_cell (PSPPIRE_SHEET (de->var_sheet), var, col);
+ psppire_sheet_moveto (PSPPIRE_SHEET (de->var_sheet), var, -1, 0.5, 0.5);
break;
default:
g_assert_not_reached ();
{
gint row, col;
gint case_num = g_value_get_long (value);
- gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &col);
- gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet[0]), case_num, col);
- gtk_sheet_moveto (GTK_SHEET (de->data_sheet[0]), case_num, -1, 0.5, 0.5);
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &col);
+ psppire_sheet_set_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), case_num, col);
+ psppire_sheet_moveto (PSPPIRE_SHEET (de->data_sheet[0]), case_num, -1, 0.5, 0.5);
}
break;
case PROP_VALUE_LABELS:
case PROP_CURRENT_CASE:
{
gint row, column;
- gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &column);
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &column);
g_value_set_long (value, row);
}
break;
case PROP_CURRENT_VAR:
{
gint row, column;
- gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &column);
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &column);
g_value_set_long (value, column);
}
break;
object_class->set_property = psppire_data_editor_set_property;
object_class->get_property = psppire_data_editor_get_property;
+
+
data_store_spec =
g_param_spec_pointer ("data-store",
"Data Store",
/* Update the data_ref_entry with the reference of the active cell */
static gint
-update_data_ref_entry (const GtkSheet *sheet,
+update_data_ref_entry (const PsppireSheet *sheet,
gint row, gint col,
gint old_row, gint old_col,
gpointer data)
PsppireDataEditor *de = data;
PsppireDataStore *data_store =
- PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+ PSPPIRE_DATA_STORE (psppire_sheet_get_model (sheet));
if (data_store)
{
gchar *text = g_strdup_printf ("%d: %s", row + FIRST_CASE_NUMBER,
var_get_name (var));
- gchar *s = pspp_locale_to_utf8 (text, -1, 0);
-
- g_free (text);
- gtk_entry_set_text (GTK_ENTRY (de->cell_ref_entry), s);
+ gtk_entry_set_text (GTK_ENTRY (de->cell_ref_entry), text);
- g_free (s);
+ g_free (text);
}
else
goto blank_entry;
const gchar *text = gtk_entry_get_text (entry);
- gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &column);
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &column);
if ( row == -1 || column == -1)
return;
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 (GtkSheet *, gint, PsppireDataEditor *);
-static void on_select_variable (GtkSheet *, gint, PsppireDataEditor *);
+static void on_select_row (PsppireSheet *, gint, PsppireDataEditor *);
+static void on_select_variable (PsppireSheet *, gint, PsppireDataEditor *);
static void on_owner_change (GtkClipboard *,
static void
init_sheet (PsppireDataEditor *de, int i,
GtkAdjustment *hadj, GtkAdjustment *vadj,
- PsppireAxisImpl *vaxis,
- PsppireAxisImpl *haxis
+ PsppireAxis *vaxis,
+ PsppireAxis *haxis
)
{
de->sheet_bin[i] = gtk_scrolled_window_new (hadj, vadj);
- de->data_sheet[i] = gtk_sheet_new (NULL);
+ de->data_sheet[i] = psppire_sheet_new (NULL);
g_object_set (de->sheet_bin[i],
"border-width", 3,
GtkAdjustment *vadj1, *hadj1;
GtkWidget *sheet ;
- PsppireAxisImpl *vaxis0 = psppire_axis_impl_new ();
- PsppireAxisImpl *vaxis1 = psppire_axis_impl_new ();
+ 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 */
- PsppireAxisImpl *haxis = psppire_axis_impl_new ();
-
+ de->haxis = psppire_axis_new ();
de->split = TRUE;
de->paned = gtk_xpaned_new ();
- init_sheet (de, 0, NULL, NULL, vaxis0, haxis);
+ 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, vaxis0, haxis);
+ 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]));
- gtk_sheet_hide_row_titles (GTK_SHEET (sheet));
+ 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, vaxis1, haxis);
+ 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]));
- gtk_sheet_hide_column_titles (GTK_SHEET (sheet));
+ 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, vaxis1, haxis);
+ 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]));
- gtk_sheet_hide_column_titles (GTK_SHEET (sheet));
- gtk_sheet_hide_row_titles (GTK_SHEET (sheet));
+ 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);
G_CALLBACK (on_switch_page),
NULL);
+ g_object_set (de, "can-focus", FALSE, NULL);
g_signal_connect (de, "map", G_CALLBACK (on_map), NULL);
-
- // gtk_sheet_hide_column_titles (de->var_sheet);
- // gtk_sheet_hide_row_titles (de->data_sheet);
+ // psppire_sheet_hide_column_titles (de->var_sheet);
+ // psppire_sheet_hide_row_titles (de->data_sheet);
de->dispose_has_run = FALSE;
gtk_widget_show_all (de->data_vbox);
}
-static void data_sheet_set_clip (GtkSheet *sheet);
+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 (GTK_SHEET (de->data_sheet[0]));
+ data_sheet_set_clip (PSPPIRE_SHEET (de->data_sheet[0]));
}
void
{
gint max_rows, max_columns;
gint r;
- GtkSheetRange range;
+ PsppireSheetRange range;
PsppireDataStore *ds = de->data_store;
- data_sheet_set_clip (GTK_SHEET (de->data_sheet[0]));
+ data_sheet_set_clip (PSPPIRE_SHEET (de->data_sheet[0]));
/* Now blank all the cells */
- gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet[0]), &range);
+ 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;
- gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &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;
}
/* and remove the selection */
- gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet[0]));
+ psppire_sheet_unselect_range (PSPPIRE_SHEET (de->data_sheet[0]));
}
/* Popup menu related stuff */
static void
-popup_variable_column_menu (GtkSheet *sheet, gint column,
+popup_variable_column_menu (PsppireSheet *sheet, gint column,
GdkEventButton *event, gpointer data)
{
GtkMenu *menu = GTK_MENU (data);
PsppireDataStore *data_store =
- PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+ 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)
{
- gtk_sheet_select_column (sheet, column);
+ psppire_sheet_select_column (sheet, column);
gtk_menu_popup (menu,
NULL, NULL, NULL, NULL,
static void
-popup_variable_row_menu (GtkSheet *sheet, gint row,
+popup_variable_row_menu (PsppireSheet *sheet, gint row,
GdkEventButton *event, gpointer data)
{
GtkMenu *menu = GTK_MENU (data);
PsppireVarStore *var_store =
- PSPPIRE_VAR_STORE (gtk_sheet_get_model (sheet));
+ PSPPIRE_VAR_STORE (psppire_sheet_get_model (sheet));
+
+ PsppireDict *dict;
+ const struct variable *v ;
- const struct variable *v =
- psppire_dict_get_variable (var_store->dict, row);
+ g_object_get (var_store, "dictionary", &dict, NULL);
+
+ v = psppire_dict_get_variable (dict, row);
if ( v && event->button == 3)
{
- gtk_sheet_select_row (sheet, row);
+ psppire_sheet_select_row (sheet, row);
gtk_menu_popup (menu,
NULL, NULL, NULL, NULL,
static void
-popup_cases_menu (GtkSheet *sheet, gint row,
+popup_cases_menu (PsppireSheet *sheet, gint row,
GdkEventButton *event, gpointer data)
{
GtkMenu *menu = GTK_MENU (data);
PsppireDataStore *data_store =
- PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+ PSPPIRE_DATA_STORE (psppire_sheet_get_model (sheet));
if ( row <= psppire_data_store_get_case_count (data_store) &&
event->button == 3)
{
- gtk_sheet_select_row (sheet, row);
+ psppire_sheet_select_row (sheet, row);
gtk_menu_popup (menu,
NULL, NULL, NULL, NULL,
void
psppire_data_editor_sort_ascending (PsppireDataEditor *de)
{
- GtkSheetRange range;
- gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet[0]), &range);
+ PsppireSheetRange range;
+ psppire_sheet_get_selected_range (PSPPIRE_SHEET(de->data_sheet[0]), &range);
do_sort (de->data_store, range.col0, FALSE);
}
void
psppire_data_editor_sort_descending (PsppireDataEditor *de)
{
- GtkSheetRange range;
- gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet[0]), &range);
+ PsppireSheetRange range;
+ psppire_sheet_get_selected_range (PSPPIRE_SHEET(de->data_sheet[0]), &range);
do_sort (de->data_store, range.col0, TRUE);
}
switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (de)))
{
case PSPPIRE_DATA_EDITOR_DATA_VIEW:
- if ( de->data_sheet[0]->state == GTK_SHEET_COLUMN_SELECTED )
- posn = GTK_SHEET (de->data_sheet[0])->range.col0;
+ if ( PSPPIRE_SHEET (de->data_sheet[0])->select_status
+ == PSPPIRE_SHEET_COLUMN_SELECTED )
+ posn = PSPPIRE_SHEET (de->data_sheet[0])->range.col0;
else
- posn = GTK_SHEET (de->data_sheet[0])->active_cell.col;
+ posn = PSPPIRE_SHEET (de->data_sheet[0])->active_cell.col;
break;
case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
- if ( de->var_sheet->state == GTK_SHEET_ROW_SELECTED )
- posn = GTK_SHEET (de->var_sheet)->range.row0;
+ if ( PSPPIRE_SHEET (de->var_sheet)->select_status
+ == PSPPIRE_SHEET_ROW_SELECTED )
+ posn = PSPPIRE_SHEET (de->var_sheet)->range.row0;
else
- posn = GTK_SHEET (de->var_sheet)->active_cell.row;
+ posn = PSPPIRE_SHEET (de->var_sheet)->active_cell.row;
break;
default:
g_assert_not_reached ();
{
glong posn = -1;
- if ( de->data_sheet[0]->state == GTK_SHEET_ROW_SELECTED )
- posn = GTK_SHEET (de->data_sheet[0])->range.row0;
+ if ( PSPPIRE_SHEET (de->data_sheet[0])->select_status == PSPPIRE_SHEET_ROW_SELECTED )
+ {
+ posn = PSPPIRE_SHEET (de->data_sheet[0])->range.row0;
+ }
else
- posn = GTK_SHEET (de->data_sheet[0])->active_cell.row;
+ {
+ posn = PSPPIRE_SHEET (de->data_sheet[0])->active_cell.row;
+ }
if ( posn == -1 ) posn = 0;
void
psppire_data_editor_delete_cases (PsppireDataEditor *de)
{
- gint first = GTK_SHEET (de->data_sheet[0])->range.row0;
- gint n = GTK_SHEET (de->data_sheet[0])->range.rowi - first + 1;
+ gint first = PSPPIRE_SHEET (de->data_sheet[0])->range.row0;
+ gint n = PSPPIRE_SHEET (de->data_sheet[0])->range.rowi - first + 1;
psppire_data_store_delete_cases (de->data_store, first, n);
- gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet[0]));
+ psppire_sheet_unselect_range (PSPPIRE_SHEET (de->data_sheet[0]));
}
/* Delete the variables currently selected in the
void
psppire_data_editor_delete_variables (PsppireDataEditor *de)
{
+ PsppireDict *dict = NULL;
gint first, n;
switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (de)))
{
case PSPPIRE_DATA_EDITOR_DATA_VIEW:
- first = GTK_SHEET (de->data_sheet[0])->range.col0;
- n = GTK_SHEET (de->data_sheet[0])->range.coli - first + 1;
+ first = PSPPIRE_SHEET (de->data_sheet[0])->range.col0;
+ n = PSPPIRE_SHEET (de->data_sheet[0])->range.coli - first + 1;
break;
case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
- first = GTK_SHEET (de->var_sheet)->range.row0;
- n = GTK_SHEET (de->var_sheet)->range.rowi - first + 1;
+ first = PSPPIRE_SHEET (de->var_sheet)->range.row0;
+ n = PSPPIRE_SHEET (de->var_sheet)->range.rowi - first + 1;
break;
default:
g_assert_not_reached ();
break;
}
- psppire_dict_delete_variables (de->var_store->dict, first, n);
+ g_object_get (de->var_store, "dictionary", &dict, NULL);
+
+ psppire_dict_delete_variables (dict, first, n);
- gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet[0]));
- gtk_sheet_unselect_range (GTK_SHEET (de->var_sheet));
+ psppire_sheet_unselect_range (PSPPIRE_SHEET (de->data_sheet[0]));
+ psppire_sheet_unselect_range (PSPPIRE_SHEET (de->var_sheet));
}
void
psppire_data_editor_show_grid (PsppireDataEditor *de, gboolean grid_visible)
{
- gtk_sheet_show_grid (GTK_SHEET (de->var_sheet), grid_visible);
- gtk_sheet_show_grid (GTK_SHEET (de->data_sheet[0]), grid_visible);
+ psppire_sheet_show_grid (PSPPIRE_SHEET (de->var_sheet), grid_visible);
+ psppire_sheet_show_grid (PSPPIRE_SHEET (de->data_sheet[0]), grid_visible);
}
on_activate (PsppireDataEditor *de)
{
gint row, col;
- gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &col);
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &col);
if ( row < psppire_data_store_get_case_count (de->data_store)
static void
on_select_range (PsppireDataEditor *de)
{
- GtkSheetRange range;
+ PsppireSheetRange range;
- gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet[0]), &range);
+ psppire_sheet_get_selected_range (PSPPIRE_SHEET (de->data_sheet[0]), &range);
if ( range.rowi < psppire_data_store_get_case_count (de->data_store)
&&
on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p,
gint pagenum, gpointer data)
{
- if ( pagenum != PSPPIRE_DATA_EDITOR_DATA_VIEW )
+ switch (pagenum)
{
+ case PSPPIRE_DATA_EDITOR_DATA_VIEW:
+ gtk_widget_grab_focus (de->data_vbox);
+ on_select_range (de);
+ break;
+ case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
+ gtk_widget_grab_focus (de->var_sheet);
emit_selected_signal (de);
- return TRUE;
- }
-
- on_select_range (de);
+ break;
+ default:
+ break;
+ };
return TRUE;
}
static gboolean
data_is_selected (PsppireDataEditor *de)
{
- GtkSheetRange range;
+ PsppireSheetRange range;
gint row, col;
if ( gtk_notebook_get_current_page (GTK_NOTEBOOK (de)) != PSPPIRE_DATA_EDITOR_DATA_VIEW)
return FALSE;
- gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet[0]), &row, &col);
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (de->data_sheet[0]), &row, &col);
if ( row >= psppire_data_store_get_case_count (de->data_store)
||
return FALSE;
}
- gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet[0]), &range);
+ psppire_sheet_get_selected_range (PSPPIRE_SHEET (de->data_sheet[0]), &range);
if ( range.rowi >= psppire_data_store_get_case_count (de->data_store)
||
static void
-on_select_row (GtkSheet *sheet, gint row, PsppireDataEditor *de)
+on_select_row (PsppireSheet *sheet, gint row, PsppireDataEditor *de)
{
g_signal_emit (de, data_editor_signals[CASES_SELECTED], 0, row);
}
static void
-on_select_variable (GtkSheet *sheet, gint var, PsppireDataEditor *de)
+on_select_variable (PsppireSheet *sheet, gint var, PsppireDataEditor *de)
{
g_signal_emit (de, data_editor_signals[VARIABLES_SELECTED], 0, var);
}
static struct dictionary *clip_dict = NULL;
-static void data_sheet_update_clipboard (GtkSheet *);
+static void data_sheet_update_clipboard (PsppireSheet *);
/* Set the clip according to the currently
selected range in the data sheet */
static void
-data_sheet_set_clip (GtkSheet *sheet)
+data_sheet_set_clip (PsppireSheet *sheet)
{
int i;
struct casewriter *writer ;
- GtkSheetRange range;
+ PsppireSheetRange range;
PsppireDataStore *ds;
struct case_map *map = NULL;
casenumber max_rows;
size_t max_columns;
+ gint row0, rowi;
+ gint col0, coli;
- ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+ ds = PSPPIRE_DATA_STORE (psppire_sheet_get_model (sheet));
- gtk_sheet_get_selected_range (sheet, &range);
+ psppire_sheet_get_selected_range (sheet, &range);
+
+ col0 = MIN (range.col0, range.coli);
+ coli = MAX (range.col0, range.coli);
+ row0 = MIN (range.row0, range.rowi);
+ rowi = MAX (range.row0, range.rowi);
/* If nothing selected, then use active cell */
- if ( range.row0 < 0 || range.col0 < 0 )
+ if ( row0 < 0 || col0 < 0 )
{
gint row, col;
- gtk_sheet_get_active_cell (sheet, &row, &col);
+ psppire_sheet_get_active_cell (sheet, &row, &col);
- range.row0 = range.rowi = row;
- range.col0 = range.coli = col;
+ row0 = rowi = row;
+ col0 = 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 (rowi >= max_rows)
{
if (max_rows == 0)
return;
- range.rowi = max_rows - 1;
+ rowi = max_rows - 1;
}
max_columns = dict_get_var_cnt (ds->dict->dict);
- if (range.coli >= max_columns)
+ if (coli >= max_columns)
{
if (max_columns == 0)
return;
- range.coli = max_columns - 1;
+ 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);
-
/* Destroy any existing clip */
if ( clip_datasheet )
{
/* Construct clip dictionary. */
clip_dict = dict_create ();
- for (i = range.col0; i <= range.coli; i++)
+ dict_set_encoding (clip_dict, dict_get_encoding (ds->dict->dict));
+ for (i = col0; i <= coli; i++)
{
const struct variable *old = dict_get_var (ds->dict->dict, i);
dict_clone_var_assert (clip_dict, old, var_get_name (old));
/* Construct clip data. */
map = case_map_by_name (ds->dict->dict, clip_dict);
- writer = autopaging_writer_create (dict_get_next_value_idx (clip_dict));
- for (i = range.row0; i <= range.rowi ; ++i )
+ writer = autopaging_writer_create (dict_get_proto (clip_dict));
+ for (i = row0; i <= rowi ; ++i )
{
- struct ccase old;
-
- if (psppire_data_store_get_case (ds, i, &old))
- {
- struct ccase new;
-
- case_map_execute (map, &old, &new);
- case_destroy (&old);
- casewriter_write (writer, &new);
- }
+ struct ccase *old = psppire_data_store_get_case (ds, i);
+ if (old != NULL)
+ casewriter_write (writer, case_map_execute (map, old));
else
casewriter_force_error (writer);
}
/* Perform data_out for case CC, variable V, appending to STRING */
static void
-data_out_g_string (GString *string, const struct variable *v,
+data_out_g_string (GString *string, const struct dictionary *dict,
+ const struct variable *v,
const struct ccase *cc)
{
- char *buf ;
-
const struct fmt_spec *fs = var_get_print_format (v);
const union value *val = case_data (cc, v);
- buf = xzalloc (fs->w);
- data_out (val, fs, buf);
+ char *s = data_out (val, dict_get_encoding (dict), fs);
- g_string_append_len (string, buf, fs->w);
+ g_string_append (string, s);
- g_free (buf);
+ g_free (s);
}
static GString *
casenumber r;
GString *string;
- const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
+ const size_t val_cnt = caseproto_get_n_widths (casereader_get_proto (clip_datasheet));
const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
const size_t var_cnt = dict_get_var_cnt (clip_dict);
for (r = 0 ; r < case_cnt ; ++r )
{
int c;
- struct ccase cc;
- if ( ! casereader_peek (clip_datasheet, r, &cc))
+ struct ccase *cc;
+
+ cc = casereader_peek (clip_datasheet, r);
+ if (cc == NULL)
{
g_warning ("Clipboard seems to have inexplicably shrunk");
break;
for (c = 0 ; c < var_cnt ; ++c)
{
const struct variable *v = dict_get_var (clip_dict, c);
- data_out_g_string (string, v, &cc);
+ data_out_g_string (string, clip_dict, v, cc);
if ( c < val_cnt - 1 )
g_string_append (string, "\t");
}
if ( r < case_cnt)
g_string_append (string, "\n");
- case_destroy (&cc);
+ case_unref (cc);
}
return string;
casenumber r;
GString *string;
- const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
+ const size_t val_cnt = caseproto_get_n_widths (casereader_get_proto (clip_datasheet));
const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
const size_t var_cnt = dict_get_var_cnt (clip_dict);
-
/* Guestimate the size needed */
- string = g_string_sized_new (20 * val_cnt * case_cnt);
+ string = g_string_sized_new (80 + 20 * val_cnt * case_cnt);
+
+ g_string_append (string,
+ "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
g_string_append (string, "<table>\n");
for (r = 0 ; r < case_cnt ; ++r )
{
int c;
- struct ccase cc;
- if ( ! casereader_peek (clip_datasheet, r, &cc))
+ struct ccase *cc = casereader_peek (clip_datasheet, r);
+ if (cc == NULL)
{
g_warning ("Clipboard seems to have inexplicably shrunk");
break;
{
const struct variable *v = dict_get_var (clip_dict, c);
g_string_append (string, "<td>");
- data_out_g_string (string, v, &cc);
+ data_out_g_string (string, clip_dict, v, cc);
g_string_append (string, "</td>\n");
}
g_string_append (string, "</tr>\n");
- case_destroy (&cc);
+ case_unref (cc);
}
g_string_append (string, "</table>\n");
static void
-data_sheet_update_clipboard (GtkSheet *sheet)
+data_sheet_update_clipboard (PsppireSheet *sheet)
{
GtkClipboard *clipboard =
gtk_widget_get_clipboard (GTK_WIDGET (sheet),
c = (char *) sd->data;
/* Paste text to selected position */
- gtk_sheet_get_active_cell (GTK_SHEET (data_editor->data_sheet[0]),
+ psppire_sheet_get_active_cell (PSPPIRE_SHEET (data_editor->data_sheet[0]),
&row, &column);
g_return_if_fail (row >= 0);
g_signal_emit (de, data_editor_signals[DATA_AVAILABLE_CHANGED], 0,
compatible_target);
}
-
-