2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2007 Hiroyuki Yamamoto
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include <glib/gi18n.h>
26 #include <gtk/gtkdialog.h>
27 #include <gtk/gtkhbox.h>
28 #include <gtk/gtklabel.h>
29 #include <gtk/gtkprogressbar.h>
30 #include <gtk/gtkscrolledwindow.h>
31 #include <gtk/gtkliststore.h>
32 #include <gtk/gtktreeview.h>
33 #include <gtk/gtktreeselection.h>
34 #include <gtk/gtkcellrendererpixbuf.h>
35 #include <gtk/gtkcellrenderertext.h>
36 #include <gtk/gtkbutton.h>
37 #include <gtk/gtkstock.h>
39 #include "progressdialog.h"
42 #include "prefs_common.h"
51 static gint progress_dialog_insert_account(ProgressDialog *progress,
57 ProgressDialog *progress_dialog_create(void)
59 ProgressDialog *progress;
63 GtkWidget *cancel_btn;
64 GtkWidget *progressbar;
65 GtkWidget *scrolledwin;
68 GtkTreeSelection *selection;
69 GtkTreeViewColumn *column;
70 GtkCellRenderer *renderer;
72 debug_print("Creating progress dialog...\n");
73 progress = g_new0(ProgressDialog, 1);
75 dialog = gtk_dialog_new();
76 gtk_container_set_border_width(GTK_CONTAINER(dialog), 8);
77 gtk_window_set_resizable(GTK_WINDOW(dialog), TRUE);
78 gtk_widget_realize(dialog);
80 gtk_container_set_border_width
81 (GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), 0);
82 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), 8);
83 gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
85 hbox = gtk_hbox_new(FALSE, 0);
86 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
88 gtk_widget_show(hbox);
90 label = gtk_label_new("");
91 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 8);
92 gtk_widget_show(label);
94 cancel_btn = gtk_dialog_add_button(GTK_DIALOG(dialog),
97 gtk_widget_grab_default(cancel_btn);
98 gtk_widget_grab_focus(cancel_btn);
100 progressbar = gtk_progress_bar_new();
101 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), progressbar,
103 gtk_widget_show(progressbar);
105 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
106 gtk_widget_show(scrolledwin);
107 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrolledwin,
109 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
110 GTK_POLICY_AUTOMATIC,
111 GTK_POLICY_AUTOMATIC);
114 store = gtk_list_store_new(N_PROGRESS_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING,
115 G_TYPE_STRING, G_TYPE_POINTER);
117 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
118 g_object_unref(G_OBJECT(store));
119 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
120 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview),
121 prefs_common.use_stripes_everywhere);
122 gtk_widget_show(treeview);
123 gtk_container_add(GTK_CONTAINER(scrolledwin), treeview);
124 gtk_widget_set_size_request(treeview, -1, 120);
126 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
127 gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
129 renderer = gtk_cell_renderer_pixbuf_new();
130 g_object_set(renderer, "xalign", 0.5, NULL);
131 column = gtk_tree_view_column_new_with_attributes
132 (NULL, renderer, "pixbuf", PROGRESS_IMAGE, NULL);
133 gtk_tree_view_column_set_alignment(column, 0.5);
134 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
135 gtk_tree_view_column_set_fixed_width(column, 20);
136 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
138 renderer = gtk_cell_renderer_text_new();
139 column = gtk_tree_view_column_new_with_attributes
140 (_("Account"), renderer, "text", PROGRESS_ACCOUNT, NULL);
141 gtk_tree_view_column_set_resizable(column, TRUE);
142 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
143 gtk_tree_view_column_set_fixed_width(column, 160);
144 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
146 renderer = gtk_cell_renderer_text_new();
147 column = gtk_tree_view_column_new_with_attributes
148 (_("Status"), renderer, "text", PROGRESS_STATE, NULL);
149 gtk_tree_view_column_set_resizable(column, TRUE);
150 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
151 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
153 progress->window = dialog;
154 progress->label = label;
155 progress->cancel_btn = cancel_btn;
156 progress->progressbar = progressbar;
157 progress->treeview = treeview;
158 progress->store = store;
163 void progress_dialog_set_label(ProgressDialog *progress, gchar *str)
165 gtk_label_set_text(GTK_LABEL(progress->label), str);
168 void progress_dialog_get_fraction(ProgressDialog *progress)
170 gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress->progressbar));
173 void progress_dialog_set_fraction(ProgressDialog *progress,
176 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress->progressbar),
180 void progress_dialog_destroy(ProgressDialog *progress)
183 gtk_widget_destroy(progress->window);
189 *\return gint Row where account was set
191 gint progress_dialog_list_set_account(ProgressDialog *progress,
193 const gchar *account_name)
195 return progress_dialog_insert_account(progress, row, account_name,
200 *\return gint Row where image was set
202 gint progress_dialog_list_set_image(ProgressDialog *progress,
206 return progress_dialog_insert_account(progress, row, NULL,
211 *\return gint Row where status was set
213 gint progress_dialog_list_set_status(ProgressDialog *progress,
217 return progress_dialog_insert_account(progress, row, NULL,
222 *\return gint Row where data were set
224 gint progress_dialog_list_set(ProgressDialog *progress,
227 const gchar *account_name,
230 return progress_dialog_insert_account(progress, row, account_name,
234 void progress_dialog_scroll_to_row(ProgressDialog *progress, gint row)
236 GtkTreeModel *model = GTK_TREE_MODEL(progress->store);
240 if (!gtk_tree_model_iter_nth_child(model, &iter, NULL, row))
243 path = gtk_tree_model_get_path(model, &iter);
244 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(progress->treeview),
245 path, NULL, FALSE, 0.0, 0.0);
246 gtk_tree_path_free(path);
249 static gint progress_dialog_insert_account(ProgressDialog *progress,
251 const gchar *account,
256 GtkListStore *store = progress->store;
259 if (account == NULL && status == NULL && image == NULL)
262 /* see if row exists, if not append */
263 if (row < 0 || !gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
265 result = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store),
267 gtk_list_store_append(store, &iter);
272 * XXX: uhm, when does the iter invalidate? sure not while
273 * just setting a row's column i hope?
277 gtk_list_store_set(store, &iter,
278 PROGRESS_ACCOUNT, account,
281 gtk_list_store_set(store, &iter,
282 PROGRESS_STATE, status,
285 gtk_list_store_set(store, &iter,
286 PROGRESS_IMAGE, image,