GUI: Dead kittens.
[gnumeric.git] / src / dialogs / dialog-autosave.c
blobd2757c1e9fdf61a7e5e5744a096f908e93126ab0
1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3 * dialog-autosave.c:
5 * Authors:
6 * Jukka-Pekka Iivonen (jiivonen@hutcs.cs.hut.fi)
7 * Miguel de Icaza (miguel@kernel.org)
9 * (C) Copyright 2000, 2001 by Jukka-Pekka Iivonen (jiivonen@hutcs.cs.hut.fi)
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, see <https://www.gnu.org/licenses/>.
23 **/
24 #include <gnumeric-config.h>
25 #include <gnumeric.h>
26 #include "dialogs.h"
27 #include "help.h"
28 #include <workbook.h>
29 #include <workbook-control.h>
30 #include <wbc-gtk.h>
31 #include <gui-util.h>
33 #include <goffice/goffice.h>
34 #include <glib/gi18n-lib.h>
36 #include <gtk/gtk.h>
38 typedef struct {
39 GtkWidget *dialog;
40 GtkWidget *minutes_entry;
41 GtkWidget *prompt_cb;
42 GtkWidget *autosave_on_off;
43 GtkWidget *ok_button;
44 GtkWidget *cancel_button;
45 Workbook *wb;
46 WBCGtk *wbcg;
47 } autosave_t;
49 #define AUTOSAVE_KEY "autosave-setup-dialog"
51 static void
52 autosave_set_sensitivity (G_GNUC_UNUSED GtkWidget *widget,
53 autosave_t *state)
55 gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state->autosave_on_off));
56 gint minutes;
57 gboolean minutes_err = entry_to_int (GTK_ENTRY (state->minutes_entry), &minutes, FALSE);
59 gtk_widget_set_sensitive (state->minutes_entry, active);
60 gtk_widget_set_sensitive (state->prompt_cb, active);
62 gtk_widget_set_sensitive (state->ok_button,
63 !active || (!minutes_err && minutes > 0));
66 gboolean
67 dialog_autosave_prompt (WBCGtk *wbcg)
69 char const *uri = go_doc_get_uri (
70 wb_control_get_doc (GNM_WBC (wbcg)));
71 GtkWidget *dialog = gtk_message_dialog_new (wbcg_toplevel (wbcg),
72 GTK_DIALOG_DESTROY_WITH_PARENT,
73 GTK_MESSAGE_QUESTION,
74 GTK_BUTTONS_YES_NO,
75 _("Do you want to save the workbook %s?"),
76 uri);
77 gint result = gtk_dialog_run (GTK_DIALOG (dialog));
79 gtk_widget_destroy (dialog);
81 return result == GTK_RESPONSE_YES;
84 static void
85 cb_autosave_cancel (G_GNUC_UNUSED GtkWidget *button,
86 autosave_t *state)
88 gtk_widget_destroy (state->dialog);
91 static void
92 cb_autosave_ok (G_GNUC_UNUSED GtkWidget *button, autosave_t *state)
94 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state->autosave_on_off))) {
95 gboolean prompt = gtk_toggle_button_get_active
96 (GTK_TOGGLE_BUTTON (state->prompt_cb));
97 int minutes, secs;
98 gboolean minutes_err = entry_to_int (GTK_ENTRY (state->minutes_entry),
99 &minutes, TRUE);
101 g_return_if_fail (!minutes_err); /* Why is ok active? */
103 secs = 60 * MIN (minutes, G_MAXINT / 60);
104 g_object_set (state->wbcg,
105 "autosave-time", secs,
106 "autosave-prompt", prompt,
107 NULL);
108 } else {
109 g_object_set (state->wbcg, "autosave-time", 0, NULL);
111 gtk_widget_destroy (state->dialog);
114 void
115 dialog_autosave (WBCGtk *wbcg)
117 GtkBuilder *gui;
118 autosave_t *state;
119 int secs;
120 gboolean prompt;
122 g_return_if_fail (wbcg != NULL);
124 if (gnm_dialog_raise_if_exists (wbcg, AUTOSAVE_KEY))
125 return;
126 gui = gnm_gtk_builder_load ("autosave.ui", NULL, GO_CMD_CONTEXT (wbcg));
127 if (gui == NULL)
128 return;
130 g_object_get (wbcg,
131 "autosave-time", &secs,
132 "autosave-prompt", &prompt,
133 NULL);
135 state = g_new (autosave_t, 1);
136 state->wbcg = wbcg;
137 state->wb = wb_control_get_workbook (GNM_WBC (wbcg));
139 state->dialog = go_gtk_builder_get_widget (gui, "AutoSave");
140 state->minutes_entry = go_gtk_builder_get_widget (gui, "minutes");
141 state->prompt_cb = go_gtk_builder_get_widget (gui, "prompt_on_off");
142 state->autosave_on_off = go_gtk_builder_get_widget (gui, "autosave_on_off");
143 state->ok_button = go_gtk_builder_get_widget (gui, "button1");
144 state->cancel_button = go_gtk_builder_get_widget (gui, "button2");
146 if (!state->dialog || !state->minutes_entry || !state->prompt_cb ||
147 !state->autosave_on_off) {
148 go_gtk_notice_dialog (wbcg_toplevel (wbcg), GTK_MESSAGE_ERROR,
149 _("Could not create the autosave dialog."));
150 g_free (state);
151 return;
154 float_to_entry (GTK_ENTRY (state->minutes_entry),
155 secs / 60);
157 gnm_editable_enters (GTK_WINDOW (state->dialog),
158 state->minutes_entry);
160 g_signal_connect (G_OBJECT (state->autosave_on_off),
161 "toggled",
162 G_CALLBACK (autosave_set_sensitivity), state);
163 g_signal_connect (G_OBJECT (state->minutes_entry),
164 "changed",
165 G_CALLBACK (autosave_set_sensitivity), state);
166 g_signal_connect (G_OBJECT (state->ok_button),
167 "clicked",
168 G_CALLBACK (cb_autosave_ok), state);
169 g_signal_connect (G_OBJECT (state->cancel_button),
170 "clicked",
171 G_CALLBACK (cb_autosave_cancel), state);
173 g_object_set_data_full (G_OBJECT (state->dialog),
174 "state", state, (GDestroyNotify)g_free);
175 gnm_init_help_button (
176 go_gtk_builder_get_widget (gui, "button3"),
177 GNUMERIC_HELP_LINK_AUTOSAVE);
179 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->autosave_on_off),
180 secs > 0);
181 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->prompt_cb),
182 prompt);
184 autosave_set_sensitivity (NULL, state);
185 gnm_keyed_dialog (state->wbcg, GTK_WINDOW (state->dialog),
186 AUTOSAVE_KEY);
187 gtk_widget_show (state->dialog);
189 g_object_unref (gui);