508e56a57670154cf908f8d493ba3b7dc5b53d56
[modest] / src / hildon / modest-ui-main-view.c
1 #include <gtk/gtk.h>
2 #include <glade/glade.h>
3 #include <glib/gi18n.h>
4 #include <string.h>
5
6 #ifdef HAVE_CONFIG_H
7 #include <config.h>
8 #endif /*HAVE_CONFIG_H*/
9
10 #include <hildon-widgets/hildon-app.h>
11
12 /* TODO: put in auto* */
13 #include <tny-text-buffer-stream.h>
14 #include <tny-msg-folder.h>
15
16 #include "../modest-ui.h"
17 #include "../modest-window-mgr.h"
18 #include "../modest-account-mgr.h"
19 #include "../modest-account-mgr.h"
20 #include "../modest-identity-mgr.h"
21
22 #include "../modest-tny-account-store.h"
23 #include "../modest-tny-folder-tree-view.h"
24 #include "../modest-tny-header-tree-view.h"
25 #include "../modest-tny-msg-view.h"
26 #include "../modest-tny-transport-actions.h"
27 #include "../modest-tny-store-actions.h"
28
29 #include "../modest-text-utils.h"
30 #include "../modest-tny-msg-actions.h"
31
32 #include "../modest-editor-window.h"
33
34 #include "modest-ui-glade.h"
35 #include "modest-ui-wizard.h"
36 #include "modest-ui-account-setup.h"
37
38 #include "modest-ui-main-view.h"
39 #include "modest-ui-message-editor.h"
40 #include "modest-ui-message-viewer.h"
41
42
43 static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
44                                                   TnyAccountStoreIface *account_store);
45
46 static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder);
47
48 static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
49                                TnyMsgFolderIface *folder,
50                                gpointer data);
51
52 static void on_message_clicked (ModestTnyFolderTreeView *folder_tree,
53                                 TnyMsgIface *message,
54                                 gpointer data);
55
56 static void on_reply_clicked (GtkWidget *widget, gpointer user_data);
57
58 static void on_forward_clicked (GtkWidget *widget, gpointer user_data);
59
60 static void on_delete_clicked (GtkWidget *widget, gpointer user_data);
61
62 static void on_view_attachments_toggled(GtkWidget *widget, gpointer user_data);
63
64 static void on_sendreceive_button_clicked (GtkWidget *widget, gpointer user_data);
65
66 static void on_forward_attached_activated (GtkWidget *widget, gpointer user_data);
67
68 static void on_headers_status_update (GtkWidget *header_view, const gchar *msg, gint status,
69                           gpointer user_data);
70 static void on_status_cleanup (gpointer user_data);
71
72 static void register_toolbar_callbacks (ModestUI *modest_ui);
73
74
75 static void
76 modest_ui_main_view_destroy (GtkWidget *win, GdkEvent *event, gpointer data)
77 {
78         ModestUIPrivate *priv;
79
80         g_return_if_fail (data);
81         g_return_if_fail(MODEST_IS_UI(data));
82         priv = MODEST_UI_GET_PRIVATE((ModestUI *)data);
83         g_return_if_fail(priv);
84         if (!modest_window_mgr_unregister (priv->modest_window_mgr, G_OBJECT(win)))
85                 g_warning ("modest window mgr: failed to unregister %p",
86                            G_OBJECT(win));
87         else
88                 gtk_widget_hide(win);
89 }
90
91
92 gboolean
93 modest_ui_show_main_window (ModestUI *modest_ui)
94 {
95         GtkWidget       *win, *app_view;
96         gint              height, width;
97         ModestUIPrivate *priv;
98         GtkWidget     *folder_view, *header_view;
99         GtkWidget     *message_view;
100         GtkWidget     *account_settings_item;
101         GtkWidget     *forward_attached_menu_item;
102         GtkWidget     *delete_item;
103         GtkWidget     *open_item;
104         GtkWidget     *view_attachments_item;
105         GtkWidget     *new_account_item;
106         GtkWidget     *main_menu, *menu_item, *main_toolbar;
107         
108         GtkWidget  *folder_view_holder,
109                 *header_view_holder,
110                 *mail_paned;
111         gboolean show_attachments_inline;
112
113         priv = MODEST_UI_GET_PRIVATE(modest_ui);
114         
115         height = modest_conf_get_int (priv->modest_conf,
116                                       MODEST_CONF_MAIN_WINDOW_HEIGHT,NULL);
117         width  = modest_conf_get_int (priv->modest_conf,
118                                       MODEST_CONF_MAIN_WINDOW_WIDTH,NULL);
119
120         win = glade_xml_get_widget (priv->glade_xml, "main");
121         if (!win) {
122                 g_warning ("could not create main window");
123                 return FALSE;
124         }
125
126         folder_view = GTK_WIDGET(modest_main_window_folder_tree(priv->modest_acc_mgr,
127                                                           priv->account_store));
128         priv->folder_view = folder_view;
129         folder_view_holder = glade_xml_get_widget (priv->glade_xml, "folders");
130         if (!folder_view||!folder_view_holder) {
131                 g_warning ("failed to create folder tree");
132                 return FALSE;
133         }
134         gtk_container_add (GTK_CONTAINER(folder_view_holder), folder_view);
135
136         header_view  =  GTK_WIDGET(modest_main_window_header_tree (NULL));
137         priv->header_view = header_view;
138         header_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_list");
139         if (!header_view) {
140                 g_warning ("failed to create header tree");
141                 return FALSE;
142         }
143         gtk_container_add (GTK_CONTAINER(header_view_holder), header_view);
144
145         g_signal_connect (G_OBJECT(folder_view), "folder_selected",
146                           G_CALLBACK(on_folder_clicked), modest_ui);
147
148         show_attachments_inline = modest_conf_get_bool(priv->modest_conf,
149                                              MODEST_CONF_MSG_VIEW_SHOW_ATTACHMENTS_INLINE,
150                                              NULL);
151
152         message_view  = GTK_WIDGET(modest_tny_msg_view_new (NULL, show_attachments_inline));
153         priv->message_view = message_view;
154         if (!message_view) {
155                 g_warning ("failed to create message view");
156                 return FALSE;
157         }
158         g_signal_connect(G_OBJECT(message_view), "on_mailto_clicked",
159                      G_CALLBACK(ui_on_mailto_clicked), modest_ui);
160         
161         mail_paned = glade_xml_get_widget (priv->glade_xml, "mail_paned");
162         gtk_paned_add2 (GTK_PANED(mail_paned), message_view);
163
164         g_signal_connect (header_view, "message_selected",
165                           G_CALLBACK(on_message_clicked),
166                           modest_ui);
167
168         g_signal_connect (header_view, "status_update",
169                           G_CALLBACK(on_headers_status_update), modest_ui);
170
171         g_signal_connect (header_view, "row-activated",
172                           G_CALLBACK(on_message_activated),
173                           modest_ui);
174
175         account_settings_item = glade_xml_get_widget (priv->glade_xml, "AccountSettingsMenuItem");
176         if (!account_settings_item) {
177                 g_warning ("The account settings item isn't available!\n");
178                 return FALSE;
179         }
180
181         g_signal_connect (account_settings_item, "activate",
182                           G_CALLBACK(account_settings), modest_ui);
183
184         new_account_item = glade_xml_get_widget (priv->glade_xml, "NewAccountWizardMenuItem");
185         if (!new_account_item) {
186                 g_warning ("The new account item isn't available!\n");
187                 return FALSE;
188         }
189
190         g_signal_connect (new_account_item, "activate",
191                 G_CALLBACK(new_wizard_account), modest_ui);
192
193         open_item = glade_xml_get_widget (priv->glade_xml, "open1");
194         if (!open_item) {
195                 g_warning ("The open item isn't available!\n");
196                 return FALSE;
197         }
198         g_signal_connect (open_item, "activate", G_CALLBACK(on_open_message_clicked),
199                           modest_ui);
200
201         delete_item = glade_xml_get_widget (priv->glade_xml, "delete1");
202         if (!delete_item) {
203                 g_warning ("The delete item isn't available!\n");
204                 return FALSE;
205         }
206         g_signal_connect (delete_item, "activate", G_CALLBACK(on_delete_clicked),
207                           modest_ui);
208
209         view_attachments_item = glade_xml_get_widget (priv->glade_xml, "menu_view_attachments");
210         if (!view_attachments_item) {
211                 g_warning ("The view_attachments_item isn't available!");
212                 return FALSE;
213         }
214
215         forward_attached_menu_item = glade_xml_get_widget (priv->glade_xml, "forward_attached");
216         if (!forward_attached_menu_item) {
217                 g_warning ("The forward_attached_menu_item isn't available!");
218                 return FALSE;
219         }
220         g_signal_connect (forward_attached_menu_item, "activate", G_CALLBACK(on_forward_attached_activated),
221                           modest_ui);
222
223         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(view_attachments_item),
224                                         modest_conf_get_bool(priv->modest_conf,
225                                         MODEST_CONF_MSG_VIEW_SHOW_ATTACHMENTS_INLINE,
226                                         NULL));
227
228         g_signal_connect (view_attachments_item, "toggled",
229                                 G_CALLBACK(on_view_attachments_toggled), modest_ui);
230
231         register_toolbar_callbacks (modest_ui);
232
233         modest_window_mgr_register (priv->modest_window_mgr,
234                                     G_OBJECT(win), MODEST_MAIN_WINDOW, 0);
235         g_signal_connect (win, "destroy-event", G_CALLBACK(modest_ui_main_view_destroy),
236                           modest_ui);
237         g_signal_connect (win, "delete-event", G_CALLBACK(modest_ui_main_view_destroy),
238                           modest_ui);
239         gtk_widget_set_usize (GTK_WIDGET(win), width, height);
240         hildon_app_set_title (HILDON_APP(win), PACKAGE_STRING);
241
242         app_view = glade_xml_get_widget (priv->glade_xml, "appview1");
243         
244         main_menu = hildon_appview_get_menu(HILDON_APPVIEW(app_view));
245         menu_item = glade_xml_get_widget (priv->glade_xml, "MessageMenuItem");
246         gtk_widget_reparent(menu_item, main_menu);
247         menu_item = glade_xml_get_widget (priv->glade_xml, "EditMenuItem");
248         gtk_widget_reparent(menu_item, main_menu);
249         menu_item = glade_xml_get_widget (priv->glade_xml, "FoldersMenuItem");
250         gtk_widget_reparent(menu_item, main_menu);
251         menu_item = glade_xml_get_widget (priv->glade_xml, "ViewMenuItem");
252         gtk_widget_reparent(menu_item, main_menu);
253         menu_item = glade_xml_get_widget (priv->glade_xml, "EMailMenuItem");
254         gtk_widget_reparent(menu_item, main_menu);
255         menu_item = glade_xml_get_widget (priv->glade_xml, "ToolsMenuItem");
256         gtk_widget_reparent(menu_item, main_menu);
257         menu_item = glade_xml_get_widget (priv->glade_xml, "CloseMenuItem");
258         gtk_widget_reparent(menu_item, main_menu);
259
260         main_toolbar = glade_xml_get_widget (priv->glade_xml, "toolbar1");
261         g_object_ref (main_toolbar);
262         gtk_container_remove (glade_xml_get_widget (priv->glade_xml, 
263                               "main_top_container"), main_toolbar);
264         hildon_appview_set_toolbar (HILDON_APPVIEW(app_view), GTK_TOOLBAR(main_toolbar));
265
266
267         gtk_widget_show_all (win);
268
269         menu_item = glade_xml_get_widget (priv->glade_xml, "menubar1");
270         gtk_widget_hide(menu_item);
271
272
273         return TRUE;
274 }
275
276
277 static void
278 register_toolbar_callbacks (ModestUI *modest_ui)
279 {
280         ModestUIPrivate *priv;
281         GtkWidget *button;
282
283         g_return_if_fail (modest_ui);
284
285         priv = MODEST_UI_GET_PRIVATE (modest_ui);
286
287         button = glade_xml_get_widget (priv->glade_xml, "toolb_new_mail");
288         if (button)
289                 g_signal_connect (button, "clicked",
290                                   G_CALLBACK(on_new_mail_clicked), modest_ui);
291
292         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
293         if (button) {
294                 g_signal_connect (button, "clicked",
295                                   G_CALLBACK(on_reply_clicked), modest_ui);
296                 gtk_widget_set_sensitive(button, FALSE);
297         }
298
299         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply_all");
300         if (button) {
301                 //g_signal_connect (button, "clicked",
302                 //                G_CALLBACK(on_reply_all_clicked), modest_ui);
303                 gtk_widget_set_sensitive(button, FALSE);
304         }
305
306         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
307         if (button) {
308                 g_signal_connect (button, "clicked",
309                                   G_CALLBACK(on_forward_clicked), modest_ui);
310                 gtk_widget_set_sensitive(button, FALSE);
311         }
312
313         button = glade_xml_get_widget (priv->glade_xml, "toolb_move_to");
314         if (button) {
315                 //g_signal_connect (button, "clicked",
316                 //                G_CALLBACK(on_move_to_clicked), modest_ui);
317                 gtk_widget_set_sensitive(button, FALSE);
318         }
319
320         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
321         if (button) {
322                 g_signal_connect (button, "clicked",
323                                   G_CALLBACK(on_delete_clicked), modest_ui);
324                 gtk_widget_set_sensitive(button, FALSE);
325         }
326
327         button = glade_xml_get_widget (priv->glade_xml, "toolb_send_receive");
328         if (button) {
329                 g_signal_connect (button, "clicked",
330                                   G_CALLBACK(on_sendreceive_button_clicked), modest_ui);
331                 gtk_widget_set_sensitive(button, TRUE);
332         }
333 }
334
335
336 static void
337 on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
338                    TnyMsgFolderIface *folder,
339                    gpointer data)
340 {
341         GtkWidget *win;
342         GtkWidget *button;
343         ModestTnyHeaderTreeView *tree_view;
344         ModestTnyMsgView *msg_view;
345         ModestUIPrivate *priv;
346         GtkWidget *scrollview;
347
348         g_return_if_fail (folder);
349         g_return_if_fail (data);
350
351         priv = MODEST_UI_GET_PRIVATE(data);
352         scrollview = glade_xml_get_widget (priv->glade_xml,"mail_list");
353
354         tree_view = MODEST_TNY_HEADER_TREE_VIEW (priv->header_view);
355
356         win = glade_xml_get_widget (priv->glade_xml, "main");
357         gtk_window_set_title (GTK_WINDOW(win),
358                               tny_msg_folder_iface_get_name(folder));
359
360         modest_tny_header_tree_view_set_folder (tree_view, folder);
361         priv->current_folder = folder;
362
363         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
364         if (button) {
365                 gtk_widget_set_sensitive(button, FALSE);
366         }
367
368         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
369         if (button) {
370                 gtk_widget_set_sensitive(button, FALSE);
371         }
372
373         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
374         if (button) {
375                 gtk_widget_set_sensitive(button, FALSE);
376         }
377
378         msg_view = MODEST_TNY_MSG_VIEW (priv->message_view);
379         g_return_if_fail (msg_view);
380
381         modest_tny_msg_view_set_message  (msg_view, NULL);
382 }
383
384
385 static void
386 on_message_clicked (ModestTnyFolderTreeView *folder_tree,
387                                 TnyMsgIface *message,
388                                 gpointer data)
389 {
390         GtkWidget *button;
391         ModestTnyMsgView *msg_view;
392         ModestUIPrivate *priv;
393
394         g_return_if_fail (data);
395
396         priv = MODEST_UI_GET_PRIVATE (data);
397         msg_view = MODEST_TNY_MSG_VIEW (priv->message_view);
398
399         modest_tny_msg_view_set_message (msg_view, message);
400         
401         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
402         if (button) {
403                 gtk_widget_set_sensitive(button, TRUE);
404         }
405         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
406         if (button) {
407                 gtk_widget_set_sensitive(button, TRUE);
408         }
409         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
410         if (button) {
411                 gtk_widget_set_sensitive(button, TRUE);
412         }
413 }
414
415
416 static GtkWidget*
417 modest_main_window_header_tree (TnyMsgFolderIface *folder)
418 {
419         int i;
420         GSList *columns = NULL;
421         GtkWidget *header_tree;
422         ModestTnyHeaderTreeViewColumn cols[] = {
423                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE,
424                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH,
425                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM,
426                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT,
427                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE
428         };
429
430         for (i = 0 ; i != sizeof(cols) / sizeof(ModestTnyHeaderTreeViewColumn); ++i)
431                 columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
432
433         header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns,
434                                                                  MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
435         g_slist_free (columns);
436
437         if (!header_tree) {
438                 g_warning ("could not create header tree");
439                 return NULL;
440         }
441
442         return GTK_WIDGET(header_tree);
443 }
444
445
446 static GtkWidget*
447 modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
448                                 TnyAccountStoreIface *account_store)
449 {
450         GtkWidget *folder_tree;
451
452         folder_tree = GTK_WIDGET (modest_tny_folder_tree_view_new (account_store));
453         if (!folder_tree) {
454                 g_warning ("could not create folder list");
455                 return NULL;
456         }
457
458         return folder_tree;
459 }
460
461
462 static void
463 on_reply_clicked (GtkWidget *widget, gpointer user_data)
464 {
465         ModestUI *modest_ui = (ModestUI *)user_data;
466
467         quoted_send_msg (modest_ui, QUOTED_SEND_REPLY);
468 }
469
470
471 static void
472 on_forward_clicked (GtkWidget *widget, gpointer user_data)
473 {
474         ModestUI *modest_ui = (ModestUI *)user_data;
475
476         quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD);
477 }
478
479
480 static void
481 on_view_attachments_toggled(GtkWidget *widget, gpointer user_data)
482 {
483         ModestUI *modest_ui = (ModestUI *)user_data;
484         GtkWidget *view_attachments_item;
485         ModestTnyMsgView *msg_view;
486         ModestUIPrivate *priv;
487         gboolean view_attachments_inline;
488
489         priv = MODEST_UI_GET_PRIVATE(modest_ui);
490         view_attachments_item = glade_xml_get_widget (priv->glade_xml, "menu_view_attachments");
491         g_return_if_fail(view_attachments_item);
492
493         msg_view = MODEST_TNY_MSG_VIEW(priv->message_view);
494
495         view_attachments_inline = gtk_check_menu_item_get_active(
496                                         GTK_CHECK_MENU_ITEM(view_attachments_item));
497
498         modest_conf_set_bool(priv->modest_conf,
499                              MODEST_CONF_MSG_VIEW_SHOW_ATTACHMENTS_INLINE,
500                              view_attachments_inline,
501                              NULL);
502
503         modest_tny_msg_view_set_show_attachments_inline_flag(msg_view, view_attachments_inline);
504 }
505
506
507 static void
508 on_delete_clicked (GtkWidget *widget, gpointer user_data)
509 {
510         ModestUI *modest_ui = (ModestUI *)user_data;
511         GtkTreeSelection *sel;
512         GtkTreeModel *model;
513         GtkTreeIter iter;
514         GtkTreeModel *mymodel;
515
516         ModestTnyHeaderTreeView *header_view;
517         ModestTnyMsgView *msg_view;
518         ModestUIPrivate *priv;
519
520         g_return_if_fail (modest_ui);
521
522         priv = MODEST_UI_GET_PRIVATE(modest_ui);
523
524         msg_view = MODEST_TNY_MSG_VIEW(priv->message_view);
525         g_return_if_fail (msg_view);
526
527         header_view = MODEST_TNY_HEADER_TREE_VIEW(priv->header_view);
528         g_return_if_fail (header_view);
529
530         sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
531         g_return_if_fail (sel);
532
533         /* get all selected mails */
534         if (G_LIKELY (gtk_tree_selection_get_selected (sel, &model, &iter))) {
535                 TnyMsgHeaderIface *header;
536
537                 gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
538                         &header, -1);
539
540                 if (G_LIKELY (header)) {
541                         TnyMsgFolderIface *folder;
542                         // const TnyMsgIface *msg;
543
544                         if (GTK_IS_TREE_MODEL_SORT (model)) {
545                                 mymodel = gtk_tree_model_sort_get_model
546                                         (GTK_TREE_MODEL_SORT (model));
547                         } else
548                                 mymodel = model;
549
550                         folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header);
551
552                         /* this will make the message as deleted */
553                         /*      tny_msg_folder_iface_expunge (folder); will finally delete messages */
554                         if (TNY_IS_MSG_FOLDER (folder))
555                                 tny_msg_folder_iface_remove_message (folder, header);
556                         gtk_widget_queue_draw (GTK_WIDGET (header_view));
557                 }
558         }
559 }
560
561
562 static void
563 on_sendreceive_button_clicked (GtkWidget *widget, gpointer user_data)
564 {
565         ModestUI *modest_ui = (ModestUI *)user_data;
566         ModestUIPrivate *priv;
567         TnyAccountStoreIface *account_store;
568         const GList *store_accounts;
569         const GList *iter;
570
571         g_return_if_fail (modest_ui);
572         priv = MODEST_UI_GET_PRIVATE(modest_ui);
573
574         account_store = priv->account_store;
575         store_accounts =
576                 tny_account_store_iface_get_store_accounts (account_store);
577                 
578         for (iter = store_accounts; iter; iter = iter->next) {
579                 modest_tny_store_actions_update_folders (TNY_STORE_ACCOUNT_IFACE (iter->data));
580
581         }
582         
583         if (priv->header_view && priv->current_folder) {
584                         
585                 modest_tny_header_tree_view_set_folder (MODEST_TNY_HEADER_TREE_VIEW(priv->header_view),
586                                                         priv->current_folder);
587                 gtk_widget_queue_draw (priv->header_view);
588         }
589 }
590 static void
591 on_forward_attached_activated (GtkWidget *widget, gpointer user_data)
592 {
593         ModestUI *modest_ui = (ModestUI *)user_data;
594
595         quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD_ATTACHED);
596 }
597
598 static void
599 on_headers_status_update (GtkWidget *header_view, const gchar *msg, gint status_id,
600                           gpointer user_data)
601 {
602         ModestUIPrivate *priv;
603         ModestUI *modest_ui;
604
605         GtkStatusbar *status_bar;
606         GtkProgressBar *progress_bar;
607         GtkWidget    *status_box;
608         
609         modest_ui = MODEST_UI (user_data);
610         priv      = MODEST_UI_GET_PRIVATE(modest_ui);
611
612         progress_bar = GTK_PROGRESS_BAR(glade_xml_get_widget
613                                         (priv->glade_xml, "progressbar"));
614         status_bar   = GTK_STATUSBAR  (glade_xml_get_widget
615                                        (priv->glade_xml, "statusbar"));
616
617         
618         status_box   = glade_xml_get_widget (priv->glade_xml, "statusbox");
619         
620         
621         if (!status_bar || !progress_bar) {
622                 g_warning ("failed to find status / progress bar");
623                 return;
624         }
625
626         if (msg && status_id) {
627                 gtk_widget_show (status_box);
628                 gtk_progress_bar_pulse (progress_bar);
629                 gtk_statusbar_push (status_bar, status_id, msg);
630         } else {
631                 gtk_widget_hide   (status_box);
632                 gtk_statusbar_pop (status_bar, status_id);
633         }
634 }               
635