~ubuntu-branches/ubuntu/wily/evolution/wily

« back to all changes in this revision

Viewing changes to mail/e-mail-paned-view.c

  • Committer: Package Import Robot
  • Author(s): Jeremy Bicha
  • Date: 2012-05-24 22:36:14 UTC
  • mfrom: (1.1.90) (1.7.20 experimental)
  • Revision ID: package-import@ubuntu.com-20120524223614-exaxktbdlt72uryf
Tags: 3.4.2-1ubuntu1
* Merge with Debian. Remaining changes:
  - debian/control:
    - Build-Depend on python-dev (for the python module) and libpst-dev
      (for the pst-import plugin).
    - Don't build depend on libchamplain (it's in universe) and disable the
      contact maps plugin
    - Don't build-depend on clutter since mx isn't in main yet
    - Depend on gnome-icon-theme-full instead of gnome-icon-theme
    - Have evolution-dev depend on libevolution instead of evolution
    - Update Vcs-* fields.
  - debian/rules:
    - use --enable-pst-import, --enable-python, --disable-contacts-map,
      and --with-clutter=no
  - debian/patches:
    - 01_ubuntu_signature.patch: don't set the ubuntu signature as default
      for new accounts.
    - 04_delay_alarm_notifier.patch: delay alarm-notifier by 30 seconds.
    - 09_add_ubuntuone_email.patch: add patch to add Ubuntu One introduction.
    - 10_desktop_shortcuts.patch: fix the calendar shortcut to appear in the
      Launcher.
    - 11_remove_upstream_submit_bugreport.patch: Remove 'Submit Bug Report'
      option from Help menu.
    - 20_skip_broken_gconf_conversions.patch: Don't install the window size
      gconf conversions. Besides not being very useful, they are broken and
      cause gnome-settings-daemon to fail to start
    - 62_no_upstream_email_notification_by_default.patch: don't enable the
      notification icon by default since the message indicator is running.
    - 89_remove_component_id_registration.patch: ignore -c component gconf
      registration on launching just "evolution".
    - 91_add_u1_email_translations.patch: Add translations for Ubuntu One
      welcome mail https://wiki.ubuntu.com/Translations/Wanted/UbuntuOneEmail
    - onlyshowin-add-unity.patch: add Unity to the OnlyShowIn field in
      desktop files.
    - alarm-notify-nodisplay.patch: don't show the alarm notifier
      in gnome-session-properties (add NoDisplay=true to the .desktop file).
  - debian/evolution-common.gsettings-override:
    - Disable systray for alarms, as Unity doesn't have a systray. Use popup
      windows instead.
    - Correct the path to spamd as /usr/sbin/spamd.
  - debian/evolution-common.install: install signature.py to generate the
    "Sent from Ubuntu" signature.
* Dropped Ubuntu patches:
  - 02_fix_missing_include_for_composer.patch: doesn't seem needed
  - 89_remove_quit_button.patch: This didn't seem to do anything & we don't
    use express mode for anything now anyway
  - 61_translate_menu_entry.patch: No longer needed
  - 62_no_upstream_email_notification_by_default.patch: Obsolete
  - 93_no_tray_icon_by_default.patch: Use gsettings override instead
  - spamd_sbin_path.patch: Use gsettings override instead
  - nss-paths.patch: Included by Debian as 02_nss_paths.patch
  - git_edit_as_new_from_addr_3dc8b0b.patch: Already applied
  - gmodule-linking.patch: Already applied
  - libpst-pst_open-args.patch: Already applied
  - git_crash_in_mail_sidebar_936a488.patch: Already applied
  - 99git_remove_g_thread_init_09c88ab.patch: Already applied

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
#include <libedataserver/e-data-server-util.h>
31
31
 
32
32
#include "e-util/e-util-private.h"
33
 
#include "e-util/gconf-bridge.h"
34
33
#include "widgets/menus/gal-view-etable.h"
35
34
#include "widgets/menus/gal-view-instance.h"
36
35
#include "widgets/misc/e-paned.h"
39
38
 
40
39
#include <shell/e-shell-window-actions.h>
41
40
 
 
41
#include <libemail-engine/e-mail-folder-utils.h>
 
