Merge branch 'master' of ssh://jmd@git.sv.gnu.org/srv/git/pspp
authorJohn Darrington <john@darrington.wattle.id.au>
Sun, 13 Dec 2009 19:39:35 +0000 (20:39 +0100)
committerJohn Darrington <john@darrington.wattle.id.au>
Sun, 13 Dec 2009 19:39:35 +0000 (20:39 +0100)
54 files changed:
glade/automake.mk
glade/psppire.xml
glade/var-view.c [new file with mode: 0644]
src/ui/gui/automake.mk
src/ui/gui/compute-dialog.c
src/ui/gui/crosstabs-dialog.c
src/ui/gui/crosstabs.ui
src/ui/gui/data-editor.glade
src/ui/gui/descriptives-dialog.c
src/ui/gui/descriptives.ui
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/examine-dialog.c
src/ui/gui/examine.ui
src/ui/gui/find-dialog.c
src/ui/gui/find.ui
src/ui/gui/frequencies-dialog.c
src/ui/gui/frequencies.ui
src/ui/gui/oneway-anova-dialog.c
src/ui/gui/oneway.ui
src/ui/gui/psppire-data-window.c
src/ui/gui/psppire-dict.c
src/ui/gui/psppire-dictview.c
src/ui/gui/psppire-selector.c
src/ui/gui/psppire-selector.h
src/ui/gui/psppire-var-view.c [new file with mode: 0644]
src/ui/gui/psppire-var-view.h [new file with mode: 0644]
src/ui/gui/psppire.c
src/ui/gui/psppire.ui
src/ui/gui/rank-dialog.c
src/ui/gui/rank.ui
src/ui/gui/recode-dialog.c
src/ui/gui/recode.ui
src/ui/gui/regression-dialog.c
src/ui/gui/regression.ui
src/ui/gui/reliability-dialog.c
src/ui/gui/reliability.ui
src/ui/gui/roc-dialog.c [new file with mode: 0644]
src/ui/gui/roc-dialog.h [new file with mode: 0644]
src/ui/gui/roc.ui [new file with mode: 0644]
src/ui/gui/select-cases-dialog.c
src/ui/gui/sort-cases-dialog.c
src/ui/gui/sort.ui
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.ui
src/ui/gui/transpose-dialog.c
src/ui/gui/variable-info-dialog.c
src/ui/gui/weight-cases-dialog.c
src/ui/gui/widgets.c

index 8e51e1f720244b9e96c4eca5233f5aadf29f11a1..bb16288620d848e3bdeecba69e4e630bca182029 100644 (file)
@@ -15,6 +15,7 @@ libglade_psppire_la_SOURCES = \
        glade/selector.c \
        glade/acr.c \
        glade/dictview.c \
+       glade/var-view.c \
        src/ui/gui/psppire-conf.c \
        src/ui/gui/psppire-acr.c \
        src/ui/gui/psppire-buttonbox.c \
@@ -23,7 +24,8 @@ libglade_psppire_la_SOURCES = \
        src/ui/gui/psppire-dialog.c \
        src/ui/gui/psppire-keypad.c \
        src/ui/gui/psppire-dictview.c \
-       src/ui/gui/psppire-selector.c
+       src/ui/gui/psppire-selector.c \
+       src/ui/gui/psppire-var-view.c
 
 dist_catalog_DATA = \
        glade/psppire.xml
index 50a0366186ea4da876516362fec16840196e5e63..db8956b70ac7880d179d1a706911c69c6552938b 100644 (file)
          </displayable-values>
        </property>
 
-
-       <property id="visible" ignore="True" default="True" />
+       <property id="source-widget"     ignore="True" />
+       <property id="dest-widget"       ignore="True" />
+       <property id="visible"           ignore="True" default="True" />
+       <property id="primary"           default="False" />
      </properties>
 
     </glade-widget-class>
       <property id="child"                disabled="True" />
       <property id="homogeneous"          disabled="True" />
       <property id="visible" ignore="True" default="True" />
+      <property id="model"                visible="False"  query="False" />
+    </properties>
+
+    </glade-widget-class>
+
+
+    <glade-widget-class name="PsppireVarView" generic-name="psppire-var-view" title="Variable Treeview">
+
+      <post-create-function>glade_psppire_var_view_post_create</post-create-function>
+      <get-children-function>glade_psppire_var_view_get_children</get-children-function>
+      <get-internal-child-function>glade_psppire_var_view_get_internal_child</get-internal-child-function>
+
+
+    <properties>
+      <property id="child"                disabled="True" />
+      <property id="homogeneous"          disabled="True" />
+      <property id="visible" ignore="True" default="True" />
+      <property id="model"                visible="False"  query="False" disabled="True" />
+      <property id="n-cols"    ignore="True" />
+
     </properties>
 
     </glade-widget-class>
 
 
   </glade-widget-classes>
+
  
 
  <glade-widget-group name="psppire" title="Psppire">
   <glade-widget-class-ref name="PsppireHButtonBox"/>
   <glade-widget-class-ref name="PsppireVButtonBox"/>
   <glade-widget-class-ref name="PsppireDictView"/>
+  <glade-widget-class-ref name="PsppireVarView"/>
   <glade-widget-class-ref name="PsppireSelector"/>
   <glade-widget-class-ref name="PsppireKeypad"/>
   <glade-widget-class-ref name="PsppireAcr"/>
diff --git a/glade/var-view.c b/glade/var-view.c
new file mode 100644 (file)
index 0000000..7eb6c62
--- /dev/null
@@ -0,0 +1,83 @@
+#include <config.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include "psppire-var-view.h"
+
+#include <gladeui/glade.h>
+
+
+/* Dummy function to keep the linker happy.
+   Glade never actually needs to use this return value.
+ */
+GType
+psppire_var_ptr_get_type (void)
+{
+  return 0;
+}
+
+void
+glade_psppire_var_view_post_create (GladeWidgetAdaptor *adaptor,
+                                   GObject            *object,
+                                   GladeCreateReason   reason)
+{
+  GladeWidget *widget ;
+
+  PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
+
+  g_return_if_fail (PSPPIRE_IS_VAR_VIEW (var_view));
+
+  widget = glade_widget_get_from_gobject (GTK_WIDGET (var_view));
+  if (!widget)
+    return;
+
+  if (reason == GLADE_CREATE_USER)
+    {
+      /* HIG complient border-width defaults on var_views */
+      glade_widget_property_set (widget, "border-width", 5);
+    }
+}
+
+
+GtkWidget *
+glade_psppire_var_view_get_internal_child (GladeWidgetAdaptor  *adaptor,
+                                        PsppireVarView       *var_view,
+                                        const gchar         *name)
+{
+#if DEBUGGING
+  g_print ("%s\n", __FUNCTION__);
+#endif
+  return GTK_WIDGET (var_view);
+}
+
+
+
+void
+glade_psppire_var_view_set_property (GladeWidgetAdaptor *adaptor,
+                                    GObject            *object,
+                                    const gchar        *id,
+                                    const GValue       *value)
+{
+#if DEBUGGING
+  g_print ("%s(%p) Type=\"%s\" Id=\"%s\"\n", __FUNCTION__, object,
+          G_OBJECT_TYPE_NAME( object ),
+          id);
+#endif
+
+  GWA_GET_CLASS (GTK_TYPE_WINDOW)->set_property (adaptor, object,
+                                                id, value);
+}
+
+
+GList *
+glade_psppire_var_view_get_children (GladeWidgetAdaptor  *adaptor,
+                                    PsppireVarView  *dv)
+{
+  GList *list = NULL;
+
+  g_return_val_if_fail (PSPPIRE_IS_VAR_VIEW (dv), NULL);
+
+  list = glade_util_container_get_all_children (GTK_CONTAINER (dv));
+
+  return list;
+}
index aaaa05b6d70051545a8725999fcbe53903dd5965..22e2350b5156cfd02d2e198abdde130dd5d9175a 100644 (file)
@@ -67,6 +67,7 @@ UI_FILES = \
        src/ui/gui/recode.ui \
        src/ui/gui/regression.ui \
        src/ui/gui/reliability.ui \
+       src/ui/gui/roc.ui \
        src/ui/gui/t-test.ui \
        src/ui/gui/text-data-import.ui \
        src/ui/gui/var-sheet-dialogs.ui \
@@ -163,6 +164,8 @@ src_ui_gui_psppire_SOURCES = \
        src/ui/gui/psppire-keypad.h \
        src/ui/gui/psppire-output-window.c \
        src/ui/gui/psppire-output-window.h \
+       src/ui/gui/psppire-var-view.c \
+       src/ui/gui/psppire-var-view.h \
        src/ui/gui/psppire-selector.h \
        src/ui/gui/psppire-syntax-window.c \
        src/ui/gui/psppire-syntax-window.h \
@@ -185,6 +188,8 @@ src_ui_gui_psppire_SOURCES = \
        src/ui/gui/regression-dialog.h \
        src/ui/gui/reliability-dialog.c \
        src/ui/gui/reliability-dialog.h \
+       src/ui/gui/roc-dialog.c \
+       src/ui/gui/roc-dialog.h \
        src/ui/gui/select-cases-dialog.c \
        src/ui/gui/select-cases-dialog.h \
        src/ui/gui/sort-cases-dialog.c \
index c09c7571936fa4e4ca493bd0647b2586629caa6d..8a98bb3dcac48d8158812d5f9b96bb7c4df6b687 100644 (file)
@@ -379,7 +379,6 @@ compute_dialog (GObject *o, gpointer data)
   GtkWidget *functions = get_widget_assert (xml, "compute-treeview2");
   GtkWidget *keypad    = get_widget_assert (xml, "psppire-keypad1");
   GtkWidget *target    = get_widget_assert (xml, "compute-entry1");
-  GtkWidget *syntax_area = get_widget_assert (xml, "compute-textview1");
   GtkWidget *var_selector = get_widget_assert (xml, "compute-selector1");
   GtkWidget *func_selector = get_widget_assert (xml, "compute-selector2");
   GtkWidget *type_and_label = get_widget_assert (xml, "compute-button1");
@@ -398,25 +397,17 @@ compute_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
   
-  g_object_set (dict_view, "dictionary", scd.dict,
+  g_object_set (dict_view, "model", scd.dict,
                "selection-mode", GTK_SELECTION_SINGLE,
                NULL);
 
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (var_selector),
-                                dict_view, syntax_area,
-                                insert_source_row_into_text_view,
-                                NULL,
-                                NULL);
-
+  psppire_selector_set_select_func (PSPPIRE_SELECTOR (var_selector),
+                                   insert_source_row_into_text_view, NULL);
 
   function_list_populate (GTK_TREE_VIEW (functions));
 
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (func_selector),
-                                functions, syntax_area,
-                                insert_function_into_syntax_area,
-                                NULL,
-                                NULL);
-
+  psppire_selector_set_select_func (PSPPIRE_SELECTOR (func_selector),
+                                   insert_function_into_syntax_area, NULL);
 
   scd.xml = xml;
 
index 019d8c361dffe49c35b58b2f2799f701abd392b8..2b93a77b657afdfd2cdbb78657669c56ae11bb7b 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "checkbox-treeview.h"
 #include "crosstabs-dialog.h"
+#include "psppire-var-view.h"
 
 #include <gtk/gtk.h>
 #include <stdlib.h>
@@ -259,9 +260,9 @@ generate_syntax (const struct crosstabs_dialog *cd)
   GString *string = g_string_new ("CROSSTABS");
 
   g_string_append (string, "\n\t/TABLES=");
-  append_variable_names (string, cd->dict, GTK_TREE_VIEW (cd->row_vars), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (cd->row_vars), 0, string);
   g_string_append (string, "\tBY\t");
-  append_variable_names (string, cd->dict, GTK_TREE_VIEW (cd->col_vars), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (cd->col_vars), 0, string);
 
   g_string_append (string, "\n\t/FORMAT=");
 
@@ -398,8 +399,6 @@ crosstabs_dialog (GObject *o, gpointer data)
   GtkWidget *source = get_widget_assert   (xml, "dict-treeview");
   GtkWidget *dest_rows =   get_widget_assert   (xml, "rows");
   GtkWidget *dest_cols =   get_widget_assert   (xml, "cols");
-  GtkWidget *row_selector = get_widget_assert (xml, "row-selector");
-  GtkWidget *col_selector = get_widget_assert (xml, "col-selector");
   GtkWidget *format_button = get_widget_assert (xml, "format-button");
   GtkWidget *stat_button = get_widget_assert (xml, "stats-button");
   GtkWidget *cell_button = get_widget_assert (xml, "cell-button");
@@ -424,24 +423,7 @@ crosstabs_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
   g_object_get (vs, "dictionary", &dict, NULL);
-  g_object_set (source, "dictionary", dict, NULL);
-
-  set_dest_model (GTK_TREE_VIEW (dest_rows), dict);
-  set_dest_model (GTK_TREE_VIEW (dest_cols), dict);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (row_selector),
-                                source,
-                                dest_rows,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (col_selector),
-                                source,
-                                dest_cols,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
+  g_object_set (source, "model", dict, NULL);
 
   cd.row_vars = GTK_TREE_VIEW (dest_rows);
   cd.col_vars = GTK_TREE_VIEW (dest_cols);
index c556c47816b147dc4de5c062a24add6676a7f01f..e21ae808e102e1b6917be548718afec3a3408d4d 100644 (file)
@@ -34,7 +34,7 @@
                         <property name="vscrollbar_policy">automatic</property>
                         <property name="shadow_type">etched-in</property>
                         <child>
-                          <object class="GtkTreeView" id="rows">
+                          <object class="PsppireVarView" id="rows">
                             <property name="visible">True</property>
                             <property name="headers_visible">False</property>
                           </object>
@@ -73,7 +73,7 @@
                         <property name="vscrollbar_policy">automatic</property>
                         <property name="shadow_type">etched-in</property>
                         <child>
-                          <object class="GtkTreeView" id="cols">
+                          <object class="PsppireVarView" id="cols">
                             <property name="visible">True</property>
                             <property name="headers_visible">False</property>
                           </object>
                 <property name="receives_default">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="border_width">5</property>
+                <property name="source_widget">dict-treeview</property>
+                <property name="dest_widget">rows</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
                 <property name="receives_default">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="border_width">5</property>
+                <property name="source_widget">dict-treeview</property>
+                <property name="dest_widget">cols</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
index 06776248738df3cbea663edeca39e2934b910037..ca7efc90aff231c0f970f1f71a37352e2b1b1386 100644 (file)
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--*- mode: xml -*-->
+<?xml version="1.0"?>
 <glade-interface>
+  <!-- interface-requires gtk+ 2.6 -->
+  <!-- interface-naming-policy toplevel-contextual -->
   <widget class="GtkMenuBar" id="menubar">
     <property name="visible">True</property>
     <child>
@@ -13,8 +13,8 @@
           <widget class="GtkMenu" id="menuitem1_menu">
             <child>
               <widget class="GtkImageMenuItem" id="new1">
-                <property name="visible">True</property>
                 <property name="label">gtk-new</property>
+                <property name="visible">True</property>
                 <property name="use_underline">True</property>
                 <property name="use_stock">True</property>
                 <child>
@@ -39,8 +39,8 @@
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="open1">
-                <property name="visible">True</property>
                 <property name="label">gtk-open</property>
+                <property name="visible">True</property>
                 <property name="use_underline">True</property>
                 <property name="use_stock">True</property>
                 <child>
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="file_save">
-                <property name="visible">True</property>
                 <property name="label">gtk-save</property>
+                <property name="visible">True</property>
                 <property name="use_underline">True</property>
                 <property name="use_stock">True</property>
               </widget>
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="file_save_as">
-                <property name="visible">True</property>
                 <property name="label">gtk-save-as</property>
+                <property name="visible">True</property>
                 <property name="use_underline">True</property>
                 <property name="use_stock">True</property>
               </widget>
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="file_quit">
-                <property name="visible">True</property>
                 <property name="label">gtk-quit</property>
+                <property name="visible">True</property>
                 <property name="use_underline">True</property>
                 <property name="use_stock">True</property>
               </widget>
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="edit_goto-case">
+                <property name="label">Go To Case</property>
                 <property name="visible">True</property>
                 <property name="sensitive">False</property>
-                <property name="label" translatable="yes">Go To Case</property>
                 <property name="use_underline">True</property>
+                <property name="use_stock">True</property>
               </widget>
             </child>
             <child>
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="edit_cut">
+                <property name="label">gtk-cut</property>
                 <property name="visible">True</property>
                 <property name="sensitive">False</property>
-                <property name="label">gtk-cut</property>
                 <property name="use_underline">True</property>
                 <property name="use_stock">True</property>
               </widget>
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="edit_copy">
+                <property name="label">gtk-copy</property>
                 <property name="visible">True</property>
                 <property name="sensitive">False</property>
-                <property name="label">gtk-copy</property>
                 <property name="use_underline">True</property>
                 <property name="use_stock">True</property>
               </widget>
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="edit_paste">
+                <property name="label">gtk-paste</property>
                 <property name="visible">True</property>
                 <property name="sensitive">False</property>
-                <property name="label">gtk-paste</property>
                 <property name="use_underline">True</property>
                 <property name="use_stock">True</property>
               </widget>
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="edit_find">
+                <property name="label">gtk-find</property>
                 <property name="visible">True</property>
                 <property name="sensitive">False</property>
-                <property name="label" translatable="yes">gtk-find</property>
                 <property name="use_underline">True</property>
                 <property name="use_stock">True</property>
               </widget>
           <widget class="GtkMenu" id="data_menu">
             <child>
               <widget class="GtkImageMenuItem" id="data_sort-cases">
+                <property name="label">_Sort Cases</property>
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">_Sort Cases</property>
                 <property name="use_underline">True</property>
-                <child internal-child="image">
-                  <widget class="GtkImage" id="menu-item-image1">
-                    <property name="visible">True</property>
-                    <property name="stock">gtk-sort-ascending</property>
-                  </widget>
-                </child>
+                <property name="use_stock">True</property>
               </widget>
             </child>
             <child>
                 <property name="sensitive">False</property>
                 <property name="label" translatable="yes">_Run Pending Transforms</property>
                 <property name="use_underline">True</property>
-                <accelerator key="G" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+                <accelerator key="G" signal="activate" modifiers="GDK_CONTROL_MASK"/>
               </widget>
             </child>
           </widget>
                 </child>
               </widget>
             </child>
