[evolution/evolution-3-12] Calendar events/tasks/memos not removed from UI on the source removal



commit c4fa7836ad37e5016f4b9122981b54cfa4f8d43a
Author: Milan Crha <mcrha redhat com>
Date:   Fri Dec 5 12:50:57 2014 +0100

    Calendar events/tasks/memos not removed from UI on the source removal
    
    While the source as such were removed, the corresponding components
    inside the views were not, because the code depended on the existence
    of a cached EClient on an EClientCache, but the EClientCache itself
    removed the EClient on its own before the signal was received by
    the calendar view.

 modules/calendar/e-cal-shell-sidebar.c  |   30 ++++++++++++++++++++++++++----
 modules/calendar/e-memo-shell-sidebar.c |   30 ++++++++++++++++++++++++++----
 modules/calendar/e-task-shell-sidebar.c |   30 ++++++++++++++++++++++++++----
 3 files changed, 78 insertions(+), 12 deletions(-)
---
diff --git a/modules/calendar/e-cal-shell-sidebar.c b/modules/calendar/e-cal-shell-sidebar.c
index 28b8d46..f653f34 100644
--- a/modules/calendar/e-cal-shell-sidebar.c
+++ b/modules/calendar/e-cal-shell-sidebar.c
@@ -22,14 +22,15 @@
 #include <config.h>
 #endif
 
-#include "e-cal-shell-sidebar.h"
-
 #include <string.h>
 #include <glib/gi18n.h>
 
 #include "calendar/gui/e-calendar-selector.h"
 #include "calendar/gui/misc.h"
 
+#include "e-cal-shell-content.h"
+#include "e-cal-shell-sidebar.h"
+
 #define E_CAL_SHELL_SIDEBAR_GET_PRIVATE(obj) \
        (G_TYPE_INSTANCE_GET_PRIVATE \
        ((obj), E_TYPE_CAL_SHELL_SIDEBAR, ECalShellSidebarPrivate))