42
#include <libemail-engine/e-mail-utils.h>
 
43
#include <libemail-engine/mail-config.h>
 
44
#include <libemail-engine/mail-ops.h>
 
45
 
42
46
#include "em-utils.h"
43
 
#include "mail-config.h"
44
 
#include "mail-ops.h"
45
47
#include "message-list.h"
46
 
#include "e-mail-folder-utils.h"
47
48
#include "e-mail-reader-utils.h"
48
49
 
 
50
#define E_MAIL_PANED_VIEW_GET_PRIVATE(obj) \
 
51
        (G_TYPE_INSTANCE_GET_PRIVATE \
 
52
        ((obj), E_TYPE_MAIL_PANED_VIEW, EMailPanedViewPrivate))
 
53
 
49
54
#define E_SHELL_WINDOW_ACTION_GROUP_MAIL(window) \
50
55
        E_SHELL_WINDOW_ACTION_GROUP ((window), "mail")
51
56
 
53
58
        GtkWidget *paned;
54
59
        GtkWidget *scrolled_window;
55
60
        GtkWidget *message_list;
56
 
        GtkWidget *search_bar;
57
 
        GtkWidget *preview;
 
61
        GtkWidget *preview_pane;
58
62
 
59
63
        EMFormatHTMLDisplay *formatter;
60
64
        GalViewInstance *view_instance;
79
83
#define STATE_KEY_GROUP_BY_THREADS      "GroupByThreads"
80
84
#define STATE_KEY_SELECTED_MESSAGE      "SelectedMessage"
81
85
#define STATE_KEY_PREVIEW_VISIBLE       "PreviewVisible"
 
86
#define STATE_GROUP_GLOBAL_FOLDER       "GlobalFolder"
82
87
 
83
88
/* Forward Declarations */
84
89
static void e_mail_paned_view_reader_init (EMailReaderInterface *interface);
86
91
G_DEFINE_TYPE_WITH_CODE (
87
92
        EMailPanedView, e_mail_paned_view, E_TYPE_MAIL_VIEW,
88
93
        G_IMPLEMENT_INTERFACE (
89
 
                E_TYPE_MAIL_READER, e_mail_paned_view_reader_init))
 
94
                E_TYPE_MAIL_READER, e_mail_paned_view_reader_init)
 
95
        G_IMPLEMENT_INTERFACE (
 
96
                E_TYPE_EXTENSIBLE, NULL))
90
97
 
91
98
static void
92
99
mail_paned_view_save_boolean (EMailView *view,
115
122
        g_free (group_name);
116
123
        g_free (folder_uri);
117
124
 
 
125
        g_key_file_set_boolean (key_file, STATE_GROUP_GLOBAL_FOLDER, key, value);
 
126
 
118
127
        e_shell_view_set_state_dirty (shell_view);
119
128
}
120
129
 
127
136
        EShellWindow *shell_window;
128
137
        GKeyFile *key_file;
129
138
 
130
 
        priv = E_MAIL_PANED_VIEW (view)->priv;
 
139
        priv = E_MAIL_PANED_VIEW_GET_PRIVATE (view);
131
140
 
132
141
        g_signal_handler_disconnect (
133
142
                message_list, priv->message_list_built_id);
215
224
                                  EMailPanedView *view)
216
225
{
217
226
        EMailPanedViewPrivate *priv;
218
 
        GConfBridge *bridge;
219
 
        GObject *object;
220
 
        const gchar *key;
 
227
        GSettings *settings;
221
228
 
222
229
        priv = E_MAIL_PANED_VIEW (view)->priv;
223
230
 
224
 
        /* Bind GObject properties to GConf keys. */
225
 
 
226
 
        bridge = gconf_bridge_get ();
227
 
 
228
 
        object = G_OBJECT (priv->paned);
229
 
        key = "/apps/evolution/mail/display/hpaned_size";
230
 
        gconf_bridge_bind_property (bridge, key, object, "hposition");
231
 
 
232
 
        object = G_OBJECT (priv->paned);
233
 
        key = "/apps/evolution/mail/display/paned_size";
234
 
        gconf_bridge_bind_property (bridge, key, object, "vposition");
 
231
        /* Bind GObject properties to GSettings keys. */
 
232
 
 
233
        settings = g_settings_new ("org.gnome.evolution.mail");
 
234
 
 
235
        g_settings_bind (
 
236
                settings, "hpaned-size",
 
237
                priv->paned, "hposition",
 
238
                G_SETTINGS_BIND_DEFAULT);
 
239
 
 
240
        g_settings_bind (
 
241
                settings, "paned-size",
 
242
                priv->paned, "vposition",
 
243
                G_SETTINGS_BIND_DEFAULT);
 
244
 
 
245
        g_object_unref (settings);
235
246
}
236
247
 
