+#include "data/value-labels.h"
+#include "data/format.h"
+#include "libpspp/i18n.h"
+#include "ui/gui/builder-wrapper.h"
+#include "ui/gui/helper.h"
+
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+static GObject *psppire_val_labs_dialog_constructor (GType type, guint,
+ GObjectConstructParam *);
+static void psppire_val_labs_dialog_finalize (GObject *);
+
+G_DEFINE_TYPE (PsppireValLabsDialog,
+ psppire_val_labs_dialog,
+ PSPPIRE_TYPE_DIALOG);
+enum
+ {
+ PROP_0,
+ PROP_VARIABLE,
+ PROP_VALUE_LABELS
+ };
+
+static void do_change (PsppireValLabsDialog *);
+
+static void
+psppire_val_labs_dialog_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PsppireValLabsDialog *obj = PSPPIRE_VAL_LABS_DIALOG (object);
+
+ switch (prop_id)
+ {
+ case PROP_VARIABLE:
+ psppire_val_labs_dialog_set_variable (obj, g_value_get_pointer (value));
+ break;
+ case PROP_VALUE_LABELS:
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+psppire_val_labs_dialog_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ PsppireValLabsDialog *obj = PSPPIRE_VAL_LABS_DIALOG (object);
+
+ switch (prop_id)
+ {
+ case PROP_VALUE_LABELS:
+ g_value_set_pointer (value, obj->labs);
+ break;
+ case PROP_VARIABLE:
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+psppire_val_labs_dialog_class_init (PsppireValLabsDialogClass *class)
+{
+ GObjectClass *gobject_class;
+ gobject_class = G_OBJECT_CLASS (class);
+
+ gobject_class->constructor = psppire_val_labs_dialog_constructor;
+ gobject_class->finalize = psppire_val_labs_dialog_finalize;
+ gobject_class->set_property = psppire_val_labs_dialog_set_property;
+ gobject_class->get_property = psppire_val_labs_dialog_get_property;
+
+ g_object_class_install_property (
+ gobject_class, PROP_VARIABLE,
+ g_param_spec_pointer ("variable",
+ "Variable",
+ "Variable whose value labels are to be edited. The "
+ "variable's print format and encoding are also used "
+ "for editing.",
+ G_PARAM_WRITABLE));
+
+ g_object_class_install_property (
+ gobject_class, PROP_VALUE_LABELS,
+ g_param_spec_pointer ("value-labels",
+ "Value Labels",
+ "Edited value labels.",
+ G_PARAM_READABLE));
+}
+
+static void
+psppire_val_labs_dialog_init (PsppireValLabsDialog *obj)
+{
+ /* We do all of our work on widgets in the constructor function, because that
+ runs after the construction properties have been set. Otherwise
+ PsppireDialog's "orientation" property hasn't been set and therefore we
+ have no box to populate. */
+ obj->labs = val_labs_create (0);
+}
+
+static void
+psppire_val_labs_dialog_finalize (GObject *obj)
+{
+ PsppireValLabsDialog *dialog = PSPPIRE_VAL_LABS_DIALOG (obj);
+
+ val_labs_destroy (dialog->labs);
+ g_free (dialog->encoding);
+
+ G_OBJECT_CLASS (psppire_val_labs_dialog_parent_class)->finalize (obj);
+}
+
+PsppireValLabsDialog *
+psppire_val_labs_dialog_new (const struct variable *var)
+{
+ return PSPPIRE_VAL_LABS_DIALOG (
+ g_object_new (PSPPIRE_TYPE_VAL_LABS_DIALOG,
+ "variable", var,
+ NULL));
+}
+
+struct val_labs *
+psppire_val_labs_dialog_run (GtkWindow *parent_window,
+ const struct variable *var)
+{
+ PsppireValLabsDialog *dialog;
+ struct val_labs *labs;
+
+ dialog = psppire_val_labs_dialog_new (var);
+ gtk_window_set_transient_for (GTK_WINDOW (dialog), parent_window);
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+ gtk_widget_show (GTK_WIDGET (dialog));
+
+ labs = (psppire_dialog_run (PSPPIRE_DIALOG (dialog)) == GTK_RESPONSE_OK
+ ? val_labs_clone (psppire_val_labs_dialog_get_value_labels (dialog))
+ : NULL);
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+
+ return labs;
+}