@@ -870,8 +871,29 @@ e_cal_shell_sidebar_remove_source (ECalShellSidebar *cal_shell_sidebar,
 
        selector = e_cal_shell_sidebar_get_selector (cal_shell_sidebar);
 
-       client = e_client_selector_ref_cached_client (
-               E_CLIENT_SELECTOR (selector), source);
+       client = e_client_selector_ref_cached_client (E_CLIENT_SELECTOR (selector), source);
+       if (!client) {
+               EShellView *shell_view;
+               EShellContent *shell_content;
+               ECalModel *model;
+               GList *clients, *link;
+
+               shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (cal_shell_sidebar));
+               shell_content = e_shell_view_get_shell_content (shell_view);
+               model = e_cal_shell_content_get_model (E_CAL_SHELL_CONTENT (shell_content));
+
+               clients = e_cal_model_list_clients (model);
+               for (link = clients; link; link = g_list_next (link)) {
+                       EClient *adept = link->data;
+
+                       if (adept && g_strcmp0 (e_source_get_uid (source), e_source_get_uid 
(e_client_get_source (adept))) == 0) {
+                               client = g_object_ref (adept);
+                               break;
+                       }
+               }
+
+               g_list_free_full (clients, g_object_unref);
+       }
 
        if (client != NULL) {
                cal_shell_sidebar_emit_client_removed (
diff --git a/modules/calendar/e-memo-shell-sidebar.c b/modules/calendar/e-memo-shell-sidebar.c
index 8575da2..8309d50 100644
--- a/modules/calendar/e-memo-shell-sidebar.c
+++ b/modules/calendar/e-memo-shell-sidebar.c
@@ -22,8 +22,6 @@
 #include <config.h>
 #endif
 
-#include "e-memo-shell-sidebar.h"
-
 #include <string.h>
 #include <glib/gi18n.h>
 
@@ -31,6 +29,9 @@
 #include "calendar/gui/e-memo-list-selector.h"
 #include "calendar/gui/misc.h"
 
+#include "e-memo-shell-content.h"
+#include "e-memo-shell-sidebar.h"
+
 #define E_MEMO_SHELL_SIDEBAR_GET_PRIVATE(obj) \
        (G_TYPE_INSTANCE_GET_PRIVATE \
        ((obj), E_TYPE_MEMO_SHELL_SIDEBAR, EMemoShellSidebarPrivate))
@@ -797,8 +798,29 @@ e_memo_shell_sidebar_remove_source (EMemoShellSidebar *memo_shell_sidebar,
 
        selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar);
 
-       client = e_client_selector_ref_cached_client (
-               E_CLIENT_SELECTOR (selector), source);
+       client = e_client_selector_ref_cached_client (E_CLIENT_SELECTOR (selector), source);
+       if (!client) {
+               EShellView *shell_view;
+               EShellContent *shell_content;
+               ECalModel *model;
+               GList *clients, *link;
+
+               shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (memo_shell_sidebar));
+               shell_content = e_shell_view_get_shell_content (shell_view);
+               model = e_memo_shell_content_get_memo_model (E_MEMO_SHELL_CONTENT (shell_content));
+
+               clients = e_cal_model_list_clients (model);
+               for (link = clients; link; link = g_list_next (link)) {
+                       EClient *adept = link->data;
+
+                       if (adept && g_strcmp0 (e_source_get_uid (source), e_source_get_uid 
(e_client_get_source (adept))) == 0) {
+                               client = g_object_ref (adept);
+                               break;
+                       }
+               }
+
+               g_list_free_full (clients, g_object_unref);
+       }
 
        if (client != NULL) {
                memo_shell_sidebar_emit_client_removed (
diff --git a/modules/calendar/e-task-shell-sidebar.c b/modules/calendar/e-task-shell-sidebar.c
index d858a9f..110b672 100644
--- a/modules/calendar/e-task-shell-sidebar.c
+++ b/modules/calendar/e-task-shell-sidebar.c
@@ -22,8 +22,6 @@
 #include <config.h>
 #endif
 
-#include "e-task-shell-sidebar.h"
-
 #include <string.h>
 #include <glib/gi18n.h>
 
@@ -31,6 +29,9 @@
 #include "calendar/gui/e-task-list-selector.h"
 #include "calendar/gui/misc.h"
 
+#include "e-task-shell-content.h"
+#include "e-task-shell-sidebar.h"
+
 #define E_TASK_SHELL_SIDEBAR_GET_PRIVATE(obj) \
        (G_TYPE_INSTANCE_GET_PRIVATE \
        ((obj), E_TYPE_TASK_SHELL_SIDEBAR, ETaskShellSidebarPrivate))
@@ -797,8 +798,29 @@ e_task_shell_sidebar_remove_source (ETaskShellSidebar *task_shell_sidebar,
 
        selector = e_task_shell_sidebar_get_selector (task_shell_sidebar);
 
-       client = e_client_selector_ref_cached_client (
-               E_CLIENT_SELECTOR (selector), source);
+       client = e_client_selector_ref_cached_client (E_CLIENT_SELECTOR (selector), source);
+       if (!client) {
+               EShellView *shell_view;
+               EShellContent *shell_content;
+               ECalModel *model;
+               GList *clients, *link;
+
+               shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (task_shell_sidebar));
+               shell_content = e_shell_view_get_shell_content (shell_view);
+               model = e_task_shell_content_get_task_model (E_TASK_SHELL_CONTENT (shell_content));
+
+               clients = e_cal_model_list_clients (model);
+               for (link = clients; link; link = g_list_next (link)) {
+                       EClient *adept = link->data;
+
+                       if (adept && g_strcmp0 (e_source_get_uid (source), e_source_get_uid 
(e_client_get_source (adept))) == 0) {
+                               client = g_object_ref (adept);
+                               break;
+                       }
+               }
+
+               g_list_free_full (clients, g_object_unref);
+       }
 
        if (client != NULL) {
                task_shell_sidebar_emit_client_removed (


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]