237
248
static void
328
339
{
329
340
        EMailPanedViewPrivate *priv;
330
341
 
331
 
        priv = E_MAIL_PANED_VIEW (object)->priv;
 
342
        priv = E_MAIL_PANED_VIEW_GET_PRIVATE (object);
332
343
 
333
344
        if (priv->paned != NULL) {
334
345
                g_object_unref (priv->paned);
345
356
                priv->message_list = NULL;
346
357
        }
347
358
 
348
 
        if (priv->search_bar != NULL) {
349
 
                g_object_unref (priv->search_bar);
350
 
                priv->search_bar = NULL;
 
359
        if (priv->preview_pane != NULL) {
 
360
                g_object_unref (priv->preview_pane);
 
361
                priv->preview_pane = NULL;
351
362
        }
352
363
 
353
364
        if (priv->formatter != NULL) {
422
433
static EMFormatHTML *
423
434
mail_paned_view_get_formatter (EMailReader *reader)
424
435
{
425
 
        EMailPanedViewPrivate *priv;
426
 
 
427
 
        priv = E_MAIL_PANED_VIEW (reader)->priv;
428
 
 
429
 
        return EM_FORMAT_HTML (priv->formatter);
 
436
        EMailPanedView *paned_view;
 
437
 
 
438
        paned_view = E_MAIL_PANED_VIEW (reader);
 
439
 
 
440
        return EM_FORMAT_HTML (paned_view->priv->formatter);
430
441
}
431
442
 
432
443
static gboolean
438
449
static GtkWidget *
439
450
mail_paned_view_get_message_list (EMailReader *reader)
440
451
{
441
 
        EMailPanedViewPrivate *priv;
442
 
 
443
 
        priv = E_MAIL_PANED_VIEW (reader)->priv;
444
 
 
445
 
        return priv->message_list;
 
452
        EMailPanedView *paned_view;
 
453
 
 
454
        paned_view = E_MAIL_PANED_VIEW (reader);
 
455
 
 
456
        return paned_view->priv->message_list;
446
457
}
447
458
 
448
459
static GtkMenu *
464
475
        return GTK_MENU (widget);
465
476
}
466
477
 
 
478
static EPreviewPane *
 
479
mail_paned_view_get_preview_pane (EMailReader *reader)
 
480
{
 
481
        EMailPanedView *paned_view;
 
482
 
 
483
        paned_view = E_MAIL_PANED_VIEW (reader);
 
484
 
 
485
        return E_PREVIEW_PANE (paned_view->priv->preview_pane);
 
486
}
 
487
 
467
488
static GtkWindow *
468
489
mail_paned_view_get_window (EMailReader *reader)
469
490
{
494
515
        gchar *folder_uri;
495
516
        gchar *group_name;
496
517
        const gchar *key;
497
 
        gboolean value;
 
518
        gboolean value, global_view_settings;
498
519
        GError *error = NULL;
499
520
 
500
 
        priv = E_MAIL_PANED_VIEW (reader)->priv;
 
521
        priv = E_MAIL_PANED_VIEW_GET_PRIVATE (reader);
501
522
 
502
523
        view = E_MAIL_VIEW (reader);
503
524
        shell_view = e_mail_view_get_shell_view (view);
505
526
 
506
527
        shell = e_shell_window_get_shell (shell_window);
507
528
        shell_settings = e_shell_get_shell_settings (shell);
 
529
        global_view_settings = e_shell_settings_get_boolean (shell_settings, "mail-global-view-setting");
508
530
 
509
531
        message_list = e_mail_reader_get_message_list (reader);
510
532
 
537
559
        g_free (folder_uri);
538
560
 
539
561
        key = STATE_KEY_GROUP_BY_THREADS;
540
 
        value = g_key_file_get_boolean (key_file, group_name, key, &error);
 
562
        value = g_key_file_get_boolean (key_file, global_view_settings ? STATE_GROUP_GLOBAL_FOLDER : group_name, key, &error);
541
563
        if (error != NULL) {
542
 
                value = TRUE;
543
564
                g_clear_error (&error);
 
565
 
 
566
                value = !global_view_settings ||
 
567
                        g_key_file_get_boolean (key_file, STATE_GROUP_GLOBAL_FOLDER, key, &error);
 
568
                if (error != NULL) {
 
569
                        g_clear_error (&error);
 
570
                        value = TRUE;
 
571
                }
544
572
        }
545
573
 
546
574
        e_mail_reader_set_group_by_threads (reader, value);
547
575
 
548
576
        key = STATE_KEY_PREVIEW_VISIBLE;
549
 
        value = g_key_file_get_boolean (key_file, group_name, key, &error);
 
577
        value = g_key_file_get_boolean (key_file, global_view_settings ? STATE_GROUP_GLOBAL_FOLDER : group_name, key, &error);
550
578
        if (error != NULL) {
551
 
                value = TRUE;
552
579
                g_clear_error (&error);
 
580
 
 
581
                value = !global_view_settings ||
 
582
                        g_key_file_get_boolean (key_file, STATE_GROUP_GLOBAL_FOLDER, key, &error);
 
583
                if (error != NULL) {
 
584
                        g_clear_error (&error);
 
585
                        value = TRUE;
 
586
                }
553
587
        }
554
588
 
555
589
        /* XXX This is a little confusing and needs rethought.  The
571
605
        message_list_thaw (MESSAGE_LIST (message_list));
572
606
}
573
607
 
574
 
static void
575
 
mail_paned_view_show_search_bar (EMailReader *reader)
576
 
{
577
 
        EMailPanedViewPrivate *priv;
578
 
 
579
 
        priv = E_MAIL_PANED_VIEW (reader)->priv;
580
 
 
581
 
        gtk_widget_show (priv->search_bar);
582
 
}
583
 
 
584
608
static guint
585
609
mail_paned_view_reader_open_selected_mail (EMailReader *reader)
586
610
{
587
 
        return E_MAIL_PANED_VIEW_GET_CLASS (reader)->
588
 
                open_selected_mail (E_MAIL_PANED_VIEW (reader));
 
611
        EMailPanedView *paned_view;
 
612
        EMailPanedViewClass *class;
 
613
 
 
614
        paned_view = E_MAIL_PANED_VIEW (reader);
 
615
 
 
616
        class = E_MAIL_PANED_VIEW_GET_CLASS (paned_view);
 
617
        g_return_val_if_fail (class->open_selected_mail != NULL, 0);
 
618
 
 
619
        return class->open_selected_mail (paned_view);
589
620
}
590
621
 
591
622
static gboolean
592
623
mail_paned_view_enable_show_folder (EMailReader *reader)
593
624
{
594
 
        EMailPanedViewPrivate *priv;
595
 
 
596
 
        priv = E_MAIL_PANED_VIEW (reader)->priv;
597
 
 
598
 
        return priv->enable_show_folder ? TRUE : FALSE;
 
625
        EMailPanedView *paned_view;
 
626
 
 
627
        paned_view = E_MAIL_PANED_VIEW (reader);
 
628
 
 
629
        return paned_view->priv->enable_show_folder;
599
630
}
600
631
 
601
632
static void
609
640
        EShellSettings *shell_settings;
610
641
        ESearchBar *search_bar;
611
642
        EMailReader *reader;
 
643
        EMailBackend *backend;
 
644
        EMailSession *session;
612
645
        EMailView *view;
613
646
        GtkWidget *message_list;
614
647
        GtkWidget *container;
615
648
        GtkWidget *widget;
616
649
        EWebView *web_view;
617
650
 
618
 
        priv = E_MAIL_PANED_VIEW (object)->priv;
 
651
        priv = E_MAIL_PANED_VIEW_GET_PRIVATE (object);
619
652
        priv->formatter = em_format_html_display_new ();
620
653
 
621
654
        view = E_MAIL_VIEW (object);
625
658
        shell = e_shell_window_get_shell (shell_window);
626
659
        shell_settings = e_shell_get_shell_settings (shell);
627
660
 
 
661
        backend = E_MAIL_BACKEND (shell_backend);
 
662
        session = e_mail_backend_get_session (backend);
 
663
 
628
664
        /* Make headers collapsable and store state of headers in config file */
629
 
        em_format_html_set_headers_collapsable (EM_FORMAT_HTML (priv->formatter), TRUE);
630
 
        g_object_bind_property (shell_settings, "paned-view-headers-state",
631
 
                                EM_FORMAT_HTML (priv->formatter), "headers-state",
632
 
                                G_BINDING_BIDIRECTIONAL |
633
 
                                G_BINDING_SYNC_CREATE);
 
665
        em_format_html_set_headers_collapsable (
 
666
                EM_FORMAT_HTML (priv->formatter), TRUE);
 
667
        g_object_bind_property (
 
668
                shell_settings, "paned-view-headers-state",
 
669
                priv->formatter, "headers-state",
 
670
                G_BINDING_BIDIRECTIONAL |
 
671
                G_BINDING_SYNC_CREATE);
634
672
 
635
673
        web_view = em_format_html_get_web_view (
636
674
                EM_FORMAT_HTML (priv->formatter));
663
701
 
664
702
        container = widget;
665
703
 
666
 
        widget = message_list_new (E_MAIL_BACKEND (shell_backend));
 
704
        widget = message_list_new (session);
667
705
        gtk_container_add (GTK_CONTAINER (container), widget);
668
706
        priv->message_list = g_object_ref (widget);
669
707
        gtk_widget_show (widget);
673
711
        gtk_widget_show (GTK_WIDGET (web_view));
674
712
 
675
713
        widget = e_preview_pane_new (web_view);
676
 
        priv->preview = widget;
677
714
        gtk_paned_pack2 (GTK_PANED (container), widget, FALSE, FALSE);
 
715
        priv->preview_pane = g_object_ref (widget);
678
716
        gtk_widget_show (widget);
679
717
 
680
718
        g_object_bind_property (
683
721
                G_BINDING_SYNC_CREATE);
684
722
 
685
723
        search_bar = e_preview_pane_get_search_bar (E_PREVIEW_PANE (widget));
686
 
        priv->search_bar = g_object_ref (search_bar);
687
724
 
688
725
        g_signal_connect_swapped (
689
726
                search_bar, "changed",
718
755
         * set_preview_visible() method relies on it. */
719
756
        e_mail_view_set_preview_visible (view, TRUE);
720
757
 
 
758
        e_extensible_load_extensions (E_EXTENSIBLE (object));
 
759
 
721
760
        /* Chain up to parent's constructed() method. */
722
761
        G_OBJECT_CLASS (e_mail_paned_view_parent_class)->constructed (object);
723
762
}
726
765
mail_paned_view_set_search_strings (EMailView *view,
727
766
                                    GSList *search_strings)
728
767
{
729
 
        EMailPanedViewPrivate *priv;
 
768
        EMailReader *reader;
 
769
        EPreviewPane *preview_pane;
730
770
        ESearchBar *search_bar;
731
771
        ESearchingTokenizer *tokenizer;
732
772
 
733
 
        priv = E_MAIL_PANED_VIEW (view)->priv;
734
 
 
735
 
        search_bar = E_SEARCH_BAR (priv->search_bar);
 
773
        reader = E_MAIL_READER (view);
 
774
        preview_pane = e_mail_reader_get_preview_pane (reader);
 
775
        search_bar = e_preview_pane_get_search_bar (preview_pane);
736
776
        tokenizer = e_search_bar_get_tokenizer (search_bar);
737
777
 
738
778
        e_searching_tokenizer_set_secondary_case_sensitivity (tokenizer, FALSE);
750
790
static GalViewInstance *
751
791
mail_paned_view_get_view_instance (EMailView *view)
752
792
{
753
 
        EMailPanedViewPrivate *priv;
754
 
 
755
 
        priv = E_MAIL_PANED_VIEW (view)->priv;
756
 
 
757
 
        return priv->view_instance;
 
793
        EMailPanedView *paned_view;
 
794
 
 
795
        paned_view = E_MAIL_PANED_VIEW (view);
 
796
 
 
797
        return paned_view->priv->view_instance;
 
798
}
 
799
 
 
800
static gchar *
 
801
empv_create_view_id (CamelFolder *folder)
 
802
{
 
803
        GChecksum *checksum;
 
804
        gchar *res, *folder_uri;
 
805
 
 
806
        g_return_val_if_fail (folder != NULL, NULL);
 
807
 
 
808
        folder_uri = e_mail_folder_uri_from_folder (folder);
 
809
        g_return_val_if_fail (folder_uri != NULL, NULL);
 
810
 
 
811
        /* to be able to migrate previously saved views */
 
812
        e_filename_make_safe (folder_uri);
 
813
 
 
814
        /* use MD5 checksum of the folder URI, to not depend on its length */
 
815
        checksum = g_checksum_new (G_CHECKSUM_MD5);
 
816
        g_checksum_update (checksum, (const guchar *) folder_uri, -1);
 
817
 
 
818
        res = g_strdup (g_checksum_get_string (checksum));
 
819
 
 
820
        g_checksum_free (checksum);
 
821
        g_free (folder_uri);
 
822
 
 
823
        return res;
758
824
}
759
825
 
760
826
static void
776
842
        gboolean show_vertical_view;
777
843
        gchar *view_id;
778
844
 
779
 
        priv = E_MAIL_PANED_VIEW (view)->priv;
 
845
        priv = E_MAIL_PANED_VIEW_GET_PRIVATE (view);
780
846
 
781
847
        shell_view = e_mail_view_get_shell_view (view);
782
848
        shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
798
864
                priv->view_instance = NULL;
799
865
        }
800
866
 
801
 
        view_id = e_mail_folder_uri_from_folder (folder);
 
867
        view_id = empv_create_view_id (folder);
802
868
        e_filename_make_safe (view_id);
803
869
 
804
870
        outgoing_folder =
1001
1067
        interface->get_hide_deleted = mail_paned_view_get_hide_deleted;
1002
1068
        interface->get_message_list = mail_paned_view_get_message_list;
1003
1069
        interface->get_popup_menu = mail_paned_view_get_popup_menu;
 
1070
        interface->get_preview_pane = mail_paned_view_get_preview_pane;
1004
1071
        interface->get_window = mail_paned_view_get_window;
1005
1072
        interface->set_folder = mail_paned_view_set_folder;
1006
 
        interface->show_search_bar = mail_paned_view_show_search_bar;
1007
1073
        interface->open_selected_mail = mail_paned_view_reader_open_selected_mail;
1008
1074
        interface->enable_show_folder = mail_paned_view_enable_show_folder;
1009
1075
}
1011
1077
static void
1012
1078
e_mail_paned_view_init (EMailPanedView *view)
1013
1079
{
1014
 
        view->priv = G_TYPE_INSTANCE_GET_PRIVATE (
1015
 
                view, E_TYPE_MAIL_PANED_VIEW, EMailPanedViewPrivate);
 
1080
        view->priv = E_MAIL_PANED_VIEW_GET_PRIVATE (view);
1016
1081
        view->priv->enable_show_folder = FALSE;
1017
1082
 
1018
1083
        g_signal_connect (
1043
1108
                gtk_widget_hide (view->priv->scrolled_window);
1044
1109
}
1045
1110
 
1046
 
GtkWidget *
1047
 
e_mail_paned_view_get_preview (EMailPanedView *view)
1048
 
{
1049
 
        g_return_val_if_fail (E_IS_MAIL_PANED_VIEW (view), NULL);
1050
 
 
1051
 
        return view->priv->preview;
1052
 
}
1053
 
 
1054
1111
void
1055
1112
e_mail_paned_view_set_enable_show_folder (EMailPanedView *view,
1056
1113
                                          gboolean set)