+            <child>
+              <widget class="GtkMenuItem" id="roc-curve">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">ROC Cur_ve...</property>
+                <property name="use_underline">True</property>
+              </widget>
+            </child>
           </widget>
         </child>
       </widget>
           <widget class="GtkMenu" id="menuitem5_menu">
             <child>
               <widget class="GtkImageMenuItem" id="help_reference">
+                <property name="label">_Reference Manual</property>
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">_Reference Manual</property>
                 <property name="use_underline">True</property>
-                <child internal-child="image">
-                  <widget class="GtkImage" id="menu-item-image2">
-                    <property name="visible">True</property>
-                    <property name="stock">gtk-help</property>
-                  </widget>
-                </child>
+                <property name="use_stock">True</property>
               </widget>
             </child>
             <child>
               <widget class="GtkImageMenuItem" id="help_about">
+                <property name="label">_About</property>
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">_About</property>
                 <property name="use_underline">True</property>
-                <child internal-child="image">
-                  <widget class="GtkImage" id="menu-item-image3">
-                    <property name="visible">True</property>
-                    <property name="stock">gtk-about</property>
-                  </widget>
-                </child>
+                <property name="use_stock">True</property>
               </widget>
             </child>
           </widget>
   </widget>
   <widget class="GtkHandleBox" id="handlebox1">
     <property name="visible">True</property>
-    <property name="shadow_type">GTK_SHADOW_OUT</property>
     <child>
       <widget class="GtkToolbar" id="toolbar1">
         <property name="visible">True</property>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
-          <widget class="GtkSeparatorToolItem" id="separatortoolitem1">
-          </widget>
+          <widget class="GtkSeparatorToolItem" id="separatortoolitem1"/>
           <packing>
             <property name="expand">False</property>
-            <property name="homogeneous">False</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="homogeneous">False</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="homogeneous">False</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="homogeneous">False</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="homogeneous">False</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="homogeneous">False</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
         <child>
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="homogeneous">True</property>
           </packing>
         </child>
       </widget>
       <widget class="GtkFrame" id="frame2">
         <property name="visible">True</property>
         <property name="label_xalign">0</property>
-        <property name="shadow_type">GTK_SHADOW_IN</property>
+        <property name="shadow_type">in</property>
         <child>
           <widget class="GtkEventBox" id="eventbox1">
             <property name="visible">True</property>
           </widget>
         </child>
       </widget>
+      <packing>
+        <property name="position">0</property>
+      </packing>
     </child>
     <child>
       <widget class="GtkFrame" id="frame3">
         <property name="visible">True</property>
         <property name="label_xalign">0</property>
-        <property name="shadow_type">GTK_SHADOW_IN</property>
+        <property name="shadow_type">in</property>
         <child>
           <widget class="GtkEventBox" id="eventbox2">
             <property name="visible">True</property>
       <widget class="GtkFrame" id="frame5">
         <property name="visible">True</property>
         <property name="label_xalign">0</property>
-        <property name="shadow_type">GTK_SHADOW_IN</property>
+        <property name="shadow_type">in</property>
         <child>
           <widget class="GtkEventBox" id="eventbox4">
             <property name="visible">True</property>
       <widget class="GtkFrame" id="frame6">
         <property name="visible">True</property>
         <property name="label_xalign">0</property>
-        <property name="shadow_type">GTK_SHADOW_IN</property>
+        <property name="shadow_type">in</property>
         <child>
           <widget class="GtkEventBox" id="eventbox5">
             <property name="visible">True</property>
             <child>
               <widget class="GtkLabel" id="filter-use-status-area">
                 <property name="visible">True</property>
-                <property name="ellipsize">PANGO_ELLIPSIZE_START</property>
+                <property name="ellipsize">start</property>
                 <property name="width_chars">10</property>
                 <property name="single_line_mode">True</property>
               </widget>
       <widget class="GtkFrame" id="frame7">
         <property name="visible">True</property>
         <property name="label_xalign">0</property>
-        <property name="shadow_type">GTK_SHADOW_IN</property>
+        <property name="shadow_type">in</property>
         <child>
           <widget class="GtkEventBox" id="eventbox6">
             <property name="visible">True</property>
             <child>
               <widget class="GtkLabel" id="weight-status-area">
                 <property name="visible">True</property>
-                <property name="ellipsize">PANGO_ELLIPSIZE_START</property>
+                <property name="ellipsize">start</property>
                 <property name="width_chars">15</property>
                 <property name="single_line_mode">True</property>
               </widget>
       <widget class="GtkFrame" id="frame8">
         <property name="visible">True</property>
         <property name="label_xalign">0</property>
-        <property name="shadow_type">GTK_SHADOW_IN</property>
+        <property name="shadow_type">in</property>
         <child>
           <widget class="GtkEventBox" id="eventbox7">
             <property name="visible">True</property>
             <child>
               <widget class="GtkLabel" id="split-file-status-area">
                 <property name="visible">True</property>
-                <property name="ellipsize">PANGO_ELLIPSIZE_START</property>
+                <property name="ellipsize">start</property>
                 <property name="width_chars">15</property>
                 <property name="single_line_mode">True</property>
               </widget>
index 318646f8ef87a4eff2002a092f7d6a111a6e70f1..9d8502de058b34b2cfa301338978ccc69267f4e2 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "checkbox-treeview.h"
 #include "descriptives-dialog.h"
+#include "psppire-var-view.h"
 
 #include <gtk/gtk.h>
 #include <stdlib.h>
@@ -117,7 +118,7 @@ generate_syntax (const struct descriptives_dialog *scd)
 
   string = g_string_new ("DESCRIPTIVES");
   g_string_append (string, "\n    /VARIABLES=");
-  append_variable_names (string, scd->dict, GTK_TREE_VIEW (scd->stat_vars), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (scd->stat_vars), 0, string);
 
   listwise = gtk_toggle_button_get_active (scd->exclude_missing_listwise);
   include = gtk_toggle_button_get_active (scd->include_user_missing);
@@ -212,7 +213,6 @@ descriptives_dialog (GObject *o, gpointer data)
 
 
   GtkWidget *source = get_widget_assert   (xml, "all-variables");
-  GtkWidget *selector = get_widget_assert (xml, "stat-var-selector");
   GtkWidget *dest =   get_widget_assert   (xml, "stat-variables");
 
   GtkWidget *stats_treeview = get_widget_assert    (xml, "statistics");
@@ -226,18 +226,9 @@ descriptives_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
 
-  g_object_set (source, "dictionary", dict,
+  g_object_set (source, "model", dict,
        "predicate", var_is_numeric, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (dest), dict);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                source,
-                                dest,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
   put_checkbox_items_in_treeview (GTK_TREE_VIEW (stats_treeview),
                                  B_DS_DEFAULT,
                                  N_DESCRIPTIVE_STATS, stats);
index f5dc93f2423719539725a27d19984f157a1e8c75..62e601f91d617fae16b5bdf768b7c23c4a909a8c 100644 (file)
@@ -56,6 +56,8 @@
                         <property name="receives_default">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="border_width">5</property>
+                        <property name="source_widget">all-variables</property>
+                        <property name="dest_widget">stat-variables</property>
                       </object>
                     </child>
                   </object>
@@ -97,7 +99,7 @@
                             <property name="vscrollbar_policy">automatic</property>
                             <property name="shadow_type">etched-in</property>
                             <child>
-                              <object class="GtkTreeView" id="stat-variables">
+                              <object class="PsppireVarView" id="stat-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 5d52204ce566ad89cdb1807adda7be338bf846e5..7edbbe504920a594e22bba139dba576f9e45b213 100644 (file)
 
 #include "helper.h"
 
-
-/* Append the names of selected variables to STRING.
-   TREEVIEW is the treeview containing the variables.
-   COLUMN is the column in the treeview containing the variables.
-   DICT is the dictionary for those variables.
+/* A (*GtkTreeCellDataFunc) function.
+   This function expects TREEMODEL to hold G_TYPE_BOXED, which is a pointer to a variable.
+   It renders the name of the variable into CELL.
 */
-gint
-append_variable_names (GString *string,
-                      PsppireDict *dict, GtkTreeView *treeview, gint column)
-{
-  gint n_vars = 0;
-  GtkTreeIter iter;
-
-  GtkTreeModel *list_store =
-    gtk_tree_view_get_model (treeview);
-
-  if ( gtk_tree_model_get_iter_first (list_store, &iter) )
-    {
-      do
-       {
-         GValue value = {0};
-         struct variable *var = NULL;
-         GtkTreePath *path = gtk_tree_model_get_path (list_store, &iter);
-
-         gtk_tree_model_get_value (list_store, &iter, column, &value);
-
-         /* FIXME:  G_TYPE_INT should be deprecated.
-            As well as being simpler, it'd be unecessary to pass dict */
-         if ( G_VALUE_TYPE (&value) == G_TYPE_INT )
-         var = psppire_dict_get_variable (dict, g_value_get_int (&value));
-
-         else if ( G_VALUE_TYPE (&value) == PSPPIRE_VAR_PTR_TYPE)
-           var = g_value_get_boxed (&value);
-
-         else
-           g_critical ("Unsupported type \"%s\", in variable name treeview.",
-                       G_VALUE_TYPE_NAME (&value));
-
-         g_value_unset (&value);
-
-         g_string_append (string, " ");
-         g_string_append (string, var_get_name (var));
-
-         gtk_tree_path_free (path);
-         n_vars++;
-       }
-      while (gtk_tree_model_iter_next (list_store, &iter));
-    }
-
-  return n_vars;
-}
-
-
-
-struct variable *
-get_selected_variable (GtkTreeModel *treemodel,
-                      GtkTreeIter *iter,
-                      PsppireDict *dict)
+void
+XXX_cell_var_name (GtkTreeViewColumn *tree_column,
+                  GtkCellRenderer *cell,
+                  GtkTreeModel *treemodel,
+                  GtkTreeIter *iter,
+                  gpointer data)
 {
-  struct variable *var;
+  const struct variable *var;
   GValue value = {0};
 
   GtkTreePath *path = gtk_tree_model_get_path (treemodel, iter);
@@ -91,67 +43,15 @@ get_selected_variable (GtkTreeModel *treemodel,
 
   gtk_tree_path_free (path);
 
-  var =  psppire_dict_get_variable (dict, g_value_get_int (&value));
+  var = g_value_get_boxed (&value);
 
   g_value_unset (&value);
 
-  return var;
-}
-
-
-
-
-/* A (*GtkTreeCellDataFunc) function.
-   This function expects TREEMODEL to hold G_TYPE_INT.  The ints it holds
-   are the indices of the variables in the dictionary, which DATA points to.
-   It renders the name of the variable into CELL.
-*/
-void
-cell_var_name (GtkTreeViewColumn *tree_column,
-              GtkCellRenderer *cell,
-              GtkTreeModel *tree_model,
-              GtkTreeIter *iter,
-              gpointer data)
-{
-  PsppireDict *dict = data;
-  const struct variable *var = get_selected_variable (tree_model, iter, dict);
-
   g_object_set (cell, "text", var_get_name (var), NULL);
 }
 
 
 
-/* Set a model for DEST, which is an GtkListStore of g_int's
-   whose values are the indices into DICT */
-void
-set_dest_model (GtkTreeView *dest, PsppireDict *dict)
-{
-  GtkTreeViewColumn *col;
-  GtkListStore *dest_list = gtk_list_store_new (1, G_TYPE_INT);
-  GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
-
-  gtk_tree_view_set_model (GTK_TREE_VIEW (dest), GTK_TREE_MODEL (dest_list));
-
-  col = gtk_tree_view_column_new_with_attributes ("Var",
-                                                 renderer,
-                                                 "text",
-                                                 0,
-                                                 NULL);
-
-  gtk_tree_view_column_set_cell_data_func (col, renderer,
-                                          cell_var_name,
-                                          dict, 0);
-
-  /* FIXME: make this a value in terms of character widths */
-  g_object_set (col, "min-width",  100, NULL);
-
-  gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
-
-  gtk_tree_view_append_column (GTK_TREE_VIEW (dest), col);
-}
-
-
-
 /* Returns FALSE if the variables represented by the union of the rows
    currently selected by SOURCE widget, and contents of the DEST
    widget, are of different types.
@@ -224,11 +124,8 @@ homogeneous_types (GtkWidget *source, GtkWidget *dest)
        ok;
        ok = gtk_tree_model_iter_next (model, &iter))
     {
-      gint idx;
       const struct variable *v;
-      gtk_tree_model_get (model, &iter, 0, &idx, -1);
-
-      v = psppire_dict_get_variable (dict, idx);
+      gtk_tree_model_get (model, &iter, 0, &v, -1);
 
       if ( type != -1 )
        {
@@ -242,7 +139,6 @@ homogeneous_types (GtkWidget *source, GtkWidget *dest)
       type = var_get_type (v);
     }
 
-
   return retval;
 }
 
index 9a003f35a20e84941b6ec83cc92870295ac38e0d..328904acfc9643fbf669cf6cd0f2f3451166d9c1 100644 (file)
 #include <gtk/gtk.h>
 #include "psppire-dict.h"
 
-/* Append the names of selected variables to STRING.
-   TREEVIEW is the treeview containing the variables.
-   COLUMN is column in treeview containing the variables.
-   DICT is the dictionary for those variables.
-*/
-gint append_variable_names (GString *string, PsppireDict *dict,
-                           GtkTreeView *treeview, gint column);
-
-
-/* Returns the variable currently selected by the iterator
-   pointing to TREEMODEL */
-struct variable * get_selected_variable (GtkTreeModel *treemodel,
-                                        GtkTreeIter *iter,
-                                        PsppireDict *dict);
-
-
-
 /* A (*GtkTreeCellDataFunc) function.
    This function expects TREEMODEL to hold G_TYPE_INT.  The ints it holds
    are the indices of the variables in the dictionary, which DATA points to.
    It renders the name of the variable into CELL.
 */
-void cell_var_name (GtkTreeViewColumn *tree_column,
+void XXX_cell_var_name (GtkTreeViewColumn *tree_column,
                    GtkCellRenderer *cell,
                    GtkTreeModel *tree_model,
                    GtkTreeIter *iter,
                    gpointer data);
 
 
-/* Set a model for DEST, which is an GtkListStore of g_int's
-   whose values are the indices into DICT */
-void set_dest_model (GtkTreeView *dest, PsppireDict *dict);
-
-
 /* Returns FALSE if the variables represented by the union of the rows
    currently selected by SOURCE widget, and contents of the DEST
    widget, are of different types.
index 1665d7ff3f7a3c0a4bc8e1b4ebeb12b99cc8cfb9..160cdb2a1b8e635c4ad72a08892ca11edbddef9d 100644 (file)
@@ -54,7 +54,6 @@ get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
 }
 
 
-
 void
 insert_source_row_into_entry (GtkTreeIter iter,
                              GtkWidget *dest,
@@ -84,7 +83,6 @@ insert_source_row_into_entry (GtkTreeIter iter,
 }
 
 
-
 void
 insert_source_row_into_tree_view (GtkTreeIter iter,
                                  GtkWidget *dest,
@@ -96,24 +94,28 @@ insert_source_row_into_tree_view (GtkTreeIter iter,
   GtkTreeIter dest_iter;
   GtkTreeIter dict_iter;
   gint *row ;
-  GtkTreeModel *destmodel = gtk_tree_view_get_model ( GTK_TREE_VIEW (dest));
+  GtkTreeModel *destmodel = gtk_tree_view_get_model (GTK_TREE_VIEW (dest));
 
+  const struct variable *var;
   GtkTreeModel *dict;
 
-
   get_base_model (model, &iter, &dict, &dict_iter);
 
   path = gtk_tree_model_get_path (dict, &dict_iter);
 
   row = gtk_tree_path_get_indices (path);
 
+  var = psppire_dict_get_variable (PSPPIRE_DICT (dict), *row);
+
   gtk_list_store_append (GTK_LIST_STORE (destmodel),  &dest_iter);
-  gtk_list_store_set (GTK_LIST_STORE (destmodel), &dest_iter, 0, *row, -1);
+
+  gtk_list_store_set (GTK_LIST_STORE (destmodel), &dest_iter, 0, var, -1);
 
   gtk_tree_path_free (path);
 }
 
 
+
 gboolean
 is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
                       PsppireSelector *selector)
@@ -125,7 +127,12 @@ is_currently_in_entry (GtkTreeModel *model, GtkTreeIter *iter,
   gint dict_index;
   gint *indeces;
   GtkTreePath *path;
-  const gchar *text =  gtk_entry_get_text (GTK_ENTRY (selector->dest));
+  GtkWidget *entry = NULL;
+  const gchar *text = NULL;
+
+  g_object_get (selector, "dest-widget", &entry, NULL);
+
+  text = gtk_entry_get_text (GTK_ENTRY (entry));
 
   get_base_model (model, iter, &dict, &dict_iter);
 
index 2c8df4407655e7d48cd4aedca7bd880d3130227a..f1a8a0016f9aa2c9920cc9b6424f9b0c34b251ca 100644 (file)
@@ -31,7 +31,6 @@ void insert_source_row_into_tree_view (GtkTreeIter source_iter,
                                       gpointer data
                                       );
 
-
 /* A SelectItemsFunc function for GtkEntry widgets */
 void insert_source_row_into_entry (GtkTreeIter source_iter,
                                   GtkWidget *dest,
index 470c4dbbe37797ac23e23d3430741c56da0aa94b..67523143fc48ea09eedcae8c5acfe67f8979ce5a 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2008  Free Software Foundation
+   Copyright (C) 2007, 2008, 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
@@ -17,6 +17,7 @@
 #include <config.h>
 
 #include "examine-dialog.h"
+#include "psppire-var-view.h"
 
 #include <gtk/gtk.h>
 #include <stdlib.h>
@@ -96,13 +97,13 @@ generate_syntax (const struct examine_dialog *ed)
   GString *str = g_string_new ("EXAMINE ");
 
   g_string_append (str, "\n\t/VARIABLES=");
-  append_variable_names (str, ed->dict, GTK_TREE_VIEW (ed->dep_list), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (ed->dep_list), 0, str);
 
   if ( 0  < gtk_tree_model_iter_n_children
        (gtk_tree_view_get_model (GTK_TREE_VIEW (ed->fct_list)), NULL))
     {
       g_string_append (str, "\n\tBY ");
-      append_variable_names (str, ed->dict, GTK_TREE_VIEW (ed->fct_list), 0);
+      psppire_var_view_append_names (PSPPIRE_VAR_VIEW (ed->fct_list), 0, str);
     }
 
   label = gtk_entry_get_text (GTK_ENTRY (ed->id_entry));
@@ -250,8 +251,6 @@ examine_dialog (GObject *o, gpointer data)
 
 
   GtkWidget *dep_selector = get_widget_assert (xml, "psppire-selector1");
-  GtkWidget *fct_selector = get_widget_assert (xml, "psppire-selector2");
-  GtkWidget *id_selector = get_widget_assert (xml, "psppire-selector3");
 
   PsppireVarStore *vs = NULL;
 
@@ -280,36 +279,11 @@ examine_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (ex_d.opts_dialog), GTK_WINDOW (de));
 
   g_object_get (vs, "dictionary", &ex_d.dict, NULL);
-  g_object_set (source, "dictionary", ex_d.dict, NULL);
-
-  set_dest_model (GTK_TREE_VIEW (ex_d.dep_list), ex_d.dict);
-
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (dep_selector),
-                                source,
-                                ex_d.dep_list,
-                                insert_source_row_into_tree_view,
-                                NULL, NULL);
+  g_object_set (source, "model", ex_d.dict, NULL);
 
   psppire_selector_set_allow (PSPPIRE_SELECTOR (dep_selector),
                              numeric_only);
 
-  set_dest_model (GTK_TREE_VIEW (ex_d.fct_list), ex_d.dict);
-
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (fct_selector),
-                                source,
-                                ex_d.fct_list,
-                                insert_source_row_into_tree_view,
-                                NULL, NULL);
-
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (id_selector),
-                                source,
-                                ex_d.id_entry,
-                                insert_source_row_into_entry,
-                                NULL, NULL);
-
   g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  &ex_d);
 
   psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog),
