New object PsppireDictView
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 17 Mar 2009 10:11:20 +0000 (19:11 +0900)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 17 Mar 2009 10:11:20 +0000 (19:11 +0900)
Created a new object PsppireDictView, which derives
from GtkTreeView for the purpose of displaying a
dictionary.  Replaces much of the functionality in
dict-display.c

36 files changed:
src/ui/gui/automake.mk
src/ui/gui/compute-dialog.c
src/ui/gui/crosstabs-dialog.c
src/ui/gui/crosstabs.glade
src/ui/gui/descriptives-dialog.c
src/ui/gui/descriptives-dialog.glade
src/ui/gui/dict-display.c
src/ui/gui/dict-display.h
src/ui/gui/examine-dialog.c
src/ui/gui/examine.glade
src/ui/gui/find-dialog.c
src/ui/gui/frequencies-dialog.c
src/ui/gui/frequencies.glade
src/ui/gui/oneway-anova-dialog.c
src/ui/gui/oneway.glade
src/ui/gui/psppire-dictview.c [new file with mode: 0644]
src/ui/gui/psppire-dictview.h [new file with mode: 0644]
src/ui/gui/psppire.glade
src/ui/gui/rank-dialog.c
src/ui/gui/rank.glade
src/ui/gui/recode-dialog.c
src/ui/gui/recode.glade
src/ui/gui/regression-dialog.c
src/ui/gui/regression.glade
src/ui/gui/select-cases-dialog.c
src/ui/gui/sort-cases-dialog.c
src/ui/gui/split-file-dialog.c
src/ui/gui/t-test-independent-samples-dialog.c
src/ui/gui/t-test-one-sample.c
src/ui/gui/t-test-paired-samples.c
src/ui/gui/t-test.glade
src/ui/gui/transpose-dialog.c
src/ui/gui/variable-info-dialog.c
src/ui/gui/variable-info-dialog.glade
src/ui/gui/weight-cases-dialog.c
src/ui/gui/widgets.c

index e104b275e45e2705258d55544b203388d5dda2f0..1a2b4af13113f08098b3be0a585e6444999dc1a7 100644 (file)
@@ -119,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 \
@@ -153,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 \
index 7269ab79750e76c3ed2cf5c7431045d5506545c3..ba5871a822f8c986ce9dc0cc224ab4bdb69ec1c4 100644 (file)
@@ -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,
index 188c4aaa92c66c339c829bef59df4748f6e23516..3d5c5718fc6477172023666d761620760ec173ab 100644 (file)
@@ -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);
index d5907a552946866010a334c13da5175148b0e65a..0409d9e512459125aa878386099f18c1202bafc8 100644 (file)
                 <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>
index e3a6d505115c25ad4b85b7bc259ca7fb88e450e3..77bf95410870fa9deaa00ef98e7cb5c60b53c1b1 100644 (file)
@@ -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);
 
index 6ce00df808567786c552a68809a73381a1dad7e3..3fa67a55a8aa4c7baa1e80a0f88574b4caac9e54 100644 (file)
@@ -29,7 +29,7 @@
                     <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>
index 023b063f5cbf769a008df7b71c247dea1559ad0b..2123c3c5cfe7b300b6c2bcaca241f5ae95d5636d 100644 (file)
 #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,189 +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 (
-                                    "<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
@@ -394,3 +150,4 @@ is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
 }
 
 
+
index a9481c6d85534439490d672accbf7d1a56f06f46..2c8df4407655e7d48cd4aedca7bd880d3130227a 100644 (file)
 #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 */
@@ -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
-                    );
index 171d88cfc2f9f6def60a12b6fee571f22825bbce..2902685d395f45ac932a88251f0dc3a30ab5d579 100644 (file)
@@ -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;
index 884e00017da775bbd5a1c4c9b969fb8b91d80f75..a6f7ca8a7d57c96156ae7ac97c87d0abcd2c2c76 100644 (file)
                     <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>
index 130b25cfafe54db8f73eca358dada6da80f77b41..60d54e2679cb37d55c67c38f3c3b209fa1d1dedc 100644 (file)
@@ -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,
index 37e301b88babb099490ed752a075e5e7f44da9f5..a368cabb2a8d622efec471220fb279c59e565890 100644 (file)
@@ -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);
 
index 5617d40d2c3e2cce6be7219fef1068046827a713..3e5e921349e937fae732c330a96239affe5f9269 100644 (file)
@@ -29,7 +29,7 @@
                     <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>
index d41b2760aa97630510ca82315ae96c1b1eb1f87c..a2b47fa5e5d33884c8ce201f3f58f86313512b44 100644 (file)
@@ -170,9 +170,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);
 
