output: Introduce pivot tables.
[pspp] / src / ui / gui / psppire-output-window.c
index fd6b7b3422f39569ed2ac30b0c450c55036c8189..f61e8e546e64719a31c0cbac6fb3f4513d61d2cf 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014  Free Software Foundation
+   Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2016  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
 #include "libpspp/cast.h"
 #include "libpspp/message.h"
 #include "libpspp/string-map.h"
-#include "output/cairo.h"
 #include "output/chart-item.h"
 #include "output/driver-provider.h"
 #include "output/message-item.h"
 #include "output/output-item.h"
-#include "output/tab.h"
 #include "output/table-item.h"
 #include "output/text-item.h"
 #include "ui/gui/help-menu.h"
 #include "ui/gui/builder-wrapper.h"
 #include "ui/gui/psppire-output-view.h"
+#include "ui/gui/psppire-conf.h"
+#include "ui/gui/windows-menu.h"
 
 #include "gl/xalloc.h"
 
@@ -94,7 +94,7 @@ psppire_output_window_dispose (GObject *obj)
 {
   PsppireOutputWindow *window = PSPPIRE_OUTPUT_WINDOW (obj);
 
-  if (window->dispose_has_run) 
+  if (window->dispose_has_run)
     return;
 
   window->dispose_has_run = TRUE;
@@ -112,7 +112,7 @@ psppire_output_window_class_init (PsppireOutputWindowClass *class)
 
   parent_class = g_type_class_peek_parent (class);
   object_class->dispose = psppire_output_window_dispose;
-  
+
   object_class->finalize = psppire_output_window_finalize;
 }
 \f
@@ -145,6 +145,10 @@ psppire_output_submit (struct output_driver *this,
   if (new)
     {
       pod->window = PSPPIRE_OUTPUT_WINDOW (psppire_output_window_new ());
+      GApplication *app = g_application_get_default ();
+      gtk_application_add_window (GTK_APPLICATION (app),
+                                 GTK_WINDOW (pod->window));
+
       pod->window->driver = pod;
     }
   window = pod->window;
@@ -160,7 +164,27 @@ psppire_output_submit (struct output_driver *this,
       gtk_widget_show_all (GTK_WIDGET (pod->window));
     }
 
-  gtk_window_set_urgency_hint (GTK_WINDOW (pod->window), TRUE);
+  PsppireConf *conf = psppire_conf_new ();
+  {
+    gboolean status = true;
+    psppire_conf_get_boolean (conf, "OutputWindowAction", "alert",
+                             &status);
+    gtk_window_set_urgency_hint (GTK_WINDOW (pod->window), status);
+  }
+
+  {
+    gboolean status ;
+    if (psppire_conf_get_boolean (conf, "OutputWindowAction", "maximize",
+                                 &status) && status)
+      gtk_window_maximize (GTK_WINDOW (pod->window));
+  }
+
+  {
+    gboolean status ;
+    if (psppire_conf_get_boolean (conf, "OutputWindowAction", "raise",
+                                 &status) && status)
+      gtk_window_present (GTK_WINDOW (pod->window));
+  }
 }
 
 static struct output_driver_class psppire_output_class =
@@ -226,7 +250,7 @@ struct file_types
   const gchar *ext;
 };
 
-enum 
+enum
   {
     FT_AUTO = 0,
     FT_PDF,
@@ -259,7 +283,7 @@ on_combo_change (GtkFileChooser *chooser)
   gboolean sensitive = FALSE;
   GtkWidget *combo = gtk_file_chooser_get_extra_widget (chooser);
 
-  int x = 0; 
+  int x = 0;
   gchar *fn = gtk_file_chooser_get_filename (chooser);
 
   if (combo &&  gtk_widget_get_realized (combo))
@@ -328,7 +352,7 @@ create_file_type_list (void)
   int i;
   GtkTreeIter iter;
   GtkListStore *list = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
-  
+
   for (i = 0 ; i < n_FT ; ++i)
     {
       gtk_list_store_append (list, &iter);
@@ -337,7 +361,7 @@ create_file_type_list (void)
                          1,  ft[i].ext,
                          -1);
     }
-  
+
   return list;
 }
 
@@ -349,12 +373,12 @@ psppire_output_window_export (PsppireOutputWindow *window)
   GtkListStore *list;
 
   GtkFileChooser *chooser;
-  
+
   GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Export Output"),
                                         GTK_WINDOW (window),
                                         GTK_FILE_CHOOSER_ACTION_SAVE,
-                                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                        GTK_STOCK_SAVE,   GTK_RESPONSE_ACCEPT,
+                                        _("Cancel"), GTK_RESPONSE_CANCEL,
+                                        _("Save"),   GTK_RESPONSE_ACCEPT,
                                         NULL);
 
   g_object_set (dialog, "local-only", FALSE, NULL);
