From 4e3feede0f6b3d2e67d6e41a9ddea3738e574dc3 Mon Sep 17 00:00:00 2001
From: John Darrington <john@darrington.wattle.id.au>
Date: Wed, 2 Oct 2013 15:14:15 +0200
Subject: [PATCH] Replace checkbox-treeview functions with a object
 PsppireCheckboxTreeview

Prior to this change there existed a function which operated on
a GtkTreeView which populated it with a model and renderers such
that it would display a list of annotated checkboxes.

This change subclasses GtkTreeView and moves the function to a
method of that class.

I anticipate this will ease implementation of upcoming functionality.
---
 src/ui/gui/automake.mk                        |   4 +-
 src/ui/gui/checkbox-treeview.h                |  43 ------
 src/ui/gui/crosstabs.ui                       |   4 +-
 src/ui/gui/descriptives.ui                    |   2 +-
 src/ui/gui/frequencies.ui                     |   2 +-
 ...treeview.c => psppire-checkbox-treeview.c} | 127 +++++++++++-------
 src/ui/gui/psppire-checkbox-treeview.h        |  88 ++++++++++++
 src/ui/gui/psppire-dialog-action-crosstabs.c  |  20 ++-
 src/ui/gui/psppire-dialog-action-crosstabs.h  |   8 ++
 .../gui/psppire-dialog-action-descriptives.c  |   8 +-
 .../gui/psppire-dialog-action-frequencies.c   |   4 +-
 src/ui/gui/psppire-dialog-action-regression.c |  10 +-
 src/ui/gui/regression.ui                      |   2 +-
 src/ui/gui/widgets.c                          |   2 +
 14 files changed, 207 insertions(+), 117 deletions(-)
 delete mode 100644 src/ui/gui/checkbox-treeview.h
 rename src/ui/gui/{checkbox-treeview.c => psppire-checkbox-treeview.c} (54%)
 create mode 100644 src/ui/gui/psppire-checkbox-treeview.h

diff --git a/src/ui/gui/automake.mk b/src/ui/gui/automake.mk
index 47a3215835..f5bd07bee3 100644
--- a/src/ui/gui/automake.mk
+++ b/src/ui/gui/automake.mk
@@ -137,8 +137,6 @@ src_ui_gui_psppire_SOURCES = \
 	src/ui/gui/aggregate-dialog.h \
 	src/ui/gui/builder-wrapper.c \
 	src/ui/gui/builder-wrapper.h \
-	src/ui/gui/checkbox-treeview.c \
-	src/ui/gui/checkbox-treeview.h \
 	src/ui/gui/comments-dialog.c \
 	src/ui/gui/comments-dialog.h \
 	src/ui/gui/compute-dialog.c \
@@ -178,6 +176,8 @@ src_ui_gui_psppire_SOURCES = \
 	src/ui/gui/psppire.h \
 	src/ui/gui/psppire-acr.h \
 	src/ui/gui/psppire-buttonbox.h \
+	src/ui/gui/psppire-checkbox-treeview.c \
+	src/ui/gui/psppire-checkbox-treeview.h \
 	src/ui/gui/psppire-conf.c \
 	src/ui/gui/psppire-conf.h \
 	src/ui/gui/psppire-data-editor.c \
diff --git a/src/ui/gui/checkbox-treeview.h b/src/ui/gui/checkbox-treeview.h
deleted file mode 100644
index 1616b7349e..0000000000
--- a/src/ui/gui/checkbox-treeview.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007  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 __CHECKBOX_TREEVIEW_H__
-#define __CHECKBOX_TREEVIEW_H__ 1
-
-
-#include <gtk/gtk.h>
-
-struct checkbox_entry_item
-  {
-    const char *name;
-    const char *label;
-  };
-
-enum
-  {
-    CHECKBOX_COLUMN_LABEL,
-    CHECKBOX_COLUMN_SELECTED,
-    N_CHECKBOX_COLUMNS
-  };
-
-
-void put_checkbox_items_in_treeview (GtkTreeView *treeview,
-				     guint default_items,
-				     gint n_items,
-				     const struct checkbox_entry_item *items
-				     );
-#endif
diff --git a/src/ui/gui/crosstabs.ui b/src/ui/gui/crosstabs.ui
index 3e6ceb5634..ac864041db 100644
--- a/src/ui/gui/crosstabs.ui
+++ b/src/ui/gui/crosstabs.ui
@@ -355,7 +355,7 @@
                 <property name="vscrollbar_policy">automatic</property>
                 <property name="shadow_type">in</property>
                 <child>
