Fix a Gtk warning when checking path input in the log viewer.
[anjuta-git-plugin.git] / libanjuta / anjuta-save-prompt.c
blob26f4a22f41e3f9facd2b85b06a8604d21aafa008
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * anjuta-save-prompt.c
4 * Copyright (C) 2000 Naba Kumar <naba@gnome.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Library General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 /**
22 * SECTION:anjuta-save-prompt
23 * @short_description: Save dialog prompt for unsaved data
24 * @see_also:
25 * @stability: Unstable
26 * @include: libanjuta/anjuta-save-prompt.h
30 #include <glib/gi18n.h>
31 #include <gtk/gtktreeview.h>
32 #include <gtk/gtkliststore.h>
33 #include <gtk/gtkvbox.h>
34 #include <gtk/gtkcellrenderertoggle.h>
35 #include <gtk/gtkcellrenderertext.h>
36 #include <gtk/gtkscrolledwindow.h>
37 #include <gtk/gtklabel.h>
38 #include <gtk/gtkstock.h>
40 #include "anjuta-save-prompt.h"
42 static void anjuta_save_prompt_class_init(AnjutaSavePromptClass *klass);
43 static void anjuta_save_prompt_init(AnjutaSavePrompt *sp);
44 static void anjuta_save_prompt_finalize(GObject *object);
46 struct _AnjutaSavePromptPrivate {
47 /* Place Private Members Here */
48 GtkWidget *treeview;
51 enum {
52 COL_SAVE_ENABLE,
53 COL_LABEL,
54 COL_ITEM,
55 COL_ITEM_SAVE_FUNC,
56 COL_ITEM_SAVE_FUNC_DATA,
57 N_COLS
60 static GtkDialogClass *parent_class = NULL;
62 GType
63 anjuta_save_prompt_get_type()
65 static GType type = 0;
67 if(type == 0) {
68 static const GTypeInfo our_info = {
69 sizeof (AnjutaSavePromptClass),
70 NULL,
71 NULL,
72 (GClassInitFunc)anjuta_save_prompt_class_init,
73 NULL,
74 NULL,
75 sizeof (AnjutaSavePrompt),
77 (GInstanceInitFunc)anjuta_save_prompt_init,
80 type = g_type_register_static(GTK_TYPE_MESSAGE_DIALOG,
81 "AnjutaSavePrompt", &our_info, 0);
84 return type;
87 static void
88 anjuta_save_prompt_class_init(AnjutaSavePromptClass *klass)
90 GObjectClass *object_class = G_OBJECT_CLASS(klass);
92 parent_class = g_type_class_peek_parent(klass);
93 object_class->finalize = anjuta_save_prompt_finalize;
96 static void
97 on_dialog_response (GtkWidget *dlg, gint response, gpointer user_data)
99 if (response == ANJUTA_SAVE_PROMPT_RESPONSE_SAVE_CLOSE)
101 GtkWidget *treeview;
102 GtkTreeModel *model;
103 GtkTreeIter iter;
105 AnjutaSavePrompt *save_prompt = ANJUTA_SAVE_PROMPT (dlg);
106 treeview = save_prompt->priv->treeview;
107 model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
108 if(gtk_tree_model_get_iter_first (model, &iter))
110 do {
111 gboolean save_enable;
112 gpointer item, user_data;
113 AnjutaSavePromptSaveFunc item_save_func;
115 gtk_tree_model_get (model, &iter,
116 COL_SAVE_ENABLE, &save_enable,
117 COL_ITEM, &item,
118 COL_ITEM_SAVE_FUNC, &item_save_func,
119 COL_ITEM_SAVE_FUNC_DATA, &user_data,
120 -1);
121 if (save_enable)
123 if (item_save_func(save_prompt, item, user_data))
125 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
126 COL_SAVE_ENABLE, FALSE,
127 -1);
129 else
131 g_signal_stop_emission_by_name (save_prompt,
132 "response");
133 break;
137 while (gtk_tree_model_iter_next (model, &iter));
142 static void
143 anjuta_save_prompt_init(AnjutaSavePrompt *obj)
145 GtkWidget *vbox;
146 GtkWidget *treeview;
147 GtkListStore *store;
148 GtkTreeViewColumn *col;
149 GtkCellRenderer *renderer;
150 GtkWidget *label;
151 GtkWidget *scrolledwindow;
153 obj->priv = g_new0(AnjutaSavePromptPrivate, 1);
155 gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_MESSAGE_DIALOG (obj)->label),
156 "Uninitialized");
157 gtk_window_set_resizable (GTK_WINDOW (obj), TRUE);
158 gtk_window_set_default_size (GTK_WINDOW (obj), 400, 300);
160 vbox = gtk_vbox_new (FALSE, 0);
161 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (obj)->vbox),
162 vbox, TRUE, TRUE, 0);
163 gtk_widget_show (vbox);
165 label = gtk_label_new (_("Select the items to save:"));
166 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
167 gtk_misc_set_padding (GTK_MISC (label), 10, -1);
168 gtk_misc_set_alignment (GTK_MISC (label), 0, -1);
169 gtk_widget_show (label);
171 store = gtk_list_store_new (N_COLS, G_TYPE_BOOLEAN,
172 G_TYPE_STRING, G_TYPE_POINTER,
173 G_TYPE_POINTER, G_TYPE_POINTER);
175 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
176 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
177 GTK_POLICY_AUTOMATIC,
178 GTK_POLICY_AUTOMATIC);
179 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
180 GTK_SHADOW_IN);
181 gtk_box_pack_start (GTK_BOX (vbox), scrolledwindow, TRUE, TRUE, 0);
182 gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow), 10);
183 gtk_widget_show (scrolledwindow);
185 treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
186 g_object_unref (store);
187 gtk_container_add (GTK_CONTAINER (scrolledwindow), treeview);
188 gtk_widget_show (treeview);
190 label = gtk_label_new (_("If you do not save, all your changes will be lost."));
191 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
192 gtk_misc_set_padding (GTK_MISC (label), 10, -1);
193 gtk_misc_set_alignment (GTK_MISC (label), 0, -1);
194 gtk_widget_show (label);
196 renderer = gtk_cell_renderer_toggle_new ();
197 col = gtk_tree_view_column_new_with_attributes (_("Save"),
198 renderer,
199 "active", COL_SAVE_ENABLE,
200 NULL);
201 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), col);
203 renderer = gtk_cell_renderer_text_new ();
204 col = gtk_tree_view_column_new_with_attributes (_("Item"),
205 renderer,
206 "markup", COL_LABEL,
207 NULL);
208 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), col);
210 gtk_dialog_add_buttons (GTK_DIALOG (obj), _("_Discard changes"),
211 ANJUTA_SAVE_PROMPT_RESPONSE_DISCARD,
212 GTK_STOCK_CANCEL,
213 ANJUTA_SAVE_PROMPT_RESPONSE_CANCEL,
214 GTK_STOCK_SAVE,
215 ANJUTA_SAVE_PROMPT_RESPONSE_SAVE_CLOSE,
216 NULL);
217 /* TRUE is the default and Gtk warns that this has no effect */
218 /* gtk_dialog_set_has_separator (GTK_DIALOG (obj), TRUE); */
219 gtk_dialog_set_default_response (GTK_DIALOG (obj),
220 ANJUTA_SAVE_PROMPT_RESPONSE_SAVE_CLOSE);
221 g_signal_connect (obj, "response",
222 G_CALLBACK (on_dialog_response),
223 obj);
224 obj->priv->treeview = treeview;
227 static void
228 anjuta_save_prompt_finalize(GObject *object)
230 AnjutaSavePrompt *cobj;
231 cobj = ANJUTA_SAVE_PROMPT(object);
233 /* Free private members, etc. */
235 g_free(cobj->priv);
236 G_OBJECT_CLASS(parent_class)->finalize(object);
239 AnjutaSavePrompt *
240 anjuta_save_prompt_new (GtkWindow *parent)
242 AnjutaSavePrompt *obj;
244 g_return_val_if_fail (GTK_IS_WINDOW (parent), NULL);
246 obj = ANJUTA_SAVE_PROMPT(g_object_new(ANJUTA_TYPE_SAVE_PROMPT,
247 "message-type", GTK_MESSAGE_QUESTION,
248 NULL));
249 /* Gtk warns that this has no effect
250 gtk_dialog_set_has_separator (GTK_DIALOG (obj), TRUE); */
251 gtk_window_set_transient_for (GTK_WINDOW (obj), parent);
252 return obj;
255 gint
256 anjuta_save_prompt_get_items_count (AnjutaSavePrompt *save_prompt)
258 GtkTreeModel *model;
259 g_return_val_if_fail (ANJUTA_IS_SAVE_PROMPT (save_prompt), -1);
260 model = gtk_tree_view_get_model (GTK_TREE_VIEW (save_prompt->priv->treeview));
261 return gtk_tree_model_iter_n_children (model, NULL);
265 void
266 anjuta_save_prompt_add_item (AnjutaSavePrompt *save_prompt,
267 const gchar *item_name,
268 const gchar *item_detail,
269 gpointer item,
270 AnjutaSavePromptSaveFunc item_save_func,
271 gpointer user_data)
273 GtkTreeModel *model;
274 GtkTreeIter iter;
275 gchar *label;
276 gint items_count;
278 g_return_if_fail (ANJUTA_IS_SAVE_PROMPT (save_prompt));
279 g_return_if_fail (item_name != NULL);
280 g_return_if_fail (item_save_func != NULL);
282 if (item_detail)
283 label = g_strdup_printf ("<b>%s</b>\n%s", item_name, item_detail);
284 else
285 label = g_strdup (item_name);
287 model = gtk_tree_view_get_model (GTK_TREE_VIEW (save_prompt->priv->treeview));
288 gtk_list_store_append (GTK_LIST_STORE (model), &iter);
289 gtk_list_store_set (GTK_LIST_STORE (model),
290 &iter,
291 COL_SAVE_ENABLE, TRUE,
292 COL_LABEL, label,
293 COL_ITEM, item,
294 COL_ITEM_SAVE_FUNC, item_save_func,
295 COL_ITEM_SAVE_FUNC_DATA, user_data,
296 -1);
297 g_free (label);
299 items_count = anjuta_save_prompt_get_items_count (save_prompt);
301 if (items_count > 1)
303 label = g_strdup_printf(
304 ngettext ("<b>There is %d item with unsaved changes. Save changes before closing?</b>",
305 "<b>There are %d items with unsaved changes. Save changes before closing?</b>",
306 items_count), items_count);
308 else
310 label = g_strdup_printf("<b>%s</b>",
311 _("There is an item with unsaved changes. Save changes before closing?"));
314 gtk_label_set_markup (GTK_LABEL (GTK_MESSAGE_DIALOG (save_prompt)->label),
315 label);
316 g_free (label);