index 273c19bc8d054409a4668863e02d13494fcd8e13..316f10439b6c2891e729a4a91b5184a1a8c1ce84 100644 (file)
@@ -81,7 +81,7 @@
                             <property name="vscrollbar_policy">automatic</property>
                             <property name="shadow_type">etched-in</property>
                             <child>
-                              <object class="GtkTreeView" id="treeview3">
+                              <object class="PsppireVarView" id="treeview3">
                                 <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">automatic</property>
                             <property name="shadow_type">etched-in</property>
                             <child>
-                              <object class="GtkTreeView" id="treeview2">
+                              <object class="PsppireVarView" 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>
                     <property name="receives_default">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="border_width">5</property>
+                    <property name="source_widget">treeview1</property>
+                    <property name="dest_widget">entry1</property>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
                     <property name="receives_default">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="border_width">5</property>
+                    <property name="source_widget">treeview1</property>
+                    <property name="dest_widget">treeview3</property>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
                     <property name="receives_default">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="border_width">5</property>
+                    <property name="primary">True</property>
+                    <property name="source_widget">treeview1</property>
+                    <property name="dest_widget">treeview2</property>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
index 11ec0603d4dfd98ee65954b1fed34af49feb4bc2..40e91bc0179f1f801a8d22086725735f5810af48 100644 (file)
@@ -242,17 +242,13 @@ find_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
 
-  g_object_set (source, "dictionary", fd.dict,
+  g_object_set (source, "model", fd.dict,
        "selection-mode", GTK_SELECTION_SINGLE,
        NULL);
 
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                source,
-                                fd.variable_entry,
-                                insert_source_row_into_entry,
-                                is_currently_in_entry,
-                                NULL
-                                );
+
+  psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector),
+                                   is_currently_in_entry);
 
   g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  &fd);
 
index 8dae0c99584dcdc2c54896460d3a460cf9abbad8..d1cb203c8020c041640d43885ed5ccd0e6d2a579 100644 (file)
@@ -52,6 +52,8 @@
                     <property name="receives_default">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="border_width">5</property>
+                    <property name="source_widget">find-variable-treeview</property>
+                    <property name="dest_widget">find-variable-entry</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
index 8706f3a4e63ac105e0caee6a46e597cee048fc40..2d5fcbb48d9f23485ab3b093c0bfe80fa273b80c 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "checkbox-treeview.h"
 #include "frequencies-dialog.h"
+#include "psppire-var-view.h"
 
 #include <gtk/gtk.h>
 #include <stdlib.h>
@@ -147,7 +148,7 @@ generate_syntax (const struct frequencies_dialog *fd)
   GString *string = g_string_new ("FREQUENCIES");
 
   g_string_append (string, "\n\t/VARIABLES=");
-  append_variable_names (string, fd->dict, GTK_TREE_VIEW (fd->stat_vars), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (fd->stat_vars), 0, string);
 
   g_string_append (string, "\n\t/FORMAT=");
 
@@ -316,7 +317,6 @@ frequencies_dialog (GObject *o, gpointer data)
   GtkWidget *dialog = get_widget_assert   (xml, "frequencies-dialog");
   GtkWidget *source = get_widget_assert   (xml, "dict-treeview");
   GtkWidget *dest =   get_widget_assert   (xml, "var-treeview");
-  GtkWidget *selector = get_widget_assert (xml, "selector1");
   GtkWidget *format_button = get_widget_assert (xml, "button1");
   GtkWidget *stats_treeview = get_widget_assert (xml, "stats-treeview");
 
@@ -334,19 +334,7 @@ frequencies_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
   g_object_get (vs, "dictionary", &fd.dict, NULL);
-  g_object_set (source, "dictionary", fd.dict, NULL);
-
-
-  set_dest_model (GTK_TREE_VIEW (dest), fd.dict);
-
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                source,
-                                dest,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
+  g_object_set (source, "model", fd.dict, NULL);
 
   fd.stat_vars = GTK_TREE_VIEW (dest);
   fd.table_button = get_widget_assert (xml, "checkbutton1");
index 47e25d49f3ddcd6e3bd69942e3e1940e95c0d10e..0ab2f29f3d7140ab4789b66b0c5225dcdf99c7f1 100644 (file)
@@ -56,6 +56,8 @@
                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                         <property name="no_show_all">True</property>
                         <property name="border_width">5</property>
+                        <property name="source_widget">dict-treeview</property>
+                        <property name="dest_widget">var-treeview</property>
                       </object>
                     </child>
                   </object>
@@ -85,7 +87,7 @@
                             <property name="vscrollbar_policy">automatic</property>
                             <property name="shadow_type">etched-in</property>
                             <child>
-                              <object class="GtkTreeView" id="var-treeview">
+                              <object class="PsppireVarView" id="var-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 1814dd6737562a1d922722141d9e6c6f3c2b0a63..57428667a2480a63b5a2956ab7e1a927169594d8 100644 (file)
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-
 #include <config.h>
 #include <gtk/gtk.h>
 #include "oneway-anova-dialog.h"
 #include "psppire-dict.h"
 #include "psppire-var-store.h"
+#include "psppire-var-view.h"
 #include "helper.h"
 #include "psppire-data-window.h"
 #include "psppire-dialog.h"
@@ -29,7 +29,6 @@
 #include "psppire-selector.h"
 #include "dict-display.h"
 
-
 #include <language/syntax-string-source.h>
 #include "executor.h"
 
@@ -141,9 +140,6 @@ oneway_anova_dialog (GObject *o, gpointer data)
   GtkWidget *selector2 =
     get_widget_assert (builder, "oneway-anova-selector2");
 
-  GtkWidget *selector1 =
-    get_widget_assert (builder, "oneway-anova-selector1");
-
   GtkWidget *contrasts_button =
     get_widget_assert (builder, "contrasts-button");
 
@@ -171,24 +167,11 @@ oneway_anova_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (ow.dialog, GTK_WINDOW (de));
 
-  g_object_set (dict_view, "dictionary", ow.dict, NULL);
-
-  set_dest_model (GTK_TREE_VIEW (ow.vars_treeview), ow.dict);
-
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector1),
-                                dict_view, ow.vars_treeview,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
+  g_object_set (dict_view, "model", ow.dict, NULL);
 
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector2),
-                                dict_view, ow.factor_entry,
-                                insert_source_row_into_entry,
-                                is_currently_in_entry,
-                                NULL);
 
+  psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector2),
+                                   is_currently_in_entry);
 
 
   g_signal_connect_swapped (ow.dialog, "refresh", G_CALLBACK (refresh),  &ow);
@@ -265,7 +248,7 @@ static gchar * generate_syntax (const struct oneway_anova_dialog *ow)
 
   GString *str = g_string_new ("ONEWAY /VARIABLES=");
 
-  append_variable_names (str, ow->dict, GTK_TREE_VIEW (ow->vars_treeview), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (ow->vars_treeview), 0, str);
 
   g_string_append (str, " BY ");
 
index 6ec3120fa608a9fa8e721c0bf1a117fc1ebdab6e..7381932b04872682ae2ddb92f09ab6e19ecfaea3 100644 (file)
@@ -84,7 +84,7 @@
                     <property name="vscrollbar_policy">automatic</property>
                     <property name="shadow_type">etched-in</property>
                     <child>
-                      <object class="GtkTreeView" id="oneway-anova-treeview2">
+                      <object class="PsppireVarView" id="oneway-anova-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="receives_default">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="border_width">5</property>
+                <property name="source_widget">oneway-anova-treeview1</property>
+                <property name="dest_widget">oneway-anova-entry</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
                 <property name="receives_default">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="border_width">5</property>
+                <property name="primary">True</property>
+                <property name="source_widget">oneway-anova-treeview1</property>
+                <property name="dest_widget">oneway-anova-treeview2</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
index 2707498c7929038cafc9d55f1e85f0ad93ad0272..e42d2bd08875f7d296ab5067ffe62703b16624ce 100644 (file)
@@ -56,6 +56,7 @@
 #include "examine-dialog.h"
 #include "regression-dialog.h"
 #include "reliability-dialog.h"
+#include "roc-dialog.h"
 #include "oneway-anova-dialog.h"
 #include "t-test-independent-samples-dialog.h"
 #include "t-test-one-sample.h"
@@ -1692,6 +1693,20 @@ psppire_data_window_init (PsppireDataWindow *de)
                      G_CALLBACK (reliability_dialog), de);
   }
 
+  {
+    GtkAction *invoke_roc_dialog =
+      resolve_action (de->builder, "roc-curve", NULL);
+
+    g_object_set (invoke_roc_dialog,
+                 "tooltip", _("ROC Curve"),
+                 "stock-id", "pspp-roc",
+                 NULL
+                 );
+
+    g_signal_connect (invoke_roc_dialog, "activate",
+                     G_CALLBACK (roc_dialog), de);
+  }
+
 
   {
     GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
index c82395f2ebdc047e1f8678b9e9d6873df2452207..9e2190b2909e181475309ed1c58e10b3ce304872 100644 (file)
@@ -21,6 +21,7 @@
 #include <gtk/gtk.h>
 #include <ui/gui/psppire-marshal.h>
 
+#include "psppire-var-ptr.h"
 #include "psppire-dict.h"
 #include <data/dictionary.h>
 #include <data/missing-values.h>
@@ -648,7 +649,7 @@ tree_model_column_type (GtkTreeModel *model, gint index)
       return G_TYPE_STRING;
       break;
     case DICT_TVM_COL_VAR:
-      return G_TYPE_POINTER;
+      return PSPPIRE_VAR_PTR_TYPE;
       break;
     default:
       g_return_val_if_reached ((GType)0);
@@ -765,8 +766,8 @@ tree_model_get_value (GtkTreeModel *model, GtkTreeIter *iter,
       }
       break;
     case DICT_TVM_COL_VAR:
-      g_value_init (value, G_TYPE_POINTER);
-      g_value_set_pointer (value, var);
+      g_value_init (value, PSPPIRE_VAR_PTR_TYPE);
+      g_value_set_boxed (value, var);
       break;
     default:
       g_return_if_reached ();
index f1a168de9f39081dc4110f03a9943d54bf0531e7..4c07d1fdc9a79291a34df4768fe2a505c35b2a62 100644 (file)
@@ -75,7 +75,6 @@ psppire_dict_view_finalize (GObject *object)
 enum
 {
   PROP_0,
-  PROP_MODEL,
   PROP_DICTIONARY,
   PROP_PREDICATE,
   PROP_SELECTION_MODE
@@ -137,11 +136,6 @@ psppire_dict_view_set_property (GObject         *object,
     case PROP_DICTIONARY:
       dict_view->dict = g_value_get_object (value);
       break;
-    case PROP_MODEL:
-      g_critical ("Don't set the \"model\" property on %s. "
-                 "Use the \"dictionary\" property instead.",
-                 G_OBJECT_TYPE_NAME (dict_view));
-      break;
     case PROP_PREDICATE:
       dict_view->predicate = g_value_get_pointer (value);
       break;
@@ -201,13 +195,6 @@ psppire_dict_view_class_init (PsppireDictViewClass *class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (class);
 
-  GParamSpec *dictionary_spec =
-    g_param_spec_object ("dictionary",
-                        "Dictionary",
-                        _("The dictionary to be displayed by this widget"),
-                        PSPPIRE_TYPE_DICT,
-                        G_PARAM_READABLE | G_PARAM_WRITABLE);
-
   GParamSpec *predicate_spec =
     g_param_spec_pointer ("predicate",
                          "Predicate",
@@ -223,23 +210,12 @@ psppire_dict_view_class_init (PsppireDictViewClass *class)
                       GTK_SELECTION_MULTIPLE,
                       G_PARAM_CONSTRUCT | G_PARAM_READABLE | G_PARAM_WRITABLE);
 
-
-  GParamSpec *dummy_spec =
-    g_param_spec_pointer ("model",
-                         "Model",
-                         "Don't set the property",
-                         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,
-                                   dummy_spec);
-
-  g_object_class_install_property (object_class,
-                                   PROP_DICTIONARY,
-                                   dictionary_spec);
+  g_object_class_override_property (object_class,
+                                   PROP_DICTIONARY,
+                                   "model");
 
   g_object_class_install_property (object_class,
                                    PROP_PREDICATE,
@@ -271,8 +247,7 @@ psppire_dict_view_base_finalize (PsppireDictViewClass *class,
 
 static void
 dv_get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
-               GtkTreeModel **model, GtkTreeIter *iter
-               )
+               GtkTreeModel **model, GtkTreeIter *iter)
 {
   *model = top_model;
 
index d6ea3375257186d0566aa8a7706da717030db17c..2b2b2ed5ceeb9f23fe4dcca11fd6fd216c3b8832 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007  Free Software Foundation
+   Copyright (C) 2007, 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
@@ -12,7 +12,8 @@
    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/>. */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
 /*
   This module provides a widget, PsppireSelector derived from
 
 #include <config.h>
 
+#include "psppire-dictview.h"
+#include "psppire-var-view.h"
+
+
+
 #include <gtk/gtksignal.h>
 #include <gtk/gtkbutton.h>
 #include <gtk/gtkentry.h>
@@ -112,22 +118,50 @@ psppire_selector_get_type (void)
   return psppire_selector_type;
 }
 
+static GObjectClass * parent_class = NULL;
 
 static void
-psppire_selector_finalize (GObject *object)
+psppire_selector_finalize (GObject *obj)
 {
+   /* Chain up to the parent class */
+   G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+
+static void
+psppire_selector_dispose (GObject *obj)
+{
+  PsppireSelector *sel = PSPPIRE_SELECTOR (obj);
+
+  if (sel->dispose_has_run)
+    return;
+
+  /* Make sure dispose does not run twice. */
+  sel->dispose_has_run = TRUE;
+
+  g_object_unref (sel->dest);
+  g_object_unref (sel->source);
+
+  /* Chain up to the parent class */
+  G_OBJECT_CLASS (parent_class)->dispose (obj);
 }
 
+
 /* Properties */
 enum
 {
   PROP_0,
-  PROP_ORIENTATION
+  PROP_ORIENTATION,
+  PROP_PRIMARY,
+  PROP_SOURCE_WIDGET,
+  PROP_DEST_WIDGET
 };
 
 
 static void on_activate (PsppireSelector *selector, gpointer data);
 
+static void update_subjects (PsppireSelector *selector);
+
 
 static void
 psppire_selector_set_property (GObject         *object,
@@ -143,6 +177,18 @@ psppire_selector_set_property (GObject         *object,
       selector->orientation = g_value_get_enum (value);
       set_direction (selector, selector->direction);
       break;
+    case PROP_PRIMARY:
+      selector->primary_requested = TRUE;
+      update_subjects (selector);
+      break;
+    case PROP_SOURCE_WIDGET:
+      selector->source = g_value_dup_object (value);
+      update_subjects (selector);
+      break;
+    case PROP_DEST_WIDGET:
+      selector->dest = g_value_dup_object (value);
+      update_subjects (selector);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -163,14 +209,18 @@ psppire_selector_get_property (GObject         *object,
     case PROP_ORIENTATION:
       g_value_set_enum (value, selector->orientation);
       break;
+    case PROP_SOURCE_WIDGET:
+      g_value_take_object (value, selector->source);
+      break;
+    case PROP_DEST_WIDGET:
+      g_value_take_object (value, selector->dest);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     };
 }
 
-
-
 static void
 psppire_selector_class_init (PsppireSelectorClass *class)
 {
@@ -184,6 +234,29 @@ psppire_selector_class_init (PsppireSelectorClass *class)
                       G_PARAM_CONSTRUCT_ONLY |G_PARAM_READWRITE);
 
 
+ /* Meaningfull only if more than one selector shares this selectors source */
+  GParamSpec *primary_spec =
+    g_param_spec_boolean ("primary",
+                         "Primary",
+                         "Whether this selector should be the primary selector for the source",
+                         FALSE,
+                         G_PARAM_READWRITE);
+
+  GParamSpec *source_widget_spec = 
+    g_param_spec_object ("source-widget",
+                        "Source Widget",
+                        "The widget to be used as the source for this selector",
+                        GTK_TYPE_WIDGET,
+                        G_PARAM_READWRITE);
+
+  GParamSpec *dest_widget_spec = 
+    g_param_spec_object ("dest-widget",
+                        "Destination Widget",
+                        "The widget to be used as the destination for this selector",
+                        GTK_TYPE_WIDGET,
+                        G_PARAM_READWRITE);
+
+
   object_class->set_property = psppire_selector_set_property;
   object_class->get_property = psppire_selector_get_property;
 
@@ -191,6 +264,20 @@ psppire_selector_class_init (PsppireSelectorClass *class)
                                    PROP_ORIENTATION,
                                    orientation_spec);
 
+  g_object_class_install_property (object_class,
+                                   PROP_PRIMARY,
+                                   primary_spec);
+
+  g_object_class_install_property (object_class,
+                                   PROP_SOURCE_WIDGET,
+                                   source_widget_spec);
+
+  g_object_class_install_property (object_class,
+                                   PROP_DEST_WIDGET,
+                                   dest_widget_spec);
+
+  parent_class = g_type_class_peek_parent (class);
+
   signals [SELECTED] =
     g_signal_new ("selected",
                  G_TYPE_FROM_CLASS (class),
@@ -210,6 +297,8 @@ psppire_selector_class_init (PsppireSelectorClass *class)
                  g_cclosure_marshal_VOID__VOID,
                  G_TYPE_NONE,
                  0);
+
+  class->default_selection_funcs = g_hash_table_new (g_direct_hash, g_direct_equal);
 }
 
 
@@ -219,6 +308,7 @@ psppire_selector_base_init (PsppireSelectorClass *class)
   GObjectClass *object_class = G_OBJECT_CLASS (class);
 
   object_class->finalize = psppire_selector_finalize;
+  object_class->dispose = psppire_selector_dispose;
 
   class->source_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
 }
@@ -230,13 +320,82 @@ psppire_selector_base_finalize(PsppireSelectorClass *class,
                                gpointer class_data)
 {
   g_hash_table_destroy (class->source_hash);
+  g_hash_table_destroy (class->default_selection_funcs);
 }
 
+/* Callback for when the source treeview is activated (double clicked) */
+static void
+on_row_activate (GtkTreeView       *tree_view,
+                GtkTreePath       *path,
+                GtkTreeViewColumn *column,
+                gpointer           data)
+{
+  PsppireSelector *selector  = data;
+
+  gtk_action_activate (selector->action);
+}
+
+/* Callback for when the source selection changes */
+static void
+on_source_select (GtkTreeSelection *treeselection, gpointer data)
+{
+  PsppireSelector *selector = data;
+
+  set_direction (selector, PSPPIRE_SELECTOR_SOURCE_TO_DEST);
+
+  if ( selector->allow_selection )
+    {
+      gtk_action_set_sensitive (selector->action,
+                               selector->allow_selection (selector->source, selector->dest));
+    }
+  else if ( GTK_IS_ENTRY (selector->dest) )
+    {
+      gtk_action_set_sensitive (selector->action,
+                               gtk_tree_selection_count_selected_rows
+                               (treeselection) <= 1 );
+    }
+}
+
+
+static void
+on_realize (PsppireSelector *selector)
+{
+  PsppireSelectorClass *class = g_type_class_peek (PSPPIRE_SELECTOR_TYPE);
+  GtkTreeSelection* selection ;
+
+  GList *list = g_hash_table_lookup (class->source_hash, selector->source);
+
+  if ( NULL == list)
+    return;
+
+  if ( g_list_first (list)->data == selector)
+    {
+      if ( selector->row_activate_id )
+       g_signal_handler_disconnect (selector->source, selector->row_activate_id);
+
+      selector->row_activate_id =  
+       g_signal_connect (selector->source, "row-activated", G_CALLBACK (on_row_activate), selector);
+    }
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (selector->source));
+
+  if ( selector->source_select_id )
+    g_signal_handler_disconnect (selection, selector->source_select_id);
+
+  selector->source_select_id = 
+    g_signal_connect (selection, "changed", G_CALLBACK (on_source_select), selector);
+}
 
 
 static void
 psppire_selector_init (PsppireSelector *selector)
 {
+  selector->primary_requested = FALSE;
+  selector->select_user_data = NULL;
+  selector->select_items = NULL;
+  selector->allow_selection = NULL;
+  selector->filter = NULL;
+
   selector->arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE);
   selector->filtered_source = NULL;
 
@@ -251,6 +410,18 @@ psppire_selector_init (PsppireSelector *selector)
   g_signal_connect_swapped (selector->action, "activate", G_CALLBACK (on_activate), selector);
 
   selector->selecting = FALSE;
+
+  selector->source = NULL;
+  selector->dest = NULL;
+  selector->dispose_has_run = FALSE;
+
+
+  selector->row_activate_id = 0;
+  selector->source_select_id  = 0;
+
+  g_signal_connect (selector, "realize",
+                   G_CALLBACK (on_realize), NULL);
+
 }
 
 
@@ -313,27 +484,6 @@ set_direction (PsppireSelector *selector, enum psppire_selector_dir d)
     }
 }
 
