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 \
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
</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"/>
--- /dev/null
+#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;
+}
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 \
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 \
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 \
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");
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;
#include "checkbox-treeview.h"
#include "crosstabs-dialog.h"
+#include "psppire-var-view.h"
#include <gtk/gtk.h>
#include <stdlib.h>
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=");
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");
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);
<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>
<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>
-<?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>
<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>
</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>
#include "checkbox-treeview.h"
#include "descriptives-dialog.h"
+#include "psppire-var-view.h"
#include <gtk/gtk.h>
#include <stdlib.h>
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);
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");
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);
<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>
<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>
#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);
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.
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 )
{
type = var_get_type (v);
}
-
return retval;
}
#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.
}
-
void
insert_source_row_into_entry (GtkTreeIter iter,
GtkWidget *dest,
}
-
void
insert_source_row_into_tree_view (GtkTreeIter iter,
GtkWidget *dest,
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)
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);
gpointer data
);
-
/* A SelectItemsFunc function for GtkEntry widgets */
void insert_source_row_into_entry (GtkTreeIter source_iter,
GtkWidget *dest,
/* 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
#include <config.h>
#include "examine-dialog.h"
+#include "psppire-var-view.h"
#include <gtk/gtk.h>
#include <stdlib.h>
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));
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;
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),
<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>
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);
<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>
#include "checkbox-treeview.h"
#include "frequencies-dialog.h"
+#include "psppire-var-view.h"
#include <gtk/gtk.h>
#include <stdlib.h>
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=");
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");
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");
<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>
<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>
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"
#include "psppire-selector.h"
#include "dict-display.h"
-
#include <language/syntax-string-source.h>
#include "executor.h"
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");
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);
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 ");
<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>
#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"
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));
#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>
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);
}
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 ();
enum
{
PROP_0,
- PROP_MODEL,
PROP_DICTIONARY,
PROP_PREDICATE,
PROP_SELECTION_MODE
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;
{
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",
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,
static void
dv_get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter,
- GtkTreeModel **model, GtkTreeIter *iter
- )
+ GtkTreeModel **model, GtkTreeIter *iter)
{
*model = top_model;
/* 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
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>
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,
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;
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)
{
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;
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),
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
+
+ class->default_selection_funcs = g_hash_table_new (g_direct_hash, g_direct_equal);
}
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);
}
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;
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);
+
}
}
}
-/* 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)
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.
*/
}
}
+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,
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));
{ /* 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);
}
}
+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
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);
}
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)
{
GtkWidget *arrow;
GtkAction *action;
+ gboolean dispose_has_run;
+
enum psppire_selector_dir direction;
+
GtkWidget *source;
GtkWidget *dest;
FilterItemsFunc *filter;
AllowSelectionFunc *allow_selection;
+
+ gulong row_activate_id ;
+
+ gulong source_select_id ;
+
+ gboolean primary_requested;
};
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;
(psppire_selector_orientation_get_type())
+void psppire_selector_set_default_selection_func (GType type, SelectItemsFunc *);
+
G_END_DECLS
--- /dev/null
+/* PSPPIRE - a graphical user interface for PSPP.
+ Copyright (C) 2009 Free Software Foundation
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <gtk/gtktreeview.h>
+#include <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;
+}
+
--- /dev/null
+/* PSPPIRE - a graphical user interface for PSPP.
+ Copyright (C) 2009 Free Software Foundation
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#ifndef __PSPPIRE_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__ */
#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"
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);
<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>
#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"
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)
{
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 = ");
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");
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);
<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>
#include "executor.h"
+#include "psppire-var-view.h"
+
#include <gtk/gtk.h>
#include <xalloc.h>
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;
};
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,
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
{
if ( !gtk_tree_model_get_iter_first (vars, ¬_used))
return FALSE;
-
}
return TRUE;
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?
}
}
+/* 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
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);
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
{
gtk_entry_set_text (GTK_ENTRY (rd->new_label_entry), "");
}
+
g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
g_list_free (rows);
}
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));
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);
}
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)
{
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");
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 */
break;
}
+ g_hash_table_destroy (rd.varmap);
gtk_list_store_clear (GTK_LIST_STORE (rd.value_map));
g_object_unref (rd.value_map);
/* 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));
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);
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");
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");
<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>
#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"
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;
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");
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);
<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>
<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>
#include "psppire-dialog.h"
#include "psppire-data-window.h"
+#include "psppire-var-view.h"
#include "executor.h"
#include "helper.h"
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");
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 =
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=");
<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>
<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>
--- /dev/null
+/* PSPPIRE - a graphical user interface for PSPP.
+ Copyright (C) 2009 Free Software Foundation
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "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;
+}
--- /dev/null
+/* PSPPIRE - a graphical user interface for PSPP.
+ Copyright (C) 2009 Free Software Foundation
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef __ROC_DIALOG_H
+#define __ROC_DIALOG_H
+
+
+#include <gtk/gtk.h>
+
+void roc_dialog (GObject *o, gpointer data);
+
+#endif
--- /dev/null
+<?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">•</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">•</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>
{
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);
}
#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"
struct sort_cases_dialog
{
- GtkTreeView *tv;
+ PsppireVarView *tv;
PsppireDict *dict;
GtkToggleButton *ascending;
};
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);
{
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, "");
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);
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"));
<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>
<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>
#include "helper.h"
#include <data/dictionary.h>
+#include "psppire-var-view.h"
+
#include <gtk/gtk.h>
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 )
{
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));
#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"
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=");
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");
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);
#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"
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);
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);
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);
#include "psppire-data-window.h"
#include "psppire-selector.h"
+#include "psppire-var-view.h"
#include "psppire-dict.h"
#include "psppire-var-store.h"
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");
}
}
-
-/* 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)
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);
<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>
#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"
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);
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));
if ( var == NULL)
return;
- g_object_get (treeview, "dictionary", &dict,
+ g_object_get (treeview, "model", &dict,
NULL);
gstring = g_string_sized_new (200);
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);
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);
#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
psppire_keypad_get_type ();
psppire_acr_get_type ();
psppire_dict_view_get_type ();
+ psppire_var_view_get_type ();
}