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=b525a9596e60d5ae4c6c464b4a426b77ade3dd72;hp=680618de92bfdfe17eb4f59ea07e2cd285ab24b6;hpb=5d612c43713291cae1aa473ee3d31786ef6f5b99;p=pspp diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c index 680618de92..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); @@ -261,12 +228,12 @@ 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"}, @@ -275,7 +242,9 @@ struct file_types ft[n_FT] = { {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"} }; @@ -285,23 +254,15 @@ 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) - { - sensitive = FALSE; - } - else + if (fn != NULL && file_type == FT_AUTO) { - 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)) { @@ -310,6 +271,8 @@ on_combo_change (GtkFileChooser *chooser) } } } + else + sensitive = (fn != NULL); g_free (fn); @@ -317,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) { @@ -406,11 +338,7 @@ 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)); @@ -429,7 +357,7 @@ 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)) { @@ -473,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");