-/* Callback for when the source selection changes */
-static void
-on_source_select (GtkTreeSelection *treeselection, gpointer data)
-{
-  PsppireSelector *selector = data;
-
-  set_direction (selector, PSPPIRE_SELECTOR_SOURCE_TO_DEST);
-
-  if ( selector->allow_selection )
-    {
-      gtk_action_set_sensitive (selector->action,
-                               selector->allow_selection (selector->source, selector->dest));
-    }
-  else if ( GTK_IS_ENTRY (selector->dest) )
-    {
-      gtk_action_set_sensitive (selector->action,
-                               gtk_tree_selection_count_selected_rows
-                               (treeselection) <= 1 );
-    }
-}
-
 /* Callback for when the destination treeview selection changes */
 static void
 on_dest_treeview_select (GtkTreeSelection *treeselection, gpointer data)
@@ -480,18 +630,6 @@ select_selection (PsppireSelector *selector)
   selector->selecting = FALSE;
 }
 
-/* Callback for when the source treeview is activated (double clicked) */
-static void
-on_row_activate (GtkTreeView       *tree_view,
-                GtkTreePath       *path,
-                GtkTreeViewColumn *column,
-                gpointer           data)
-{
-  PsppireSelector *selector  = data;
-
-  gtk_action_activate (selector->action);
-}
-
 /* Callback for when the selector button is clicked,
    or other event which causes the selector's action to occur.
  */
@@ -512,6 +650,13 @@ on_activate (PsppireSelector *selector, gpointer data)
     }
 }
 
+static gboolean
+permissive_filter (GtkTreeModel *model, GtkTreeIter *iter,
+                PsppireSelector *selector)
+{
+  return FALSE;
+}
+
 /* Default visibility filter for GtkTreeView DEST widget */
 static gboolean
 is_item_in_dest (GtkTreeModel *model, GtkTreeIter *iter,
@@ -606,18 +751,17 @@ static void
 set_tree_view_source (PsppireSelector *selector,
                      GtkTreeView *source)
 {
-  GtkTreeSelection* selection ;
+
   GList *list = NULL;
 
   PsppireSelectorClass *class = g_type_class_peek (PSPPIRE_SELECTOR_TYPE);
+  
+  GtkTreeModel *model = gtk_tree_view_get_model (source);
 
   if ( ! (list = g_hash_table_lookup (class->source_hash, source)))
     {
       selector->filtered_source =
-       GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new
-                              (gtk_tree_view_get_model (source),  NULL));
-
-      gtk_tree_view_set_model (source, NULL);
+       GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (model, NULL));
 
       gtk_tree_view_set_model (source,
                               GTK_TREE_MODEL (selector->filtered_source));
@@ -635,20 +779,19 @@ set_tree_view_source (PsppireSelector *selector,
     {  /* Append this selector to the list and push the <source,list>
          pair onto the hash table */
 
-      selector->filtered_source = GTK_TREE_MODEL_FILTER (
-       gtk_tree_view_get_model (source));
+      selector->filtered_source = GTK_TREE_MODEL_FILTER (model);
 
-      list = g_list_append (list, selector);
-      g_hash_table_replace (class->source_hash, source, list);
+      if ( NULL == g_list_find (list, selector) )
+       {
+         if ( selector->primary_requested )
+           list = g_list_prepend (list, selector);
+         else
+           list = g_list_append (list, selector);
+         g_hash_table_replace (class->source_hash, source, list);
+       }
     }
 
-  selection = gtk_tree_view_get_selection (source);
-
-  g_signal_connect (source, "row-activated", G_CALLBACK (on_row_activate),
-                   selector);
 
-  g_signal_connect (selection, "changed", G_CALLBACK (on_source_select),
-                   selector);
 }
 
 
@@ -682,7 +825,17 @@ on_dest_data_delete (GtkTreeModel *tree_model,
 }
 
 
+static void
+xxx (PsppireSelector *selector)
+{
+  GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (selector->dest));
+
+  g_signal_connect (model, "row-changed", G_CALLBACK (on_dest_data_change),
+                   selector);
 
+  g_signal_connect (model, "row-deleted", G_CALLBACK (on_dest_data_delete),
+                   selector);
+}
 
 /* Set the destination widget to DEST */
 static void
@@ -690,18 +843,16 @@ set_tree_view_dest (PsppireSelector *selector,
                    GtkTreeView *dest)
 {
   GtkTreeSelection* selection = gtk_tree_view_get_selection (dest);
-  GtkTreeModel *model = gtk_tree_view_get_model (dest);
+
 
   gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
 
   g_signal_connect (selection, "changed", G_CALLBACK (on_dest_treeview_select),
                    selector);
 
-  g_signal_connect (model, "row-changed", G_CALLBACK (on_dest_data_change),
-                     selector);
 
-  g_signal_connect (model, "row-deleted", G_CALLBACK (on_dest_data_delete),
-                     selector);
+  g_signal_connect_swapped (dest, "notify::model",
+                           G_CALLBACK (xxx), selector);
 
 }
 
@@ -777,67 +928,120 @@ set_entry_dest (PsppireSelector *selector,
                    G_CALLBACK (on_row_inserted), selector);
 }
 
+static void
+set_default_filter (PsppireSelector *selector)
+{
+  if ( selector->filter == NULL)
+    {
+      if  (GTK_IS_TREE_VIEW (selector->dest))
+       selector->filter = permissive_filter;
+    }
+}
 
-/* Set SOURCE and DEST for this selector, and
-   set SELECT_FUNC and FILTER_FUNC */
-void
-psppire_selector_set_subjects (PsppireSelector *selector,
-                              GtkWidget *source,
-                              GtkWidget *dest,
-                              SelectItemsFunc *select_func,
-                              FilterItemsFunc *filter_func,
-                              gpointer user_data)
+static void
+update_subjects (PsppireSelector *selector)
 {
-  g_assert(selector);
+  GtkTreeModel *model = NULL;
 
-  selector->filter = filter_func ;
+  if ( NULL == selector->dest )
+    return;
 
-  selector->source = source;
-  selector->dest = dest;
-  selector->select_user_data = user_data;
+  set_default_filter (selector);
 
-  if ( filter_func == NULL)
-    {
-      if  (GTK_IS_TREE_VIEW (dest))
-       selector->filter = is_item_in_dest;
-    }
+  if ( NULL == selector->source )
+    return;
 
-  if ( GTK_IS_TREE_VIEW (source))
-    set_tree_view_source (selector, GTK_TREE_VIEW (source) );
-  else
-    g_error ("Unsupported source widget: %s", G_OBJECT_TYPE_NAME (source));
+  g_signal_connect_swapped (selector->source, "notify::model",
+                           G_CALLBACK (update_subjects), selector);
+
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (selector->source));
 
-  g_assert ( GTK_IS_TREE_MODEL_FILTER (selector->filtered_source));
+  if ( NULL == model)
+    return;
 
-  if ( NULL == dest)
+
+  if ( GTK_IS_TREE_VIEW (selector->source))
+    set_tree_view_source (selector, GTK_TREE_VIEW (selector->source) );
+  else
+    g_error ("Unsupported source widget: %s", G_OBJECT_TYPE_NAME (selector->source));
+
+  if ( NULL == selector->dest)
     ;
-  else if  ( GTK_IS_TREE_VIEW (dest))
-    set_tree_view_dest (selector, GTK_TREE_VIEW (dest));
+  else if  ( GTK_IS_TREE_VIEW (selector->dest))
+    {
+      set_tree_view_dest (selector, GTK_TREE_VIEW (selector->dest));
+    }
 
-  else if ( GTK_IS_ENTRY (dest))
-    set_entry_dest (selector, GTK_ENTRY (dest));
+  else if ( GTK_IS_ENTRY (selector->dest))
+    set_entry_dest (selector, GTK_ENTRY (selector->dest));
 
-  else if (GTK_IS_TEXT_VIEW (dest))
+  else if (GTK_IS_TEXT_VIEW (selector->dest))
     {
       /* Nothing to be done */
     }
-
   else
-    g_error ("Unsupported destination widget: %s", G_OBJECT_TYPE_NAME (dest));
+    g_error ("Unsupported destination widget: %s", G_OBJECT_TYPE_NAME (selector->dest));
+
+
+  /* FIXME: Remove this dependency */
+  if ( PSPPIRE_IS_DICT_VIEW (selector->source) )
+    {
+      GObjectClass *class = G_OBJECT_GET_CLASS (selector);
+      GType type = G_OBJECT_TYPE (selector->dest);
+
+      SelectItemsFunc *func  = 
+       g_hash_table_lookup (PSPPIRE_SELECTOR_CLASS (class)->default_selection_funcs, (gpointer) type);
 
+      if ( func )
+       psppire_selector_set_select_func (PSPPIRE_SELECTOR (selector),
+                                         func, NULL);
+    }
+}
+
+
+void
+psppire_selector_set_default_selection_func (GType type, SelectItemsFunc *func)
+{
+  GObjectClass *class = g_type_class_ref (PSPPIRE_SELECTOR_TYPE);
+
+  g_hash_table_insert (PSPPIRE_SELECTOR_CLASS (class)->default_selection_funcs, (gpointer) type, func);
+
+  g_type_class_unref (class);
+}
+
+
+
+
+/* Set FILTER_FUNC for this selector */
+void
+psppire_selector_set_filter_func (PsppireSelector *selector,
+                                 FilterItemsFunc *filter_func)
+{
+  selector->filter = filter_func ;
+  
+  set_default_filter (selector);
+}
+
+
+/* Set SELECT_FUNC for this selector */
+void
+psppire_selector_set_select_func (PsppireSelector *selector,
+                              SelectItemsFunc *select_func,
+                              gpointer user_data)
+{
+  selector->select_user_data = user_data;
   selector->select_items = select_func;
 }
 
 
 
 void
-psppire_selector_set_allow        (PsppireSelector *selector , AllowSelectionFunc *allow)
+psppire_selector_set_allow (PsppireSelector *selector, AllowSelectionFunc *allow)
 {
   selector->allow_selection = allow;
 }
 
 
-
 GType
 psppire_selector_orientation_get_type (void)
 {
index 6fff5d4269da20286062e0f8c36def77374f1fa5..bb267cd49cf08631a02e5cfd07e19cf54f31df4a 100644 (file)
@@ -77,7 +77,10 @@ struct _PsppireSelector
   GtkWidget *arrow;
   GtkAction *action;
 
+  gboolean dispose_has_run;
+
   enum psppire_selector_dir direction;
+
   GtkWidget *source;
   GtkWidget *dest;
 
@@ -97,6 +100,12 @@ struct _PsppireSelector
   FilterItemsFunc *filter;
 
   AllowSelectionFunc *allow_selection;
+
+  gulong row_activate_id ;
+
+  gulong source_select_id ;
+
+  gboolean primary_requested;
 };
 
 struct _PsppireSelectorClass
@@ -106,18 +115,26 @@ struct _PsppireSelectorClass
   /* This is a hash of Lists of FilterItemsFunc pointers, keyed by address of
      the source widget */
   GHashTable *source_hash;
+
+  /* A hash of SelectItemFuncs indexed by GType */
+  GHashTable *default_selection_funcs;
 };
 
 GType      psppire_selector_get_type        (void);
 GtkWidget* psppire_selector_new             (void);
-void       psppire_selector_set_subjects    (PsppireSelector *,
-                                            GtkWidget *,
-                                            GtkWidget *,
-                                            SelectItemsFunc *,
-                                            FilterItemsFunc *,
-                                            gpointer );
 
-void      psppire_selector_set_allow        (PsppireSelector *, AllowSelectionFunc *);
+
+/* Set FILTER_FUNC for this selector */
+void psppire_selector_set_filter_func (PsppireSelector *selector,
+                                      FilterItemsFunc *filter_func);
+
+/* Set SELECT_FUNC for this selector */
+void psppire_selector_set_select_func (PsppireSelector *selector,
+                                      SelectItemsFunc *select_func,
+                                      gpointer user_data);
+
+
+void psppire_selector_set_allow (PsppireSelector *, AllowSelectionFunc *);
 
 
 GType psppire_selector_orientation_get_type (void) G_GNUC_CONST;
