source: trunk/third/evolution/mail/folder-browser-ui.c @ 17188

Revision 17188, 19.6 KB checked in by ghudson, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r17187, which included commits to RCS files with non-trunk default branches.
Line 
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2/*
3 * folder-browser-ui.c: Sets up the Bonobo UI for FolderBrowsers
4 *
5 * Author:
6 *   Peter Williams <peterw@ximian.com>
7 *
8 * (C) 2001 Ximian, Inc.
9 */
10
11#ifdef HAVE_CONFIG_H
12#include <config.h>
13#endif
14
15#include <libgnome/gnome-defs.h>
16#include <libgnome/gnome-util.h> /* gnome_util_prepend_user_home */
17
18#include <bonobo/bonobo-ui-component.h>
19#include <bonobo/bonobo-ui-util.h>
20
21#include "widgets/misc/e-charset-picker.h"
22#include "widgets/menus/gal-view-menus.h" /* GalView stuff */
23#include <gal/menus/gal-view-factory-etable.h>
24#include <gal/menus/gal-view-etable.h>
25
26#include "mail-callbacks.h" /* almost all the verbs */
27#include "mail-session.h" /* mail_session_forget_passwords */
28
29#include "folder-browser-ui.h"
30
31#include "evolution-shell-component-utils.h" /* Pixmap stuff */
32
33
34/*
35 * Add with 'folder_browser'
36 */
37
38static BonoboUIVerb message_verbs [] = {
39        BONOBO_UI_UNSAFE_VERB ("MailNext", next_msg),
40        BONOBO_UI_UNSAFE_VERB ("MailNextFlagged", next_flagged_msg),
41        BONOBO_UI_UNSAFE_VERB ("MailNextUnread", next_unread_msg),
42/*      BONOBO_UI_UNSAFE_VERB ("MailNextThread", next_thread),*/
43        BONOBO_UI_UNSAFE_VERB ("MailPrevious", previous_msg),
44        BONOBO_UI_UNSAFE_VERB ("MailPreviousFlagged", previous_flagged_msg),
45        BONOBO_UI_UNSAFE_VERB ("MailPreviousUnread", previous_unread_msg),
46        BONOBO_UI_UNSAFE_VERB ("AddSenderToAddressbook", add_sender_to_addrbook),
47        BONOBO_UI_UNSAFE_VERB ("MessageApplyFilters", apply_filters),
48        BONOBO_UI_UNSAFE_VERB ("MessageCopy", copy_msg),
49        BONOBO_UI_UNSAFE_VERB ("MessageDelete", delete_msg),
50        BONOBO_UI_UNSAFE_VERB ("MessageForward", forward),
51        BONOBO_UI_UNSAFE_VERB ("MessageForwardAttached", forward_attached),
52        BONOBO_UI_UNSAFE_VERB ("MessageForwardInline", forward_inline),
53        BONOBO_UI_UNSAFE_VERB ("MessageForwardQuoted", forward_quoted),
54        BONOBO_UI_UNSAFE_VERB ("MessageMarkAsRead", mark_as_seen),
55        BONOBO_UI_UNSAFE_VERB ("MessageMarkAsUnRead", mark_as_unseen),
56        BONOBO_UI_UNSAFE_VERB ("MessageMarkAsImportant", mark_as_important),
57        BONOBO_UI_UNSAFE_VERB ("MessageMarkAsUnimportant", mark_as_unimportant),
58        BONOBO_UI_UNSAFE_VERB ("MessageMove", move_msg),
59        BONOBO_UI_UNSAFE_VERB ("MessageOpen", open_message),
60        BONOBO_UI_UNSAFE_VERB ("MessageReplyAll", reply_to_all),
61        BONOBO_UI_UNSAFE_VERB ("MessageReplyList", reply_to_list),
62        BONOBO_UI_UNSAFE_VERB ("MessageReplySender", reply_to_sender),
63        BONOBO_UI_UNSAFE_VERB ("MessageResend", resend_msg),
64        BONOBO_UI_UNSAFE_VERB ("MessageSaveAs", save_msg),
65        BONOBO_UI_UNSAFE_VERB ("MessageSearch", search_msg),
66        BONOBO_UI_UNSAFE_VERB ("MessageUndelete", undelete_msg),
67        BONOBO_UI_UNSAFE_VERB ("PrintMessage", print_msg),
68        BONOBO_UI_UNSAFE_VERB ("TextZoomIn", zoom_in),
69        BONOBO_UI_UNSAFE_VERB ("TextZoomOut", zoom_out),
70        BONOBO_UI_UNSAFE_VERB ("TextZoomReset", zoom_reset),
71        BONOBO_UI_UNSAFE_VERB ("PrintPreviewMessage", print_preview_msg),
72        BONOBO_UI_UNSAFE_VERB ("ToolsFilterMailingList", filter_mlist),
73        BONOBO_UI_UNSAFE_VERB ("ToolsFilterRecipient", filter_recipient),
74        BONOBO_UI_UNSAFE_VERB ("ToolsFilterSender", filter_sender),
75        BONOBO_UI_UNSAFE_VERB ("ToolsFilterSubject", filter_subject),
76        BONOBO_UI_UNSAFE_VERB ("ToolsVFolderMailingList", vfolder_mlist),
77        BONOBO_UI_UNSAFE_VERB ("ToolsVFolderRecipient", vfolder_recipient),
78        BONOBO_UI_UNSAFE_VERB ("ToolsVFolderSender", vfolder_sender),
79        BONOBO_UI_UNSAFE_VERB ("ToolsVFolderSubject", vfolder_subject),
80        BONOBO_UI_UNSAFE_VERB ("ViewLoadImages", load_images),
81        /* ViewHeaders stuff is a radio */
82
83        BONOBO_UI_VERB_END
84};
85
86static BonoboUIVerb list_verbs [] = {
87        BONOBO_UI_UNSAFE_VERB ("EditCut", folder_browser_cut),
88        BONOBO_UI_UNSAFE_VERB ("EditCopy", folder_browser_copy),
89        BONOBO_UI_UNSAFE_VERB ("EditPaste", folder_browser_paste),
90        BONOBO_UI_UNSAFE_VERB ("EditInvertSelection", invert_selection),
91        BONOBO_UI_UNSAFE_VERB ("EditSelectAll", select_all),
92        BONOBO_UI_UNSAFE_VERB ("EditSelectThread", select_thread),
93        BONOBO_UI_UNSAFE_VERB ("ChangeFolderProperties", configure_folder),
94        BONOBO_UI_UNSAFE_VERB ("FolderExpunge", expunge_folder),
95        /* HideDeleted is a toggle */
96        BONOBO_UI_UNSAFE_VERB ("MessageMarkAllAsRead", mark_all_as_seen),
97        BONOBO_UI_UNSAFE_VERB ("ViewHideRead", hide_read),
98        BONOBO_UI_UNSAFE_VERB ("ViewHideSelected", hide_selected),
99        BONOBO_UI_UNSAFE_VERB ("ViewShowAll", hide_none),
100        /* ViewThreaded is a toggle */
101
102        BONOBO_UI_VERB_END
103};
104
105static BonoboUIVerb global_verbs [] = {
106        BONOBO_UI_UNSAFE_VERB ("EmptyTrash", empty_trash),
107        BONOBO_UI_UNSAFE_VERB ("ForgetPasswords", mail_session_forget_passwords),
108        BONOBO_UI_UNSAFE_VERB ("MailCompose", compose_msg),
109        BONOBO_UI_UNSAFE_VERB ("MailGetSend", send_receive_mail),
110        BONOBO_UI_UNSAFE_VERB ("MailStop", stop_threads),
111        BONOBO_UI_UNSAFE_VERB ("ToolsFilters", filter_edit),
112        BONOBO_UI_UNSAFE_VERB ("ToolsSettings", providers_config),
113        BONOBO_UI_UNSAFE_VERB ("ToolsSubscriptions", manage_subscriptions),
114        BONOBO_UI_UNSAFE_VERB ("ToolsVFolders", vfolder_edit_vfolders),
115        /* ViewPreview is a toggle */
116
117        BONOBO_UI_VERB_END
118};
119
120static EPixmap message_pixcache [] = {
121        E_PIXMAP ("/commands/PrintMessage", "print.xpm"),
122        E_PIXMAP ("/commands/PrintPreviewMessage", "print-preview.xpm"),
123        E_PIXMAP ("/commands/MessageDelete", "evolution-trash-mini.png"),
124        E_PIXMAP ("/commands/MessageUndelete", "undelete_message-16.png"),
125        E_PIXMAP ("/commands/MessageCopy", "copy_16_message.xpm"),
126        E_PIXMAP ("/commands/MessageMove", "move_message.xpm"),
127        E_PIXMAP ("/commands/MessageReplyAll", "reply_to_all.xpm"),
128        E_PIXMAP ("/commands/MessageReplySender", "reply.xpm"),
129        E_PIXMAP ("/commands/MessageForward", "forward.xpm"),
130        E_PIXMAP ("/commands/MessageApplyFilters", "apply-filters-16.xpm"),
131        E_PIXMAP ("/commands/MessageSearch", "search-16.png"),
132        E_PIXMAP ("/commands/MessageSaveAs", "save-as-16.png"),
133
134        E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageReplySender", "buttons/reply.png"),
135        E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageReplyAll", "buttons/reply-to-all.png"),
136        E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageForward", "buttons/forward.png"),
137        E_PIXMAP ("/Toolbar/MailMessageToolbar/PrintMessage", "buttons/print.png"),
138        E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageMove", "buttons/move-message.png"),
139        E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageCopy", "buttons/copy-message.png"),
140        E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageDelete", "buttons/delete-message.png"),
141
142        E_PIXMAP ("/Toolbar/MailNextButtons/MailNext", "buttons/next-message.png"),
143        E_PIXMAP ("/Toolbar/MailNextButtons/MailPrevious", "buttons/previous-message.png"),
144
145        E_PIXMAP_END
146};
147
148static EPixmap list_pixcache [] = {
149        E_PIXMAP ("/commands/ChangeFolderProperties", "configure_16_folder.xpm"),
150        E_PIXMAP ("/commands/ViewHideRead", "hide_read_messages.xpm"),
151        E_PIXMAP ("/commands/ViewHideSelected", "hide_selected_messages.xpm"),
152        E_PIXMAP ("/commands/ViewShowAll", "show_all_messages.xpm"),
153
154        E_PIXMAP ("/commands/EditCut", "16_cut.png"),
155        E_PIXMAP ("/commands/EditCopy", "16_copy.png"),
156        E_PIXMAP ("/commands/EditPaste", "16_paste.png"),
157
158        E_PIXMAP_END
159};
160
161static EPixmap global_pixcache [] = {
162        E_PIXMAP ("/commands/MailCompose", "new-message.xpm"),
163        E_PIXMAP ("/commands/MailGetSend", "send-receive.xpm"),
164        E_PIXMAP ("/commands/ToolsSettings", "configure_16_mail.xpm"),
165       
166        E_PIXMAP ("/Toolbar/MailGetSend", "buttons/send-24-receive.png"),
167        E_PIXMAP ("/Toolbar/MailCompose", "buttons/compose-message.png"),
168
169        E_PIXMAP_END
170};
171
172static void ui_add (FolderBrowser *fb,
173                    const gchar *name,
174                    BonoboUIVerb verb[],
175                    EPixmap pixcache[])
176{
177        BonoboUIComponent *uic = fb->uicomp;
178        char *file;
179       
180        bonobo_ui_component_add_verb_list_with_data (uic, verb, fb);
181       
182        /*bonobo_ui_component_freeze (uic, NULL);*/
183       
184        file = g_strconcat ("evolution-mail-", name, ".xml", NULL);
185        bonobo_ui_util_set_ui (uic, EVOLUTION_DATADIR, file, "evolution-mail");
186        g_free (file);
187       
188        e_pixmaps_update (uic, pixcache);
189       
190        /*bonobo_ui_component_thaw (uic, NULL);*/
191}
192
193/* more complex stuff */
194
195static void
196display_view(GalViewCollection *collection,
197             GalView *view,
198             gpointer data)
199{
200        FolderBrowser *fb = data;
201        if (GAL_IS_VIEW_ETABLE(view)) {
202                e_tree_set_state_object(fb->message_list->tree, GAL_VIEW_ETABLE(view)->state);
203        }
204}
205
206static void
207folder_browser_setup_view_menus (FolderBrowser *fb,
208                                 BonoboUIComponent *uic)
209{
210        GalViewFactory *factory;
211        ETableSpecification *spec;
212        char *local_dir;
213
214        g_assert (fb->view_collection == NULL);
215        g_assert (fb->view_menus == NULL);
216
217        fb->view_collection = gal_view_collection_new();
218
219        local_dir = gnome_util_prepend_user_home ("/evolution/views/mail/");
220        gal_view_collection_set_storage_directories(
221                fb->view_collection,
222                EVOLUTION_DATADIR "/evolution/views/mail/",
223                local_dir);
224        g_free (local_dir);
225
226        spec = e_table_specification_new();
227        e_table_specification_load_from_file(spec, EVOLUTION_ETSPECDIR "/message-list.etspec");
228
229        factory = gal_view_factory_etable_new (spec);
230        gtk_object_unref (GTK_OBJECT (spec));
231        gal_view_collection_add_factory (fb->view_collection, factory);
232        gtk_object_unref (GTK_OBJECT (factory));
233
234        gal_view_collection_load(fb->view_collection);
235
236        fb->view_menus = gal_view_menus_new(fb->view_collection);
237        gal_view_menus_apply(fb->view_menus, uic, NULL);
238        gtk_signal_connect(GTK_OBJECT(fb->view_collection), "display_view",
239                           display_view, fb);
240}
241
242/* Gets rid of the view collection and view menus objects */
243static void
244folder_browser_discard_view_menus (FolderBrowser *fb)
245{
246        g_assert (fb->view_collection != NULL);
247        g_assert (fb->view_menus != NULL);
248
249        gtk_object_unref (GTK_OBJECT (fb->view_collection));
250        fb->view_collection = NULL;
251
252        gtk_object_unref (GTK_OBJECT (fb->view_menus));
253        fb->view_menus = NULL;
254}
255
256static void
257folder_browser_setup_property_menu (FolderBrowser *fb,
258                                    BonoboUIComponent *uic)
259{
260        char *name, *base = NULL;
261        CamelURL *url;
262
263        url = camel_url_new(fb->uri, NULL);
264        if (url) {
265                if (url->fragment)
266                        base = g_basename(url->fragment);
267                else
268                        base = g_basename(url->path);
269        }
270
271        if (base && base [0] != 0)
272                name = g_strdup_printf (_("Properties for \"%s\""), base);
273        else
274                name = g_strdup (_("Properties"));
275
276        bonobo_ui_component_set_prop (
277                uic, "/menu/File/Folder/ComponentPlaceholder/ChangeFolderProperties",
278                "label", name, NULL);
279        g_free (name);
280
281        if (url)
282                camel_url_free(url);
283
284        fbui_sensitise_item(fb, "ChangeFolderProperties", (strncmp(fb->uri, "vfolder:", 8) == 0 || strncmp(fb->uri, "file:", 5) == 0));
285}
286
287/* Must be in the same order as MailConfigDisplayStyle */
288/* used in folder-browser.c as well (therefore not static) */
289char *message_display_styles[] = {
290        "/commands/ViewNormal",
291        "/commands/ViewFullHeaders",
292        "/commands/ViewSource"
293};
294
295/* public */
296
297void
298folder_browser_ui_add_message (FolderBrowser *fb)
299{
300        int state;
301        BonoboUIComponent *uic = fb->uicomp;
302        FolderBrowserSelectionState prev_state;
303       
304        ui_add (fb, "message", message_verbs, message_pixcache);
305       
306        /* Display Style */
307        state = fb->mail_display->display_style;
308        bonobo_ui_component_set_prop (uic, message_display_styles[state],
309                                      "state", "1", NULL);
310        bonobo_ui_component_add_listener (uic, "ViewNormal", folder_browser_set_message_display_style, fb);
311        bonobo_ui_component_add_listener (uic, "ViewFullHeaders", folder_browser_set_message_display_style, fb);
312        bonobo_ui_component_add_listener (uic, "ViewSource", folder_browser_set_message_display_style, fb);
313        /* FIXME: this kind of bypasses bonobo but seems the only way when we change components */
314        folder_browser_set_message_display_style (uic, strrchr (message_display_styles[state], '/') + 1,
315                                                  Bonobo_UIComponent_STATE_CHANGED, "1", fb);
316       
317        /* Resend Message */
318        if (fb->folder && !folder_browser_is_sent (fb))
319                fbui_sensitise_item(fb, "MessageResend", FALSE);
320       
321        /* sensitivity of message-specific commands */
322        prev_state = fb->selection_state;
323        fb->selection_state = FB_SELSTATE_UNDEFINED;
324        folder_browser_ui_set_selection_state (fb, prev_state);
325       
326        /* Charset picker */
327        e_charset_picker_bonobo_ui_populate (uic, "/menu/View", FB_DEFAULT_CHARSET,
328                                             folder_browser_charset_changed,
329                                             fb);
330}
331
332/*
333void
334folder_browser_ui_rm_message (FolderBrowser *fb)
335{
336        ui_rm (fb, "message", message_verbs, message_pixcache);
337}
338*/
339
340void
341folder_browser_ui_add_list (FolderBrowser *fb)
342{
343        int state;
344        BonoboUIComponent *uic = fb->uicomp;
345       
346        ui_add (fb, "list", list_verbs, list_pixcache);
347       
348        /* Hide Deleted */
349        if (fb->folder && (fb->folder->folder_flags & CAMEL_FOLDER_IS_TRASH)) {
350                fbui_sensitise_item(fb, "HideDeleted", FALSE);
351                state = FALSE;
352        } else {
353                state = mail_config_get_hide_deleted ();
354        }
355        bonobo_ui_component_set_prop (uic, "/commands/HideDeleted", "state", state ? "1" : "0", NULL);
356        bonobo_ui_component_add_listener (uic, "HideDeleted", folder_browser_toggle_hide_deleted, fb);
357        /* FIXME: this kind of bypasses bonobo but seems the only way when we change components */
358        folder_browser_toggle_hide_deleted (uic, "", Bonobo_UIComponent_STATE_CHANGED,
359                                            state ? "1" : "0", fb);
360       
361        /* Threaded toggle */
362        state = mail_config_get_thread_list (FOLDER_BROWSER (fb)->uri);
363        bonobo_ui_component_set_prop (uic, "/commands/ViewThreaded", "state", state ? "1" : "0", NULL);
364        bonobo_ui_component_add_listener (uic, "ViewThreaded", folder_browser_toggle_threads, fb);
365        /* FIXME: this kind of bypasses bonobo but seems the only way when we change components */
366        folder_browser_toggle_threads (uic, "", Bonobo_UIComponent_STATE_CHANGED,
367                                       state ? "1" : "0", fb);
368       
369        /* Property menu */
370        folder_browser_setup_property_menu (fb, fb->uicomp);
371       
372        /* View menu */
373        folder_browser_setup_view_menus (fb, fb->uicomp);
374}
375
376void
377folder_browser_ui_rm_list (FolderBrowser *fb)
378{
379        /* View menu */
380        folder_browser_discard_view_menus (fb);
381}
382
383void
384folder_browser_ui_add_global (FolderBrowser *fb)
385{
386        int state;
387        BonoboUIComponent *uic = fb->uicomp;
388
389        ui_add (fb, "global", global_verbs, global_pixcache);
390
391        /* (Pre)view toggle */
392
393        state = mail_config_get_show_preview (FOLDER_BROWSER (fb)->uri);
394        bonobo_ui_component_set_prop (uic, "/commands/ViewPreview", "state", state ? "1" : "0", NULL);
395        bonobo_ui_component_add_listener (uic, "ViewPreview", folder_browser_toggle_preview, fb);
396        /* FIXME: this kind of bypasses bonobo but seems the only way when we change components */
397        folder_browser_toggle_preview (uic, "", Bonobo_UIComponent_STATE_CHANGED, state ? "1" : "0", fb);
398       
399        /* Stop button */
400        /* TODO: Go through cache, but we can't becaus eof mail-mt.c:set_stop at the moment */
401        bonobo_ui_component_set_prop(uic, "/commands/MailStop", "sensitive", "0", NULL);
402}
403
404/*
405void
406folder_browser_ui_rm_global (FolderBrowser *fb)
407{
408}
409*/
410
411void
412folder_browser_ui_rm_all (FolderBrowser *fb)
413{
414        BonoboUIComponent *uic = fb->uicomp;
415
416        bonobo_ui_component_rm (uic, "/", NULL);
417        bonobo_ui_component_unset_container (uic);
418
419        if (fb->sensitise_state) {
420                g_hash_table_destroy(fb->sensitise_state);
421                fb->sensitise_state = NULL;
422        }
423}
424
425void
426fbui_sensitise_item(FolderBrowser *fb, const char *item, int state)
427{
428        char *name;
429        int val;
430        char *key;
431
432        /* If this whole caching idea doesn't work, remove it here */
433        if (fb->sensitise_state == NULL)
434                fb->sensitise_state = g_hash_table_new(g_str_hash, g_str_equal);
435
436        if (g_hash_table_lookup_extended(fb->sensitise_state, item, (void **)&key, (void **)&val)) {
437                if (val == state)
438                        return;
439        }
440
441        g_hash_table_insert(fb->sensitise_state, (char *)item, (void *)state);
442
443        if (fb->uicomp) {
444                name = alloca(strlen(item) + strlen("/commands/") + 1);
445                sprintf(name, "/commands/%s", item);
446                bonobo_ui_component_set_prop(fb->uicomp, name, "sensitive", state?"1":"0", NULL);
447        }
448}
449
450struct sensitize_data {
451        const char **items;
452        gboolean enable;
453};
454
455static gboolean
456fbui_sensitize_timeout (gpointer data)
457{
458        FolderBrowser *fb = FOLDER_BROWSER (data);
459        GSList *iter, *list;
460        struct sensitize_data *sd;
461        int i;
462
463        list = fb->sensitize_changes;
464        fb->sensitize_changes = NULL;
465        iter = list;
466        fb->sensitize_timeout_id = 0;
467
468        gtk_object_ref((GtkObject *)fb);
469
470        /*bonobo_ui_component_freeze (uic, NULL);*/
471
472        for (; iter; iter = iter->next) {
473                sd = (struct sensitize_data *) iter->data;
474                for (i=0;sd->items[i];i++) {
475                        if (fb->uicomp)
476                                fbui_sensitise_item(fb, sd->items[i], sd->enable);
477                }
478                g_free(sd);
479        }
480
481        g_slist_free (list);
482        gtk_object_unref((GtkObject *)fb);
483
484        return FALSE;
485}
486
487static void
488fbui_sensitize_items (FolderBrowser *fb, const char **items, gboolean enable)
489{
490        struct sensitize_data *sd;
491        GSList *iter;
492
493        /* If we're already updating these items, save an update by
494         * changing the item in the list. */
495
496        for (iter = fb->sensitize_changes; iter; iter = iter->next) {
497                sd = (struct sensitize_data *) iter->data;
498
499                if (sd->items == items)
500                        break;
501        }
502
503        if (iter == NULL) {
504                sd = g_new (struct sensitize_data, 1);
505                sd->items = items;
506                sd->enable = enable;
507
508                fb->sensitize_changes = g_slist_prepend (fb->sensitize_changes, sd);
509        } else {
510                /* Redundant, but shuts up the compiler. */
511                sd = (struct sensitize_data *) iter->data;
512                sd->enable = enable;
513        }
514
515        if (fb->sensitize_timeout_id == 0)
516                fb->sensitize_timeout_id = g_timeout_add (110, fbui_sensitize_timeout, fb);
517}
518
519static const char *message_pane_enables[] = {
520        /* these only work if there's a message in the message pane
521         * (preview pane). This state is independent of how many are
522         * selected. */
523        "PrintMessage", "PrintPreviewMessage",
524        "ViewFullHeaders", "ViewLoadImages", "ViewNormal", "ViewSource",
525        "MessageSearch", "AddSenderToAddressbook",
526        NULL
527};
528
529void
530folder_browser_ui_set_selection_state (FolderBrowser *fb, FolderBrowserSelectionState state)
531{
532        /* We'd like to keep the number of changes to be minimal cause
533         * this is a lot of corba traffic. So we break these sets of commands into bits:
534         *
535         * Also remember that everything defaults to sensitized
536         *
537         * Disable:
538         *      NONE = none_disables + multiple_disables
539         *    SINGLE = [nothing disabled]
540         *  MULTIPLE = multiple_disables
541         * UNDEFINED = [nothing disabled]
542         */
543
544        static const char *none_disables[] = {
545                /* actions that work on > 0 messages */
546                "MessageApplyFilters",
547                "MessageCopy", "MessageMove",
548                "MessageDelete", "MessageUndelete",
549                "MessageMarkAsRead", "MessageMarkAsUnRead",
550                "MessageMarkAsImportant", "MessageMarkAsUnimportant",
551                "MessageOpen", "MessageSaveAs",
552                "MessageForward", "MessageForwardAttached",
553
554                "EditCut", "EditCopy", "EditPaste", "ViewHideSelected",
555
556                "MailNext", "MailNextFlagged", "MailNextUnread", "MailNextThread",
557                "MailPrevious", "MailPreviousFlagged", "MailPreviousUnread",
558
559                NULL
560        };
561
562        static const char *multiple_disables[] = {
563                /* actions that work on exactly 1 message */
564                "MessageReplyAll", "MessageReplyList", "MessageReplySender", "MessageResend",
565                "MessageForwardInline", "MessageForwardQuoted", "MessageSearch",
566
567                "ToolsFilterMailingList", "ToolsFilterRecipient", "ToolsFilterSender",
568                "ToolsFilterSubject", "ToolsVFolderMailingList", "ToolsVFolderRecipient",
569                "ToolsVFolderSender", "ToolsVFolderSubject",
570
571                NULL
572        };
573
574
575        fbui_sensitize_items (fb, message_pane_enables, state != FB_SELSTATE_NONE && fb->loaded_uid && fb->preview_shown);
576
577        /* assumes that all the appropriate XML's have been loaded */
578
579        if (state == fb->selection_state)
580                return;
581
582        switch (state) {
583        case FB_SELSTATE_NONE:
584                fbui_sensitize_items (fb, none_disables, FALSE);
585                if (fb->selection_state != FB_SELSTATE_MULTIPLE)
586                        fbui_sensitize_items (fb, multiple_disables, FALSE);
587                break;
588        case FB_SELSTATE_SINGLE:
589                if (fb->selection_state != FB_SELSTATE_UNDEFINED)
590                        fbui_sensitize_items (fb, multiple_disables, TRUE);
591                if (fb->selection_state == FB_SELSTATE_NONE)
592                        fbui_sensitize_items (fb, none_disables, TRUE);
593                break;
594        case FB_SELSTATE_MULTIPLE:
595                if (fb->selection_state == FB_SELSTATE_NONE)
596                        fbui_sensitize_items (fb, none_disables, TRUE);
597                else
598                        fbui_sensitize_items (fb, multiple_disables, FALSE);
599                break;
600        case FB_SELSTATE_UNDEFINED:
601                printf ("changing to undefined selection state? hah!\n");
602                return;
603        }
604
605        fb->selection_state = state;
606}
607
608void
609folder_browser_ui_message_loaded (FolderBrowser *fb)
610{
611        BonoboUIComponent *uic = fb->uicomp;
612
613        if (uic)
614                fbui_sensitize_items (fb, message_pane_enables, fb->loaded_uid && fb->preview_shown);
615}
Note: See TracBrowser for help on using the repository browser.