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 \
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 \
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,
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);
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="dict-treeview">
+ <widget class="PsppireDictView" id="dict-treeview">
<property name="visible">True</property>
<property name="headers_visible">False</property>
</widget>
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);
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="all-variables">
+ <widget class="PsppireDictView" id="all-variables">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
#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
)
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 (
- "<span stretch=\"condensed\">%s</span>",
- 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);
-
- g_signal_connect (treeview, "query-tooltip", G_CALLBACK (set_tooltip_for_variable), NULL);
-}
void
}
+
#include <gtk/gtk.h>
#include "psppire-selector.h"
-#include "psppire-dict.h"
-#include <data/variable.h>
-
-/* 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 */
PsppireSelector *selector);
-void get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
- GtkTreeModel **model, GtkTreeIter *iter
- );
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;
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="treeview1">
+ <widget class="PsppireDictView" id="treeview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
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,
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);
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="dict-treeview">
+ <widget class="PsppireDictView" id="dict-treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
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);
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="oneway-anova-treeview1">
+ <widget class="PsppireDictView" id="oneway-anova-treeview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
--- /dev/null
+/* 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 <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <gtk/gtktreeview.h>
+#include "psppire-dictview.h"
+#include "psppire-dict.h"
+#include "psppire-conf.h"
+#include <data/format.h>
+#include "helper.h"
+
+#include <gettext.h>
+#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)
+{
+}
+
+/* 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"),
+ G_TYPE_PSPPIRE_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)
+{
+ 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);
+
+ 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) && prefer_labels)
+ {
+ gchar *text = g_strdup_printf (
+ "<span stretch=\"condensed\">%s</span>",
+ 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 ;
+ 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;
+}
+
+
+static void
+psppire_dict_view_init (PsppireDictView *dict_view)
+{
+ GtkTreeViewColumn *col;
+
+ GtkCellRenderer *renderer;
+
+ 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 (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);
+}
+
+
+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;
+}
+
+
--- /dev/null
+/* 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 <http://www.gnu.org/licenses/>. */
+
+
+#ifndef __PSPPIRE_DICT_VIEW_H__
+#define __PSPPIRE_DICT_VIEW_H__
+
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtktreeview.h>
+
+#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;
+};
+
+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__ */
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="weight-cases-treeview">
+ <widget class="PsppireDictView" id="weight-cases-treeview">
<property name="visible">True</property>
<property name="headers_visible">False</property>
<property name="fixed_height_mode">True</property>
<property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
- <widget class="GtkTreeView" id="source-treeview">
+ <widget class="PsppireDictView" id="source-treeview">
<property name="visible">True</property>
<property name="headers_visible">False</property>
</widget>
<property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
- <widget class="GtkTreeView" id="split-file-dict-treeview">
+ <widget class="PsppireDictView" id="split-file-dict-treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="sort-cases-treeview1">
+ <widget class="PsppireDictView" id="sort-cases-treeview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<child>
- <widget class="GtkTreeView" id="compute-treeview1">
+ <widget class="PsppireDictView" id="compute-treeview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<child>
- <widget class="GtkTreeView" id="select-cases-treeview">
+ <widget class="PsppireDictView" id="select-cases-treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
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);
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="dict-treeview">
+ <widget class="PsppireDictView" id="dict-treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
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 )
{
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="treeview1">
+ <widget class="PsppireDictView" id="treeview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
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);
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="dict-view">
+ <widget class="PsppireDictView" id="dict-view">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
{
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,
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);
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);
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);
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);
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 =
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="indep-samples-t-test-treeview1">
+ <widget class="PsppireDictView" id="indep-samples-t-test-treeview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="one-sample-t-test-treeview2">
+ <widget class="PsppireDictView" id="one-sample-t-test-treeview2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
<child>
- <widget class="GtkTreeView" id="paired-samples-t-test-treeview1">
+ <widget class="PsppireDictView" id="paired-samples-t-test-treeview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
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);
#include <config.h>
#include <gtk/gtk.h>
-#include "dict-display.h"
+//#include "dict-display.h"
#include "var-display.h"
#include <data/variable.h>
#include <data/format.h>
#include "psppire-data-window.h"
#include "psppire-dialog.h"
#include "psppire-var-store.h"
+#include "psppire-dictview.h"
#include "helper.h"
#include <language/syntax-string-source.h>
#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;
}
-static gchar * generate_syntax (GtkTreeView *treeview);
+static gchar * generate_syntax (PsppireDictView *treeview);
void
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);
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);
}
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 ("");
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<child>
- <widget class="GtkTreeView" id="treeview2">
+ <widget class="PsppireDictView" id="treeview2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
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,
+#include <config.h>
+
#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
psppire_hbutton_box_get_type ();
psppire_keypad_get_type ();
psppire_acr_get_type ();
+ psppire_dict_view_get_type ();
}