@@ -134,6 +151,8 @@ typedef enum {
   (psppire_selector_orientation_get_type())
 
 
+void psppire_selector_set_default_selection_func (GType type, SelectItemsFunc *);
+
 
 G_END_DECLS
 
diff --git a/src/ui/gui/psppire-var-view.c b/src/ui/gui/psppire-var-view.c
new file mode 100644 (file)
index 0000000..2a9ebf2
--- /dev/null
@@ -0,0 +1,316 @@
+/* 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 <gtk/gtkcellrenderertext.h>
+#include "psppire-var-view.h"
+#include "psppire-var-ptr.h"
+
+#include <data/variable.h>
+
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+static void psppire_var_view_base_finalize (PsppireVarViewClass *, gpointer);
+static void psppire_var_view_base_init     (PsppireVarViewClass *class);
+static void psppire_var_view_class_init    (PsppireVarViewClass *class);
+static void psppire_var_view_init          (PsppireVarView      *var_view);
+
+
+GType
+psppire_var_view_get_type (void)
+{
+  static GType psppire_var_view_type = 0;
+
+  if (!psppire_var_view_type)
+    {
+      static const GTypeInfo psppire_var_view_info =
+      {
+       sizeof (PsppireVarViewClass),
+       (GBaseInitFunc) psppire_var_view_base_init,
+        (GBaseFinalizeFunc) psppire_var_view_base_finalize,
+       (GClassInitFunc)psppire_var_view_class_init,
+       (GClassFinalizeFunc) NULL,
+       NULL,
+        sizeof (PsppireVarView),
+       0,
+       (GInstanceInitFunc) psppire_var_view_init,
+      };
+
+      psppire_var_view_type =
+       g_type_register_static (GTK_TYPE_TREE_VIEW, "PsppireVarView",
+                               &psppire_var_view_info, 0);
+    }
+
+  return psppire_var_view_type;
+}
+
+
+static void
+psppire_var_view_finalize (GObject *object)
+{
+  PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
+  g_free (var_view->nums);
+}
+
+/* Properties */
+enum
+{
+  PROP_0,
+  PROP_N_COLS
+};
+
+/* A (*GtkTreeCellDataFunc) function.
+   This function expects TREEMODEL to hold PSPPIRE_VAR_PTR_TYPE.
+   It renders the name of the variable into CELL.
+*/
+static void
+display_cell_var_name (GtkTreeViewColumn *tree_column,
+                      GtkCellRenderer *cell,
+                      GtkTreeModel *treemodel,
+                      GtkTreeIter *iter,
+                      gpointer data)
+{
+  struct variable *var;
+  GValue value = {0};
+  gint *col = data;
+
+  GtkTreePath *path = gtk_tree_model_get_path (treemodel, iter);
+
+  gtk_tree_model_get_value (treemodel, iter, *col, &value);
+
+  gtk_tree_path_free (path);
+
+  var = g_value_get_boxed (&value);
+
+  g_value_unset (&value);
+
+  g_object_set (cell, "text", var_get_name (var), NULL);
+}
+
+
+static void
+psppire_var_view_get_property (GObject         *object,
+                              guint            prop_id,
+                              GValue          *value,
+                              GParamSpec      *pspec)
+{
+  PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
+
+  switch (prop_id)
+    {
+    case PROP_N_COLS:
+      g_value_set_int (value,  gtk_tree_model_iter_n_children (GTK_TREE_MODEL (var_view->list), NULL));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    };
+}
+
+
+static void
+psppire_var_view_set_property (GObject         *object,
+                              guint            prop_id,
+                              const GValue    *value,
+                              GParamSpec      *pspec)
+{
+  PsppireVarView *var_view = PSPPIRE_VAR_VIEW (object);
+
+  switch (prop_id)
+    {
+    case PROP_N_COLS:
+      {
+       gint n_cols = g_value_get_int (value);
+       gint c;
+
+
+       GType *array = g_alloca (sizeof (GType) *  n_cols);
+
+       var_view->nums = g_malloc (sizeof *var_view->nums * n_cols);
+
+       for (c = 0 ; c < n_cols; ++c)
+       {
+         GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+         GtkTreeViewColumn *col = gtk_tree_view_column_new ();
+
+         gchar *label = g_strdup_printf (_("Var%d"), c + 1);
+
+         gtk_tree_view_column_set_min_width (col, 100);
+         gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
+         gtk_tree_view_column_set_resizable (col, TRUE);
+         gtk_tree_view_column_set_title (col, label);
+
+         g_free (label);
+
+         var_view->nums[c] = c;
+
+         gtk_tree_view_column_pack_start (col, renderer, TRUE);
+         gtk_tree_view_column_set_cell_data_func (col, renderer,
+                                                  display_cell_var_name,
+                                                  &var_view->nums[c], 0);
+
+         gtk_tree_view_append_column (GTK_TREE_VIEW (var_view), col);
+         array[c] = PSPPIRE_VAR_PTR_TYPE;
+       }
+
+       /* Set a model, which is an GtkListStore of gpointers which point to a variable */
+       var_view->list = gtk_list_store_newv  (n_cols, array);
+       gtk_tree_view_set_model (GTK_TREE_VIEW (var_view), GTK_TREE_MODEL (var_view->list));
+      }
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    };
+}
+
+static void
+psppire_var_view_class_init (PsppireVarViewClass *class)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+  GParamSpec *n_cols_spec =
+    g_param_spec_int ("n-cols",
+                     "Number of columns",
+                     "The Number of Columns in the Variable View",
+                     1, 20,
+                     1,
+                     G_PARAM_CONSTRUCT_ONLY | G_PARAM_READABLE | G_PARAM_WRITABLE);
+
+
+  object_class->set_property = psppire_var_view_set_property;
+  object_class->get_property = psppire_var_view_get_property;
+
+  g_object_class_install_property (object_class,
+                                   PROP_N_COLS,
+                                   n_cols_spec);
+}
+
+
+static void
+psppire_var_view_base_init (PsppireVarViewClass *class)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+  object_class->finalize = psppire_var_view_finalize;
+}
+
+
+
+static void
+psppire_var_view_base_finalize (PsppireVarViewClass *class,
+                                gpointer class_data)
+{
+}
+
+
+
+static void
+psppire_var_view_init (PsppireVarView *var_view)
+{
+}
+
+
+GtkWidget*
+psppire_var_view_new (void)
+{
+  return GTK_WIDGET (g_object_new (psppire_var_view_get_type (), NULL));
+}
+
+
+gboolean
+psppire_var_view_get_iter_first (PsppireVarView *vv, GtkTreeIter *iter)
+{
+  return gtk_tree_model_get_iter_first (GTK_TREE_MODEL (vv->list), iter);
+}
+
+gboolean
+psppire_var_view_get_iter_next (PsppireVarView *vv, GtkTreeIter *iter)
+{
+  return gtk_tree_model_iter_next (GTK_TREE_MODEL (vv->list), iter);
+}
+
+const struct variable *
+psppire_var_view_get_variable (PsppireVarView *vv, gint column, GtkTreeIter *iter)
+{
+  const struct variable *var = NULL;
+  GValue value = {0};
+  gtk_tree_model_get_value (GTK_TREE_MODEL (vv->list), iter, column, &value);
+
+  if ( G_VALUE_TYPE (&value) == PSPPIRE_VAR_PTR_TYPE)
+    var = g_value_get_boxed (&value);
+  else
+    g_critical ("Unsupported type \"%s\", in variable name treeview.",
+               G_VALUE_TYPE_NAME (&value));
+
+  g_value_unset (&value);
+
+  return var;
+}
+
+/*
+  Append the names of selected variables to STRING.
+  Returns the number of variables appended.
+*/
+gint
+psppire_var_view_append_names (PsppireVarView *vv, gint column, GString *string)
+{
+  gint n_vars = 0;
+  GtkTreeIter iter;
+
+  if ( psppire_var_view_get_iter_first (vv, &iter) )
+    {
+      do
+       {
+         const struct variable *var = psppire_var_view_get_variable (vv, column, &iter);
+         g_string_append (string, " ");
+         g_string_append (string, var_get_name (var));
+
+         n_vars++;
+       }
+      while (psppire_var_view_get_iter_next (vv, &iter));
+    }
+
+  return n_vars;
+}
+
+/* Returns TRUE iff VV contains the item V.
+   V must be an initialised value containing a
+   PSPPIRE_VAR_PTR_TYPE.
+*/
+gboolean
+psppire_var_view_contains_var (PsppireVarView *vv, const GValue *v)
+{
+  gboolean ok;
+  GtkTreeIter iter;
+  g_return_val_if_fail (G_VALUE_HOLDS (v, PSPPIRE_VAR_PTR_TYPE), FALSE);
+
+  for (ok = psppire_var_view_get_iter_first (vv, &iter);
+       ok;
+       ok = psppire_var_view_get_iter_next (vv, &iter))
+    {
+      const struct variable *var = psppire_var_view_get_variable (vv, 0, &iter);
+      if (var == g_value_get_boxed (v))
+       return TRUE;
+    }
+
+  return FALSE;
+}
+
diff --git a/src/ui/gui/psppire-var-view.h b/src/ui/gui/psppire-var-view.h
new file mode 100644 (file)
index 0000000..3509a46
--- /dev/null
@@ -0,0 +1,75 @@
+/* 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_VAR_VIEW_H__
+#define __PSPPIRE_VAR_VIEW_H__
+
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtktreeview.h>
+
+G_BEGIN_DECLS
+
+#define PSPPIRE_VAR_VIEW_TYPE            (psppire_var_view_get_type ())
+#define PSPPIRE_VAR_VIEW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), PSPPIRE_VAR_VIEW_TYPE, PsppireVarView))
+#define PSPPIRE_VAR_VIEW_CLASS(class)    (G_TYPE_CHECK_CLASS_CAST ((class), \
+    PSPPIRE_VAR_VIEW_TYPE, PsppireVarViewClass))
+#define PSPPIRE_IS_VAR_VIEW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+    PSPPIRE_VAR_VIEW_TYPE))
+#define PSPPIRE_IS_VAR_VIEW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \
+    PSPPIRE_VAR_VIEW_TYPE))
+
+
+typedef struct _PsppireVarView       PsppireVarView;
+typedef struct _PsppireVarViewClass  PsppireVarViewClass;
+
+struct variable;
+
+struct _PsppireVarView
+{
+  GtkTreeView parent;
+
+  GtkListStore *list;
+  
+  gint *nums;
+
+};
+
+struct _PsppireVarViewClass
+{
+  GtkTreeViewClass parent_class;
+
+};
+
+GType      psppire_var_view_get_type        (void);
+
+gboolean psppire_var_view_contains_var (PsppireVarView *vv, const GValue *v);
+
+gint psppire_var_view_append_names (PsppireVarView *vv, gint column, GString *string);
+
+gboolean psppire_var_view_get_iter_first (PsppireVarView *vv, GtkTreeIter *iter);
+
+gboolean psppire_var_view_get_iter_next (PsppireVarView *vv, GtkTreeIter *iter);
+
+const struct variable * psppire_var_view_get_variable (PsppireVarView *vv, gint column, GtkTreeIter *iter);
+
+
+
+G_END_DECLS
+
+#endif /* __PSPPIRE_VAR_VIEW_H__ */
index 1cd7ee803c736a740b373a53b035c7dcef6bd90a..8491851383f4405805bbf71d0a35d5e172500b29 100644 (file)
@@ -47,6 +47,9 @@
 
 #include <gtk/gtk.h>
 #include "psppire-dict.h"
+#include "dict-display.h"
+#include "psppire-selector.h"
+#include "psppire-var-view.h"
 #include "psppire-var-store.h"
 #include "psppire-data-store.h"
 #include "executor.h"
@@ -146,6 +149,10 @@ initialize (struct command_line_processor *clp, int argc, char **argv)
 
   the_recent_mgr = gtk_recent_manager_get_default ();
 
+  psppire_selector_set_default_selection_func (GTK_TYPE_ENTRY, insert_source_row_into_entry);
+  psppire_selector_set_default_selection_func (PSPPIRE_VAR_VIEW_TYPE, insert_source_row_into_tree_view);
+  psppire_selector_set_default_selection_func (GTK_TYPE_TREE_VIEW, insert_source_row_into_tree_view);
+
   the_data_window = psppire_data_window_new ();
 
   command_line_processor_replace_aux (clp, &post_init_argp, the_source_stream);
index 06cce7beebebacc5a372154f537e8a593d2dee74..06e72fb18445d2c3eeccb7b1cc6b8b733c1f40ba 100644 (file)
@@ -85,6 +85,8 @@
                                 <property name="can_focus">False</property>
                                 <property name="receives_default">False</property>
                                 <property name="border_width">5</property>
+                                <property name="source_widget">weight-cases-treeview</property>
+                                <property name="dest_widget">weight-cases-entry</property>
                               </object>
                               <packing>
                                 <property name="position">0</property>
                             <property name="hscrollbar_policy">never</property>
                             <property name="vscrollbar_policy">automatic</property>
                             <child>
-                              <object class="GtkTreeView" id="variables-treeview">
+                              <object class="PsppireVarView" id="variables-treeview">
                                 <property name="visible">True</property>
                                 <property name="headers_visible">False</property>
                               </object>
                     <property name="can_focus">False</property>
                     <property name="receives_default">False</property>
                     <property name="border_width">5</property>
+                    <property name="source_widget">source-treeview</property>
+                    <property name="dest_widget">new-name-entry</property>
                   </object>
                   <packing>
                     <property name="top_attach">1</property>
                     <property name="can_focus">False</property>
                     <property name="receives_default">False</property>
                     <property name="border_width">5</property>
+                    <property name="primary">True</property>
+                    <property name="source_widget">source-treeview</property>
+                    <property name="dest_widget">variables-treeview</property>
                   </object>
                   <packing>
                     <property name="x_options"></property>
                                 <property name="receives_default">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="border_width">5</property>
+                                <property name="source_widget">split-file-dict-treeview</property>
+                                <property name="dest_widget">split-file-grouping-vars</property>
                               </object>
                             </child>
                           </object>
                                     <property name="hscrollbar_policy">never</property>
                                     <property name="vscrollbar_policy">automatic</property>
                                     <child>
-                                      <object class="GtkTreeView" id="split-file-grouping-vars">
+                                      <object class="PsppireVarView" id="split-file-grouping-vars">
                                         <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="receives_default">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="border_width">5</property>
+                        <property name="source_widget">compute-treeview1</property>
+                        <property name="dest_widget">compute-textview1</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <property name="border_width">5</property>
                             <property name="orientation">source below destination</property>
+                            <property name="source_widget">compute-treeview2</property>
+                            <property name="dest_widget">compute-textview1</property>
                           </object>
                           <packing>
                             <property name="fill">False</property>
                                             <property name="receives_default">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="border_width">5</property>
+                                            <property name="source_widget">select-cases-treeview</property>
+                                            <property name="dest_widget">filter-variable-entry</property>
                                           </object>
                                           <packing>
                                             <property name="expand">False</property>
index b2894095b76c69335e6b3f73d3276305967b5787..aa81e23bbe71fd77fb2e5997f53c3bd93045643a 100644 (file)
@@ -28,6 +28,7 @@
 #include <ui/gui/helper.h>
 #include <ui/gui/psppire-dialog.h>
 #include <ui/gui/psppire-var-store.h>
+#include <ui/gui/psppire-var-view.h>
 #include "executor.h"
 
 #include "gettext.h"
@@ -110,7 +111,7 @@ generate_syntax (const struct rank_dialog *rd)
 
   GString *str = g_string_new ("RANK VARIABLES=");
 
-  append_variable_names (str, rd->dict, GTK_TREE_VIEW (rd->rank_vars), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->rank_vars), 0, str);
 
   g_string_append_printf (str, " (%c)",
                   gtk_toggle_button_get_active (rd->ascending_togglebutton)
@@ -120,7 +121,7 @@ generate_syntax (const struct rank_dialog *rd)
     {
       g_string_append (str, "\n\tBY ");
 
-      append_variable_names (str, rd->dict, GTK_TREE_VIEW (rd->group_vars), 0);
+      psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->group_vars),  0, str);
     }
 
   g_string_append (str, "\n\t/PRINT = ");
@@ -227,9 +228,6 @@ rank_dialog (GObject *o, gpointer data)
   GtkBuilder * builder = builder_new ("rank.ui");
 
   GtkWidget *vars = get_widget_assert   (builder, "dict-treeview");
-  GtkWidget *selector1 = get_widget_assert (builder, "psppire-selector1");
-  GtkWidget *selector2 = get_widget_assert (builder, "psppire-selector2");
-
 
   GtkWidget *types_button = get_widget_assert (builder, "button1");
   GtkWidget *ties_button = get_widget_assert (builder, "button2");
@@ -306,26 +304,7 @@ rank_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (rd.dialog), GTK_WINDOW (de));
 
-  g_object_set (vars, "dictionary", rd.dict, NULL);
-
-  set_dest_model (GTK_TREE_VIEW (rd.rank_vars), rd.dict);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector1),
-                                vars,
-                                rd.rank_vars,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
-  set_dest_model (GTK_TREE_VIEW (rd.group_vars), rd.dict);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector2),
-                                vars,
-                                rd.group_vars,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
+  g_object_set (vars, "model", rd.dict, NULL);
 
   g_signal_connect (types_button, "clicked",
                    G_CALLBACK (run_types_dialog),  &rd);
index 5b7d6f4b27f471ef1735b5c1e17b3767687ccd2d..b05ab4501c7902a0cc84358805a174c4503a2558 100644 (file)
@@ -72,7 +72,7 @@
                         <property name="vscrollbar_policy">automatic</property>
                         <property name="shadow_type">etched-in</property>
                         <child>
-                          <object class="GtkTreeView" id="group-vars-treeview">
+                          <object class="PsppireVarView" id="group-vars-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">automatic</property>
                         <property name="shadow_type">etched-in</property>
                         <child>
-                          <object class="GtkTreeView" id="variables-treeview">
+                          <object class="PsppireVarView" id="variables-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="receives_default">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="border_width">5</property>
+                    <property name="source_widget">dict-treeview</property>
+                    <property name="dest_widget">group-vars-treeview</property>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
                     <property name="receives_default">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="border_width">5</property>
+                    <property name="primary">True</property>
+                    <property name="source_widget">dict-treeview</property>
+                    <property name="dest_widget">variables-treeview</property>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
index 0bb82eb335a9a6d3c75a13f6c1cf34e47863c8a3..9a1af8d5d7a582a69119fb835b084c86b0ad5cad 100644 (file)
@@ -26,6 +26,8 @@
 
 #include "executor.h"
 
+#include "psppire-var-view.h"
+
 #include <gtk/gtk.h>
 
 #include <xalloc.h>
@@ -337,13 +339,15 @@ struct recode_dialog
 
   gboolean input_var_is_string;
 
-  GtkListStore *var_map;
   GtkWidget *new_name_entry;
   GtkWidget *new_label_entry;
   GtkWidget *change_button;
 
   GtkWidget *string_button;
   GtkWidget *width_entry;
+
+  /* A hash table of struct nlp's indexed by variable */
+  GHashTable *varmap;
 };
 
 
@@ -352,33 +356,23 @@ static void run_old_and_new_dialog (struct recode_dialog *rd);
 static void
 refresh (PsppireDialog *dialog, struct recode_dialog *rd)
 {
+  GtkTreeModel *vars =
+    gtk_tree_view_get_model (GTK_TREE_VIEW (rd->variable_treeview));
+
+  gtk_list_store_clear (GTK_LIST_STORE (vars));
+
   gtk_widget_set_sensitive (rd->change_button, FALSE);
   gtk_widget_set_sensitive (rd->new_name_entry, FALSE);
   gtk_widget_set_sensitive (rd->new_label_entry, FALSE);
 
-
   if ( rd->different )
-    gtk_list_store_clear (GTK_LIST_STORE (rd->var_map));
-  else
-    {
-      GtkTreeModel *vars =
-       gtk_tree_view_get_model (GTK_TREE_VIEW (rd->variable_treeview));
-
-      gtk_list_store_clear (GTK_LIST_STORE (vars));
-    }
+    g_hash_table_remove_all (rd->varmap);
 
   gtk_list_store_clear (GTK_LIST_STORE (rd->value_map));
 }
 
 static char * generate_syntax (const struct recode_dialog *rd);
 