-                  <object class="GtkTreeView" id="cell-view">
+                  <object class="PsppireCheckboxTreeview" id="cell-view">
                     <property name="visible">True</property>
                     <property name="headers_visible">False</property>
                   </object>
@@ -415,7 +415,7 @@
                 <property name="vscrollbar_policy">automatic</property>
                 <property name="shadow_type">in</property>
                 <child>
-                  <object class="GtkTreeView" id="stats-view">
+                  <object class="PsppireCheckboxTreeview" id="stats-view">
                     <property name="width_request">128</property>
                     <property name="height_request">150</property>
                     <property name="visible">True</property>
diff --git a/src/ui/gui/descriptives.ui b/src/ui/gui/descriptives.ui
index 70fef5df1a..a573cc1be3 100644
--- a/src/ui/gui/descriptives.ui
+++ b/src/ui/gui/descriptives.ui
@@ -141,7 +141,7 @@
                                     <property name="vscrollbar_policy">automatic</property>
                                     <property name="shadow_type">etched-in</property>
                                     <child>
-                                      <object class="GtkTreeView" id="statistics">
+                                      <object class="PsppireCheckboxTreeview" id="statistics">
                                         <property name="height_request">200</property>
                                         <property name="visible">True</property>
                                         <property name="can_focus">True</property>
diff --git a/src/ui/gui/frequencies.ui b/src/ui/gui/frequencies.ui
index e0bb6c6e7f..a65e45f0b9 100644
--- a/src/ui/gui/frequencies.ui
+++ b/src/ui/gui/frequencies.ui
@@ -130,7 +130,7 @@
                             <property name="vscrollbar_policy">automatic</property>
                             <property name="shadow_type">etched-in</property>
                             <child>
-                              <object class="GtkTreeView" id="stats-treeview">
+                              <object class="PsppireCheckboxTreeview" id="stats-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>
diff --git a/src/ui/gui/checkbox-treeview.c b/src/ui/gui/psppire-checkbox-treeview.c
similarity index 54%
rename from src/ui/gui/checkbox-treeview.c
rename to src/ui/gui/psppire-checkbox-treeview.c
index 324943ab84..9cf5030219 100644
--- a/src/ui/gui/checkbox-treeview.c
+++ b/src/ui/gui/psppire-checkbox-treeview.c
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2012  Free Software Foundation
+   Copyright (C) 2007, 2012, 2013  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
@@ -14,20 +14,60 @@
    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 "checkbox-treeview.h"
+/* 
+   This module provides a subclass of GtkTreeView, designed for dialogs
+   which need lists of annotated checkbox items.
+   The object contains the necessary model and renderers, which means that
+   the user does not have to create these herself.
+ */
+
+#include <config.h>
 #include <gtk/gtk.h>
 
+#include "psppire-checkbox-treeview.h"
+
+
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 
+static void psppire_checkbox_treeview_init          (PsppireCheckboxTreeview      *cbtv);
+
+GType
+psppire_checkbox_treeview_get_type (void)
+{
+  static GType psppire_checkbox_treeview_type = 0;
+
+  if (!psppire_checkbox_treeview_type)
+    {
+      static const GTypeInfo psppire_checkbox_treeview_info =
+      {
+	sizeof (PsppireCheckboxTreeviewClass),
+	(GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+	(GClassInitFunc) NULL,
+	(GClassFinalizeFunc) NULL,
+	NULL,
+        sizeof (PsppireCheckboxTreeview),
+	0,
+	(GInstanceInitFunc) psppire_checkbox_treeview_init,
+      };
+
+      psppire_checkbox_treeview_type =
+	g_type_register_static (GTK_TYPE_TREE_VIEW, "PsppireCheckboxTreeview",
+				&psppire_checkbox_treeview_info, 0);
+    }
+
+  return psppire_checkbox_treeview_type;
+}
+
+
 
 /* Callback for checkbox cells in the statistics tree view.
    Toggles the checkbox. */
 static void
-toggle (GtkCellRendererToggle *cell_renderer, gchar *path_str, gpointer data)
+toggle (GtkCellRendererToggle *cell_renderer, const gchar *path_str, gpointer data)
 {
   GtkTreeView *tv = GTK_TREE_VIEW (data);
   GtkTreeModel *model = gtk_tree_view_get_model (tv);
@@ -42,44 +82,13 @@ toggle (GtkCellRendererToggle *cell_renderer, gchar *path_str, gpointer data)
   gtk_tree_path_free (path);
 }
 
-
-static void
-treeview_create_checkbox_model (GtkTreeView *treeview,
-				guint default_items,
-				gint n_items,
-				const struct checkbox_entry_item *items
-				)
-{
-  GtkListStore *list;
-  size_t i;
-
-  list = gtk_list_store_new (N_CHECKBOX_COLUMNS,
-			     G_TYPE_STRING, G_TYPE_BOOLEAN);
-
-  for (i = 0; i < n_items; i++)
-    {
-      GtkTreeIter iter;
-      gtk_list_store_append (list, &iter);
-      gtk_list_store_set (list, &iter,
-                          CHECKBOX_COLUMN_LABEL, gettext (items[i].label),
-                          CHECKBOX_COLUMN_SELECTED,
-			  (default_items & (1u << i)) != 0,
-                          -1);
-    }
-
-  gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (list));
-  g_object_unref (list);
-}
-
+/* Create the necessary columns and renderers and add them to the widget */
 static void
 treeview_checkbox_populate (GtkTreeView *treeview)
 {
-  GtkTreeViewColumn *col;
-  GtkCellRenderer *renderer;
-
   /* Checkbox column. */
-  col = gtk_tree_view_column_new ();
-  renderer = gtk_cell_renderer_toggle_new ();
+  GtkTreeViewColumn *col = gtk_tree_view_column_new ();
+  GtkCellRenderer *renderer = gtk_cell_renderer_toggle_new ();
 
   gtk_tree_view_column_pack_start (col, renderer, TRUE);
 
@@ -105,14 +114,42 @@ treeview_checkbox_populate (GtkTreeView *treeview)
   gtk_tree_view_append_column (treeview, col);
 }
 
