X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dialog.c;h=4f3bb243132dbe8c85dd69c471ecc2dfebcab696;hb=dcd593ebc418681f2a7f14795b13f94eaa95ccaf;hp=7369cbbf60c186ab3ddc51e796927f8f2123702a;hpb=531de52e961c7feaa6f5e86f1de36afa69ab1fab;p=pspp diff --git a/src/ui/gui/psppire-dialog.c b/src/ui/gui/psppire-dialog.c index 7369cbbf60..4f3bb24313 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 @@ -41,9 +41,6 @@ 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) { @@ -73,29 +70,19 @@ psppire_dialog_get_type (void) static const GTypeInfo dialog_info = { sizeof (PsppireDialogClass), - psppire_dialog_base_init, + (GBaseInitFunc) (void (*)(void)) psppire_dialog_base_init, NULL, /* base_finalize */ - (GClassInitFunc) psppire_dialog_class_init, + (GClassInitFunc) (void (*)(void)) psppire_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (PsppireDialog), 0, - (GInstanceInitFunc) psppire_dialog_init, - }; - - static const GInterfaceInfo buildable_info = - { - (GInterfaceInitFunc) psppire_dialog_buildable_init, - NULL, - NULL + (GInstanceInitFunc) (void (*)(void)) psppire_dialog_init, + NULL /* value_table */ }; dialog_type = g_type_register_static (PSPPIRE_TYPE_WINDOW_BASE, "PsppireDialog", &dialog_info, 0); - - g_type_add_interface_static (dialog_type, - GTK_TYPE_BUILDABLE, - &buildable_info); } return dialog_type; @@ -123,16 +110,6 @@ psppire_dialog_get_property (GObject *object, switch (prop_id) { - case PROP_ORIENTATION: - { - if ( GTK_IS_VBOX (dialog->box) || GTK_VPANED (dialog->box)) - g_value_set_enum (value, PSPPIRE_VERTICAL); - else if ( GTK_IS_HBOX (dialog->box) || GTK_HPANED (dialog->box)) - g_value_set_enum (value, PSPPIRE_HORIZONTAL); - else if ( GTK_IS_TABLE (dialog->box)) - g_value_set_enum (value, PSPPIRE_TABULAR); - } - break; case PROP_SLIDING: g_value_set_boolean (value, dialog->slidable); break; @@ -145,43 +122,6 @@ psppire_dialog_get_property (GObject *object, }; } - -static void -dialog_set_container (PsppireDialog *dialog) -{ - if ( dialog->box != NULL) - { - gtk_container_remove (GTK_CONTAINER (dialog), dialog->box); - } - - switch (dialog->orientation) - { - case PSPPIRE_HORIZONTAL: - if ( dialog->slidable) - dialog->box = gtk_hpaned_new(); - else - dialog->box = gtk_hbox_new (FALSE, 5); - break; - case PSPPIRE_VERTICAL: - if ( dialog->slidable) - dialog->box = gtk_vpaned_new(); - else - dialog->box = gtk_vbox_new (FALSE, 5); - break; - case PSPPIRE_TABULAR: - dialog->box = gtk_table_new (2, 3, FALSE); - g_object_set (dialog->box, - "row-spacing", 5, - "column-spacing", 5, - NULL); - break; - } - - gtk_widget_show_all (dialog->box); - gtk_container_add (GTK_CONTAINER (dialog), dialog->box); -} - - static void psppire_dialog_set_property (GObject *object, guint prop_id, @@ -196,9 +136,6 @@ psppire_dialog_set_property (GObject *object, case PROP_SLIDING: dialog->slidable = g_value_get_boolean (value); break; - case PROP_ORIENTATION: - dialog->orientation = g_value_get_enum (value); - break; case PROP_HELP_PAGE: dialog->help_page = g_value_dup_string (value); break; @@ -206,13 +143,8 @@ psppire_dialog_set_property (GObject *object, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; }; - - dialog_set_container (dialog); } - -static GParamSpec *orientation_spec ; - static void psppire_dialog_class_init (PsppireDialogClass *class) { @@ -221,21 +153,13 @@ psppire_dialog_class_init (PsppireDialogClass *class) GParamSpec *sliding_spec ; GParamSpec *help_page_spec ; - help_page_spec = - g_param_spec_string ("help-page", + 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", - "Orientation", - "Which way widgets are packed", - PSPPIRE_TYPE_ORIENTATION, - PSPPIRE_HORIZONTAL /* default value */, - G_PARAM_CONSTRUCT_ONLY |G_PARAM_READWRITE); - sliding_spec = g_param_spec_boolean ("slidable", "Slidable", @@ -246,11 +170,6 @@ psppire_dialog_class_init (PsppireDialogClass *class) object_class->set_property = psppire_dialog_set_property; object_class->get_property = psppire_dialog_get_property; - g_object_class_install_property (object_class, - PROP_ORIENTATION, - orientation_spec); - - g_object_class_install_property (object_class, PROP_SLIDING, sliding_spec); @@ -306,13 +225,9 @@ psppire_dialog_class_init (PsppireDialogClass *class) 1, G_TYPE_STRING); - parent_class = g_type_class_peek_parent (class); } - - - static void close_dialog (GtkWidget *w, gpointer data) { @@ -328,7 +243,6 @@ psppire_dialog_close (PsppireDialog *dialog) gtk_widget_hide (GTK_WIDGET (dialog)); } - static void delete_event_callback (GtkWidget *w, GdkEvent *e, gpointer data) { @@ -339,8 +253,6 @@ delete_event_callback (GtkWidget *w, GdkEvent *e, gpointer data) static void psppire_dialog_init (PsppireDialog *dialog) { - GValue value = {0}; - dialog->box = NULL; dialog->contents_are_valid = NULL; dialog->validity_data = NULL; dialog->contents_are_acceptable = NULL; @@ -348,14 +260,9 @@ psppire_dialog_init (PsppireDialog *dialog) dialog->slidable = FALSE; dialog->help_page = NULL; - g_value_init (&value, orientation_spec->value_type); - g_param_value_set_default (orientation_spec, &value); - gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG); - g_value_unset (&value); - g_signal_connect (dialog, "delete-event", G_CALLBACK (delete_event_callback), dialog); @@ -366,7 +273,6 @@ psppire_dialog_init (PsppireDialog *dialog) g_object_set (dialog, "icon-name", "pspp", NULL); } - GtkWidget* psppire_dialog_new (void) { @@ -382,7 +288,7 @@ psppire_dialog_new (void) void psppire_dialog_notify_change (PsppireDialog *dialog) { - if ( dialog->contents_are_valid ) + if (dialog->contents_are_valid) { gboolean valid = dialog->contents_are_valid (dialog->validity_data); @@ -391,13 +297,6 @@ 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 @@ -405,10 +304,10 @@ connect_notify_signal (GtkWidget *w, gpointer data) { PsppireDialog *dialog = data; - if ( PSPPIRE_IS_BUTTONBOX (w)) + if (PSPPIRE_IS_BUTTON_BOX (w)) return; - if ( GTK_IS_CONTAINER (w)) + if (GTK_IS_CONTAINER (w)) { gtk_container_foreach (GTK_CONTAINER (w), connect_notify_signal, @@ -420,14 +319,14 @@ connect_notify_signal (GtkWidget *w, gpointer data) "user-modified-state-changed" signal. Instead, we have to try and predict what widgets and signals are likely to exist in our dialogs. */ - if ( GTK_IS_TOGGLE_BUTTON (w)) + if (GTK_IS_TOGGLE_BUTTON (w)) { g_signal_connect_swapped (w, "toggled", G_CALLBACK (psppire_dialog_notify_change), dialog); } - if ( PSPPIRE_IS_SELECTOR (w)) + if (PSPPIRE_IS_SELECTOR (w)) { g_signal_connect_swapped (w, "selected", G_CALLBACK (psppire_dialog_notify_change), @@ -436,23 +335,25 @@ connect_notify_signal (GtkWidget *w, gpointer data) g_signal_connect_swapped (w, "de-selected", G_CALLBACK (psppire_dialog_notify_change), dialog); + + psppire_selector_update_subjects (PSPPIRE_SELECTOR (w)); } - if ( GTK_IS_EDITABLE (w)) + if (GTK_IS_EDITABLE (w)) { g_signal_connect_swapped (w, "changed", G_CALLBACK (psppire_dialog_notify_change), dialog); } - if ( GTK_IS_CELL_EDITABLE (w)) + if (GTK_IS_CELL_EDITABLE (w)) { g_signal_connect_swapped (w, "editing-done", G_CALLBACK (psppire_dialog_notify_change), dialog); } - if ( GTK_IS_TEXT_VIEW (w)) + if (GTK_IS_TEXT_VIEW (w)) { GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (w)); @@ -461,7 +362,7 @@ connect_notify_signal (GtkWidget *w, gpointer data) dialog); } - if ( GTK_IS_TREE_VIEW (w)) + if (GTK_IS_TREE_VIEW (w)) { gint i = 0; GtkTreeView *tv = GTK_TREE_VIEW (w); @@ -470,7 +371,7 @@ connect_notify_signal (GtkWidget *w, gpointer data) GtkTreeViewColumn *col; GtkTreeModel *model = gtk_tree_view_get_model (tv); - if ( model) + if (model) { g_signal_connect_swapped (model, "row-changed", G_CALLBACK (psppire_dialog_notify_change), @@ -484,10 +385,8 @@ connect_notify_signal (GtkWidget *w, gpointer data) 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); @@ -498,7 +397,7 @@ connect_notify_signal (GtkWidget *w, gpointer data) GList *start = renderers; while (renderers) { - if ( GTK_IS_CELL_RENDERER_TOGGLE (renderers->data)) + if (GTK_IS_CELL_RENDERER_TOGGLE (renderers->data)) g_signal_connect_swapped (renderers->data, "toggled", G_CALLBACK (psppire_dialog_notify_change), dialog); renderers = renderers->next; @@ -517,29 +416,25 @@ psppire_dialog_run (PsppireDialog *dialog) 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), + + if (dialog->contents_are_valid != NULL) + gtk_container_foreach (GTK_CONTAINER (gtk_bin_get_child(GTK_BIN(dialog))), connect_notify_signal, dialog); dialog->loop = g_main_loop_new (NULL, FALSE); gtk_widget_show (GTK_WIDGET (dialog)); + psppire_dialog_notify_change (dialog); - if ( dialog->contents_are_valid != NULL) - g_signal_emit (dialog, signals [VALIDITY_CHANGED], 0, FALSE); - - g_signal_emit (dialog, signals [DIALOG_REFRESH], 0); - - gdk_threads_leave (); g_main_loop_run (dialog->loop); - gdk_threads_enter (); g_main_loop_unref (dialog->loop); g_signal_emit (dialog, signals [RESPONSE], 0, dialog->response); + g_free (title); + return dialog->response; } @@ -563,29 +458,6 @@ psppire_dialog_help (PsppireDialog *dialog) g_signal_emit (dialog, signals [DIALOG_HELP], 0, page); } - -GType -psppire_orientation_get_type (void) -{ - static GType etype = 0; - if (etype == 0) - { - static const GEnumValue values[] = - { - { PSPPIRE_HORIZONTAL, "PSPPIRE_HORIZONTAL", "Horizontal" }, - { PSPPIRE_VERTICAL, "PSPPIRE_VERTICAL", "Vertical" }, - { PSPPIRE_TABULAR, "PSPPIRE_TABULAR", "Tabular" }, - { 0, NULL, NULL } - }; - - etype = g_enum_register_static - (g_intern_static_string ("PsppireOrientation"), values); - - } - return etype; -} - - /* Sets a predicate function that is checked after each change that the user makes to the dialog's state. If the predicate function returns false, then "OK" and other buttons that accept the dialog's settings will be @@ -623,27 +495,3 @@ psppire_dialog_is_acceptable (const PsppireDialog *dialog) return (dialog->contents_are_acceptable == NULL || dialog->contents_are_acceptable (dialog->acceptable_data)); } - - - - -static GObject * -get_internal_child (GtkBuildable *buildable, - GtkBuilder *builder, - const gchar *childname) -{ - PsppireDialog *dialog = PSPPIRE_DIALOG (buildable); - - if ( 0 == strcmp (childname, "hbox")) - return G_OBJECT (dialog->box); - - return NULL; -} - - - -static void -psppire_dialog_buildable_init (GtkBuildableIface *iface) -{ - iface->get_internal_child = get_internal_child; -}