-enum {
-  COL_OLD,
-  COL_NEW_NAME,
-  COL_NEW_LABEL,
-  n_COL_VARS
-};
-
 enum {
   COL_VALUE_OLD,
   COL_VALUE_NEW,
@@ -403,26 +397,10 @@ dialog_state_valid (gpointer data)
 
   if ( rd->different )
     {
-      GtkTreeIter iter;
-
-      gboolean ok;
+      GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd->variable_treeview)->list);
 
-      for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rd->var_map),
-                                              &iter);
-          ok;
-          ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (rd->var_map),
-                                         &iter))
-       {
-         gchar *name = NULL;
-
-         gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter,
-                             COL_NEW_NAME, &name, -1);
-
-         if ( name == NULL )
-           return FALSE;
-
-         g_free (name);
-       }
+      if (g_hash_table_size (rd->varmap) != gtk_tree_model_iter_n_children (model, NULL) )
+       return FALSE;
     }
   else
     {
@@ -431,7 +409,6 @@ dialog_state_valid (gpointer data)
 
       if ( !gtk_tree_model_get_iter_first (vars, &not_used))
        return FALSE;
-
     }
 
   return TRUE;
@@ -494,22 +471,6 @@ recode_different_dialog (GObject *o, gpointer data)
   recode_dialog (de, TRUE);
 }
 
-static void
-render_new_var_name (GtkTreeViewColumn *tree_column,
-                    GtkCellRenderer *cell,
-                    GtkTreeModel *tree_model,
-                    GtkTreeIter *iter,
-                    gpointer data)
-{
-  gchar *new_var_name = NULL;
-
-  gtk_tree_model_get (tree_model, iter, COL_NEW_NAME, &new_var_name, -1);
-
-  g_object_set (cell, "text", new_var_name, NULL);
-
-  g_free (new_var_name);
-}
-
 
 /* This might need to be changed to something less naive.
    In particular, what happends with dates, etc?
@@ -686,6 +647,41 @@ on_acr_selection_change (GtkTreeSelection *selection, gpointer data)
     }
 }
 
+/* Name-Label pair */
+struct nlp
+{
+  char *name;
+  char *label;
+};
+
+static struct nlp *
+nlp_create (const char *name, const char *label)
+{
+  struct nlp *nlp = xmalloc (sizeof *nlp);
+
+  nlp->name = g_strdup (name);
+
+  nlp->label = NULL;
+
+  if ( 0 != strcmp ("", label))
+    nlp->label = g_strdup (label);
+
+  return nlp;
+}
+
+static void
+nlp_destroy (gpointer data)
+{
+  struct nlp *nlp = data ;
+  if ( ! nlp )
+    return;
+
+  g_free (nlp->name);
+  g_free (nlp->label);
+  g_free (nlp);
+}
+
+
 /* Callback which gets called when a new row is selected
    in the variable treeview.
    It sets the name and label entry widgets to reflect the
@@ -695,18 +691,18 @@ static void
 on_selection_change (GtkTreeSelection *selection, gpointer data)
 {
   struct recode_dialog *rd = data;
-  GtkTreeModel *model = GTK_TREE_MODEL (rd->var_map);
+
+  GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd->variable_treeview)->list);
 
   GList *rows = gtk_tree_selection_get_selected_rows (selection, &model);
 
   if ( rows && !rows->next)
     {
       /* Exactly one row is selected */
-
+      struct nlp *nlp;
+      struct variable *var;
       gboolean ok;
       GtkTreeIter iter;
-      gchar *name = NULL;
-      gchar *label = NULL;
 
       gtk_widget_set_sensitive  (rd->change_button, TRUE);
       gtk_widget_set_sensitive  (rd->new_name_entry, TRUE);
@@ -714,16 +710,22 @@ on_selection_change (GtkTreeSelection *selection, gpointer data)
 
       ok = gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) rows->data);
 
-      gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter,
-                         COL_NEW_NAME, &name,
-                         COL_NEW_LABEL, &label,
+      gtk_tree_model_get (model, &iter,
+                         0, &var, 
                          -1);
 
-      gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), name ? name : "");
-      gtk_entry_set_text (GTK_ENTRY (rd->new_label_entry), label ? label : "");
+      nlp = g_hash_table_lookup (rd->varmap, var);
 
-      g_free (name);
-      g_free (label);
+      if (nlp)
+       {
+         gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), nlp->name ? nlp->name : "");
+         gtk_entry_set_text (GTK_ENTRY (rd->new_label_entry), nlp->label ? nlp->label : "");
+       }
+      else
+       {
+         gtk_entry_set_text (GTK_ENTRY (rd->new_name_entry), "");
+         gtk_entry_set_text (GTK_ENTRY (rd->new_label_entry), "");
+       }
     }
   else
     {
@@ -735,6 +737,7 @@ on_selection_change (GtkTreeSelection *selection, gpointer data)
       gtk_entry_set_text (GTK_ENTRY (rd->new_label_entry), "");
     }
 
+
   g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
   g_list_free (rows);
 }
@@ -762,12 +765,13 @@ on_convert_toggled (GtkToggleButton *b, struct recode_dialog *rd)
   gtk_widget_set_sensitive (rd->string_button, !active);
 }
 
-
 static void
 on_change_clicked (GObject *obj, gpointer data)
 {
   struct recode_dialog *rd = data;
-  GtkTreeModel *model = GTK_TREE_MODEL (rd->var_map);
+  struct variable *var = NULL;
+  struct nlp *nlp;
+  GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd->variable_treeview)->list);
   GtkTreeIter iter;
   GtkTreeSelection *selection =
     gtk_tree_view_get_selection (GTK_TREE_VIEW (rd->variable_treeview));
@@ -780,16 +784,22 @@ on_change_clicked (GObject *obj, gpointer data)
   const gchar *dest_var_label =
     gtk_entry_get_text (GTK_ENTRY (rd->new_label_entry));
 
-  if ( NULL == rows )
-    return;
+  if ( NULL == rows || rows->next != NULL)
+    goto finish;
 
   gtk_tree_model_get_iter (model, &iter, rows->data);
 
-  gtk_list_store_set (rd->var_map, &iter,
-                     COL_NEW_NAME, dest_var_name,
-                     COL_NEW_LABEL, dest_var_label,
-                     -1);
+  gtk_tree_model_get (model, &iter, 0, &var, -1);
+
+  g_hash_table_remove (rd->varmap, var);
+
+  nlp = nlp_create (dest_var_name, dest_var_label);
+
+  g_hash_table_insert (rd->varmap, var, nlp);
 
+  gtk_tree_model_row_changed (model, rows->data, &iter);
+
+ finish:
   g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
   g_list_free (rows);
 }
@@ -838,6 +848,32 @@ set_acr (struct recode_dialog *rd)
   psppire_acr_set_enabled (rd->acr, !g_str_equal (text, ""));
 }
 
+static void
+render_new_var_name (GtkTreeViewColumn *tree_column,
+                    GtkCellRenderer *cell,
+                    GtkTreeModel *tree_model,
+                    GtkTreeIter *iter,
+                    gpointer data)
+{
+  struct nlp *nlp = NULL;
+  struct recode_dialog *rd = data;
+
+  struct variable *var = NULL;
+
+  gtk_tree_model_get (tree_model, iter, 
+                     0, &var,
+                     -1);
+
+  nlp = g_hash_table_lookup (rd->varmap, var);
+
+  if ( nlp )
+    g_object_set (cell, "text", nlp->name, NULL);
+  else
+    g_object_set (cell, "text", "", NULL);
+}
+
+
+
 static void
 recode_dialog (PsppireDataWindow *de, gboolean diff)
 {
@@ -854,13 +890,11 @@ recode_dialog (PsppireDataWindow *de, gboolean diff)
 
   GtkWidget *output_variable_box = get_widget_assert (builder,"frame4");
 
-
   PsppireVarStore *vs = NULL;
-
   g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   rd.change_button = get_widget_assert (builder, "change-button");
-
+  rd.varmap = NULL;
   rd.dialog = get_widget_assert   (builder, "recode-dialog");
   rd.dict_treeview = get_widget_assert (builder, "treeview1");
   rd.variable_treeview =   get_widget_assert (builder, "treeview2");
@@ -887,77 +921,50 @@ recode_dialog (PsppireDataWindow *de, gboolean diff)
 
   gtk_window_set_transient_for (GTK_WINDOW (rd.dialog), GTK_WINDOW (de));
 
+  g_object_set (rd.dict_treeview, "model", rd.dict, NULL);
 
-  g_object_set (rd.dict_treeview, "dictionary", rd.dict, NULL);
-
-  if ( ! rd.different )
-    {
-      set_dest_model (GTK_TREE_VIEW (rd.variable_treeview), rd.dict);
-    }
-  else
+  if (rd.different)
     {
+      GtkTreeModel *model = GTK_TREE_MODEL (PSPPIRE_VAR_VIEW (rd.variable_treeview)->list);
       GtkTreeSelection *sel;
-      GtkTreeViewColumn *col;
-      GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
-
-      rd.var_map = gtk_list_store_new (n_COL_VARS, G_TYPE_INT,
-                                                   G_TYPE_STRING,
-                                                   G_TYPE_STRING);
-
-
 
-      gtk_tree_view_set_model (GTK_TREE_VIEW (rd.variable_treeview),
-                              GTK_TREE_MODEL (rd.var_map));
+      GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
 
-      col = gtk_tree_view_column_new_with_attributes (_("Old"),
-                                                 renderer,
-                                                 "text", NULL,
-                                                 NULL);
+      GtkTreeViewColumn *col = gtk_tree_view_column_new_with_attributes (_("New"),
+                                                                        renderer,
+                                                                        "text", NULL,
+                                                                        NULL);
 
       gtk_tree_view_column_set_cell_data_func (col, renderer,
-                                              cell_var_name,
-                                              rd.dict, 0);
+                                              render_new_var_name,
+                                              &rd, NULL);
 
 
       gtk_tree_view_append_column (GTK_TREE_VIEW (rd.variable_treeview), col);
 
 
-      renderer = gtk_cell_renderer_text_new ();
+      col = gtk_tree_view_get_column (GTK_TREE_VIEW (rd.variable_treeview), 0);
 
-      col = gtk_tree_view_column_new_with_attributes (_("New"),
-                                                 renderer,
-                                                 "text", NULL,
-                                                 NULL);
-
-      gtk_tree_view_column_set_cell_data_func (col, renderer,
-                                              render_new_var_name,
-                                              NULL, NULL);
-
-
-      gtk_tree_view_append_column (GTK_TREE_VIEW (rd.variable_treeview), col);
+      g_object_set (col, "title", _("Old"), NULL);
 
       g_object_set (rd.variable_treeview, "headers-visible", TRUE, NULL);
 
-      g_signal_connect (rd.change_button, "clicked",
-                       G_CALLBACK (on_change_clicked),  &rd);
+      rd.varmap = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, nlp_destroy);
 
       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (rd.variable_treeview));
+
       g_signal_connect (sel, "changed",
                        G_CALLBACK (on_selection_change), &rd);
 
-      g_signal_connect (rd.var_map, "row-inserted",
+      g_signal_connect (rd.change_button, "clicked",
+                       G_CALLBACK (on_change_clicked),  &rd);
+
+#if 0
+      g_signal_connect (model, "row-inserted",
                        G_CALLBACK (select_something), &rd);
+#endif
     }
 
-
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                rd.dict_treeview,
-                                rd.variable_treeview,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
   psppire_selector_set_allow (PSPPIRE_SELECTOR (selector), homogeneous_types);
 
   /* Set up the Old & New Values subdialog */
@@ -1103,6 +1110,7 @@ recode_dialog (PsppireDataWindow *de, gboolean diff)
       break;
     }
 
+  g_hash_table_destroy (rd.varmap);
 
   gtk_list_store_clear (GTK_LIST_STORE (rd.value_map));
   g_object_unref (rd.value_map);
@@ -1276,7 +1284,6 @@ run_old_and_new_dialog (struct recode_dialog *rd)
     /* Find the type of the first variable (it's invariant that
        all variables are of the same type) */
     const struct variable *v;
-    gint idx;
     GtkTreeIter iter;
     GtkTreeModel *model =
       gtk_tree_view_get_model (GTK_TREE_VIEW (rd->variable_treeview));
@@ -1285,9 +1292,7 @@ run_old_and_new_dialog (struct recode_dialog *rd)
 
     g_return_if_fail (not_empty);
 
-    gtk_tree_model_get (model, &iter, 0, &idx, -1);
-
-    v = psppire_dict_get_variable (rd->dict, idx);
+    gtk_tree_model_get (model, &iter, 0, &v, -1);
 
     rd->input_var_is_string = var_is_alpha (v);
 
@@ -1416,33 +1421,26 @@ generate_syntax (const struct recode_dialog *rd)
   if ( rd->different &&
        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->string_button)))
     {
-      GtkTreeIter iter;
+      GHashTableIter iter;
 
+      struct variable *var = NULL;
+      struct nlp *nlp = NULL;
 
-      for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rd->var_map),
-                                              &iter);
-          ok;
-          ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (rd->var_map), &iter))
+      g_hash_table_iter_init (&iter, rd->varmap);
+      while (g_hash_table_iter_next (&iter, (void**) &var, (void**) &nlp))
        {
-         gchar *name = NULL;
-
-         gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter,
-                             COL_NEW_NAME, &name, -1);
-
          g_string_append (str, "\nSTRING ");
-         g_string_append (str, name);
+         g_string_append (str, nlp->name);
          g_string_append_printf (str, " (A%d).",
                                  (int)
                                  gtk_spin_button_get_value (GTK_SPIN_BUTTON (rd->width_entry) )
                                  );
-
-         g_free (name);
        }
     }
 
   g_string_append (str, "\nRECODE ");
 
-  append_variable_names (str, rd->dict, GTK_TREE_VIEW (rd->variable_treeview), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->variable_treeview), 0, str);
 
   g_string_append (str, "\n\t");
 
@@ -1483,67 +1481,43 @@ generate_syntax (const struct recode_dialog *rd)
 
   if ( rd->different )
     {
+
       GtkTreeIter iter;
       g_string_append (str, "\n\tINTO ");
 
-      for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rd->var_map),
-                                              &iter);
+      for (ok = psppire_var_view_get_iter_first (PSPPIRE_VAR_VIEW (rd->variable_treeview), &iter);
           ok;
-          ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (rd->var_map), &iter))
-       {
-         gchar *name = NULL;
-
-         gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter,
-                             COL_NEW_NAME, &name, -1);
-
-         g_string_append (str, name);
-         g_string_append (str, " ");
+          ok = psppire_var_view_get_iter_next (PSPPIRE_VAR_VIEW (rd->variable_treeview), &iter))
+         {
+           struct nlp *nlp = NULL;
+           const struct variable *var = psppire_var_view_get_variable (PSPPIRE_VAR_VIEW (rd->variable_treeview), 0, &iter);
 
-         g_free (name);
-       }
+           nlp = g_hash_table_lookup (rd->varmap, var);
+           
+           g_string_append (str, nlp->name);
+           g_string_append (str, " ");
+         }
     }
 
   g_string_append (str, ".");
 
-
   /* If applicable, set labels for the new variables. */
   if ( rd->different )
     {
-      GtkTreeIter iter;
+      GHashTableIter iter;
 
-      for (ok = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rd->var_map),
-                                              &iter);
-          ok;
-          ok = gtk_tree_model_iter_next (GTK_TREE_MODEL (rd->var_map), &iter))
+      struct variable *var = NULL;
+      struct nlp *nlp = NULL;
+
+      g_hash_table_iter_init (&iter, rd->varmap);
+      while (g_hash_table_iter_next (&iter, (void**) &var, (void**) &nlp))
        {
-         struct string ls;
-         gchar *label = NULL;
-         gchar *name = NULL;
-
-         gtk_tree_model_get (GTK_TREE_MODEL (rd->var_map), &iter,
-                             COL_NEW_NAME, &name,
-                             COL_NEW_LABEL, &label, -1);
-
-         if ( 0 == strcmp (label, "") )
-           {
-             g_free (name);
-             g_free (label);
-             continue;
-           }
-
-         ds_init_empty (&ls);
-         syntax_gen_string (&ls, ss_cstr (label));
-         g_free (label);
-
-         g_string_append_printf (str, "\nVARIABLE LABELS %s %s.",
-                                 name, ds_cstr (&ls));
-
-         g_free (name);
-         ds_destroy (&ls);
+         if (nlp->label)
+           g_string_append_printf (str, "\nVARIABLE LABELS %s %s.",
+                                   nlp->name, nlp->label);
        }
     }
 
-
   g_string_append (str, "\nEXECUTE.\n");
 
 
index 4acd7fc4c44be92ec4f828f19cca6757db8deda4..c573dba0607f7f85c45394330ede2946e0e7b283 100644 (file)
             <property name="receives_default">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="border_width">5</property>
+            <property name="source_widget">treeview1</property>
+            <property name="dest_widget">treeview2</property>
           </object>
           <packing>
             <property name="left_attach">1</property>
                         <property name="vscrollbar_policy">automatic</property>
                         <property name="shadow_type">etched-in</property>
                         <child>
-                          <object class="GtkTreeView" id="treeview2">
+                          <object class="PsppireVarView" 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 eaca17e074e49aef32c5cbbb7447ef3c012b94b8..070d30a6e74bbfe59749eba9c86903e79f502827 100644 (file)
@@ -30,6 +30,7 @@
 #include <ui/gui/helper.h>
 #include <ui/gui/psppire-dialog.h>
 #include <ui/gui/psppire-var-store.h>
+#include <ui/gui/psppire-var-view.h>
 
 
 #include "gettext.h"
