From: John Darrington Date: Tue, 17 Mar 2009 12:14:12 +0000 (+0900) Subject: Merge branch 'master' of ssh://jmd@git.sv.gnu.org/srv/git/pspp X-Git-Tag: v0.7.3~216 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3181522c4d8e725d417cbae655e46f660fe168e;hp=cdbf99d3a0b7c7152470d62e202216db512b09a6;p=pspp-builds.git Merge branch 'master' of ssh://jmd@git.sv.gnu.org/srv/git/pspp --- diff --git a/lib/gtk-contrib/psppire-sheet.c b/lib/gtk-contrib/psppire-sheet.c index 8a537536..ad1cf78a 100644 --- a/lib/gtk-contrib/psppire-sheet.c +++ b/lib/gtk-contrib/psppire-sheet.c @@ -2098,6 +2098,13 @@ psppire_sheet_unmap (GtkWidget *widget) gtk_widget_unmap (sheet->button); } +/* get cell attributes of the given cell */ +/* TRUE means that the cell is currently allocated */ +static gboolean psppire_sheet_get_attributes (const PsppireSheet *sheet, + gint row, gint col, + PsppireSheetCellAttr *attributes); + + static void psppire_sheet_cell_draw (PsppireSheet *sheet, gint row, gint col) @@ -5248,7 +5255,7 @@ set_row_height (PsppireSheet *sheet, } } -gboolean +static gboolean psppire_sheet_get_attributes (const PsppireSheet *sheet, gint row, gint col, PsppireSheetCellAttr *attr) { @@ -5271,8 +5278,6 @@ psppire_sheet_get_attributes (const PsppireSheet *sheet, gint row, gint col, attr->border.mask = 0; attr->border.color = GTK_WIDGET (sheet)->style->black; - attr->is_editable = psppire_sheet_model_is_editable (sheet->model, row, col); - colormap = gtk_widget_get_colormap (GTK_WIDGET (sheet)); fg = psppire_sheet_model_get_foreground (sheet->model, row, col); if ( fg ) diff --git a/lib/gtk-contrib/psppire-sheet.h b/lib/gtk-contrib/psppire-sheet.h index 82de87be..8e83765c 100644 --- a/lib/gtk-contrib/psppire-sheet.h +++ b/lib/gtk-contrib/psppire-sheet.h @@ -84,7 +84,6 @@ struct _PsppireSheetCellAttr GdkColor foreground; GdkColor background; PsppireSheetCellBorder border; - gboolean is_editable; }; struct _PsppireSheetHoverTitle @@ -300,12 +299,6 @@ void psppire_sheet_get_active_cell (PsppireSheet *sheet, gchar *psppire_sheet_cell_get_text (const PsppireSheet *sheet, gint row, gint col); -/* get cell attributes of the given cell */ -/* TRUE means that the cell is currently allocated */ -gboolean psppire_sheet_get_attributes (const PsppireSheet *sheet, - gint row, gint col, - PsppireSheetCellAttr *attributes); - void psppire_sheet_set_model (PsppireSheet *sheet, PsppireSheetModel *model); diff --git a/src/ui/gui/automake.mk b/src/ui/gui/automake.mk index 5f14e62c..1a2b4af1 100644 --- a/src/ui/gui/automake.mk +++ b/src/ui/gui/automake.mk @@ -73,7 +73,8 @@ nodist_src_ui_gui_psppire_DATA = \ $(top_builddir)/src/ui/gui/syntax-editor.ui \ $(top_builddir)/src/ui/gui/text-data-import.ui \ $(top_builddir)/src/ui/gui/t-test.ui \ - $(top_builddir)/src/ui/gui/var-sheet-dialogs.ui + $(top_builddir)/src/ui/gui/var-sheet-dialogs.ui \ + $(top_builddir)/src/ui/gui/variable-info-dialog.ui dist_src_ui_gui_psppire_DATA = \ @@ -118,8 +119,8 @@ src_ui_gui_psppire_SOURCES = \ src/ui/gui/descriptives-dialog.h \ src/ui/gui/dialog-common.c \ src/ui/gui/dialog-common.h \ - src/ui/gui/dict-display.c \ src/ui/gui/dict-display.h \ + src/ui/gui/dict-display.c \ src/ui/gui/examine-dialog.c \ src/ui/gui/examine-dialog.h \ src/ui/gui/find-dialog.c \ @@ -152,6 +153,8 @@ src_ui_gui_psppire_SOURCES = \ src/ui/gui/psppire-dialog.h \ src/ui/gui/psppire-dict.c \ src/ui/gui/psppire-dict.h \ + src/ui/gui/psppire-dictview.c \ + src/ui/gui/psppire-dictview.h \ src/ui/gui/psppire-hbuttonbox.h \ src/ui/gui/psppire-keypad.h \ src/ui/gui/psppire-output-window.c \ @@ -225,7 +228,8 @@ src_ui_gui_psppire_SOURCES = \ src/ui/gui/syntax-editor.glade \ src/ui/gui/text-data-import.glade \ src/ui/gui/t-test.glade \ - src/ui/gui/var-sheet-dialogs.glade + src/ui/gui/var-sheet-dialogs.glade \ + src/ui/gui/variable-info-dialog.glade nodist_src_ui_gui_psppire_SOURCES = \ diff --git a/src/ui/gui/compute-dialog.c b/src/ui/gui/compute-dialog.c index 7269ab79..e3d1c6a1 100644 --- a/src/ui/gui/compute-dialog.c +++ b/src/ui/gui/compute-dialog.c @@ -22,8 +22,8 @@ #include "psppire-keypad.h" #include "psppire-data-window.h" #include "psppire-var-store.h" +#include "psppire-selector.h" #include "dialog-common.h" -#include "dict-display.h" #include #include @@ -396,11 +396,10 @@ compute_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - - attach_dictionary_to_treeview (GTK_TREE_VIEW (dict_view), - vs->dict, - GTK_SELECTION_SINGLE, NULL); - + g_object_set (dict_view, + "model", vs->dict, + "selection-mode", GTK_SELECTION_SINGLE, + NULL); psppire_selector_set_subjects (PSPPIRE_SELECTOR (var_selector), dict_view, syntax_area, diff --git a/src/ui/gui/crosstabs-dialog.c b/src/ui/gui/crosstabs-dialog.c index 188c4aaa..3d5c5718 100644 --- a/src/ui/gui/crosstabs-dialog.c +++ b/src/ui/gui/crosstabs-dialog.c @@ -422,9 +422,7 @@ crosstabs_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); + g_object_set (source, "model", vs->dict, NULL); set_dest_model (GTK_TREE_VIEW (dest_rows), vs->dict); set_dest_model (GTK_TREE_VIEW (dest_cols), vs->dict); diff --git a/src/ui/gui/crosstabs.glade b/src/ui/gui/crosstabs.glade index d5907a55..0409d9e5 100644 --- a/src/ui/gui/crosstabs.glade +++ b/src/ui/gui/crosstabs.glade @@ -111,7 +111,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True False diff --git a/src/ui/gui/descriptives-dialog.c b/src/ui/gui/descriptives-dialog.c index e3a6d505..77bf9541 100644 --- a/src/ui/gui/descriptives-dialog.c +++ b/src/ui/gui/descriptives-dialog.c @@ -223,9 +223,8 @@ descriptives_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_MULTIPLE, var_is_numeric); + g_object_set (source, "model", vs->dict, + "predicate", var_is_numeric, NULL); set_dest_model (GTK_TREE_VIEW (dest), vs->dict); diff --git a/src/ui/gui/descriptives-dialog.glade b/src/ui/gui/descriptives-dialog.glade index 6ce00df8..3fa67a55 100644 --- a/src/ui/gui/descriptives-dialog.glade +++ b/src/ui/gui/descriptives-dialog.glade @@ -29,7 +29,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/dict-display.c b/src/ui/gui/dict-display.c index 6d167145..2123c3c5 100644 --- a/src/ui/gui/dict-display.c +++ b/src/ui/gui/dict-display.c @@ -30,68 +30,7 @@ #define _(msgid) gettext (msgid) #define N_(msgid) msgid - -/* A GtkTreeModelFilterVisibleFunc to filter lines in the treeview */ -static gboolean -filter_variables (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) -{ - var_predicate_func *predicate = data; - struct variable *var; - PsppireDict *dict = PSPPIRE_DICT (model); - - GtkTreePath *path = gtk_tree_model_get_path (model, iter); - - gint *idx = gtk_tree_path_get_indices (path); - - var = psppire_dict_get_variable (dict, *idx); - - gtk_tree_path_free (path); - - return predicate (var); -} - -/* A GtkTreeCellDataFunc which sets the icon appropriate to the type - of variable */ static void -var_icon_cell_data_func (GtkTreeViewColumn *col, - GtkCellRenderer *cell, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data) -{ - struct variable *var; - gtk_tree_model_get (model, iter, DICT_TVM_COL_VAR, &var, -1); - - if ( var_is_alpha (var)) - { - g_object_set (cell, "stock-id", "var-string", NULL); - } - else - { - const struct fmt_spec *fs = var_get_write_format (var); - int cat = fmt_get_category (fs->type); - switch ( var_get_measure (var)) - { - case MEASURE_NOMINAL: - g_object_set (cell, "stock-id", "var-nominal", NULL); - break; - case MEASURE_ORDINAL: - g_object_set (cell, "stock-id", "var-ordinal", NULL); - break; - case MEASURE_SCALE: - if ( ( FMT_CAT_DATE | FMT_CAT_TIME ) & cat ) - g_object_set (cell, "stock-id", "var-date-scale", NULL); - else - g_object_set (cell, "stock-id", "var-scale", NULL); - break; - default: - g_assert_not_reached (); - }; - } -} - - -void get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter, GtkTreeModel **model, GtkTreeIter *iter ) @@ -113,191 +52,6 @@ get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter, g_assert (PSPPIRE_IS_DICT (*model)); } -/* A GtkTreeCellDataFunc which renders the name and/or label of the - variable */ -static void -var_description_cell_data_func (GtkTreeViewColumn *col, - GtkCellRenderer *cell, - GtkTreeModel *top_model, - GtkTreeIter *top_iter, - gpointer data) -{ - struct variable *var; - GtkTreeIter iter; - GtkTreeModel *model; - gboolean prefer_labels = FALSE; - - PsppireConf *conf = psppire_conf_new (); - - psppire_conf_get_boolean (conf, "dialog-boxes", "prefer-labels", - &prefer_labels); - - get_base_model (top_model, top_iter, &model, &iter); - - g_assert (PSPPIRE_IS_DICT (model)); - - - gtk_tree_model_get (model, - &iter, DICT_TVM_COL_VAR, &var, -1); - - if ( var_has_label (var) && prefer_labels) - { - gchar *text = g_strdup_printf ( - "%s", - var_get_label (var)); - - char *utf8 = pspp_locale_to_utf8 (text, -1, NULL); - - g_free (text); - g_object_set (cell, "markup", utf8, NULL); - g_free (utf8); - } - else - { - char *name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL); - g_object_set (cell, "text", name, NULL); - g_free (name); - } -} - - -/* Sets the tooltip to be the name of the variable under the cursor */ -static gboolean -set_tooltip_for_variable (GtkTreeView *treeview, - gint x, - gint y, - gboolean keyboard_mode, - GtkTooltip *tooltip, - gpointer user_data) - -{ - gint bx, by; - GtkTreeIter iter; - GtkTreePath *path; - GtkTreeModel *tree_model; - struct variable *var = NULL; - gboolean ok; - - - gtk_tree_view_convert_widget_to_bin_window_coords (treeview, - x, y, &bx, &by); - - if (!gtk_tree_view_get_path_at_pos (treeview, bx, by, - &path, NULL, NULL, NULL)) - return FALSE; - - tree_model = gtk_tree_view_get_model (treeview); - - - gtk_tree_view_set_tooltip_row (treeview, tooltip, path); - - ok = gtk_tree_model_get_iter (tree_model, &iter, path); - - gtk_tree_path_free (path); - if (!ok) - return FALSE; - - - gtk_tree_model_get (tree_model, &iter, DICT_TVM_COL_VAR, &var, -1); - - if ( ! var_has_label (var)) - return FALSE; - - { - gchar *tip ; - gboolean prefer_labels = FALSE; - - PsppireConf *conf = psppire_conf_new (); - - psppire_conf_get_boolean (conf, "dialog-boxes", "prefer-labels", - &prefer_labels); - - if ( prefer_labels ) - tip = pspp_locale_to_utf8 (var_get_name (var), -1, NULL); - else - tip = pspp_locale_to_utf8 (var_get_label (var), -1, NULL); - - gtk_tooltip_set_text (tooltip, tip); - - g_free (tip); - } - - return TRUE; -} - - /* Sets up TREEVIEW to display the variables of DICT. - MODE is the selection mode for TREEVIEW. - PREDICATE determines which variables should be visible, or NULL if - all are to be visible. - */ -void -attach_dictionary_to_treeview (GtkTreeView *treeview, PsppireDict *dict, - GtkSelectionMode mode, - var_predicate_func *predicate - ) -{ - GtkTreeViewColumn *col; - - GtkTreeSelection *selection = - gtk_tree_view_get_selection (treeview); - - GtkCellRenderer *renderer; - - GtkTreeModel *model ; - - if ( predicate ) - { - model = gtk_tree_model_filter_new (GTK_TREE_MODEL (dict), - NULL); - - gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (model), - filter_variables, - predicate, - NULL); - } - else - { - model = GTK_TREE_MODEL (dict); - } - - gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), model); - - - col = gtk_tree_view_column_new (); - gtk_tree_view_column_set_title (col, _("Variable")); - - renderer = gtk_cell_renderer_pixbuf_new (); - gtk_tree_view_column_pack_start (col, renderer, FALSE); - - gtk_tree_view_column_set_cell_data_func (col, renderer, - var_icon_cell_data_func, - NULL, NULL); - - - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start (col, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func (col, renderer, - var_description_cell_data_func, - NULL, NULL); - - g_object_set (renderer, "ellipsize-set", TRUE, NULL); - g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_MIDDLE, NULL); - - gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED); - - /* FIXME: make this a value in terms of character widths */ - gtk_tree_view_column_set_min_width (col, 150); - - gtk_tree_view_append_column (treeview, col); - - gtk_tree_selection_set_mode (selection, mode); - - g_object_set (treeview, "has-tooltip", TRUE, NULL); - -#if GTK_CHECK_VERSION (2, 12, 0) - g_signal_connect (treeview, "query-tooltip", G_CALLBACK (set_tooltip_for_variable), NULL); -#endif -} void @@ -396,3 +150,4 @@ is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter, } + diff --git a/src/ui/gui/dict-display.h b/src/ui/gui/dict-display.h index a9481c6d..2c8df440 100644 --- a/src/ui/gui/dict-display.h +++ b/src/ui/gui/dict-display.h @@ -22,18 +22,6 @@ #include #include "psppire-selector.h" -#include "psppire-dict.h" -#include - -/* Sets up TREEVIEW to display the variables of DICT. - MODE is the selection mode for TREEVIEW. - PREDICATE determines which variables should be visible, or NULL if - all are to be visible. - */ -void attach_dictionary_to_treeview (GtkTreeView *treeview, PsppireDict *dict, - GtkSelectionMode mode, - var_predicate_func *predicate - ); /* A SelectItemsFunc function for GtkTreeView widgets */ @@ -58,6 +46,3 @@ gboolean is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter, PsppireSelector *selector); -void get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter, - GtkTreeModel **model, GtkTreeIter *iter - ); diff --git a/src/ui/gui/examine-dialog.c b/src/ui/gui/examine-dialog.c index 171d88cf..2902685d 100644 --- a/src/ui/gui/examine-dialog.c +++ b/src/ui/gui/examine-dialog.c @@ -279,10 +279,7 @@ examine_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (ex_d.stats_dialog), GTK_WINDOW (de)); gtk_window_set_transient_for (GTK_WINDOW (ex_d.opts_dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); - + g_object_set (source, "model", vs->dict, NULL); set_dest_model (GTK_TREE_VIEW (ex_d.dep_list), vs->dict); ex_d.dict = vs->dict; diff --git a/src/ui/gui/examine.glade b/src/ui/gui/examine.glade index 884e0001..a6f7ca8a 100644 --- a/src/ui/gui/examine.glade +++ b/src/ui/gui/examine.glade @@ -218,7 +218,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/find-dialog.c b/src/ui/gui/find-dialog.c index 130b25cf..60d54e26 100644 --- a/src/ui/gui/find-dialog.c +++ b/src/ui/gui/find-dialog.c @@ -241,10 +241,9 @@ find_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - fd.dict, - GTK_SELECTION_SINGLE, - NULL); + g_object_set (source, "model", fd.dict, + "selection-mode", GTK_SELECTION_SINGLE, + NULL); psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector), source, diff --git a/src/ui/gui/frequencies-dialog.c b/src/ui/gui/frequencies-dialog.c index 37e301b8..a368cabb 100644 --- a/src/ui/gui/frequencies-dialog.c +++ b/src/ui/gui/frequencies-dialog.c @@ -333,9 +333,7 @@ frequencies_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); + g_object_set (source, "model", vs->dict, NULL); set_dest_model (GTK_TREE_VIEW (dest), vs->dict); diff --git a/src/ui/gui/frequencies.glade b/src/ui/gui/frequencies.glade index 5617d40d..3e5e9213 100644 --- a/src/ui/gui/frequencies.glade +++ b/src/ui/gui/frequencies.glade @@ -29,7 +29,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/oneway-anova-dialog.c b/src/ui/gui/oneway-anova-dialog.c index d41b2760..3c80f9e3 100644 --- a/src/ui/gui/oneway-anova-dialog.c +++ b/src/ui/gui/oneway-anova-dialog.c @@ -25,8 +25,9 @@ #include "psppire-data-window.h" #include "psppire-dialog.h" #include "dialog-common.h" -#include "dict-display.h" #include "psppire-acr.h" +#include "psppire-selector.h" +#include "dict-display.h" #include @@ -170,9 +171,7 @@ oneway_anova_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (ow.dialog, GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (dict_view), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); + g_object_set (dict_view, "model", vs->dict, NULL); set_dest_model (GTK_TREE_VIEW (ow.vars_treeview), vs->dict); diff --git a/src/ui/gui/oneway.glade b/src/ui/gui/oneway.glade index bdca13dd..4b12f68b 100644 --- a/src/ui/gui/oneway.glade +++ b/src/ui/gui/oneway.glade @@ -139,7 +139,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/psppire-buttonbox.c b/src/ui/gui/psppire-buttonbox.c index d121d961..184ebd16 100644 --- a/src/ui/gui/psppire-buttonbox.c +++ b/src/ui/gui/psppire-buttonbox.c @@ -142,7 +142,7 @@ psppire_button_box_class_init (PsppireButtonBoxClass *class) g_param_spec_flags ("buttons", _("Buttons"), _("The mask that decides what buttons appear in the button box"), - G_TYPE_PSPPIRE_BUTTON_MASK, + PSPPIRE_TYPE_BUTTON_MASK, PSPPIRE_BUTTON_OK_MASK | PSPPIRE_BUTTON_CANCEL_MASK | PSPPIRE_BUTTON_RESET_MASK | diff --git a/src/ui/gui/psppire-buttonbox.h b/src/ui/gui/psppire-buttonbox.h index 3f865fac..03f9fe34 100644 --- a/src/ui/gui/psppire-buttonbox.h +++ b/src/ui/gui/psppire-buttonbox.h @@ -71,7 +71,7 @@ _psppire_button_box_child_requisition (GtkWidget *widget, int *width, -#define G_TYPE_PSPPIRE_BUTTON_MASK \ +#define PSPPIRE_TYPE_BUTTON_MASK \ (psppire_button_flags_get_type()) int *height); diff --git a/src/ui/gui/psppire-conf.c b/src/ui/gui/psppire-conf.c index d9f6800f..4090b74c 100644 --- a/src/ui/gui/psppire-conf.c +++ b/src/ui/gui/psppire-conf.c @@ -181,16 +181,20 @@ psppire_conf_get_boolean (PsppireConf *conf, const gchar *base, const gchar *name, gboolean *value) { gboolean ok; + gboolean b; GError *err = NULL; conf_read (conf); - *value = g_key_file_get_boolean (conf->keyfile, - base, - name, &err); + b = g_key_file_get_boolean (conf->keyfile, + base, + name, &err); ok = (err == NULL); if ( err != NULL ) g_error_free (err); + if (ok) + *value = b; + return ok; } @@ -270,9 +274,6 @@ psppire_conf_save_window_geometry (PsppireConf *conf, GDK_WINDOW_STATE_MAXIMIZED ) return; - if ( event->send_event ) - return; - psppire_conf_set_int (conf, base, "height", event->height); psppire_conf_set_int (conf, base, "width", event->width); @@ -292,4 +293,5 @@ psppire_conf_save_window_geometry (PsppireConf *conf, default: break; }; + } diff --git a/src/ui/gui/psppire-data-editor.c b/src/ui/gui/psppire-data-editor.c index a608e6de..ab3b2128 100644 --- a/src/ui/gui/psppire-data-editor.c +++ b/src/ui/gui/psppire-data-editor.c @@ -862,11 +862,10 @@ init_data_sheet (PsppireDataEditor *de) de->vaxis[0] = psppire_axis_impl_new (); de->vaxis[1] = psppire_axis_impl_new (); - /* Txoxovhere's only one horizontal axis, since the + /* There's only one horizontal axis, since the column widths are parameters of the variables */ de->haxis = psppire_axis_impl_new (); - de->split = TRUE; de->paned = gtk_xpaned_new (); diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c index c754f730..5efb02de 100644 --- a/src/ui/gui/psppire-data-window.c +++ b/src/ui/gui/psppire-data-window.c @@ -53,7 +53,6 @@ #include "crosstabs-dialog.h" #include "frequencies-dialog.h" #include "examine-dialog.h" -#include "dict-display.h" #include "regression-dialog.h" #include "oneway-anova-dialog.h" #include "t-test-independent-samples-dialog.h" diff --git a/src/ui/gui/psppire-dialog.c b/src/ui/gui/psppire-dialog.c index 22b4cf4e..dbe4612f 100644 --- a/src/ui/gui/psppire-dialog.c +++ b/src/ui/gui/psppire-dialog.c @@ -73,7 +73,6 @@ psppire_dialog_get_type (void) g_type_add_interface_static (dialog_type, GTK_TYPE_BUILDABLE, &buildable_info); - } return dialog_type; @@ -104,7 +103,8 @@ psppire_dialog_finalize (GObject *object) enum { PROP_0, - PROP_ORIENTATION + PROP_ORIENTATION, + PROP_SLIDING }; @@ -120,14 +120,17 @@ psppire_dialog_get_property (GObject *object, { case PROP_ORIENTATION: { - if ( GTK_IS_VBOX (dialog->box) ) + if ( GTK_IS_VBOX (dialog->box) || GTK_VPANED (dialog->box)) g_value_set_enum (value, PSPPIRE_VERTICAL); - else if ( GTK_IS_HBOX (dialog->box)) + else if ( GTK_IS_HBOX (dialog->box) || GTK_HPANED (dialog->box)) g_value_set_enum (value, PSPPIRE_HORIZONTAL); else if ( GTK_IS_TABLE (dialog->box)) g_value_set_enum (value, PSPPIRE_TABULAR); } break; + case PROP_SLIDING: + g_value_set_boolean (value, dialog->slidable); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -136,22 +139,26 @@ psppire_dialog_get_property (GObject *object, static void -dialog_set_orientation (PsppireDialog *dialog, const GValue *orval) +dialog_set_container (PsppireDialog *dialog) { - PsppireOrientation orientation = g_value_get_enum (orval); - if ( dialog->box != NULL) { gtk_container_remove (GTK_CONTAINER (dialog), dialog->box); } - switch ( orientation ) + switch (dialog->orientation) { case PSPPIRE_HORIZONTAL: - dialog->box = gtk_hbox_new (FALSE, 5); + if ( dialog->slidable) + dialog->box = gtk_hpaned_new(); + else + dialog->box = gtk_hbox_new (FALSE, 5); break; case PSPPIRE_VERTICAL: - dialog->box = gtk_vbox_new (FALSE, 5); + if ( dialog->slidable) + dialog->box = gtk_vpaned_new(); + else + dialog->box = gtk_vbox_new (FALSE, 5); break; case PSPPIRE_TABULAR: dialog->box = gtk_table_new (2, 3, FALSE); @@ -162,6 +169,7 @@ dialog_set_orientation (PsppireDialog *dialog, const GValue *orval) break; } + gtk_widget_show_all (dialog->box); gtk_container_add (GTK_CONTAINER (dialog), dialog->box); } @@ -177,13 +185,18 @@ psppire_dialog_set_property (GObject *object, switch (prop_id) { + case PROP_SLIDING: + dialog->slidable = g_value_get_boolean (value); + break; case PROP_ORIENTATION: - dialog_set_orientation (dialog, value); + dialog->orientation = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; }; + + dialog_set_container (dialog); } @@ -194,15 +207,24 @@ psppire_dialog_class_init (PsppireDialogClass *class) { GObjectClass *object_class = (GObjectClass *) class; + GParamSpec *sliding_spec ; orientation_spec = g_param_spec_enum ("orientation", "Orientation", "Which way widgets are packed", - G_TYPE_PSPPIRE_ORIENTATION, + PSPPIRE_TYPE_ORIENTATION, PSPPIRE_HORIZONTAL /* default value */, G_PARAM_CONSTRUCT_ONLY |G_PARAM_READWRITE); + sliding_spec = + g_param_spec_boolean ("slidable", + "Slidable", + "Can the container be sized by the user", + FALSE, + G_PARAM_CONSTRUCT_ONLY |G_PARAM_READWRITE); + + object_class->set_property = psppire_dialog_set_property; object_class->get_property = psppire_dialog_get_property; @@ -212,6 +234,11 @@ psppire_dialog_class_init (PsppireDialogClass *class) orientation_spec); + g_object_class_install_property (object_class, + PROP_SLIDING, + sliding_spec); + + signals [DIALOG_REFRESH] = g_signal_new ("refresh", @@ -305,6 +332,7 @@ psppire_dialog_init (PsppireDialog *dialog) dialog->box = NULL; dialog->contents_are_valid = NULL; dialog->validity_data = NULL; + dialog->slidable = FALSE; g_value_init (&value, orientation_spec->value_type); g_param_value_set_default (orientation_spec, &value); @@ -312,8 +340,6 @@ psppire_dialog_init (PsppireDialog *dialog) gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG); - dialog_set_orientation (dialog, &value); - g_value_unset (&value); g_signal_connect (dialog, "delete-event", @@ -333,8 +359,6 @@ psppire_dialog_init (PsppireDialog *dialog) GDK_WINDOW_TYPE_HINT_DIALOG); g_object_set (dialog, "icon-name", "psppicon", NULL); - - gtk_widget_show_all (dialog->box); } diff --git a/src/ui/gui/psppire-dialog.h b/src/ui/gui/psppire-dialog.h index 05215ce9..6c175cfb 100644 --- a/src/ui/gui/psppire-dialog.h +++ b/src/ui/gui/psppire-dialog.h @@ -42,6 +42,14 @@ typedef struct _PsppireDialogClass PsppireDialogClass; typedef gboolean (*ContentsAreValid) (gpointer); +typedef enum + { + PSPPIRE_HORIZONTAL, + PSPPIRE_VERTICAL, + PSPPIRE_TABULAR + } PsppireOrientation; + + struct _PsppireDialog { @@ -54,6 +62,8 @@ struct _PsppireDialog ContentsAreValid contents_are_valid; gpointer validity_data; + gboolean slidable; + PsppireOrientation orientation; }; struct _PsppireDialogClass @@ -77,14 +87,7 @@ void psppire_dialog_notify_change (PsppireDialog *); GType psppire_orientation_get_type (void); -typedef enum - { - PSPPIRE_HORIZONTAL, - PSPPIRE_VERTICAL, - PSPPIRE_TABULAR - } PsppireOrientation; - -#define G_TYPE_PSPPIRE_ORIENTATION (psppire_orientation_get_type ()) +#define PSPPIRE_TYPE_ORIENTATION (psppire_orientation_get_type ()) G_END_DECLS diff --git a/src/ui/gui/psppire-dict.c b/src/ui/gui/psppire-dict.c index 91293956..564257f4 100644 --- a/src/ui/gui/psppire-dict.c +++ b/src/ui/gui/psppire-dict.c @@ -315,7 +315,7 @@ psppire_dict_init (PsppireDict *psppire_dict) PsppireDict* psppire_dict_new_from_dict (struct dictionary *d) { - PsppireDict *new_dict = g_object_new (G_TYPE_PSPPIRE_DICT, NULL); + PsppireDict *new_dict = g_object_new (PSPPIRE_TYPE_DICT, NULL); new_dict->dict = d; dict_set_callbacks (new_dict->dict, &gui_callbacks, new_dict); diff --git a/src/ui/gui/psppire-dict.h b/src/ui/gui/psppire-dict.h index 534f0707..6d731f21 100644 --- a/src/ui/gui/psppire-dict.h +++ b/src/ui/gui/psppire-dict.h @@ -30,12 +30,12 @@ G_BEGIN_DECLS /* --- type macros --- */ -#define G_TYPE_PSPPIRE_DICT (psppire_dict_get_type ()) -#define PSPPIRE_DICT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_PSPPIRE_DICT, PsppireDict)) -#define PSPPIRE_DICT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), G_TYPE_PSPPIRE_DICT, PsppireDictClass)) -#define PSPPIRE_IS_DICT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_PSPPIRE_DICT)) -#define PSPPIRE_IS_DICT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), G_TYPE_PSPPIRE_DICT)) -#define PSPPIRE_DICT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_PSPPIRE_DICT, PsppireDictClass)) +#define PSPPIRE_TYPE_DICT (psppire_dict_get_type ()) +#define PSPPIRE_DICT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PSPPIRE_TYPE_DICT, PsppireDict)) +#define PSPPIRE_DICT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PSPPIRE_TYPE_DICT, PsppireDictClass)) +#define PSPPIRE_IS_DICT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PSPPIRE_TYPE_DICT)) +#define PSPPIRE_IS_DICT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DICT)) +#define PSPPIRE_DICT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PSPPIRE_TYPE_DICT, PsppireDictClass)) /* --- typedefs & structures --- */ diff --git a/src/ui/gui/psppire-dictview.c b/src/ui/gui/psppire-dictview.c new file mode 100644 index 00000000..336092f5 --- /dev/null +++ b/src/ui/gui/psppire-dictview.c @@ -0,0 +1,545 @@ +/* PSPPIRE - a graphical user interface for PSPP. + Copyright (C) 2009 Free Software Foundation + + 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include +#include "psppire-dictview.h" +#include "psppire-dict.h" +#include "psppire-conf.h" +#include +#include "helper.h" + +#include +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + +static void psppire_dict_view_base_finalize (PsppireDictViewClass *, gpointer); +static void psppire_dict_view_base_init (PsppireDictViewClass *class); +static void psppire_dict_view_class_init (PsppireDictViewClass *class); +static void psppire_dict_view_init (PsppireDictView *dict_view); + + +GType +psppire_dict_view_get_type (void) +{ + static GType psppire_dict_view_type = 0; + + if (!psppire_dict_view_type) + { + static const GTypeInfo psppire_dict_view_info = + { + sizeof (PsppireDictViewClass), + (GBaseInitFunc) psppire_dict_view_base_init, + (GBaseFinalizeFunc) psppire_dict_view_base_finalize, + (GClassInitFunc)psppire_dict_view_class_init, + (GClassFinalizeFunc) NULL, + NULL, + sizeof (PsppireDictView), + 0, + (GInstanceInitFunc) psppire_dict_view_init, + }; + + psppire_dict_view_type = + g_type_register_static (GTK_TYPE_TREE_VIEW, "PsppireDictView", + &psppire_dict_view_info, 0); + } + + return psppire_dict_view_type; +} + + +static void +psppire_dict_view_finalize (GObject *object) +{ + PsppireDictView *dict_view = PSPPIRE_DICT_VIEW (object); + + g_object_unref (dict_view->menu); +} + +/* Properties */ +enum +{ + PROP_0, + PROP_MODEL, + PROP_PREDICATE, + PROP_SELECTION_MODE +}; + + +/* A GtkTreeModelFilterVisibleFunc to filter lines in the treeview */ +static gboolean +filter_variables (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) +{ + var_predicate_func *predicate = data; + struct variable *var; + PsppireDict *dict = PSPPIRE_DICT (model); + + GtkTreePath *path = gtk_tree_model_get_path (model, iter); + + gint *idx = gtk_tree_path_get_indices (path); + + var = psppire_dict_get_variable (dict, *idx); + + gtk_tree_path_free (path); + + return predicate (var); +} + +static void +set_model (PsppireDictView *dict_view) +{ + GtkTreeModel *model ; + + if ( dict_view->predicate ) + { + model = gtk_tree_model_filter_new (GTK_TREE_MODEL (dict_view->dict), + NULL); + + gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (model), + filter_variables, + dict_view->predicate, + NULL); + } + else + { + model = GTK_TREE_MODEL (dict_view->dict); + } + + gtk_tree_view_set_model (GTK_TREE_VIEW (dict_view), model); +} + +static void +psppire_dict_view_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + PsppireDictView *dict_view = PSPPIRE_DICT_VIEW (object); + + switch (prop_id) + { + case PROP_MODEL: + dict_view->dict = g_value_get_object (value); + break; + case PROP_PREDICATE: + dict_view->predicate = g_value_get_pointer (value); + break; + case PROP_SELECTION_MODE: + { + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (dict_view)); + + GtkSelectionMode mode = g_value_get_enum (value); + + gtk_tree_selection_set_mode (selection, mode); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + }; + + + set_model (dict_view); +} + + +static void +psppire_dict_view_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + PsppireDictView *dict_view = PSPPIRE_DICT_VIEW (object); + + switch (prop_id) + { + case PROP_MODEL: + g_value_set_object (value, dict_view->dict); + break; + case PROP_PREDICATE: + g_value_set_pointer (value, dict_view->predicate); + break; + case PROP_SELECTION_MODE: + { + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (dict_view)); + + g_value_set_enum (value, gtk_tree_selection_get_mode (selection)); + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + }; +} + + + +static void +psppire_dict_view_class_init (PsppireDictViewClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + GParamSpec *model_spec = + g_param_spec_object ("model", + "Model", + _("The dictionary to be displayed by this widget"), + PSPPIRE_TYPE_DICT, + G_PARAM_READABLE | G_PARAM_WRITABLE); + + GParamSpec *predicate_spec = + g_param_spec_pointer ("predicate", + "Predicate", + _("A predicate function"), + G_PARAM_READABLE | G_PARAM_WRITABLE); + + + GParamSpec *selection_mode_spec = + g_param_spec_enum ("selection-mode", + "Selection Mode", + _("How many things can be selected"), + GTK_TYPE_SELECTION_MODE, + GTK_SELECTION_MULTIPLE, + G_PARAM_CONSTRUCT | G_PARAM_READABLE | G_PARAM_WRITABLE); + + + object_class->set_property = psppire_dict_view_set_property; + object_class->get_property = psppire_dict_view_get_property; + + g_object_class_install_property (object_class, + PROP_MODEL, + model_spec); + + g_object_class_install_property (object_class, + PROP_PREDICATE, + predicate_spec); + + g_object_class_install_property (object_class, + PROP_SELECTION_MODE, + selection_mode_spec); +} + + +static void +psppire_dict_view_base_init (PsppireDictViewClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = psppire_dict_view_finalize; +} + + + +static void +psppire_dict_view_base_finalize (PsppireDictViewClass *class, + gpointer class_data) +{ + +} + + +static void +dv_get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter, + GtkTreeModel **model, GtkTreeIter *iter + ) +{ + *model = top_model; + *iter = *top_iter; + while (GTK_IS_TREE_MODEL_FILTER (*model)) + { + GtkTreeIter parent_iter = *iter; + GtkTreeModelFilter *parent_model = GTK_TREE_MODEL_FILTER (*model); + + *model = gtk_tree_model_filter_get_model (parent_model); + + gtk_tree_model_filter_convert_iter_to_child_iter (parent_model, + iter, + &parent_iter); + } + + g_assert (PSPPIRE_IS_DICT (*model)); +} + + + +/* A GtkTreeCellDataFunc which renders the name and/or label of the + variable */ +static void +var_description_cell_data_func (GtkTreeViewColumn *col, + GtkCellRenderer *cell, + GtkTreeModel *top_model, + GtkTreeIter *top_iter, + gpointer data) +{ + PsppireDictView *dv = PSPPIRE_DICT_VIEW (data); + struct variable *var; + GtkTreeIter iter; + GtkTreeModel *model; + + + dv_get_base_model (top_model, top_iter, &model, &iter); + + g_assert (PSPPIRE_IS_DICT (model)); + + gtk_tree_model_get (model, + &iter, DICT_TVM_COL_VAR, &var, -1); + + if ( var_has_label (var) && dv->prefer_labels) + { + gchar *text = g_strdup_printf ( + "%s", + var_get_label (var)); + + char *utf8 = pspp_locale_to_utf8 (text, -1, NULL); + + g_free (text); + g_object_set (cell, "markup", utf8, NULL); + g_free (utf8); + } + else + { + char *name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL); + g_object_set (cell, "text", name, NULL); + g_free (name); + } +} + + + +/* A GtkTreeCellDataFunc which sets the icon appropriate to the type + of variable */ +static void +var_icon_cell_data_func (GtkTreeViewColumn *col, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data) +{ + struct variable *var; + gtk_tree_model_get (model, iter, DICT_TVM_COL_VAR, &var, -1); + + if ( var_is_alpha (var)) + { + g_object_set (cell, "stock-id", "var-string", NULL); + } + else + { + const struct fmt_spec *fs = var_get_write_format (var); + int cat = fmt_get_category (fs->type); + switch ( var_get_measure (var)) + { + case MEASURE_NOMINAL: + g_object_set (cell, "stock-id", "var-nominal", NULL); + break; + case MEASURE_ORDINAL: + g_object_set (cell, "stock-id", "var-ordinal", NULL); + break; + case MEASURE_SCALE: + if ( ( FMT_CAT_DATE | FMT_CAT_TIME ) & cat ) + g_object_set (cell, "stock-id", "var-date-scale", NULL); + else + g_object_set (cell, "stock-id", "var-scale", NULL); + break; + default: + g_assert_not_reached (); + }; + } +} + + +/* Sets the tooltip to be the name of the variable under the cursor */ +static gboolean +set_tooltip_for_variable (GtkTreeView *treeview, + gint x, + gint y, + gboolean keyboard_mode, + GtkTooltip *tooltip, + gpointer user_data) +{ + gint bx, by; + GtkTreeIter iter; + GtkTreePath *path; + GtkTreeModel *tree_model; + struct variable *var = NULL; + gboolean ok; + + + gtk_tree_view_convert_widget_to_bin_window_coords (treeview, + x, y, &bx, &by); + + if (!gtk_tree_view_get_path_at_pos (treeview, bx, by, + &path, NULL, NULL, NULL)) + return FALSE; + + tree_model = gtk_tree_view_get_model (treeview); + + + gtk_tree_view_set_tooltip_row (treeview, tooltip, path); + + ok = gtk_tree_model_get_iter (tree_model, &iter, path); + + gtk_tree_path_free (path); + if (!ok) + return FALSE; + + + gtk_tree_model_get (tree_model, &iter, DICT_TVM_COL_VAR, &var, -1); + + if ( ! var_has_label (var)) + return FALSE; + + { + gchar *tip ; + + if ( PSPPIRE_DICT_VIEW (treeview)->prefer_labels ) + tip = pspp_locale_to_utf8 (var_get_name (var), -1, NULL); + else + tip = pspp_locale_to_utf8 (var_get_label (var), -1, NULL); + + gtk_tooltip_set_text (tooltip, tip); + + g_free (tip); + } + + return TRUE; +} + +static gboolean +show_menu (PsppireDictView *dv, GdkEventButton *event, gpointer data) +{ + if (event->button != 3) + return FALSE; + + gtk_menu_popup (GTK_MENU (dv->menu), NULL, NULL, NULL, NULL, + event->button, event->time); + + return TRUE; +} + +static void +toggle_label_preference (GtkCheckMenuItem *checkbox, gpointer data) +{ + PsppireDictView *dv = PSPPIRE_DICT_VIEW (data); + + dv->prefer_labels = gtk_check_menu_item_get_active (checkbox); + + gtk_widget_queue_draw (GTK_WIDGET (dv)); +} + +static void +psppire_dict_view_init (PsppireDictView *dict_view) +{ + GtkTreeViewColumn *col = gtk_tree_view_column_new (); + + GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new (); + + dict_view->prefer_labels = TRUE; + + psppire_conf_get_boolean (psppire_conf_new (), + "dialog-boxes", "prefer-labels", + &dict_view->prefer_labels); + + gtk_tree_view_column_set_title (col, _("Variable")); + + gtk_tree_view_column_pack_start (col, renderer, FALSE); + + gtk_tree_view_column_set_cell_data_func (col, renderer, + var_icon_cell_data_func, + NULL, NULL); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (col, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func (col, renderer, + var_description_cell_data_func, + dict_view, NULL); + + g_object_set (renderer, "ellipsize-set", TRUE, NULL); + g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_MIDDLE, NULL); + + gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED); + + /* FIXME: make this a value in terms of character widths */ + gtk_tree_view_column_set_min_width (col, 150); + + gtk_tree_view_append_column (GTK_TREE_VIEW (dict_view), col); + + g_object_set (dict_view, "has-tooltip", TRUE, NULL); + + g_signal_connect (dict_view, "query-tooltip", + G_CALLBACK (set_tooltip_for_variable), NULL); + + dict_view->menu = gtk_menu_new (); + + + { + GtkWidget *checkbox = + gtk_check_menu_item_new_with_label (_("Prefer variable labels")); + + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (checkbox), + dict_view->prefer_labels); + + g_signal_connect (checkbox, "toggled", + G_CALLBACK (toggle_label_preference), dict_view); + + + gtk_menu_shell_append (GTK_MENU_SHELL (dict_view->menu), checkbox); + + } + + gtk_widget_show_all (dict_view->menu); + + g_signal_connect (dict_view, "button-press-event", + G_CALLBACK (show_menu), NULL); +} + + +GtkWidget* +psppire_dict_view_new (void) +{ + return GTK_WIDGET (g_object_new (psppire_dict_view_get_type (), NULL)); +} + + + +struct variable * +psppire_dict_view_get_selected_variable (PsppireDictView *treeview) +{ + struct variable *var; + GtkTreeModel *top_model; + GtkTreeIter top_iter; + + GtkTreeModel *model; + GtkTreeIter iter; + + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + + if (! gtk_tree_selection_get_selected (selection, + &top_model, &top_iter)) + return NULL; + + dv_get_base_model (top_model, &top_iter, &model, &iter); + + g_assert (PSPPIRE_IS_DICT (model)); + + gtk_tree_model_get (model, + &iter, DICT_TVM_COL_VAR, &var, -1); + + return var; +} + + diff --git a/src/ui/gui/psppire-dictview.h b/src/ui/gui/psppire-dictview.h new file mode 100644 index 00000000..dd08d78f --- /dev/null +++ b/src/ui/gui/psppire-dictview.h @@ -0,0 +1,68 @@ +/* PSPPIRE - a graphical user interface for PSPP. + Copyright (C) 2009 Free Software Foundation + + 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +#ifndef __PSPPIRE_DICT_VIEW_H__ +#define __PSPPIRE_DICT_VIEW_H__ + + +#include +#include +#include + +#include "psppire-dict.h" +#include "dict-display.h" + +G_BEGIN_DECLS + +#define PSPPIRE_DICT_VIEW_TYPE (psppire_dict_view_get_type ()) +#define PSPPIRE_DICT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PSPPIRE_DICT_VIEW_TYPE, PsppireDictView)) +#define PSPPIRE_DICT_VIEW_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + PSPPIRE_DICT_VIEW_TYPE, PsppireDictViewClass)) +#define PSPPIRE_IS_DICT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + PSPPIRE_DICT_VIEW_TYPE)) +#define PSPPIRE_IS_DICT_VIEW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + PSPPIRE_DICT_VIEW_TYPE)) + + +typedef struct _PsppireDictView PsppireDictView; +typedef struct _PsppireDictViewClass PsppireDictViewClass; + + + +struct _PsppireDictView +{ + GtkTreeView parent; + + PsppireDict *dict; + var_predicate_func *predicate; + GtkWidget *menu; + gboolean prefer_labels; +}; + +struct _PsppireDictViewClass +{ + GtkTreeViewClass parent_class; + +}; + +GType psppire_dict_view_get_type (void); +struct variable * psppire_dict_view_get_selected_variable (PsppireDictView *); + + +G_END_DECLS + +#endif /* __PSPPIRE_DICT_VIEW_H__ */ diff --git a/src/ui/gui/psppire-selector.c b/src/ui/gui/psppire-selector.c index 2f9dbe06..d6ea3375 100644 --- a/src/ui/gui/psppire-selector.c +++ b/src/ui/gui/psppire-selector.c @@ -179,7 +179,7 @@ psppire_selector_class_init (PsppireSelectorClass *class) g_param_spec_enum ("orientation", "Orientation", "Where the selector is relative to its subjects", - G_TYPE_PSPPIRE_SELECTOR_ORIENTATION, + PSPPIRE_TYPE_SELECTOR_ORIENTATION, PSPPIRE_SELECT_SOURCE_BEFORE_DEST /* default value */, G_PARAM_CONSTRUCT_ONLY |G_PARAM_READWRITE); diff --git a/src/ui/gui/psppire-selector.h b/src/ui/gui/psppire-selector.h index bdd358eb..6fff5d42 100644 --- a/src/ui/gui/psppire-selector.h +++ b/src/ui/gui/psppire-selector.h @@ -130,7 +130,7 @@ typedef enum { PSPPIRE_SELECT_SOURCE_BELOW_DEST } PsppireSelectorOrientation; -#define G_TYPE_PSPPIRE_SELECTOR_ORIENTATION \ +#define PSPPIRE_TYPE_SELECTOR_ORIENTATION \ (psppire_selector_orientation_get_type()) diff --git a/src/ui/gui/psppire-var-sheet.c b/src/ui/gui/psppire-var-sheet.c index bffcfd1d..517a61e0 100644 --- a/src/ui/gui/psppire-var-sheet.c +++ b/src/ui/gui/psppire-var-sheet.c @@ -286,7 +286,6 @@ traverse_cell_callback (PsppireSheet *sheet, - /* Callback whenever the active cell changes on the var sheet. */ @@ -296,7 +295,6 @@ var_sheet_change_active_cell (PsppireVarSheet *vs, gint oldrow, gint oldcolumn, gpointer data) { - PsppireSheetCellAttr attributes; PsppireVarStore *var_store; PsppireVarSheetClass *vs_class = PSPPIRE_VAR_SHEET_CLASS(G_OBJECT_GET_CLASS (vs)); @@ -313,8 +311,6 @@ var_sheet_change_active_cell (PsppireVarSheet *vs, g_return_if_fail (oldcolumn == PSPPIRE_VAR_STORE_COL_NAME || row < psppire_var_store_get_var_cnt (var_store)); - psppire_sheet_get_attributes (sheet, row, column, &attributes); - var = psppire_var_store_get_var (var_store, row); switch (column) @@ -430,7 +426,8 @@ var_sheet_change_active_cell (PsppireVarSheet *vs, case PSPPIRE_VAR_STORE_COL_DECIMALS: case PSPPIRE_VAR_STORE_COL_COLUMNS: { - if ( attributes.is_editable) + if ( psppire_sheet_model_is_editable (PSPPIRE_SHEET_MODEL(var_store), + row, column)) { gint r_min, r_max; diff --git a/src/ui/gui/psppire-var-store.c b/src/ui/gui/psppire-var-store.c index b092de30..8e78e2ec 100644 --- a/src/ui/gui/psppire-var-store.c +++ b/src/ui/gui/psppire-var-store.c @@ -191,7 +191,7 @@ psppire_var_store_class_init (PsppireVarStoreClass *class) "Variable format type", ("Whether variables have input or output " "formats"), - G_TYPE_PSPPIRE_VAR_STORE_FORMAT_TYPE, + PSPPIRE_TYPE_VAR_STORE_FORMAT_TYPE, PSPPIRE_VAR_STORE_OUTPUT_FORMATS, G_PARAM_READWRITE); diff --git a/src/ui/gui/psppire-var-store.h b/src/ui/gui/psppire-var-store.h index cf437589..4cda0159 100644 --- a/src/ui/gui/psppire-var-store.h +++ b/src/ui/gui/psppire-var-store.h @@ -34,7 +34,7 @@ typedef enum } PsppireVarStoreFormatType; -#define G_TYPE_PSPPIRE_VAR_STORE_FORMAT_TYPE \ +#define PSPPIRE_TYPE_VAR_STORE_FORMAT_TYPE \ (psppire_var_store_format_type_get_type ()) /* PSPPIRE variable store. */ diff --git a/src/ui/gui/psppire.glade b/src/ui/gui/psppire.glade index 473d5304..ad08cb2b 100644 --- a/src/ui/gui/psppire.glade +++ b/src/ui/gui/psppire.glade @@ -47,7 +47,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True False True @@ -212,7 +212,7 @@ GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC - + True False @@ -394,7 +394,7 @@ GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -680,7 +680,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -924,7 +924,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -1187,7 +1187,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -1775,108 +1775,6 @@ - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Variables - True - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 5 - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - True - True - - - - - False - False - 5 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 5 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - Variable Information: - - - False - False - 5 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - - - 200 - True - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - GTK_WRAP_WORD_CHAR - 3 - False - False - - - - - 5 - 2 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 5 - True - PSPPIRE_BUTTON_GOTO_MASK | PSPPIRE_BUTTON_CANCEL_MASK | PSPPIRE_BUTTON_HELP_MASK | PSPPIRE_BUTTON_PASTE_MASK - - - False - False - GTK_PACK_END - 1 - - - - - 5 - 1 - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Select Cases: Range diff --git a/src/ui/gui/rank-dialog.c b/src/ui/gui/rank-dialog.c index 8ea25a1d..606475ba 100644 --- a/src/ui/gui/rank-dialog.c +++ b/src/ui/gui/rank-dialog.c @@ -306,10 +306,7 @@ rank_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (rd.dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (vars), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); - + g_object_set (vars, "model", vs->dict, NULL); set_dest_model (GTK_TREE_VIEW (rd.rank_vars), vs->dict); diff --git a/src/ui/gui/rank.glade b/src/ui/gui/rank.glade index 6f65542f..fd412dfe 100644 --- a/src/ui/gui/rank.glade +++ b/src/ui/gui/rank.glade @@ -32,7 +32,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/recode-dialog.c b/src/ui/gui/recode-dialog.c index 859737f6..e5de4597 100644 --- a/src/ui/gui/recode-dialog.c +++ b/src/ui/gui/recode-dialog.c @@ -885,10 +885,7 @@ recode_dialog (PsppireDataWindow *de, gboolean diff) gtk_window_set_transient_for (GTK_WINDOW (rd.dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (rd.dict_treeview), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); - + g_object_set (rd.dict_treeview, "model", vs->dict, NULL); if ( ! rd.different ) { diff --git a/src/ui/gui/recode.glade b/src/ui/gui/recode.glade index a3b795e6..6edcc0ab 100644 --- a/src/ui/gui/recode.glade +++ b/src/ui/gui/recode.glade @@ -775,7 +775,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/regression-dialog.c b/src/ui/gui/regression-dialog.c index 2d8aca3e..a8605018 100644 --- a/src/ui/gui/regression-dialog.c +++ b/src/ui/gui/regression-dialog.c @@ -252,9 +252,7 @@ regression_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); + g_object_set (source, "model", vs->dict, NULL); set_dest_model (GTK_TREE_VIEW (dest_dep), vs->dict); set_dest_model (GTK_TREE_VIEW (dest_indep), vs->dict); diff --git a/src/ui/gui/regression.glade b/src/ui/gui/regression.glade index 3ee4973b..e6bac4d8 100644 --- a/src/ui/gui/regression.glade +++ b/src/ui/gui/regression.glade @@ -95,7 +95,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/select-cases-dialog.c b/src/ui/gui/select-cases-dialog.c index e4d599ed..ca1b31bc 100644 --- a/src/ui/gui/select-cases-dialog.c +++ b/src/ui/gui/select-cases-dialog.c @@ -21,8 +21,9 @@ #include "helper.h" #include "psppire-dialog.h" #include "psppire-data-window.h" -#include "dialog-common.h" +#include "psppire-selector.h" #include "dict-display.h" +#include "dialog-common.h" #include "widget-io.h" #include #include "helper.h" @@ -324,9 +325,10 @@ select_cases_dialog (GObject *o, gpointer data) { GtkWidget *source = get_widget_assert (scd.xml, "select-cases-treeview"); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - scd.data_store->dict, - GTK_SELECTION_SINGLE, NULL); + g_object_set (source, "model", + scd.data_store->dict, + "selection-mode", + GTK_SELECTION_SINGLE, NULL); psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector), source, diff --git a/src/ui/gui/sort-cases-dialog.c b/src/ui/gui/sort-cases-dialog.c index d9c665e6..9d4ea50b 100644 --- a/src/ui/gui/sort-cases-dialog.c +++ b/src/ui/gui/sort-cases-dialog.c @@ -22,6 +22,7 @@ #include "psppire-data-window.h" #include "psppire-var-store.h" #include "dialog-common.h" +#include "psppire-selector.h" #include "dict-display.h" #include @@ -110,9 +111,7 @@ sort_cases_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); + g_object_set (source, "model", vs->dict, NULL); set_dest_model (GTK_TREE_VIEW (dest), vs->dict); diff --git a/src/ui/gui/split-file-dialog.c b/src/ui/gui/split-file-dialog.c index 8708b33f..1641b50c 100644 --- a/src/ui/gui/split-file-dialog.c +++ b/src/ui/gui/split-file-dialog.c @@ -191,9 +191,8 @@ split_file_dialog (GObject *o, gpointer data) sfd.selector = PSPPIRE_SELECTOR ( get_widget_assert (sfd.xml, "split-file-selector")); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); + g_object_set (source, "model", + vs->dict, NULL); g_signal_connect (on_off, "toggled", G_CALLBACK(on_off_toggled), sfd.xml); diff --git a/src/ui/gui/t-test-independent-samples-dialog.c b/src/ui/gui/t-test-independent-samples-dialog.c index 392867ad..53b2c20c 100644 --- a/src/ui/gui/t-test-independent-samples-dialog.c +++ b/src/ui/gui/t-test-independent-samples-dialog.c @@ -426,9 +426,9 @@ t_test_independent_samples_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (tt_d.dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (dict_view), + g_object_set (dict_view, "model", vs->dict, - GTK_SELECTION_MULTIPLE, NULL); + NULL); set_dest_model (GTK_TREE_VIEW (test_variables_treeview), vs->dict); diff --git a/src/ui/gui/t-test-one-sample.c b/src/ui/gui/t-test-one-sample.c index 3cdc91c3..64232d85 100644 --- a/src/ui/gui/t-test-one-sample.c +++ b/src/ui/gui/t-test-one-sample.c @@ -147,10 +147,10 @@ t_test_one_sample_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (dict_view), + g_object_set (dict_view, "model", vs->dict, - GTK_SELECTION_MULTIPLE, - var_is_numeric); + "predicate", + var_is_numeric, NULL); set_dest_model (GTK_TREE_VIEW (tt_d.vars_treeview), vs->dict); diff --git a/src/ui/gui/t-test-paired-samples.c b/src/ui/gui/t-test-paired-samples.c index ca1d776a..5ac5d8aa 100644 --- a/src/ui/gui/t-test-paired-samples.c +++ b/src/ui/gui/t-test-paired-samples.c @@ -20,13 +20,13 @@ #include #include "psppire-data-window.h" +#include "psppire-selector.h" #include "psppire-dict.h" #include "psppire-var-store.h" #include "t-test-paired-samples.h" #include "t-test-options.h" -#include "dict-display.h" #include "dialog-common.h" #include "psppire-dialog.h" @@ -205,10 +205,10 @@ t_test_paired_samples_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (dict_view), + g_object_set (dict_view, "model", vs->dict, - GTK_SELECTION_MULTIPLE, - var_is_numeric); + "predicate", + var_is_numeric, NULL); { tt_d.list_store = diff --git a/src/ui/gui/t-test.glade b/src/ui/gui/t-test.glade index e355daf4..040a99ea 100644 --- a/src/ui/gui/t-test.glade +++ b/src/ui/gui/t-test.glade @@ -26,7 +26,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -568,7 +568,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -686,7 +686,7 @@ GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/transpose-dialog.c b/src/ui/gui/transpose-dialog.c index 09756d37..0e8a6259 100644 --- a/src/ui/gui/transpose-dialog.c +++ b/src/ui/gui/transpose-dialog.c @@ -94,9 +94,7 @@ transpose_dialog (GObject *o, gpointer data) g_object_get (de->data_editor, "var-store", &vs, NULL); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_MULTIPLE, NULL); + g_object_set (source, "model", vs->dict, NULL); set_dest_model (GTK_TREE_VIEW (dest), vs->dict); diff --git a/src/ui/gui/variable-info-dialog.c b/src/ui/gui/variable-info-dialog.c index 2f5495f1..9cafd9b8 100644 --- a/src/ui/gui/variable-info-dialog.c +++ b/src/ui/gui/variable-info-dialog.c @@ -17,7 +17,6 @@ #include #include -#include "dict-display.h" #include "var-display.h" #include #include @@ -25,6 +24,7 @@ #include "psppire-data-window.h" #include "psppire-dialog.h" #include "psppire-var-store.h" +#include "psppire-dictview.h" #include "helper.h" #include @@ -36,44 +36,17 @@ #define N_(msgid) msgid -static struct variable * -get_selected_variable (GtkTreeView *treeview) -{ - struct variable *var; - GtkTreeModel *top_model; - GtkTreeIter top_iter; - - GtkTreeModel *model; - GtkTreeIter iter; - - GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview); - - if (! gtk_tree_selection_get_selected (selection, - &top_model, &top_iter)) - { - return NULL; - } - - get_base_model (top_model, &top_iter, &model, &iter); - - g_assert (PSPPIRE_IS_DICT (model)); - - gtk_tree_model_get (model, - &iter, DICT_TVM_COL_VAR, &var, -1); - - return var; -} - - static void -populate_text (GtkTreeView *treeview, gpointer data) +populate_text (PsppireDictView *treeview, gpointer data) { gchar *text = 0; GString *gstring; GtkTextBuffer *textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(data)); - const struct variable *var = get_selected_variable (treeview); + const struct variable *var = + psppire_dict_view_get_selected_variable (treeview); + if ( var == NULL) return; @@ -157,7 +130,7 @@ treeview_item_selected (gpointer data) } -static gchar * generate_syntax (GtkTreeView *treeview); +static gchar * generate_syntax (PsppireDictView *treeview); void @@ -167,7 +140,7 @@ variable_info_dialog (GObject *o, gpointer data) gint response ; - GtkBuilder *xml = builder_new ("psppire.ui"); + GtkBuilder *xml = builder_new ("variable-info-dialog.ui"); GtkWidget *dialog = get_widget_assert (xml, "variable-info-dialog"); GtkWidget *treeview = get_widget_assert (xml, "treeview2"); @@ -179,11 +152,10 @@ variable_info_dialog (GObject *o, gpointer data) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de)); - attach_dictionary_to_treeview (GTK_TREE_VIEW (treeview), - vs->dict, - GTK_SELECTION_SINGLE, - NULL ); - + g_object_set (treeview, + "model", vs->dict, + "selection-mode", GTK_SELECTION_SINGLE, + NULL); g_signal_connect (treeview, "cursor-changed", G_CALLBACK (populate_text), textview); @@ -201,18 +173,20 @@ variable_info_dialog (GObject *o, gpointer data) case PSPPIRE_RESPONSE_GOTO: { const struct variable *var = - get_selected_variable (GTK_TREE_VIEW (treeview)); + psppire_dict_view_get_selected_variable (PSPPIRE_DICT_VIEW (treeview)); if ( NULL == var) goto done; - g_object_set (de->data_editor, "current-variable", var_get_dict_index (var), NULL); + g_object_set (de->data_editor, + "current-variable", var_get_dict_index (var), + NULL); } break; case PSPPIRE_RESPONSE_PASTE: { - gchar *syntax = generate_syntax (GTK_TREE_VIEW (treeview)); + gchar *syntax = generate_syntax (PSPPIRE_DICT_VIEW (treeview)); paste_syntax_in_new_window (syntax); g_free (syntax); @@ -227,9 +201,10 @@ variable_info_dialog (GObject *o, gpointer data) } static gchar * -generate_syntax (GtkTreeView *treeview) +generate_syntax (PsppireDictView *treeview) { - const struct variable *var = get_selected_variable (treeview); + const struct variable *var = + psppire_dict_view_get_selected_variable (treeview); if ( NULL == var) return g_strdup (""); diff --git a/src/ui/gui/variable-info-dialog.glade b/src/ui/gui/variable-info-dialog.glade new file mode 100644 index 00000000..1acb84ea --- /dev/null +++ b/src/ui/gui/variable-info-dialog.glade @@ -0,0 +1,107 @@ + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Variables + True + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + True + True + + + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + Variable Information: + + + False + False + 5 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + 200 + True + GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + GTK_WRAP_WORD_CHAR + 3 + False + False + + + + + 5 + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + True + PSPPIRE_BUTTON_GOTO_MASK | PSPPIRE_BUTTON_CANCEL_MASK | PSPPIRE_BUTTON_HELP_MASK | PSPPIRE_BUTTON_PASTE_MASK + + + False + False + GTK_PACK_END + 1 + + + + + True + True + + + + + + diff --git a/src/ui/gui/weight-cases-dialog.c b/src/ui/gui/weight-cases-dialog.c index a464646f..8cfae24b 100644 --- a/src/ui/gui/weight-cases-dialog.c +++ b/src/ui/gui/weight-cases-dialog.c @@ -130,11 +130,10 @@ weight_cases_dialog (GObject *o, gpointer data) g_signal_connect (selector, "de-selected", G_CALLBACK (on_deselect), radiobutton1); - attach_dictionary_to_treeview (GTK_TREE_VIEW (source), - vs->dict, - GTK_SELECTION_SINGLE, - var_is_numeric - ); + g_object_set (source, "model", vs->dict, + "selection-mode", GTK_SELECTION_SINGLE, + "predicate", var_is_numeric, + NULL); psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector), source, diff --git a/src/ui/gui/widgets.c b/src/ui/gui/widgets.c index 843f1f3c..979224fe 100644 --- a/src/ui/gui/widgets.c +++ b/src/ui/gui/widgets.c @@ -1,11 +1,15 @@ +#include + #include "widgets.h" + #include "psppire-dialog.h" #include "psppire-selector.h" #include "psppire-vbuttonbox.h" #include "psppire-hbuttonbox.h" #include "psppire-keypad.h" #include "psppire-acr.h" +#include "psppire-dictview.h" /* Any custom widgets which are to be used in GtkBuilder ui files @@ -20,4 +24,5 @@ preregister_widgets (void) psppire_hbutton_box_get_type (); psppire_keypad_get_type (); psppire_acr_get_type (); + psppire_dict_view_get_type (); }