@@ -423,7 +447,7 @@ psppire_output_window_export (PsppireOutputWindow *window)
           filename = g_strconcat (filename, ft[file_type].ext, NULL);
           g_free (of);
         }
-      
+
       string_map_init (&options);
       string_map_insert (&options, "output-file", filename);
 
@@ -474,19 +498,18 @@ psppire_output_window_export (PsppireOutputWindow *window)
 static void
 psppire_output_window_init (PsppireOutputWindow *window)
 {
-  GtkBuilder *xml;
+  GtkBuilder *xml = builder_new ("output-window.ui");
+  GtkApplication *app = GTK_APPLICATION (g_application_get_default());
+  GtkWidget *box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+  gtk_container_add (GTK_CONTAINER (window), box);
 
-  xml = builder_new ("output-window.ui");
-
-  gtk_widget_reparent (get_widget_assert (xml, "vbox1"), GTK_WIDGET (window));
+  GtkWidget *paned = get_widget_assert (xml, "paned1");
 
   window->dispose_has_run = FALSE;
 
   window->view = psppire_output_view_new (
     GTK_LAYOUT (get_widget_assert (xml, "output")),
-    GTK_TREE_VIEW (get_widget_assert (xml, "overview")),
-    get_action_assert (xml, "edit_copy"),
-    get_action_assert (xml, "edit_select-all"));
+    GTK_TREE_VIEW (get_widget_assert (xml, "overview")));
 
 
   connect_help (xml);
@@ -496,28 +519,51 @@ psppire_output_window_init (PsppireOutputWindow *window)
                    G_CALLBACK (cancel_urgency),
                    NULL);
 
-  g_signal_connect (get_action_assert (xml,"windows_minimise-all"),
-                   "activate",
-                   G_CALLBACK (psppire_window_minimise_all),
-                   NULL);
+  GObject *menu = get_object_assert (xml, "output-window-menu", G_TYPE_MENU);
+  GtkWidget *menubar = gtk_menu_bar_new_from_model (G_MENU_MODEL (menu));
+  gtk_box_pack_start (GTK_BOX (box), menubar, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (box), paned, TRUE, TRUE, 0);
+
+  gtk_menu_shell_append (GTK_MENU_SHELL (menubar),
+                        create_windows_menu (GTK_WINDOW (window)));
+
+  gtk_menu_shell_append (GTK_MENU_SHELL (menubar),
+                        create_help_menu (GTK_WINDOW (window)));
 
   {
-    GtkWidget *w;
-    GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1", GTK_TYPE_UI_MANAGER));
-    merge_help_menu (uim);
+    GSimpleAction *print = g_simple_action_new ("print", NULL);
+    g_signal_connect_swapped (print, "activate", G_CALLBACK (psppire_output_window_print), window);
+    g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (print));
 
-    w = gtk_ui_manager_get_widget (uim,"/ui/menubar/windows_menuitem/windows_minimise-all");
 
-    PSPPIRE_WINDOW (window)->menu =
-      GTK_MENU_SHELL (gtk_widget_get_parent (w));
+    const gchar *accels[2] = { "<Ctrl>P", NULL};
+    gtk_application_set_accels_for_action (app,
+                                          "win.print",
+                                          accels);
   }
 
-  g_signal_connect_swapped (get_action_assert (xml, "file_export"), "activate",
-                            G_CALLBACK (psppire_output_window_export), window);
 
+  {
+    GSimpleAction *export = g_simple_action_new ("export", NULL);
+    g_signal_connect_swapped (export, "activate", G_CALLBACK (psppire_output_window_export), window);
+    g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (export));
+  }
+
+  {
+    GSimpleAction *select_all = g_simple_action_new ("select-all", NULL);
+    g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (select_all));
+  }
+
+  {
+    GSimpleAction *copy = g_simple_action_new ("copy", NULL);
+    g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (copy));
+
+    const gchar *accels[2] = { "<Ctrl>C", NULL};
+    gtk_application_set_accels_for_action (app,
+                                          "win.copy",
+                                          accels);
+  }
 
-  g_signal_connect_swapped (get_action_assert (xml, "file_print"), "activate",
-                            G_CALLBACK (psppire_output_window_print), window);
 
   g_object_unref (xml);
 
@@ -530,7 +576,7 @@ GtkWidget*
 psppire_output_window_new (void)
 {
   return GTK_WIDGET (g_object_new (psppire_output_window_get_type (),
-                                  /* TRANSLATORS: This will form a filename.  Please avoid whitespace. */
+                                  /* TRANSLATORS: This will be part of a filename.  Please avoid whitespace. */
                                   "filename", _("Output"),
                                   "description", _("Output Viewer"),
                                   NULL));