@@ -157,9 +158,9 @@ generate_syntax (const struct regression_dialog *rd)
   GString *string = g_string_new ("REGRESSION");
 
   g_string_append (string, "\n\t/VARIABLES=");
-  append_variable_names (string, rd->dict, GTK_TREE_VIEW (rd->indep_vars), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->indep_vars), 0, string);
   g_string_append (string, "\n\t/DEPENDENT=\t");
-  append_variable_names (string, rd->dict, GTK_TREE_VIEW (rd->dep_vars), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->dep_vars), 0, string);
 
   selected = 0;
   for (i = 0, ok = gtk_tree_model_get_iter_first (rd->stat, &iter); ok; 
@@ -234,8 +235,6 @@ regression_dialog (GObject *o, gpointer data)
   GtkWidget *source = get_widget_assert   (xml, "dict-view");
   GtkWidget *dest_dep =   get_widget_assert   (xml, "dep-view");
   GtkWidget *dest_indep =   get_widget_assert   (xml, "indep-view");
-  GtkWidget *dep_selector = get_widget_assert (xml, "dep-selector");
-  GtkWidget *indep_selector = get_widget_assert (xml, "indep-selector");
   GtkWidget *stat_button = get_widget_assert (xml, "stat-button");
   GtkWidget *save_button = get_widget_assert (xml, "save-button");
 
@@ -254,24 +253,7 @@ regression_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
   g_object_get (vs, "dictionary", &rd.dict, NULL);
-  g_object_set (source, "dictionary", rd.dict, NULL);
-
-  set_dest_model (GTK_TREE_VIEW (dest_dep), rd.dict);
-  set_dest_model (GTK_TREE_VIEW (dest_indep), rd.dict);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (dep_selector),
-                                source,
-                                dest_dep,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (indep_selector),
-                                source,
-                                dest_indep,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
+  g_object_set (source, "model", rd.dict, NULL);
 
   rd.dep_vars = GTK_TREE_VIEW (dest_dep);
   rd.indep_vars = GTK_TREE_VIEW (dest_indep);
index 190e686671fd38378a78de0f94f8a10ed284d9f1..61561f354a19d28de3c306c0299323d39d742a73 100644 (file)
@@ -67,6 +67,8 @@
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                 <property name="no_show_all">True</property>
                 <property name="border_width">5</property>
+                <property name="source_widget">dict-view</property>
+                <property name="dest_widget">dep-view</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
@@ -83,6 +85,8 @@
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                 <property name="no_show_all">True</property>
                 <property name="border_width">5</property>
+                <property name="source_widget">dict-view</property>
+                <property name="dest_widget">indep-view</property>
               </object>
               <packing>
                 <property name="left_attach">1</property>
                         <property name="vscrollbar_policy">automatic</property>
                         <property name="shadow_type">etched-in</property>
                         <child>
-                          <object class="GtkTreeView" id="dep-view">
+                          <object class="PsppireVarView" id="dep-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>
                         <property name="vscrollbar_policy">automatic</property>
                         <property name="shadow_type">etched-in</property>
                         <child>
-                          <object class="GtkTreeView" id="indep-view">
+                          <object class="PsppireVarView" id="indep-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 66c8bf5ce4b3eed41425643db8bd3eb5ec043790..9831ab7f66ce7ae20c974cdcdc1593b31a459763 100644 (file)
@@ -24,6 +24,7 @@
 #include "psppire-dialog.h"
 
 #include "psppire-data-window.h"
+#include "psppire-var-view.h"
 
 #include "executor.h"
 #include "helper.h"
@@ -121,8 +122,6 @@ reliability_dialog (GObject *o, gpointer data)
   GtkWidget *dialog = get_widget_assert   (xml, "reliability-dialog");
   GtkWidget *source = get_widget_assert   (xml, "dict-view");
 
-  GtkWidget *selector = get_widget_assert (xml, "psppire-selector1");
-
   rd.split_point_hbox = get_widget_assert (xml, "split-point-hbox");
 
   rd.variables = get_widget_assert   (xml, "treeview2");
@@ -138,16 +137,7 @@ reliability_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
   g_object_get (vs, "dictionary", &rd.dict, NULL);
-  g_object_set (source, "dictionary", rd.dict, NULL);
-
-  set_dest_model (GTK_TREE_VIEW (rd.variables), rd.dict);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                source,
-                                rd.variables,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
+  g_object_set (source, "model", rd.dict, NULL);
 
   {
     GtkTreeModel *tm =
@@ -206,7 +196,7 @@ generate_syntax (const struct reliability *rd)
   GString *string = g_string_new ("RELIABILITY");
 
   g_string_append (string, "\n\t/VARIABLES=");
-  append_variable_names (string, rd->dict, GTK_TREE_VIEW (rd->variables), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->variables), 0, string);
 
 
   g_string_append (string, "\n\t/MODEL=");
index a4236b77a18aa75eb2a6489d2787ca515efd695d..25af6ca1d63595111890f6461ad1da0b2b073a82 100644 (file)
@@ -70,6 +70,8 @@
                         <property name="receives_default">True</property>
                         <property name="no_show_all">True</property>
                         <property name="border_width">5</property>
+                        <property name="source_widget">dict-view</property>
+                        <property name="dest_widget">treeview2</property>
                       </object>
                     </child>
                   </object>
@@ -96,7 +98,7 @@
                             <property name="vscrollbar_policy">automatic</property>
                             <property name="shadow_type">etched-in</property>
                             <child>
-                              <object class="GtkTreeView" id="treeview2">
+                              <object class="PsppireVarView" id="treeview2">
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="headers_visible">False</property>
diff --git a/src/ui/gui/roc-dialog.c b/src/ui/gui/roc-dialog.c
new file mode 100644 (file)
index 0000000..4d1a7d3
--- /dev/null
@@ -0,0 +1,257 @@
+/* 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 "dialog-common.h"
+#include <language/syntax-string-source.h>
+#include <ui/syntax-gen.h>
+#include <libpspp/str.h>
+
+#include "roc-dialog.h"
+#include "psppire-selector.h"
+#include "psppire-dictview.h"
+#include "psppire-dialog.h"
+
+#include "psppire-data-window.h"
+#include "psppire-var-view.h"
+
+#include "executor.h"
+#include "helper.h"
+
+#include <gtk/gtk.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+
+struct roc
+{
+  PsppireDict *dict;
+
+  GtkWidget *test_variables;
+  GtkWidget *state_variable;
+  GtkWidget *state_value;
+
+  GtkWidget *curve;
+  GtkWidget *reference;
+  GtkWidget *standard_error;
+  GtkWidget *coordinates;
+};
+
+
+static char * generate_syntax (const struct roc *rd);
+
+
+static void
+refresh (struct roc *rd)
+{
+  GtkTreeModel *liststore =
+    gtk_tree_view_get_model (GTK_TREE_VIEW (rd->test_variables));
+  gtk_list_store_clear (GTK_LIST_STORE (liststore));
+
+  gtk_entry_set_text (GTK_ENTRY (rd->state_variable), "");
+  gtk_entry_set_text (GTK_ENTRY (rd->state_value), "");
+
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->curve),          TRUE);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->reference),      FALSE);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->standard_error), FALSE);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->coordinates),    FALSE);
+}
+
+
+static gboolean
+dialog_state_valid (gpointer data)
+{
+  struct roc *rd = data;
+  const gchar *text;
+
+  GtkTreeModel *liststore =
+    gtk_tree_view_get_model (GTK_TREE_VIEW (rd->test_variables));
+
+  if  (gtk_tree_model_iter_n_children (liststore, NULL) < 1)
+    return FALSE;
+
+  
+  text = gtk_entry_get_text (GTK_ENTRY (rd->state_variable));
+  if ( 0 == strcmp ("", text))
+    return FALSE;
+
+
+  text = gtk_entry_get_text (GTK_ENTRY (rd->state_value));
+  if ( 0 == strcmp ("", text))
+    return FALSE;
+
+
+  return TRUE;
+}
+
+static void
+on_curve_button_toggle  (GtkCheckButton *curve, struct roc *rd)
+{
+  if ( !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (curve)))
+    {
+      if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->reference)))
+       g_object_set (rd->reference, "inconsistent", TRUE, NULL);
+      g_object_set (rd->reference, "sensitive", FALSE, NULL);
+    }
+  else 
+    {
+      g_object_set (rd->reference, "inconsistent", FALSE, NULL);
+      g_object_set (rd->reference, "sensitive", TRUE, NULL);
+    }
+}
+
+
+/* Pops up the Roc dialog box */
+void
+roc_dialog (GObject *o, gpointer data)
+{
+  struct roc rd;
+  gint response;
+
+  GtkBuilder *xml = builder_new ("roc.ui");
+  PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (data);
+  PsppireVarStore *vs;
+
+  GtkWidget *dialog = get_widget_assert   (xml, "roc-dialog");
+  GtkWidget *source = get_widget_assert   (xml, "dict-view");
+
+  rd.test_variables    = get_widget_assert   (xml, "psppire-var-view1");
+  rd.state_variable    = get_widget_assert   (xml, "entry1");
+  rd.state_value       = get_widget_assert   (xml, "entry2");
+
+  rd.curve          = get_widget_assert   (xml, "curve");
+  rd.reference      = get_widget_assert   (xml, "reference-line");
+  rd.standard_error = get_widget_assert   (xml, "standard-error");
+  rd.coordinates    = get_widget_assert   (xml, "co-ordinates");
+
+
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
+
+  gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
+
+  g_object_get (vs, "dictionary", &rd.dict, NULL);
+  g_object_set (source, "model", rd.dict, NULL);
+
+  g_signal_connect (rd.curve, "toggled", G_CALLBACK (on_curve_button_toggle), &rd);
+
+  g_signal_connect_swapped (dialog, "refresh", G_CALLBACK (refresh),  &rd);
+
+  psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog),
+                                     dialog_state_valid, &rd);
+
+  response = psppire_dialog_run (PSPPIRE_DIALOG (dialog));
+
+  switch (response)
+    {
+    case GTK_RESPONSE_OK:
+      {
+       gchar *syntax = generate_syntax (&rd);
+
+       struct getl_interface *sss = create_syntax_string_source (syntax);
+       execute_syntax (sss);
+
+       g_free (syntax);
+      }
+      break;
+    case PSPPIRE_RESPONSE_PASTE:
+      {
+       gchar *syntax = generate_syntax (&rd);
+        paste_syntax_in_new_window (syntax);
+
+       g_free (syntax);
+      }
+      break;
+    default:
+      break;
+    }
+
+  g_object_unref (xml);
+}
+
+
+\f
+
+static char *
+generate_syntax (const struct roc *rd)
+{
+  gchar *text;
+  const gchar *var_name = gtk_entry_get_text (GTK_ENTRY (rd->state_variable));
+  GString *string = g_string_new ("ROC");
+
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->test_variables), 0, string);
+
+  g_string_append (string, " BY ");
+
+  g_string_append (string, var_name);
+
+  g_string_append (string, " (");
+  {
+    const gchar *value = gtk_entry_get_text (GTK_ENTRY (rd->state_value));
+
+    const struct variable *var = psppire_dict_lookup_var (rd->dict, var_name);
+
+    g_return_val_if_fail (var, NULL);
+
+    if ( var_is_alpha (var))
+      {
+       struct string xx;
+       ds_init_empty (&xx);
+       syntax_gen_string (&xx, ss_cstr (value));
+       g_string_append (string, ds_cstr (&xx));
+       ds_destroy (&xx);
+      }
+    else
+      g_string_append (string, value);
+  }
+  g_string_append (string, ")");
+
+
+  /* The /PLOT subcommand */
+  g_string_append (string, "\n\t/PLOT ");
+  if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->curve)))
+    {
+      g_string_append (string, "CURVE");
+      if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->reference)))
+       g_string_append (string, " (REFERENCE)");
+    }
+  else
+    g_string_append (string, "NONE");
+
+
+  /* The /PRINT subcommand */
+  if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->standard_error)) ||
+       gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->coordinates)) )
+    {
+      g_string_append (string, "\n\t/PRINT");
+
+      if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->standard_error)))
+       g_string_append (string, " SE");
+
+      if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rd->coordinates)))
+       g_string_append (string, " COORDINATES");
+    }
+
+  g_string_append (string, ".\n");
+
+  text = string->str;
+
+  g_string_free (string, FALSE);
+
+  return text;
+}
diff --git a/src/ui/gui/roc-dialog.h b/src/ui/gui/roc-dialog.h
new file mode 100644 (file)
index 0000000..0244980
--- /dev/null
@@ -0,0 +1,25 @@
+/* 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 __ROC_DIALOG_H
+#define __ROC_DIALOG_H
+
+
+#include <gtk/gtk.h>
+
+void roc_dialog (GObject *o, gpointer data);
+
+#endif
diff --git a/src/ui/gui/roc.ui b/src/ui/gui/roc.ui
new file mode 100644 (file)
index 0000000..a3aee25
--- /dev/null
@@ -0,0 +1,327 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="psppire" version="2054.17080"/>
+  <!-- interface-requires gtk+ 2.12 -->
+  <!-- interface-naming-policy project-wide -->
+  <object class="PsppireDialog" id="roc-dialog">
+    <property name="title">ROC Curve</property>
+    <property name="modal">True</property>
+    <child internal-child="hbox">
+      <object class="GtkHBox" id="dialog-hbox1">
+        <property name="visible">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="spacing">2</property>
+        <child>
+          <object class="GtkTable" id="table1">
+            <property name="visible">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="n_rows">3</property>
+            <property name="n_columns">3</property>
+            <child>
+              <object class="PsppireSelector" id="dep-selector">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">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="no_show_all">True</property>
+                <property name="border_width">5</property>
+                <property name="source_widget">dict-view</property>
+                <property name="dest_widget">psppire-var-view1</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="x_options"></property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <object class="PsppireSelector" id="indep-selector">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">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="no_show_all">True</property>
+                <property name="border_width">5</property>
+                <property name="source_widget">dict-view</property>
+                <property name="dest_widget">entry1</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+                <property name="x_options"></property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="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>
+                <property name="hscrollbar_policy">never</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <property name="shadow_type">etched-in</property>
+                <child>
+                  <object 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>
+                    <property name="headers_visible">False</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="bottom_attach">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkFrame" id="frame2">
+                <property name="visible">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="label_xalign">0</property>
+                <property name="shadow_type">none</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment1">
+                    <property name="visible">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="left_padding">12</property>
+                    <child>
+                      <object class="GtkScrolledWindow" id="scrolledwindow1">
+                        <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="hscrollbar_policy">never</property>
+                        <property name="vscrollbar_policy">automatic</property>
+                        <property name="shadow_type">etched-in</property>
+                        <child>
+                          <object class="PsppireVarView" id="psppire-var-view1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="border_width">5</property>
+                            <property name="headers_visible">False</property>
+                            <property name="headers_clickable">False</property>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label1">
+                    <property name="visible">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="label" translatable="yes">_Test Variable:</property>
+                    <property name="use_markup">True</property>
+                    <property name="use_underline">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">2</property>
+                <property name="right_attach">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkFrame" id="frame1">
+                <property name="visible">True</property>
+                <property name="label_xalign">0</property>
+                <property name="shadow_type">none</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment2">
+                    <property name="visible">True</property>
+                    <property name="left_padding">12</property>
+                    <child>
+                      <object class="GtkEntry" id="entry1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="invisible_char">&#x2022;</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label2">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_State Variable:</property>
+                    <property name="use_markup">True</property>
+                    <property name="use_underline">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">2</property>
+                <property name="right_attach">3</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+                <property name="y_options">GTK_FILL</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVBox" id="vbox1">
+                <property name="visible">True</property>
+                <property name="orientation">vertical</property>
+                <child>
+                  <object class="GtkHBox" id="hbox1">
+                    <property name="visible">True</property>
+                    <child>
+                      <object class="GtkLabel" id="label4">
+                        <property name="visible">True</property>
+                        <property name="xalign">1</property>
+                        <property name="label" translatable="yes">_Value of state variable:</property>
+                        <property name="use_underline">True</property>
+                        <property name="mnemonic_widget">entry2</property>
+                      </object>
+                      <packing>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="entry2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="invisible_char">&#x2022;</property>
+                      </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkFrame" id="frame3">
+                    <property name="visible">True</property>
+                    <property name="label_xalign">0</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment3">
+                        <property name="visible">True</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkVButtonBox" id="vbuttonbox1">
+                            <property name="visible">True</property>
+                            <property name="orientation">vertical</property>
+                            <child>
+                              <object class="GtkCheckButton" id="curve">
+                                <property name="label" translatable="yes">ROC C_urve</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox2">
+                                <property name="visible">True</property>
+                                <child>
+                                  <object class="GtkCheckButton" id="reference-line">
+                                    <property name="label" translatable="yes">_With diagonal reference line</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">False</property>
+                                    <property name="use_underline">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="draw_indicator">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="padding">12</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="standard-error">
+                                <property name="label" translatable="yes">Standard _Error and Confidence Interval</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="co-ordinates">
+                                <property name="label" translatable="yes">_Coordinate points of the ROC Curve</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">3</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label3">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Display</property>
+                        <property name="use_markup">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">3</property>
+                <property name="top_attach">2</property>
+                <property name="bottom_attach">3</property>
+                <property name="y_options">GTK_FILL</property>
+                <property name="x_padding">5</property>
+                <property name="y_padding">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="PsppireVButtonBox" id="psppire-vbuttonbox1">
+            <property name="visible">True</property>
+            <property name="border_width">5</property>
+            <property name="orientation">vertical</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
index 56b10d2c5482e382da1b8b2df32f5646bb8fe127..5b027825bc6e62ccec66116837e7f085015a9dc7 100644 (file)
@@ -326,17 +326,13 @@ select_cases_dialog (GObject *o, gpointer data)
   {
     GtkWidget *source = get_widget_assert   (scd.xml, "select-cases-treeview");
 
-    g_object_set (source, "dictionary",
+    g_object_set (source, "model",
                  scd.data_store->dict,
                  "selection-mode",
                  GTK_SELECTION_SINGLE, NULL);
 
-    psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                  source,
-                                  entry,
-                                  insert_source_row_into_entry,
-                                  is_currently_in_entry,
-                                  NULL);
+    psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector),
+                                  is_currently_in_entry);
   }
 
 
index cde70ccf83074fc65ac9b54ae94c423f41dddb60..22c537812311eb232837062c384b5a91dc22db70 100644 (file)
@@ -24,6 +24,7 @@
 #include "dialog-common.h"
 #include "psppire-selector.h"
 #include "dict-display.h"
+#include "psppire-var-view.h"
 
 #include <language/syntax-string-source.h>
 #include "helper.h"
@@ -40,7 +41,7 @@ refresh (PsppireDialog *dialog, GtkTreeView *dest)
 
 struct sort_cases_dialog
 {
-  GtkTreeView *tv;
+  PsppireVarView *tv;
   PsppireDict *dict;
   GtkToggleButton *ascending;
 };
@@ -50,7 +51,7 @@ static gboolean
 dialog_state_valid (gpointer data)
 {
   struct sort_cases_dialog *scd = data;
-  GtkTreeModel *model = gtk_tree_view_get_model (scd->tv);
+  GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (scd->tv));
 
   gint n_rows = gtk_tree_model_iter_n_children  (model, NULL);
 
@@ -65,8 +66,8 @@ generate_syntax (const struct sort_cases_dialog *scd)
 {
   gchar *text;
   GString *string = g_string_new ("SORT CASES BY ");
-  gint n_vars = append_variable_names (string,
-                                      scd->dict, GTK_TREE_VIEW (scd->tv), 0);
+
+  gint n_vars = psppire_var_view_append_names (scd->tv, 0, string);
 
   if ( n_vars == 0 )
     g_string_assign (string, "");
@@ -102,9 +103,7 @@ sort_cases_dialog (GObject *o, gpointer data)
 
 
   GtkWidget *source = get_widget_assert   (xml, "sort-cases-treeview1");
-  GtkWidget *selector = get_widget_assert (xml, "sort-cases-selector");
   GtkWidget *dest =   get_widget_assert   (xml, "sort-cases-treeview2");
-
   PsppireVarStore *vs = NULL;
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
@@ -112,20 +111,11 @@ sort_cases_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
   g_object_get (vs, "dictionary", &scd.dict, NULL);
-  g_object_set (source, "dictionary", scd.dict, NULL);
-
-  set_dest_model (GTK_TREE_VIEW (dest), scd.dict);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                source,
-                                dest,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
+  g_object_set (source, "model", scd.dict, NULL);
 
   g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  dest);
 
-  scd.tv = GTK_TREE_VIEW (dest);
+  scd.tv = PSPPIRE_VAR_VIEW (dest);
   scd.ascending =
     GTK_TOGGLE_BUTTON (get_widget_assert (xml, "sort-cases-radiobutton0"));
 
index c7e4b2d40310aaeb7bf0b43c06691bfc3221d5a4..19f8b719fabd0361edc49b49a6a733f0b0489952 100644 (file)
@@ -51,6 +51,8 @@
                     <property name="receives_default">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="border_width">5</property>
+                    <property name="source_widget">sort-cases-treeview1</property>
+                    <property name="dest_widget">sort-cases-treeview2</property>
                   </object>
                 </child>
               </object>
@@ -90,7 +92,7 @@
                         <property name="vscrollbar_policy">automatic</property>
                         <property name="shadow_type">etched-in</property>
                         <child>
-                          <object class="GtkTreeView" id="sort-cases-treeview2">
+                          <object class="PsppireVarView" id="sort-cases-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 613f8e91fe601cf544f32bb62933c00211c3869a..cb226d9fffc095a1f23e7bf668efdca6015ac1bb 100644 (file)
@@ -26,6 +26,8 @@
 #include "helper.h"
 #include <data/dictionary.h>
 
+#include "psppire-var-view.h"
+
 #include <gtk/gtk.h>
 
 
@@ -68,8 +70,7 @@ generate_syntax (const struct split_file_dialog *sfd)
       GString * varlist = g_string_sized_new (80);
       GtkWidget *sort = get_widget_assert (sfd->xml, "split-radiobutton3");
       GtkWidget *layered = get_widget_assert (sfd->xml, "split-radiobutton1");
-      gint n_vars = append_variable_names (varlist,
-                                          sfd->dict, GTK_TREE_VIEW (vars), 0);
+      gint n_vars = psppire_var_view_append_names (PSPPIRE_VAR_VIEW (vars), 0, varlist);
 
       if ( n_vars > 0 )
        {
@@ -191,19 +192,10 @@ split_file_dialog (GObject *o, gpointer data)
   sfd.selector  = PSPPIRE_SELECTOR (
                                    get_widget_assert   (sfd.xml, "split-file-selector"));
 
-  g_object_set (source, "dictionary", sfd.dict, NULL);
+  g_object_set (source, "model", sfd.dict, NULL);
 
   g_signal_connect (on_off, "toggled", G_CALLBACK(on_off_toggled),  sfd.xml);
 
-  set_dest_model (GTK_TREE_VIEW (dest), sfd.dict);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                source,
-                                dest,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
   g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  &sfd);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
index 5d77ce43031ea7e46b37c3f0de57e9f9a22e67eb..90c5ab54870b9439548d61ff0fc5efed2d4cedc9 100644 (file)
@@ -21,6 +21,7 @@
 #include "t-test-independent-samples-dialog.h"
 #include "psppire-dict.h"
 #include "psppire-var-store.h"
+#include "psppire-var-view.h"
 #include "executor.h"
 #include "psppire-data-window.h"
 #include "psppire-dialog.h"
@@ -160,7 +161,7 @@ generate_syntax (const struct tt_indep_samples_dialog *d)
 
   GString *str = g_string_new ("T-TEST /VARIABLES=");
 
-  append_variable_names (str, d->dict, GTK_TREE_VIEW (tv), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (tv), 0, str);
 
   g_string_append (str, "\n\t/GROUPS=");
 
@@ -400,9 +401,6 @@ t_test_independent_samples_dialog (GObject *o, gpointer data)
   GtkWidget *dict_view =
     get_widget_assert (xml, "indep-samples-t-test-treeview1");
 
-  GtkWidget *test_variables_treeview =
-    get_widget_assert (xml, "indep-samples-t-test-treeview2");
-
   GtkWidget *selector2 =
     get_widget_assert (xml, "indep-samples-t-test-selector2");
 
@@ -426,26 +424,14 @@ t_test_independent_samples_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (tt_d.dialog), GTK_WINDOW (de));
 
-  g_object_set (dict_view, "dictionary", tt_d.dict, NULL);
-
-  set_dest_model (GTK_TREE_VIEW (test_variables_treeview), tt_d.dict);
-
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector1),
-                                dict_view, test_variables_treeview,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
+  g_object_set (dict_view, "model", tt_d.dict, NULL);
 
   psppire_selector_set_allow (PSPPIRE_SELECTOR (selector1),
                              numeric_only);
 
 
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector2),
-                                dict_view, tt_d.groups_entry,
-                                insert_source_row_into_entry,
-                                is_currently_in_entry,
-                                NULL);
+  psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector2),
+                                is_currently_in_entry);
 
   g_signal_connect_swapped (tt_d.define_groups_button, "clicked",
                            G_CALLBACK (run_define_groups), &tt_d);
index 8b2d8af795e055552e3cec44981e1e6b5f2ed4f9..9301b2c316893566b5f891bf1f081d5e3de613e1 100644 (file)
@@ -21,6 +21,7 @@
 #include "t-test-one-sample.h"
 #include "psppire-dict.h"
 #include "psppire-var-store.h"
+#include "psppire-var-view.h"
 #include "helper.h"
 #include "psppire-data-window.h"
 #include "psppire-dialog.h"
@@ -58,7 +59,7 @@ generate_syntax (const struct tt_one_sample_dialog *d)
 
   g_string_append (str, "\n\t/VARIABLES=");
 
-  append_variable_names (str, d->dict, GTK_TREE_VIEW (d->vars_treeview), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (d->vars_treeview), 0, str);
 
   tt_options_dialog_append_syntax (d->opt, str);
 
@@ -135,8 +136,6 @@ t_test_one_sample_dialog (GObject *o, gpointer data)
   GtkWidget *options_button =
     get_widget_assert (xml, "button1");
 
-  GtkWidget *selector = get_widget_assert (xml, "psppire-selector1");
-
   GtkWidget *dialog = get_widget_assert (xml, "t-test-one-sample-dialog");
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
@@ -148,21 +147,11 @@ t_test_one_sample_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
-  g_object_set (dict_view, "dictionary",
+  g_object_set (dict_view, "model",
                tt_d.dict,
                "predicate",
                var_is_numeric, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (tt_d.vars_treeview), tt_d.dict);
-
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                dict_view, tt_d.vars_treeview,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
-
   g_signal_connect_swapped (dialog, "refresh",
                            G_CALLBACK (refresh),  &tt_d);
 
index 15b99ad21914c6e3b119b5ab810dc54e6941dc48..95e212aff7e21e12e95912a9ab46f9fd3824b9a0 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "psppire-data-window.h"
 #include "psppire-selector.h"
+#include "psppire-var-view.h"
 
 #include "psppire-dict.h"
 #include "psppire-var-store.h"
@@ -56,11 +57,11 @@ generate_syntax (const struct tt_paired_samples_dialog *d)
   gchar *text = NULL;
   GString *str =   g_string_new ("T-TEST \n\tPAIRS = ");
 
-  append_variable_names (str, d->dict, GTK_TREE_VIEW (d->pairs_treeview), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (d->pairs_treeview), 0, str);
 
   g_string_append (str, " WITH ");
 
-  append_variable_names (str, d->dict, GTK_TREE_VIEW (d->pairs_treeview), 1);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (d->pairs_treeview), 1, str);
 
   g_string_append (str, " (PAIRED)");
   g_string_append (str, "\n");
@@ -151,31 +152,6 @@ select_as_pair_member (GtkTreeIter source_iter,
     }
 }
 
-
-/* Append a new column to TV at position C, and heading TITLE */
-static void
-add_new_column (GtkTreeView *tv, const gchar *title, gint c)
-{
-  GtkTreeViewColumn *col = gtk_tree_view_column_new ();
-  GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
-
-  gtk_tree_view_column_set_min_width (col, 100);
-  gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-  gtk_tree_view_column_set_resizable (col, TRUE);
-
-
-  gtk_tree_view_column_set_title (col, title);
-
-  gtk_tree_view_column_pack_start (col, renderer, TRUE);
-
-  gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_FIXED);
-
-  gtk_tree_view_append_column (tv, col);
-
-  gtk_tree_view_column_add_attribute  (col, renderer, "text", c);
-}
-
-
 /* Pops up the dialog box */
 void
 t_test_paired_samples_dialog (GObject *o, gpointer data)
