X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-output-window.c;h=46535b0f2362fd7cc8777cdeeaf18a67057c7e9b;hb=f20d313de2b85419c3e2e22a78cdcdce499af43d;hp=ad1f03db5fb947c766616dccaf934a477eec9a76;hpb=8100f937ee385fd0d40e62a733d7af085f6a40b6;p=pspp diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c index ad1f03db5f..46535b0f23 100644 --- a/src/ui/gui/psppire-output-window.c +++ b/src/ui/gui/psppire-output-window.c @@ -1,5 +1,6 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation + Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2016, + 2021 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 @@ -28,12 +29,8 @@ #include "libpspp/cast.h" #include "libpspp/message.h" #include "libpspp/string-map.h" -#include "output/chart-item.h" #include "output/driver-provider.h" -#include "output/message-item.h" #include "output/output-item.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" @@ -48,36 +45,7 @@ #define _(msgid) gettext (msgid) #define N_(msgid) msgid -static void psppire_output_window_class_init (PsppireOutputWindowClass *class); -static void psppire_output_window_init (PsppireOutputWindow *window); - -GType -psppire_output_window_get_type (void) -{ - static GType psppire_output_window_type = 0; - - if (!psppire_output_window_type) - { - static const GTypeInfo psppire_output_window_info = - { - sizeof (PsppireOutputWindowClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc)psppire_output_window_class_init, - (GClassFinalizeFunc) NULL, - NULL, - sizeof (PsppireOutputWindow), - 0, - (GInstanceInitFunc) psppire_output_window_init, - }; - - psppire_output_window_type = - g_type_register_static (PSPPIRE_TYPE_WINDOW, "PsppireOutputWindow", - &psppire_output_window_info, 0); - } - - return psppire_output_window_type; -} +G_DEFINE_TYPE (PsppireOutputWindow, psppire_output_window, PSPPIRE_TYPE_WINDOW) static GObjectClass *parent_class; @@ -189,19 +157,18 @@ psppire_output_submit (struct output_driver *this, static struct output_driver_class psppire_output_class = { - "PSPPIRE", /* name */ - NULL, /* destroy */ - psppire_output_submit, /* submit */ - NULL, /* flush */ + .name = "PSPPIRE", + .submit = psppire_output_submit, + .handles_groups = true, + .handles_show = true, }; void psppire_output_window_setup (void) { - struct psppire_output_driver *pod; + struct psppire_output_driver *pod = XZALLOC (struct psppire_output_driver); struct output_driver *d; - pod = xzalloc (sizeof *pod); d = &pod->driver; output_driver_init (d, &psppire_output_class, "PSPPIRE", SETTINGS_DEVICE_UNFILTERED); @@ -253,6 +220,7 @@ struct file_types enum { FT_AUTO = 0, + FT_SPV, FT_PDF, FT_HTML, FT_ODT, @@ -260,20 +228,23 @@ enum FT_ASCII, FT_PS, FT_CSV, + FT_PNG, + FT_SVG, n_FT }; -#define N_EXTENSIONS (n_FT - 1) - -struct file_types ft[n_FT] = { +static const struct file_types ft[n_FT] = { {N_("Infer file type from extension"), NULL}, + {N_("SPSS Viewer (*.spv)"), ".spv"}, {N_("PDF (*.pdf)"), ".pdf"}, {N_("HTML (*.html)"), ".html"}, {N_("OpenDocument (*.odt)"), ".odt"}, {N_("Text (*.txt)"), ".txt"}, {N_("Text [plain] (*.txt)"), ".txt"}, {N_("PostScript (*.ps)"), ".ps"}, - {N_("Comma-Separated Values (*.csv)"), ".csv"} + {N_("Comma-Separated Values (*.csv)"), ".csv"}, + {N_("Portable Network Graphics (*.png)"), ".png"}, + {N_("Scalable Vector Graphics (*.svg)"), ".svg"} }; @@ -283,31 +254,25 @@ on_combo_change (GtkFileChooser *chooser) gboolean sensitive = FALSE; GtkWidget *combo = gtk_file_chooser_get_extra_widget (chooser); - int x = 0; + int file_type = FT_AUTO; gchar *fn = gtk_file_chooser_get_filename (chooser); if (combo && gtk_widget_get_realized (combo)) - x = gtk_combo_box_get_active (GTK_COMBO_BOX (combo)); + file_type = gtk_combo_box_get_active (GTK_COMBO_BOX (combo)); - if (fn == NULL) + if (fn != NULL && file_type == FT_AUTO) { - sensitive = FALSE; - } - else - { - gint i; - if ( x != 0 ) - sensitive = TRUE; - - for (i = 1 ; i < N_EXTENSIONS ; ++i) + for (gint i = 1 ; i < n_FT ; ++i) { - if ( g_str_has_suffix (fn, ft[i].ext)) + if (g_str_has_suffix (fn, ft[i].ext)) { sensitive = TRUE; break; } } } + else + sensitive = (fn != NULL); g_free (fn); @@ -315,37 +280,6 @@ on_combo_change (GtkFileChooser *chooser) } -static void -on_file_chooser_change (GObject *w, GParamSpec *pspec, gpointer data) -{ - - GtkFileChooser *chooser = data; - const gchar *name = g_param_spec_get_name (pspec); - - if ( ! gtk_widget_get_realized (GTK_WIDGET (chooser))) - return; - - /* Ignore this one. It causes recursion. */ - if ( 0 == strcmp ("tooltip-text", name)) - return; - - on_combo_change (chooser); -} - - -/* Recursively descend all the children of W, connecting - to their "notify" signal */ -static void -iterate_widgets (GtkWidget *w, gpointer data) -{ - if ( GTK_IS_CONTAINER (w)) - gtk_container_forall (GTK_CONTAINER (w), iterate_widgets, data); - else - g_signal_connect (w, "notify", G_CALLBACK (on_file_chooser_change), data); -} - - - static GtkListStore * create_file_type_list (void) { @@ -393,7 +327,7 @@ psppire_output_window_export (PsppireOutputWindow *window) { /* Create text cell renderer */ GtkCellRenderer *cell = gtk_cell_renderer_text_new(); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, FALSE ); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, FALSE); gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), cell, "text", 0); } @@ -404,16 +338,12 @@ psppire_output_window_export (PsppireOutputWindow *window) gtk_file_chooser_set_extra_widget (chooser, combo); - /* This kludge is necessary because there is no signal to tell us - when the candidate filename of a GtkFileChooser has changed */ - gtk_container_forall (GTK_CONTAINER (dialog), iterate_widgets, dialog); - - + g_signal_connect (chooser, "selection-changed", G_CALLBACK (on_combo_change), NULL); gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE); response = gtk_dialog_run (GTK_DIALOG (dialog)); - if ( response == GTK_RESPONSE_ACCEPT ) + if (response == GTK_RESPONSE_ACCEPT) { gint file_type = gtk_combo_box_get_active (GTK_COMBO_BOX (combo)); gchar *filename = gtk_file_chooser_get_filename (chooser); @@ -427,9 +357,9 @@ psppire_output_window_export (PsppireOutputWindow *window) search for the respective type in the list. (It's a O(n) search, but fortunately n is small). */ gint i; - for (i = 1 ; i < N_EXTENSIONS ; ++i) + for (i = 1 ; i < n_FT ; ++i) { - if ( g_str_has_suffix (filename, ft[i].ext)) + if (g_str_has_suffix (filename, ft[i].ext)) { file_type = i; break; @@ -453,6 +383,9 @@ psppire_output_window_export (PsppireOutputWindow *window) switch (file_type) { + case FT_SPV: + export_output (window, &options, "spv"); + break; case FT_PDF: export_output (window, &options, "pdf"); break; @@ -468,6 +401,12 @@ psppire_output_window_export (PsppireOutputWindow *window) case FT_CSV: export_output (window, &options, "csv"); break; + case FT_PNG: + export_output (window, &options, "png"); + break; + case FT_SVG: + export_output (window, &options, "svg"); + break; case FT_TXT: string_map_insert (&options, "box", "unicode"); @@ -505,9 +444,6 @@ psppire_output_window_init (PsppireOutputWindow *window) GTK_LAYOUT (get_widget_assert (xml, "output")), GTK_TREE_VIEW (get_widget_assert (xml, "overview"))); - - connect_help (xml); - g_signal_connect (window, "focus-in-event", G_CALLBACK (cancel_urgency), @@ -530,7 +466,7 @@ psppire_output_window_init (PsppireOutputWindow *window) g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (print)); - const gchar *accels[2] = { "P", NULL}; + const gchar *accels[2] = { "P", NULL}; gtk_application_set_accels_for_action (app, "win.print", accels); @@ -552,7 +488,7 @@ psppire_output_window_init (PsppireOutputWindow *window) GSimpleAction *copy = g_simple_action_new ("copy", NULL); g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (copy)); - const gchar *accels[2] = { "C", NULL}; + const gchar *accels[2] = { "C", NULL}; gtk_application_set_accels_for_action (app, "win.copy", accels);