+static void
+psppire_checkbox_treeview_init (PsppireCheckboxTreeview *cbtv)
+{
+  cbtv->list = GTK_TREE_MODEL (gtk_list_store_new (N_CHECKBOX_COLUMNS,
+						  G_TYPE_STRING, 
+						  G_TYPE_BOOLEAN));
+
+  gtk_tree_view_set_model (GTK_TREE_VIEW (cbtv), cbtv->list);
+  g_object_unref (cbtv->list);
 
+  treeview_checkbox_populate (GTK_TREE_VIEW (cbtv));
+}
+
+
+/*
+  Load the object's model from the array ITEMS.
+  N_ITEMS is the size of the array.
+  DEFAULT_ITEMS is a bitwise field indicating the initial state
+  of the items.
+*/
 void
-put_checkbox_items_in_treeview (GtkTreeView *treeview,
-				guint default_items,
-				gint n_items,
-				const struct checkbox_entry_item *items
-				)
+psppire_checkbox_treeview_populate (PsppireCheckboxTreeview *cbtv,
+				    guint default_items,
+				    gint n_items,
+				    const struct checkbox_entry_item *items)
 {
-  treeview_create_checkbox_model (treeview, default_items, n_items, items);
-  treeview_checkbox_populate (treeview);
+  size_t i;
+  for (i = 0; i < n_items; ++i)
+    {
+      GtkTreeIter iter;
+      gtk_list_store_append (GTK_LIST_STORE (cbtv->list), &iter);
+      gtk_list_store_set (GTK_LIST_STORE (cbtv->list), &iter,
+                          CHECKBOX_COLUMN_LABEL, gettext (items[i].label),
+                          CHECKBOX_COLUMN_SELECTED,
+			  (default_items & (1u << i)) != 0,
+                          -1);
+    }
+
 }
