X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dialog-action.c;fp=src%2Fui%2Fgui%2Fpsppire-dialog-action.c;h=e3ee25be75fc7f53c021314573e29a6ec42ed537;hb=53508ccb5785dfcad8080d9dcdacdf3b7af5be76;hp=0000000000000000000000000000000000000000;hpb=3039501eeeb280c2bd6dae91a9471f8372c52698;p=pspp
diff --git a/src/ui/gui/psppire-dialog-action.c b/src/ui/gui/psppire-dialog-action.c
new file mode 100644
index 0000000000..e3ee25be75
--- /dev/null
+++ b/src/ui/gui/psppire-dialog-action.c
@@ -0,0 +1,188 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+ Copyright (C) 2012 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 . */
+
+
+#include
+
+#include "psppire-dialog-action.h"
+#include "psppire-dialog.h"
+#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);
+
+G_DEFINE_ABSTRACT_TYPE (PsppireDialogAction, psppire_dialog_action, GTK_TYPE_ACTION);
+
+/* Properties */
+enum
+{
+ PROP_0,
+ PROP_MANAGER,
+ PROP_TOPLEVEL,
+};
+
+static void
+psppire_dialog_action_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PsppireDialogAction *act = PSPPIRE_DIALOG_ACTION (object);
+
+ switch (prop_id)
+ {
+ case PROP_MANAGER:
+ {
+
+ GObject *p = g_value_get_object (value);
+ act->uim = GTK_UI_MANAGER (p);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ };
+}
+
+
+static void
+psppire_dialog_action_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ PsppireDialogAction *dialog_action = PSPPIRE_DIALOG_ACTION (object);
+
+ switch (prop_id)
+ {
+ case PROP_MANAGER:
+ g_value_take_object (value, dialog_action->uim);
+ break;
+ case PROP_TOPLEVEL:
+ g_value_take_object (value, dialog_action->toplevel);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ };
+}
+
+
+static void
+psppire_dialog_action_activate (PsppireDialogAction *act)
+{
+ gint response;
+
+ PsppireVarStore *vs;
+ PsppireDialogActionClass *class = PSPPIRE_DIALOG_ACTION_GET_CLASS (act);
+
+ GSList *sl = gtk_ui_manager_get_toplevels (act->uim, GTK_UI_MANAGER_MENUBAR | GTK_UI_MANAGER_TOOLBAR);
+ g_return_if_fail (sl);
+
+ act->toplevel = gtk_widget_get_toplevel (GTK_WIDGET (sl->data));
+ g_slist_free (sl);
+
+ vs = PSPPIRE_DATA_WINDOW(act->toplevel)->var_store;
+
+ g_object_get (vs, "dictionary", &act->dict, NULL);
+
+ g_object_set (act->source, "model", act->dict, NULL);
+
+ gtk_window_set_transient_for (GTK_WINDOW (act->dialog), GTK_WINDOW (act->toplevel));
+
+
+ if (GTK_ACTION_CLASS (psppire_dialog_action_parent_class)->activate)
+ GTK_ACTION_CLASS (psppire_dialog_action_parent_class)->activate ( GTK_ACTION (act));
+
+ response = psppire_dialog_run (PSPPIRE_DIALOG (act->dialog));
+
+ if ( class->generate_syntax )
+ {
+ switch (response)
+ {
+ case GTK_RESPONSE_OK:
+ g_free (execute_syntax_string (PSPPIRE_DATA_WINDOW (act->toplevel),
+ class->generate_syntax (act)));
+ break;
+ case PSPPIRE_RESPONSE_PASTE:
+ g_free (paste_syntax_to_window (class->generate_syntax (act)));
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+static void
+psppire_dialog_action_class_init (PsppireDialogActionClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+ GParamSpec *manager_spec =
+ g_param_spec_object ("manager",
+ "Manager",
+ "The GtkUIManager which created this object",
+ GTK_TYPE_UI_MANAGER,
+ G_PARAM_CONSTRUCT_ONLY |G_PARAM_READWRITE);
+
+ GParamSpec *toplevel_spec =
+ g_param_spec_object ("top-level",
+ "Top Level",
+ "The top level widget to which this dialog action belongs",
+ GTK_TYPE_WINDOW,
+ G_PARAM_READABLE);
+
+ object_class->set_property = psppire_dialog_action_set_property;
+ object_class->get_property = psppire_dialog_action_get_property;
+
+ class->generate_syntax = NULL;
+
+ class->activate = psppire_dialog_action_activate;
+
+ g_object_class_install_property (object_class,
+ PROP_MANAGER,
+ manager_spec);
+
+ g_object_class_install_property (object_class,
+ PROP_TOPLEVEL,
+ toplevel_spec);
+}
+
+
+static void
+psppire_dialog_action_init (PsppireDialogAction *act)
+{
+ act->toplevel = NULL;
+ act->dict = NULL;
+}
+
+
+void
+psppire_dialog_action_set_valid_predicate (PsppireDialogAction *act,
+ ContentsAreValid dialog_state_valid)
+{
+ psppire_dialog_set_valid_predicate (act->dialog, dialog_state_valid, act);
+}
+
+void
+psppire_dialog_action_set_refresh (PsppireDialogAction *pda,
+ PsppireDialogActionRefresh refresh)
+{
+ g_signal_connect_swapped (pda->dialog, "refresh", G_CALLBACK (refresh), pda);
+}
+