1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
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.
22 * SECTION:anjuta-save-prompt
23 * @short_description: Save dialog prompt for unsaved data
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 */
56 COL_ITEM_SAVE_FUNC_DATA
,
60 static GtkDialogClass
*parent_class
= NULL
;
63 anjuta_save_prompt_get_type()
65 static GType type
= 0;
68 static const GTypeInfo our_info
= {
69 sizeof (AnjutaSavePromptClass
),
72 (GClassInitFunc
)anjuta_save_prompt_class_init
,
75 sizeof (AnjutaSavePrompt
),
77 (GInstanceInitFunc
)anjuta_save_prompt_init
,
80 type
= g_type_register_static(GTK_TYPE_MESSAGE_DIALOG
,
81 "AnjutaSavePrompt", &our_info
, 0);
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
;
97 on_dialog_response (GtkWidget
*dlg
, gint response
, gpointer user_data
)
99 if (response
== ANJUTA_SAVE_PROMPT_RESPONSE_SAVE_CLOSE
)
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
))
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
,
118 COL_ITEM_SAVE_FUNC
, &item_save_func
,
119 COL_ITEM_SAVE_FUNC_DATA
, &user_data
,
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
,
131 g_signal_stop_emission_by_name (save_prompt
,
137 while (gtk_tree_model_iter_next (model
, &iter
));
143 anjuta_save_prompt_init(AnjutaSavePrompt
*obj
)
148 GtkTreeViewColumn
*col
;
149 GtkCellRenderer
*renderer
;
151 GtkWidget
*scrolledwindow
;
153 obj
->priv
= g_new0(AnjutaSavePromptPrivate
, 1);
155 gtk_label_set_text_with_mnemonic (GTK_LABEL (GTK_MESSAGE_DIALOG (obj
)->label
),
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
),
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"),
199 "active", COL_SAVE_ENABLE
,
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"),
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
,
213 ANJUTA_SAVE_PROMPT_RESPONSE_CANCEL
,
215 ANJUTA_SAVE_PROMPT_RESPONSE_SAVE_CLOSE
,
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
),
224 obj
->priv
->treeview
= treeview
;
228 anjuta_save_prompt_finalize(GObject
*object
)
230 AnjutaSavePrompt
*cobj
;
231 cobj
= ANJUTA_SAVE_PROMPT(object
);
233 /* Free private members, etc. */
236 G_OBJECT_CLASS(parent_class
)->finalize(object
);
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
,
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
);
256 anjuta_save_prompt_get_items_count (AnjutaSavePrompt
*save_prompt
)
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
);
266 anjuta_save_prompt_add_item (AnjutaSavePrompt
*save_prompt
,
267 const gchar
*item_name
,
268 const gchar
*item_detail
,
270 AnjutaSavePromptSaveFunc item_save_func
,
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
);
283 label
= g_strdup_printf ("<b>%s</b>\n%s", item_name
, item_detail
);
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
),
291 COL_SAVE_ENABLE
, TRUE
,
294 COL_ITEM_SAVE_FUNC
, item_save_func
,
295 COL_ITEM_SAVE_FUNC_DATA
, user_data
,
299 items_count
= anjuta_save_prompt_get_items_count (save_prompt
);
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
);
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
),