diff --git a/src/ui/gui/psppire-checkbox-treeview.h b/src/ui/gui/psppire-checkbox-treeview.h
new file mode 100644
index 0000000000..b61cfdcc3c
--- /dev/null
+++ b/src/ui/gui/psppire-checkbox-treeview.h
@@ -0,0 +1,88 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2007, 2013  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_CHECKBOX_TREEVIEW_H__
+#define __PSPPIRE_CHECKBOX_TREEVIEW_H__
+
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+
+#define PSPPIRE_TYPE_CHECKBOX_TREEVIEW            (psppire_checkbox_treeview_get_type ())
+
+#define PSPPIRE_CHECKBOX_TREEVIEW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+    PSPPIRE_TYPE_CHECKBOX_TREEVIEW, PsppireCheckboxTreeview))
+
+#define PSPPIRE_CHECKBOX_TREEVIEW_CLASS(class)    (G_TYPE_CHECK_CLASS_CAST ((class), \
+    PSPPIRE_TYPE_CHECKBOX_TREEVIEW, PsppireCheckboxTreeviewClass))
+
+#define PSPPIRE_IS_CHECKBOX_TREEVIEW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+    PSPPIRE_TYPE_CHECKBOX_TREEVIEW))
+
+#define PSPPIRE_IS_CHECKBOX_TREEVIEW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \
+    PSPPIRE_TYPE_CHECKBOX_TREEVIEW))
+
+
+typedef struct _PsppireCheckboxTreeview       PsppireCheckboxTreeview;
+typedef struct _PsppireCheckboxTreeviewClass  PsppireCheckboxTreeviewClass;
+
+
+struct _PsppireCheckboxTreeview
+{
+  GtkTreeView parent;
+
+  /* <private> */
+  GtkTreeModel *list;
+};
+
+
+struct _PsppireCheckboxTreeviewClass
+{
+  GtkTreeViewClass parent_class;
+};
+
+
+
+GType      psppire_checkbox_treeview_get_type        (void);
+GType      psppire_checkbox_treeview_model_get_type        (void);
+
+
+struct checkbox_entry_item
+  {
+    const char *name;
+    const char *label;
+  };
+
+enum
+  {
+    CHECKBOX_COLUMN_LABEL,
+    CHECKBOX_COLUMN_SELECTED,
+    N_CHECKBOX_COLUMNS
+  };
+
+void psppire_checkbox_treeview_populate (PsppireCheckboxTreeview *pctv,
+					 guint default_items,
+					 gint n_items,
+					 const struct checkbox_entry_item *items);
+
+G_END_DECLS
+
+#endif /* __PSPPIRE_CHECKBOX_TREEVIEW_H__ */
diff --git a/src/ui/gui/psppire-dialog-action-crosstabs.c b/src/ui/gui/psppire-dialog-action-crosstabs.c
index 2bc07c6e4c..b0b08b5ce6 100644
--- a/src/ui/gui/psppire-dialog-action-crosstabs.c
+++ b/src/ui/gui/psppire-dialog-action-crosstabs.c
@@ -27,7 +27,7 @@
 
 #include "psppire-dialog.h"
 #include "builder-wrapper.h"
-#include "checkbox-treeview.h"
+#include "psppire-checkbox-treeview.h"
 #include "psppire-dict.h"
 #include "libpspp/str.h"
 
@@ -235,19 +235,17 @@ psppire_dialog_action_crosstabs_activate (GtkAction *a)
   act->format_options_table = TRUE;
   act->format_options_pivot = TRUE;
 
-  put_checkbox_items_in_treeview (GTK_TREE_VIEW (act->cell_view),
-				  B_CS_CELL_DEFAULT,
-				  N_CROSSTABS_CELLS,
-				  cells
-				  );
+  psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (act->cell_view),
+  				  B_CS_CELL_DEFAULT,
+  				  N_CROSSTABS_CELLS,
+  				  cells);
 
   act->cell = gtk_tree_view_get_model (GTK_TREE_VIEW (act->cell_view));
 
-  put_checkbox_items_in_treeview (GTK_TREE_VIEW (act->stat_view),
-				  B_CS_STATS_DEFAULT,
-				  N_CROSSTABS_STATS,
-				  stats
-				  );
+  psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (act->stat_view),
+  				  B_CS_STATS_DEFAULT,
+  				  N_CROSSTABS_STATS,
+  				  stats);
 
   act->stat = gtk_tree_view_get_model (GTK_TREE_VIEW (act->stat_view));
 
diff --git a/src/ui/gui/psppire-dialog-action-crosstabs.h b/src/ui/gui/psppire-dialog-action-crosstabs.h
index ee8169aece..a286e0f828 100644
--- a/src/ui/gui/psppire-dialog-action-crosstabs.h
+++ b/src/ui/gui/psppire-dialog-action-crosstabs.h
@@ -20,6 +20,14 @@
 
 #include "psppire-dialog-action.h"
 
+/* 
+   This module provides a subclass of GtkTreeView, designed for dialogs
+   which need lists of annotated checkbox items.
+   The object contains the necessary model and renderers, which means that
+   the user does not have to create these herself.
+ */
+
+
 #ifndef __PSPPIRE_DIALOG_ACTION_CROSSTABS_H__
 #define __PSPPIRE_DIALOG_ACTION_CROSSTABS_H__
 
diff --git a/src/ui/gui/psppire-dialog-action-descriptives.c b/src/ui/gui/psppire-dialog-action-descriptives.c
index b83cea8067..4510917266 100644
--- a/src/ui/gui/psppire-dialog-action-descriptives.c
+++ b/src/ui/gui/psppire-dialog-action-descriptives.c
@@ -19,7 +19,7 @@
 
 #include "psppire-dialog-action-descriptives.h"
 