index bdca13ddb54e8dec747bf3d4f70c464520518fb2..4b12f68b9b050e31e64591560c8c0843c912452c 100644 (file)
                 <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>
diff --git a/src/ui/gui/psppire-dictview.c b/src/ui/gui/psppire-dictview.c
new file mode 100644 (file)
index 0000000..d955fae
--- /dev/null
@@ -0,0 +1,509 @@
+/* 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;
+}
+
+
diff --git a/src/ui/gui/psppire-dictview.h b/src/ui/gui/psppire-dictview.h
new file mode 100644 (file)
index 0000000..98000ff
--- /dev/null
@@ -0,0 +1,66 @@
+/* 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__ */
index 8be27e381f54e28ba0ec49ca9c159aa8a0aa4538..ad08cb2b13a3e30543582e02eb9ebe1349816791 100644 (file)
@@ -47,7 +47,7 @@
                 <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>
index 8ea25a1d9e8e5f9f93f39619ad39f37409bdce84..606475bac5d12bfdbe5701f878b4c0a1bb5f68f6 100644 (file)
@@ -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);
 
index 6f65542f404d3388ce482f8dd3ceb30a46a03fc1..fd412dfeb5fcdad9a559f003bb8cbfc02b3b5c1a 100644 (file)
@@ -32,7 +32,7 @@
                     <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>
index 859737f63e7d4d7895c1347f2a585c60d28cb5ab..e5de4597cb011b0dc67999d9342eef487850938b 100644 (file)
@@ -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 )
     {
index a3b795e6960842c92ed8d5c126669332ad4eed70..6edcc0ab719f22c9ac753d72f89de85f3c3cc924 100644 (file)
             <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>
index 2d8aca3ebc6a5d074e3a329211d25c530df83f2e..a860501805b391af6a5fbd35f684dfa55fc5aa10 100644 (file)
@@ -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);
index 3ee4973b32418352015bac1c68a801931d44c8f5..e6bac4d8e8979e4157743ec538c18d37e2334161 100644 (file)
@@ -95,7 +95,7 @@
                 <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>
index e4d599edc8124480e2b51afb45ef1a25e44e7ca4..9d72344f5ba77041d0a055f95213530660f0d1f0 100644 (file)
@@ -324,9 +324,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,
index d9c665e69a8db988df983919d7ea6d651cc9c9ea..44792432bc7afa2abea97aeea8611b41e15cc758 100644 (file)
@@ -110,9 +110,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);
 
index 8708b33f05df2d5613cc0b514d4cf0150e055156..1641b50c2df701a08dbc9a0bb477e8634ad0eef3 100644 (file)
@@ -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);
index 392867adbb606acd5c62abad6ce6a58286807f13..53b2c20c430291bf3792d65d30468bbaa89871d1 100644 (file)
@@ -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);
 
index 3cdc91c32721f4780684f2966c5b896ecaae6ef3..64232d85754429e4117e8eb02228d54f83836407 100644 (file)
@@ -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);
 
index ca1d776a7294f6bed0b91060e4be8f7878ef4b2c..50964b6e06ef7a85500a444f3ae53ad770c7fd08 100644 (file)
@@ -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 =
index e355daf442b655be6422835c2022ff7bcacb2070..040a99ea432721dd17e7e43354536b5adb3994c5 100644 (file)
@@ -26,7 +26,7 @@
                 <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>
index 09756d3738919bc40f2f314b3d4d924a7a287499..0e8a6259ddb365cfe13c53d35c068aa0fd69ebb6 100644 (file)
@@ -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);
 
index 6fc8dd89221759c9d24f1050d2fd8ab6384e9ebd..0b40a8f1b00ba75e7ead2d09403f354e9c870a7b 100644 (file)
@@ -17,7 +17,7 @@
 #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>
@@ -25,6 +25,7 @@
 #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;
 
@@ -157,7 +131,7 @@ treeview_item_selected (gpointer data)
 }
 
 
-static gchar * generate_syntax (GtkTreeView *treeview);
+static gchar * generate_syntax (PsppireDictView *treeview);
 
 
 void
@@ -179,11 +153,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 +174,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 +202,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 ("");
index 147d66a26f1e394ec56798ee955fd5bca69f6f37..1acb84ea59a59637a69ae680fa43e1e915775515 100644 (file)
@@ -21,7 +21,7 @@
             <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>
index a464646fe7742eeacf0c0ece78467710c0ad5de8..8cfae24b74bded8b517a85784c3214bab3852d36 100644 (file)
@@ -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,
index 843f1f3c414023eb4096f0e2e603e2661e84d9ff..979224fe4152331227d6597cf3259e08fb996cb5 100644 (file)
@@ -1,11 +1,15 @@
+#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
@@ -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 ();
 }