X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dialog-action.c;h=f0caabae726872c980ce7e6a8ac6c0652f252713;hb=b525a9596e60d5ae4c6c464b4a426b77ade3dd72;hp=ab04cae3021b51ee68f9793d96f2c01673180569;hpb=258cbd9cdf386687122b0854274923acafc786d4;p=pspp diff --git a/src/ui/gui/psppire-dialog-action.c b/src/ui/gui/psppire-dialog-action.c index ab04cae302..f0caabae72 100644 --- a/src/ui/gui/psppire-dialog-action.c +++ b/src/ui/gui/psppire-dialog-action.c @@ -22,13 +22,10 @@ #include "executor.h" #include "helper.h" #include "psppire-data-window.h" - -static void psppire_dialog_action_init (PsppireDialogAction *act); -static void psppire_dialog_action_class_init (PsppireDialogActionClass *class); +#include "builder-wrapper.h" static GObjectClass * parent_class = NULL; - static const gchar * __get_name (GAction *act) { @@ -88,44 +85,11 @@ action_model_init (GActionInterface *iface) iface->activate = __activate; } - -GType -psppire_dialog_action_get_type (void) -{ - static GType de_type = 0; - - if (!de_type) - { - static const GTypeInfo de_info = - { - sizeof (PsppireDialogActionClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) psppire_dialog_action_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (PsppireDialogAction), - 0, - (GInstanceInitFunc) psppire_dialog_action_init, - }; - - - static const GInterfaceInfo ga_info = { - (GInterfaceInitFunc) action_model_init, - NULL, - NULL - }; - - - de_type = g_type_register_static (G_TYPE_OBJECT, "PsppireDialogAction", - &de_info, G_TYPE_FLAG_ABSTRACT); - - g_type_add_interface_static (de_type, G_TYPE_ACTION, &ga_info); - } - - return de_type; -} - +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (PsppireDialogAction, \ + psppire_dialog_action, \ + G_TYPE_OBJECT, \ + G_IMPLEMENT_INTERFACE (G_TYPE_ACTION, \ + action_model_init)) /* Properties */ enum @@ -188,20 +152,20 @@ on_destroy_dataset (GObject *w) { GHashTable *t = g_object_get_data (w, "thing-table"); GSList *dl = g_object_get_data (w, "widget-list"); - + g_slist_free_full (dl, (GDestroyNotify) gtk_widget_destroy); g_hash_table_unref (t); } /* Each toplevel widget - that is the data window, which generally has a 1-1 association with a dataset - has an associated GHashTable. - + This GHashTable is keyed by the address of a PsppireDialogAction, and its values are user determined pointers (typically a GtkBuilder*). This is useful for storing the state of dialogs so they can persist between invocations. */ -GHashTable * +static GHashTable * psppire_dialog_action_get_hash_table (PsppireDialogAction *act) { GHashTable *t = g_object_get_data (G_OBJECT (act->toplevel), "thing-table"); @@ -216,6 +180,14 @@ psppire_dialog_action_get_hash_table (PsppireDialogAction *act) return t; } +GtkBuilder * +psppire_dialog_action_get_xml (PsppireDialogAction *da) +{ + GHashTable *thing = psppire_dialog_action_get_hash_table (da); + GtkBuilder *xml = g_hash_table_lookup (thing, da); + return xml; +} + static void psppire_dialog_action_activate (PsppireDialogAction *act, GVariant *parameter) @@ -230,8 +202,24 @@ psppire_dialog_action_activate (PsppireDialogAction *act, GVariant *parameter) wl = g_slist_prepend (wl, act->dialog); g_object_set_data (G_OBJECT (act->toplevel), "widget-list", wl); + if (class->initial_activate) + { + GHashTable *thing = psppire_dialog_action_get_hash_table (act); + GtkBuilder *xml = g_hash_table_lookup (thing, act); + if (xml == NULL) + { + xml = class->initial_activate (act, parameter); + g_hash_table_insert (thing, act, xml); + } + } + if (class->activate) - class->activate (act, parameter); + { + GHashTable *thing = psppire_dialog_action_get_hash_table (act); + GtkBuilder *xml = g_hash_table_lookup (thing, act); + if (xml != NULL) + class->activate (act, parameter); + } gtk_window_set_transient_for (GTK_WINDOW (act->dialog), GTK_WINDOW (act->toplevel)); @@ -249,7 +237,7 @@ psppire_dialog_action_activate (PsppireDialogAction *act, GVariant *parameter) response = psppire_dialog_run (PSPPIRE_DIALOG (act->dialog)); - if ( class->generate_syntax ) + if (class->generate_syntax) { switch (response) { @@ -285,8 +273,6 @@ psppire_dialog_action_class_init (PsppireDialogActionClass *class) class->generate_syntax = NULL; - class->activate = psppire_dialog_action_activate; - g_object_class_install_property (object_class, PROP_TOPLEVEL, toplevel_spec); @@ -309,7 +295,7 @@ psppire_dialog_action_init (PsppireDialogAction *act) } void -psppire_dialog_action_set_valid_predicate (PsppireDialogAction *act, +psppire_dialog_action_set_valid_predicate (PsppireDialogAction *act, ContentsAreValid dialog_state_valid) { psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (act->dialog), @@ -317,16 +303,8 @@ psppire_dialog_action_set_valid_predicate (PsppireDialogAction *act, } void -psppire_dialog_action_set_refresh (PsppireDialogAction *pda, +psppire_dialog_action_set_refresh (PsppireDialogAction *pda, PsppireDialogActionRefresh refresh) { g_signal_connect_swapped (pda->dialog, "refresh", G_CALLBACK (refresh), pda); } - - -void -psppire_dialog_action_set_activation (gpointer class, activation activate) -{ - PSPPIRE_DIALOG_ACTION_CLASS (class)->activate = (void (*)(PsppireDialogAction *, GVariant *)) activate; -} -