X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fui%2Fgui%2Fpsppire-dialog.c;h=37eaa1fb50234d0d95305277373eda2b1aec2a94;hb=3380cd42c3831b98b71709a0c1fcb175e3e4a5d9;hp=547ff2a4da25c155411b177fbc8ded3ce8ff943b;hpb=f481fd69631024bcdc7dc2369bbc1592d7a43ac7;p=pspp diff --git a/src/ui/gui/psppire-dialog.c b/src/ui/gui/psppire-dialog.c index 547ff2a4da..37eaa1fb50 100644 --- a/src/ui/gui/psppire-dialog.c +++ b/src/ui/gui/psppire-dialog.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2007, 2010, 2011, 2012 Free Software Foundation + Copyright (C) 2007, 2010, 2011, 2012, 2015 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 @@ -39,9 +39,29 @@ enum {DIALOG_REFRESH, static guint signals [n_SIGNALS]; +static GObjectClass *parent_class = NULL; + static void psppire_dialog_buildable_init (GtkBuildableIface *iface); +static void +psppire_dialog_finalize (GObject *object) +{ + PsppireDialog *dialog = PSPPIRE_DIALOG (object); + + g_free (dialog->help_page); + + if (G_OBJECT_CLASS (parent_class)->finalize) + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +psppire_dialog_base_init (PsppireDialogClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = psppire_dialog_finalize; +} GType psppire_dialog_get_type (void) @@ -53,7 +73,7 @@ psppire_dialog_get_type (void) static const GTypeInfo dialog_info = { sizeof (PsppireDialogClass), - NULL, /* base_init */ + (GBaseInitFunc) psppire_dialog_base_init, NULL, /* base_finalize */ (GClassInitFunc) psppire_dialog_class_init, NULL, /* class_finalize */ @@ -83,31 +103,13 @@ psppire_dialog_get_type (void) -static GObjectClass *parent_class = NULL; - - -static void -psppire_dialog_finalize (GObject *object) -{ - PsppireDialog *dialog ; - - g_return_if_fail (object != NULL); - g_return_if_fail (PSPPIRE_IS_DIALOG (object)); - - dialog = PSPPIRE_DIALOG (object); - - if (G_OBJECT_CLASS (parent_class)->finalize) - G_OBJECT_CLASS (parent_class)->finalize (object); -} - - - /* Properties */ enum { PROP_0, PROP_ORIENTATION, - PROP_SLIDING + PROP_SLIDING, + PROP_HELP_PAGE, }; @@ -134,6 +136,9 @@ psppire_dialog_get_property (GObject *object, case PROP_SLIDING: g_value_set_boolean (value, dialog->slidable); break; + case PROP_HELP_PAGE: + g_value_set_string (value, dialog->help_page); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -194,6 +199,9 @@ psppire_dialog_set_property (GObject *object, case PROP_ORIENTATION: dialog->orientation = g_value_get_enum (value); break; + case PROP_HELP_PAGE: + dialog->help_page = g_value_dup_string (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -211,6 +219,14 @@ psppire_dialog_class_init (PsppireDialogClass *class) GObjectClass *object_class = (GObjectClass *) class; GParamSpec *sliding_spec ; + GParamSpec *help_page_spec ; + + help_page_spec = + g_param_spec_string ("help-page", + "Help Page", + "The section of the manual to load when the Help button is clicked", + NULL, + G_PARAM_READWRITE); orientation_spec = g_param_spec_enum ("orientation", @@ -239,6 +255,11 @@ psppire_dialog_class_init (PsppireDialogClass *class) PROP_SLIDING, sliding_spec); + g_object_class_install_property (object_class, + PROP_HELP_PAGE, + help_page_spec); + + signals [DIALOG_REFRESH] = g_signal_new ("refresh", G_TYPE_FROM_CLASS (class), @@ -286,8 +307,6 @@ psppire_dialog_class_init (PsppireDialogClass *class) G_TYPE_STRING); - object_class->finalize = psppire_dialog_finalize; - parent_class = g_type_class_peek_parent (class); } @@ -327,6 +346,7 @@ psppire_dialog_init (PsppireDialog *dialog) dialog->contents_are_acceptable = NULL; dialog->acceptable_data = NULL; dialog->slidable = FALSE; + dialog->help_page = NULL; g_value_init (&value, orientation_spec->value_type); g_param_value_set_default (orientation_spec, &value); @@ -371,6 +391,13 @@ psppire_dialog_notify_change (PsppireDialog *dialog) } +static void +remove_notify_handlers (PsppireDialog *dialog, GObject *sel) +{ + g_signal_handlers_disconnect_by_data (sel, dialog); +} + + /* Descend the widget tree, connecting appropriate signals to the psppire_dialog_notify_change callback */ static void @@ -445,19 +472,22 @@ connect_notify_signal (GtkWidget *w, gpointer data) if ( model) { - g_signal_connect_swapped (model, "row-changed", - G_CALLBACK (psppire_dialog_notify_change), - dialog); + g_signal_connect_swapped (model, "row-changed", + G_CALLBACK (psppire_dialog_notify_change), + dialog); - g_signal_connect_swapped (model, "row-deleted", - G_CALLBACK (psppire_dialog_notify_change), - dialog); + g_signal_connect_swapped (model, "row-deleted", + G_CALLBACK (psppire_dialog_notify_change), + dialog); - g_signal_connect_swapped (model, "row-inserted", - G_CALLBACK (psppire_dialog_notify_change), - dialog); - } + g_signal_connect_swapped (model, "row-inserted", + G_CALLBACK (psppire_dialog_notify_change), + dialog); + g_signal_connect (dialog, "destroy", G_CALLBACK (remove_notify_handlers), + model); + } + g_signal_connect_swapped (selection, "changed", G_CALLBACK (psppire_dialog_notify_change), dialog); @@ -482,6 +512,12 @@ connect_notify_signal (GtkWidget *w, gpointer data) gint psppire_dialog_run (PsppireDialog *dialog) { + gchar *title = NULL; + g_object_get (dialog, "title", &title, NULL); + + if (title == NULL) + g_warning ("PsppireDialog %s has no title", gtk_widget_get_name (GTK_WIDGET (dialog))); + if ( dialog->contents_are_valid != NULL ) gtk_container_foreach (GTK_CONTAINER (dialog->box), connect_notify_signal, @@ -518,12 +554,13 @@ psppire_dialog_reload (PsppireDialog *dialog) void psppire_dialog_help (PsppireDialog *dialog) { - char *name = NULL; - g_object_get (dialog, "name", &name, NULL); + const char *page = NULL; + + g_object_get (dialog, "help-page", &page, NULL); - online_help (name); + online_help (page); - g_signal_emit (dialog, signals [DIALOG_HELP], 0, name); + g_signal_emit (dialog, signals [DIALOG_HELP], 0, page); }