GUI: Move .ui files from goffice resources to glib resources
[gnumeric.git] / src / dialogs / dialog-view.c
blob5a63fab4eb3c438013d7a3ffa72a9a46c2607cd8
1 /**
2 * dialog-view.c: New view dialog.
4 * Author:
5 * Morten Welinder <terra@gnome.org>
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of the
10 * License, or (at your option) version 3.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
20 * USA
23 #include <gnumeric-config.h>
24 #include <gnumeric.h>
25 #include "dialogs.h"
26 #include "help.h"
27 #include "application.h"
28 #include <gui-util.h>
29 #include <wbc-gtk.h>
31 #include <gtk/gtk.h>
32 #include <glib/gi18n-lib.h>
34 #define VIEW_DIALOG_KEY "view-dialog"
36 typedef struct {
37 WBCGtk *wbcg;
38 GtkWidget *dialog;
39 GtkBuilder *gui;
40 GtkRadioButton *location_elsewhere;
41 GtkEntry *location_display_name;
42 } ViewState;
44 static void
45 cb_view_cancel_clicked (G_GNUC_UNUSED GtkWidget *button,
46 ViewState *state)
48 gtk_widget_destroy (state->dialog);
51 static void
52 cb_view_ok_clicked (G_GNUC_UNUSED GtkWidget *button,
53 ViewState *state)
55 WBCGtk *wbcg = state->wbcg;
56 WorkbookControl *wbc = GNM_WBC (wbcg);
57 WorkbookControl *new_wbc;
58 gboolean shared;
59 GdkScreen *screen;
60 GSList *buttons = gtk_radio_button_get_group (state->location_elsewhere);
62 shared = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (go_gtk_builder_get_widget (state->gui, "view_shared")));
64 while (buttons)
65 if (gtk_toggle_button_get_active (buttons->data))
66 break;
67 else
68 buttons = buttons->next;
70 if (!buttons) {
71 g_assert_not_reached ();
72 return;
73 } else if (buttons->data == state->location_elsewhere) {
74 const char *name = gtk_entry_get_text (state->location_display_name);
75 GdkDisplay *display;
76 if (!name)
77 return; /* Just ignore */
79 display = gdk_display_open (name);
80 if (!display) {
81 char *error_str =
82 g_strdup_printf (_("Display \"%s\" could not be opened."),
83 name);
84 gtk_widget_destroy (state->dialog);
85 go_gtk_notice_dialog (wbcg_toplevel (wbcg),
86 GTK_MESSAGE_ERROR,
87 "%s", error_str);
88 g_free (error_str);
89 return;
92 screen = gdk_display_get_default_screen (display);
93 } else {
94 screen = g_object_get_data (buttons->data, "screen");
97 gtk_widget_destroy (state->dialog);
99 new_wbc = workbook_control_new_wrapper
100 (wbc,
101 shared ? wb_control_view (wbc) : NULL,
102 wb_control_get_workbook (wbc),
103 screen);
105 if (GNM_IS_WBC_GTK (new_wbc)) {
106 /* What else would it be? */
107 WBCGtk *new_wbcg = WBC_GTK (new_wbc);
108 wbcg_copy_toolbar_visibility (new_wbcg, wbcg);
109 _gnm_app_flag_windows_changed ();
113 static void
114 cb_view_destroy (ViewState *state)
116 if (state->gui != NULL) {
117 g_object_unref (state->gui);
118 state->gui = NULL;
121 state->dialog = NULL;
122 g_free (state);
125 void
126 dialog_new_view (WBCGtk *wbcg)
128 ViewState *state;
129 GtkBuilder *gui;
131 if (gnm_dialog_raise_if_exists (wbcg, VIEW_DIALOG_KEY))
132 return;
133 gui = gnm_gtk_builder_load ("res:ui/view.ui", NULL, GO_CMD_CONTEXT (wbcg));
134 if (gui == NULL)
135 return;
137 state = g_new (ViewState, 1);
138 state->wbcg = wbcg;
139 state->gui = gui;
140 state->dialog = go_gtk_builder_get_widget (gui, "View");
141 state->location_elsewhere = GTK_RADIO_BUTTON (go_gtk_builder_get_widget (gui, "location_elsewhere"));
142 state->location_display_name = GTK_ENTRY (go_gtk_builder_get_widget (gui, "location_display_name"));
143 g_return_if_fail (state->dialog != NULL);
146 GdkScreen *this_screen = gtk_window_get_screen (wbcg_toplevel (wbcg));
147 GdkDisplay *this_display = gdk_screen_get_display (this_screen);
148 int n_screens = gdk_display_get_n_screens (this_display);
149 GtkBox *box = GTK_BOX (go_gtk_builder_get_widget (gui, "location_screens_vbox"));
150 int i;
152 for (i = 0; i < n_screens; i++) {
153 /* Get this for every screen -- it might change. */
154 GSList *group =
155 gtk_radio_button_get_group (state->location_elsewhere);
156 GdkScreen *screen = gdk_display_get_screen (this_display, i);
157 char *label =
158 screen == this_screen
159 ? (n_screens == 1
160 ? g_strdup (_("This screen"))
161 : g_strdup_printf (_("Screen %d [This screen]"), i))
162 : g_strdup_printf (_("Screen %d"), i);
163 GtkWidget *button =
164 gtk_radio_button_new_with_label (group, label);
165 g_free (label);
167 if (screen == this_screen)
168 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
170 g_object_set_data (G_OBJECT (button),
171 "screen", screen);
173 gtk_box_pack_start (box, button, TRUE, TRUE, 0);
177 g_signal_connect (G_OBJECT (go_gtk_builder_get_widget (gui, "ok_button")),
178 "clicked",
179 G_CALLBACK (cb_view_ok_clicked), state);
180 g_signal_connect (G_OBJECT (go_gtk_builder_get_widget (gui, "cancel_button")),
181 "clicked",
182 G_CALLBACK (cb_view_cancel_clicked), state);
184 gnm_link_button_and_entry (GTK_WIDGET (state->location_elsewhere),
185 GTK_WIDGET (state->location_display_name));
187 gnm_editable_enters (GTK_WINDOW (state->dialog),
188 GTK_WIDGET (state->location_display_name));
190 gnm_init_help_button (
191 go_gtk_builder_get_widget (gui, "help_button"),
192 GNUMERIC_HELP_LINK_VIEW);
193 gnm_keyed_dialog (wbcg, GTK_WINDOW (state->dialog),
194 VIEW_DIALOG_KEY);
196 g_object_set_data_full (G_OBJECT (state->dialog),
197 "state", state, (GDestroyNotify) cb_view_destroy);
198 gtk_widget_show_all (state->dialog);