@@ -207,34 +183,16 @@ t_test_paired_samples_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
 
-  g_object_set (dict_view, "dictionary", tt_d.dict,
+  g_object_set (dict_view, "model", tt_d.dict,
                "predicate",
                var_is_numeric, NULL);
 
-  {
-    tt_d.list_store =
-      GTK_TREE_MODEL (
-                     gtk_list_store_new (2,
-                                         PSPPIRE_VAR_PTR_TYPE,
-                                         PSPPIRE_VAR_PTR_TYPE));
-
-
-    gtk_tree_view_set_model (GTK_TREE_VIEW (tt_d.pairs_treeview),
-                            GTK_TREE_MODEL (tt_d.list_store));
-
-
-    add_new_column (GTK_TREE_VIEW (tt_d.pairs_treeview), _("Var 1"), 0);
-    add_new_column (GTK_TREE_VIEW (tt_d.pairs_treeview), _("Var 2"), 1);
-  }
-
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                dict_view,
-                                tt_d.pairs_treeview,
-                                select_as_pair_member,
-                                NULL,
-                                &tt_d);
+  
+  tt_d.list_store = gtk_tree_view_get_model (GTK_TREE_VIEW (tt_d.pairs_treeview));
 
+  psppire_selector_set_select_func (PSPPIRE_SELECTOR (selector),
+                                   select_as_pair_member,
+                                   &tt_d);
 
   g_signal_connect_swapped (dialog, "refresh",
                            G_CALLBACK (refresh),  &tt_d);
index 74d8d0682d1f2b56afb5f5e1d12a44ef81473705..d8c2511315f2b265c33a97b30beba01681c61dfe 100644 (file)
@@ -93,6 +93,8 @@
                     <property name="receives_default">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="border_width">5</property>
+                    <property name="source_widget">indep-samples-t-test-treeview1</property>
+                    <property name="dest_widget">indep-samples-t-test-treeview2</property>
                   </object>
                   <packing>
                     <property name="x_options"></property>
                     <property name="receives_default">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="border_width">5</property>
+                    <property name="source_widget">indep-samples-t-test-treeview1</property>
+                    <property name="dest_widget">indep-samples-t-test-entry</property>
                   </object>
                   <packing>
                     <property name="top_attach">1</property>
                         <property name="vscrollbar_policy">automatic</property>
                         <property name="shadow_type">etched-in</property>
                         <child>
-                          <object class="GtkTreeView" id="indep-samples-t-test-treeview2">
+                          <object class="PsppireVarView" id="indep-samples-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">automatic</property>
                     <property name="shadow_type">etched-in</property>
                     <child>
-                      <object class="GtkTreeView" id="one-sample-t-test-treeview1">
+                      <object class="PsppireVarView" id="one-sample-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="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                 <property name="no_show_all">True</property>
                 <property name="border_width">5</property>
+                <property name="source_widget">one-sample-t-test-treeview2</property>
+                <property name="dest_widget">one-sample-t-test-treeview1</property>
               </object>
             </child>
           </object>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                     <property name="no_show_all">True</property>
                     <property name="border_width">5</property>
+                    <property name="source_widget">paired-samples-t-test-treeview1</property>
+                    <property name="dest_widget">paired-samples-t-test-treeview2</property>
                   </object>
                 </child>
               </object>
                             <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="hscrollbar_policy">never</property>
+                            <property name="hscrollbar_policy">always</property>
                             <property name="vscrollbar_policy">automatic</property>
                             <property name="shadow_type">etched-in</property>
                             <child>
-                              <object class="GtkTreeView" id="paired-samples-t-test-treeview2">
+                              <object class="PsppireVarView" id="paired-samples-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="enable_search">False</property>
+                                <property name="n-cols">2</property>
                               </object>
                             </child>
                           </object>
index 36640f6f752a71829b391c1310a243d97de8eb17..0061193e16b1b86f1d9dfa6c7c26d336e04cfb6b 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "transpose-dialog.h"
 #include "psppire-selector.h"
+#include "psppire-var-view.h"
 #include "psppire-dialog.h"
 #include "executor.h"
 #include "psppire-data-window.h"
@@ -88,30 +89,15 @@ transpose_dialog (GObject *o, gpointer data)
 
   GtkWidget *dialog = get_widget_assert (xml, "transpose-dialog");
   GtkWidget *source = get_widget_assert (xml, "source-treeview");
-  GtkWidget *dest = get_widget_assert (xml, "variables-treeview");
-  GtkWidget *selector1 = get_widget_assert (xml, "psppire-selector2");
   GtkWidget *selector2 = get_widget_assert (xml, "psppire-selector3");
-  GtkWidget *new_name_entry = get_widget_assert (xml, "new-name-entry");
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   g_object_get (vs, "dictionary", &dict, NULL);
-  g_object_set (source, "dictionary", dict, NULL);
-
-  set_dest_model (GTK_TREE_VIEW (dest), dict);
-
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector1),
-                                source, dest,
-                                insert_source_row_into_tree_view,
-                                NULL,
-                                NULL);
-
+  g_object_set (source, "model", dict, NULL);
 
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector2),
-                                source, new_name_entry,
-                                insert_source_row_into_entry,
-                                is_currently_in_entry,
-                                NULL);
+  psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector2),
+                                is_currently_in_entry);
 
 
   g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  xml);
@@ -166,7 +152,7 @@ generate_syntax (PsppireDict *dict, GtkBuilder *xml)
 
   g_string_append (string, " /VARIABLES = ");
 
-  append_variable_names (string, dict, GTK_TREE_VIEW (dest), 0);
+  psppire_var_view_append_names (PSPPIRE_VAR_VIEW (dest), 0, string);
 
   text = gtk_entry_get_text (GTK_ENTRY (entry));
 
index 11cee3e5d78a84b73d4e6ff63f5e85d9eed89cf3..cbc4d5cadb97eedc10b929e4532da9e820d7df3d 100644 (file)
@@ -65,7 +65,7 @@ populate_text (PsppireDictView *treeview, gpointer data)
   if ( var == NULL)
     return;
 
-  g_object_get (treeview, "dictionary", &dict,
+  g_object_get (treeview, "model", &dict,
                NULL);
 
   gstring = g_string_sized_new (200);
@@ -165,7 +165,7 @@ variable_info_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
   g_object_get (vs, "dictionary", &dict, NULL);
-  g_object_set (treeview, "dictionary", dict,
+  g_object_set (treeview, "model", dict,
                "selection-mode", GTK_SELECTION_SINGLE,
                NULL);
 
index b3087159f941adf7d16b7d2dc1d66f7165ee38d5..40951360d70186658642ec2a99c701ed8e9e042c 100644 (file)
@@ -132,19 +132,13 @@ weight_cases_dialog (GObject *o, gpointer data)
                    radiobutton1);
 
   
-  g_object_set (source, "dictionary", wcd.dict,
+  g_object_set (source, "model", wcd.dict,
                                 "selection-mode", GTK_SELECTION_SINGLE,
                                 "predicate", var_is_numeric,
                                 NULL);
 
-  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
-                                source,
-                                entry,
-                                insert_source_row_into_entry,
-                                is_currently_in_entry,
-                                NULL
-                                );
-
+  psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector),
+                                   is_currently_in_entry);
 
 
   wcd.entry = GTK_ENTRY (entry);
index 979224fe4152331227d6597cf3259e08fb996cb5..a1a55d1453a3816bd1a3bdf68c7b0b833bf3bccc 100644 (file)
@@ -10,6 +10,7 @@
 #include "psppire-keypad.h"
 #include "psppire-acr.h"
 #include "psppire-dictview.h"
+#include "psppire-var-view.h"
 
 
 /* Any custom widgets which are to be used in GtkBuilder ui files
@@ -25,4 +26,5 @@ preregister_widgets (void)
   psppire_keypad_get_type ();
   psppire_acr_get_type ();
   psppire_dict_view_get_type ();
+  psppire_var_view_get_type ();
 }