-#include "checkbox-treeview.h"
+#include "psppire-checkbox-treeview.h"
 
 #include "psppire-var-view.h"
 #include "psppire-dict.h"
@@ -209,9 +209,9 @@ psppire_dialog_action_descriptives_activate (GtkAction *a)
   g_object_set (pda->source, "model", pda->dict,
 	"predicate", var_is_numeric, NULL);
 
-  put_checkbox_items_in_treeview (GTK_TREE_VIEW (stats_treeview),
-				  B_DS_DEFAULT,
-				  N_DESCRIPTIVE_STATS, stats);
+  psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (stats_treeview),
+				      B_DS_DEFAULT,
+				      N_DESCRIPTIVE_STATS, stats);
 
   act->stat_vars = GTK_TREE_VIEW (act->variables);
   act->stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats_treeview));
diff --git a/src/ui/gui/psppire-dialog-action-frequencies.c b/src/ui/gui/psppire-dialog-action-frequencies.c
index 6f8049009e..a5c5010a09 100644
--- a/src/ui/gui/psppire-dialog-action-frequencies.c
+++ b/src/ui/gui/psppire-dialog-action-frequencies.c
@@ -27,7 +27,7 @@ This program is free software: you can redistribute it and/or modify
 
 #include "psppire-dialog.h"
 #include "builder-wrapper.h"
-#include "checkbox-treeview.h"
+#include "psppire-checkbox-treeview.h"
 #include "psppire-dict.h"
 #include "libpspp/str.h"
 
@@ -263,7 +263,7 @@ psppire_dialog_action_frequencies_activate (GtkAction * a)
 
   act->stat_vars = get_widget_assert (xml, "var-treeview");
 
-  put_checkbox_items_in_treeview (GTK_TREE_VIEW (stats_treeview),
+  psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (stats_treeview),
                                   B_FS_DEFAULT, N_FREQUENCY_STATS, stats);
 
   act->stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats_treeview));
diff --git a/src/ui/gui/psppire-dialog-action-regression.c b/src/ui/gui/psppire-dialog-action-regression.c
index 29df2a4392..fe3d4418cf 100644
--- a/src/ui/gui/psppire-dialog-action-regression.c
+++ b/src/ui/gui/psppire-dialog-action-regression.c
@@ -27,7 +27,7 @@
 
 #include "psppire-dialog.h"
 #include "builder-wrapper.h"
-#include "checkbox-treeview.h"
+#include "psppire-checkbox-treeview.h"
 #include "psppire-dict.h"
 #include "libpspp/str.h"
 
@@ -162,10 +162,10 @@ psppire_dialog_action_regression_activate (GtkAction *a)
 
   g_object_unref (xml);
 
-  put_checkbox_items_in_treeview (GTK_TREE_VIEW (act->stat_view),
-				  B_RG_STATS_DEFAULT,
-				  N_REGRESSION_STATS,
-				  stats);
+  psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (act->stat_view),
+  				  B_RG_STATS_DEFAULT,
+  				  N_REGRESSION_STATS,
+  				  stats);
 
   psppire_dialog_action_set_refresh (pda, refresh);
 
diff --git a/src/ui/gui/regression.ui b/src/ui/gui/regression.ui
index e56c095c1d..d7a0675f4d 100644
--- a/src/ui/gui/regression.ui
+++ b/src/ui/gui/regression.ui
@@ -340,7 +340,7 @@
                     <property name="vscrollbar_policy">automatic</property>
                     <property name="shadow_type">etched-in</property>
                     <child>
-                      <object class="GtkTreeView" id="stat-view">
+                      <object class="PsppireCheckboxTreeview" id="stat-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>
diff --git a/src/ui/gui/widgets.c b/src/ui/gui/widgets.c
index 488656e9e6..7046df8c93 100644
--- a/src/ui/gui/widgets.c
+++ b/src/ui/gui/widgets.c
@@ -14,6 +14,7 @@
 #include "psppire-dictview.h"
 #include "psppire-var-view.h"
 #include "psppire-val-chooser.h"
+#include "psppire-checkbox-treeview.h"
 
 #include "psppire-dialog-action-binomial.h"
 #include "psppire-dialog-action-correlation.h"
@@ -53,6 +54,7 @@ preregister_widgets (void)
   psppire_dict_view_get_type ();
   psppire_var_view_get_type ();
   psppire_value_entry_get_type ();
+  psppire_checkbox_treeview_get_type ();
 
   psppire_dialog_action_binomial_get_type ();
   psppire_dialog_action_correlation_get_type ();
-- 
2.30.2