* data/default.proflie, data/Makefile.am, src/anjuta.c,
[anjuta-git-plugin.git] / libanjuta / anjuta-save-prompt.c
blobb06373c224302cee5f178a6ef8cf7c7baf841923
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #include <glib/gi18n.h>
22 #include <gtk/gtktreeview.h>
23 #include <gtk/gtkliststore.h>
24 #include <gtk/gtkvbox.h>
25 #include <gtk/gtkcellrenderertoggle.h>
26 #include <gtk/gtkcellrenderertext.h>
27 #include <gtk/gtkscrolledwindow.h>
28 #include <gtk/gtklabel.h>
29 #include <gtk/gtkstock.h>
31 #include "anjuta-save-prompt.h"
33 static void anjuta_save_prompt_class_init(AnjutaSavePromptClass *klass);
34 static void anjuta_save_prompt_init(AnjutaSavePrompt *sp);
35 static void anjuta_save_prompt_finalize(GObject *object);
37 struct _AnjutaSavePromptPrivate {
38 /* Place Private Members Here */
39 GtkWidget *treeview;
42 enum {
43 COL_SAVE_ENABLE,
44 COL_LABEL,
45 COL_ITEM,
46 COL_ITEM_SAVE_FUNC,
47 COL_ITEM_SAVE_FUNC_DATA,
48 N_COLS
51 static GtkDialogClass *parent_class = NULL;
53 GType
54 anjuta_save_prompt_get_type()
56 static GType type = 0;
58 if(type == 0) {
59 static const GTypeInfo our_info = {
60 sizeof (AnjutaSavePromptClass),
61 NULL,
62 NULL,
63 (GClassInitFunc)anjuta_save_prompt_class_init,
64 NULL,
65 NULL,
66 sizeof (AnjutaSavePrompt),
68 (GInstanceInitFunc)anjuta_save_prompt_init,
71 type = g_type_register_static(GTK_TYPE_MESSAGE_DIALOG,
72 "AnjutaSavePrompt", &our_info, 0);
75 return type;
78 static void
79 anjuta_save_prompt_class_init(AnjutaSavePromptClass *klass)
81 GObjectClass *object_class = G_OBJECT_CLASS(klass);
83 parent_class = g_type_class_peek_parent(klass);
84 object_class->finalize = anjuta_save_prompt_finalize;
87 static void
88 on_dialog_response (GtkWidget *dlg, gint response, gpointer user_data)
90 if (response == ANJUTA_SAVE_PROMPT_RESPONSE_SAVE_CLOSE)
92 GtkWidget *treeview;
93 GtkTreeModel *model;
94 GtkTreeIter iter;
96 AnjutaSavePrompt *save_prompt = ANJUTA_SAVE_PROMPT (dlg);
97 treeview = save_prompt->priv->treeview;
98 model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
99 if(gtk_tree_model_get_iter_first (model, &iter))
101 do {
102 gboolean save_enable;
103 gpointer item, user_data;
104 AnjutaSavePromptSaveFunc item_save_func;
106 gtk_tree_model_get (model, &iter,
107 COL_SAVE_ENABLE, &save_enable,
108 COL_ITEM, &item,
109 COL_ITEM_SAVE_FUNC, &item_save_func,
110 COL_ITEM_SAVE_FUNC_DATA, &user_data,
111 -1);
112 if (save_enable)
114 if (item_save_func(save_prompt, item, user_data))
116 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
117 COL_SAVE_ENABLE, FALSE,
118 -1);
120 else
122 g_signal_stop_emission_by_name (save_prompt,
123 "response");
124 break;
128 while (gtk_tree_model_iter_next (model, &iter));
133 static void
134 anjuta_save_prompt_init(AnjutaSavePrompt *obj)
136 GtkWidget *vbox;
137 GtkWidget *treeview;
138 GtkListStore *store;
139 GtkTreeViewColumn *col;
140 GtkCellRenderer *renderer;
141 GtkWidget *label;
142 GtkWidget *scrolledwindow;
144 obj->priv = g_new0(AnjutaSavePromptPrivate, 1);
146 gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_MESSAGE_DIALOG (obj)->label),
147 "Uninitialized");
148 gtk_window_set_resizable (GTK_WINDOW (obj), TRUE);
149 gtk_window_set_default_size (GTK_WINDOW (obj), 400, 300);
151 vbox = gtk_vbox_new (FALSE, 0);
152 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (obj)->vbox),
153 vbox, TRUE, TRUE, 0);
154 gtk_widget_show (vbox);
156 label = gtk_label_new (_("Select the items to save:"));
157 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
158 gtk_misc_set_padding (GTK_MISC (label), 10, -1);
159 gtk_misc_set_alignment (GTK_MISC (label), 0, -1);
160 gtk_widget_show (label);
162 store = gtk_list_store_new (N_COLS, G_TYPE_BOOLEAN,
163 G_TYPE_STRING, G_TYPE_POINTER,
164 G_TYPE_POINTER, G_TYPE_POINTER);
166 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
167 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
168 GTK_POLICY_AUTOMATIC,
169 GTK_POLICY_AUTOMATIC);
170 gtk_box_pack_start (GTK_BOX (vbox), scrolledwindow, TRUE, TRUE, 0);
171 gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow), 10);
172 gtk_widget_show (scrolledwindow);
174 treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
175 g_object_unref (store);
176 gtk_container_add (GTK_CONTAINER (scrolledwindow), treeview);
177 gtk_widget_show (treeview);
179 label = gtk_label_new (_("If you do not save, all your changes will be lost."));
180 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
181 gtk_misc_set_padding (GTK_MISC (label), 10, -1);
182 gtk_misc_set_alignment (GTK_MISC (label), 0, -1);
183 gtk_widget_show (label);
185 renderer = gtk_cell_renderer_toggle_new ();
186 col = gtk_tree_view_column_new_with_attributes (_("Save"),
187 renderer,
188 "active", COL_SAVE_ENABLE,
189 NULL);
190 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), col);
192 renderer = gtk_cell_renderer_text_new ();
193 col = gtk_tree_view_column_new_with_attributes (_("Item"),
194 renderer,
195 "markup", COL_LABEL,
196 NULL);
197 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), col);
199 gtk_dialog_add_buttons (GTK_DIALOG (obj), _("_Discard changes"),
200 ANJUTA_SAVE_PROMPT_RESPONSE_DISCARD,
201 GTK_STOCK_CANCEL,
202 ANJUTA_SAVE_PROMPT_RESPONSE_CANCEL,
203 GTK_STOCK_SAVE,
204 ANJUTA_SAVE_PROMPT_RESPONSE_SAVE_CLOSE,
205 NULL);
206 gtk_dialog_set_has_separator (GTK_DIALOG (obj), TRUE);
207 gtk_dialog_set_default_response (GTK_DIALOG (obj),
208 ANJUTA_SAVE_PROMPT_RESPONSE_SAVE_CLOSE);
209 g_signal_connect (obj, "response",
210 G_CALLBACK (on_dialog_response),
211 obj);
212 obj->priv->treeview = treeview;
215 static void
216 anjuta_save_prompt_finalize(GObject *object)
218 AnjutaSavePrompt *cobj;
219 cobj = ANJUTA_SAVE_PROMPT(object);
221 /* Free private members, etc. */
223 g_free(cobj->priv);
224 G_OBJECT_CLASS(parent_class)->finalize(object);
227 AnjutaSavePrompt *
228 anjuta_save_prompt_new (GtkWindow *parent)
230 AnjutaSavePrompt *obj;
232 g_return_val_if_fail (GTK_IS_WINDOW (parent), NULL);
234 obj = ANJUTA_SAVE_PROMPT(g_object_new(ANJUTA_TYPE_SAVE_PROMPT,
235 "message-type", GTK_MESSAGE_QUESTION,
236 NULL));
237 gtk_dialog_set_has_separator (GTK_DIALOG (obj), TRUE);
238 gtk_window_set_transient_for (GTK_WINDOW (obj), parent);
239 return obj;
242 gint
243 anjuta_save_prompt_get_items_count (AnjutaSavePrompt *save_prompt)
245 GtkTreeModel *model;
246 g_return_val_if_fail (ANJUTA_IS_SAVE_PROMPT (save_prompt), -1);
247 model = gtk_tree_view_get_model (GTK_TREE_VIEW (save_prompt->priv->treeview));
248 return gtk_tree_model_iter_n_children (model, NULL);
252 void
253 anjuta_save_prompt_add_item (AnjutaSavePrompt *save_prompt,
254 const gchar *item_name,
255 const gchar *item_detail,
256 gpointer item,
257 AnjutaSavePromptSaveFunc item_save_func,
258 gpointer user_data)
260 GtkTreeModel *model;
261 GtkTreeIter iter;
262 gchar *label;
263 gint items_count;
265 g_return_if_fail (ANJUTA_IS_SAVE_PROMPT (save_prompt));
266 g_return_if_fail (item_name != NULL);
267 g_return_if_fail (item_save_func != NULL);
269 if (item_detail)
270 label = g_strdup_printf ("<b>%s</b>\n%s", item_name, item_detail);
271 else
272 label = g_strdup (item_name);
274 model = gtk_tree_view_get_model (GTK_TREE_VIEW (save_prompt->priv->treeview));
275 gtk_list_store_append (GTK_LIST_STORE (model), &iter);
276 gtk_list_store_set (GTK_LIST_STORE (model),
277 &iter,
278 COL_SAVE_ENABLE, TRUE,
279 COL_LABEL, label,
280 COL_ITEM, item,
281 COL_ITEM_SAVE_FUNC, item_save_func,
282 COL_ITEM_SAVE_FUNC_DATA, user_data,
283 -1);
284 g_free (label);
286 items_count = anjuta_save_prompt_get_items_count (save_prompt);
288 if (items_count > 1)
290 gchar *string;
291 string = g_strdup_printf("<b>%s</b>",
292 _("There are %d items with unsaved changes. Save changes before closing?"));
293 label = g_strdup_printf (string, items_count);
294 g_free(string);
296 else
298 label = g_strdup_printf("<b>%s</b>",
299 _("There is an item with unsaved changes. Save changes before closing?"));
302 gtk_label_set_markup (GTK_LABEL (GTK_MESSAGE_DIALOG (save_prompt)->label),
303 label);