+static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
+
+
+static DimmedState *
+_define_main_window_dimming_state (ModestMainWindow *window)
+{
+ DimmedState *state = NULL;
+ GtkWidget *header_view = NULL;
+ TnyList *selected_headers = NULL;
+ TnyIterator *iter = NULL;
+ TnyHeader *header = NULL;
+ ModestCacheMgr *cache_mgr = NULL;
+ GHashTable *send_queue_cache = NULL;
+ ModestTnySendQueue *send_queue = NULL;
+ GSList *send_queues = NULL, *node = NULL;
+ ModestWindowMgr *mgr = NULL;
+ gboolean found = FALSE;
+ gchar *msg_uid = NULL;
+ TnyHeaderFlags flags;
+
+ g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
+
+ /* Init state */
+ state = g_slice_new0 (DimmedState);
+ state->n_selected = 0;
+ state->already_opened_msg = FALSE;
+ state->any_marked_as_deleted = FALSE;
+ state->all_marked_as_deleted = FALSE;
+ state->any_marked_as_seen = FALSE;
+ state->all_marked_as_seen = FALSE;
+ state->any_marked_as_cached = FALSE;
+ state->all_marked_as_cached = FALSE;
+ state->any_has_attachments = FALSE;
+ state->all_has_attachments = FALSE;
+ state->sent_in_progress = FALSE;
+
+ /* Get header view and selected headers */
+ header_view = modest_main_window_get_child_widget (window, MODEST_WIDGET_TYPE_HEADER_VIEW);
+ selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
+ if (!selected_headers)
+ return state;
+
+ /* Examine selected headers */
+ iter = tny_list_create_iterator (selected_headers);
+ while (!tny_iterator_is_done (iter)) {
+ header = TNY_HEADER (tny_iterator_get_current (iter));
+ flags = tny_header_get_flags (header);
+
+ /* No selected */
+ state->n_selected++;
+
+ /* Already opened */
+ mgr = modest_runtime_get_window_mgr ();
+ if (!state->already_opened_msg)
+ state->already_opened_msg = modest_window_mgr_find_registered_header (mgr, header, NULL);
+
+ /* Mark as deleted */
+ state->any_marked_as_deleted &= flags & TNY_HEADER_FLAG_DELETED;
+ if (!state->any_marked_as_deleted)
+ state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
+
+ /* Mark as seen */
+ state->any_marked_as_seen &= flags & TNY_HEADER_FLAG_SEEN;
+ if (!state->any_marked_as_seen)
+ state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
+
+ /* Mark as cached */
+ state->any_marked_as_cached &= flags & TNY_HEADER_FLAG_CACHED;
+ if (!state->any_marked_as_cached)
+ state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
+
+ /* Mark has_attachments */
+ state->any_has_attachments &= flags & TNY_HEADER_FLAG_ATTACHMENTS;
+ if (!state->any_has_attachments)
+ state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
+
+ /* sent in progress */
+ msg_uid = modest_tny_send_queue_get_msg_id (header);
+ if (!state->sent_in_progress) {
+ cache_mgr = modest_runtime_get_cache_mgr ();
+ send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
+ MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
+
+ g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
+
+ for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
+ send_queue = MODEST_TNY_SEND_QUEUE (node->data);
+
+ /* Check if msg uid is being processed inside send queue */
+ found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
+ }
+ state->sent_in_progress = found;
+ }
+
+ tny_iterator_next (iter);
+ g_object_unref (header);
+ }
+
+ /* Free */
+ g_free(msg_uid);
+ g_object_unref(selected_headers);
+ g_object_unref(iter);
+ g_slist_free (send_queues);
+
+ return state;
+}
+
+static DimmedState *
+_define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
+{
+ DimmedState *state = NULL;
+ TnyHeader *header = NULL;
+ ModestCacheMgr *cache_mgr = NULL;
+ GHashTable *send_queue_cache = NULL;
+ ModestTnySendQueue *send_queue = NULL;
+ GSList *send_queues = NULL, *node = NULL;
+ gboolean found = FALSE;
+ gchar *msg_uid = NULL;
+ TnyHeaderFlags flags;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
+
+ /* Init state */
+ state = g_slice_new0 (DimmedState);
+ state->n_selected = 0;
+ state->already_opened_msg = FALSE;
+ state->any_marked_as_deleted = FALSE;
+ state->all_marked_as_deleted = FALSE;
+ state->any_marked_as_seen = FALSE;
+ state->all_marked_as_seen = FALSE;
+ state->any_marked_as_cached = FALSE;
+ state->all_marked_as_cached = FALSE;
+ state->any_has_attachments = FALSE;
+ state->all_has_attachments = FALSE;
+ state->sent_in_progress = FALSE;
+
+ header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
+ g_return_val_if_fail (TNY_IS_HEADER(header), state);
+ flags = tny_header_get_flags (header);
+
+ /* Selected */
+ state->n_selected++;
+
+ /* Mark as deleted */
+ state->any_marked_as_deleted &= flags & TNY_HEADER_FLAG_DELETED;
+ if (!state->any_marked_as_deleted)
+ state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
+
+ /* Mark as seen */
+ state->any_marked_as_seen &= flags & TNY_HEADER_FLAG_SEEN;
+ if (!state->any_marked_as_seen)
+ state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
+
+ /* Mark as cached */
+ state->any_marked_as_cached &= flags & TNY_HEADER_FLAG_CACHED;
+ if (!state->any_marked_as_cached)
+ state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
+
+ /* Mark has_attachments */
+ state->any_has_attachments &= flags & TNY_HEADER_FLAG_ATTACHMENTS;
+ if (!state->any_has_attachments)
+ state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
+
+ /* sent in progress */
+ msg_uid = modest_tny_send_queue_get_msg_id (header);
+ if (!state->sent_in_progress) {
+ cache_mgr = modest_runtime_get_cache_mgr ();
+ send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
+ MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
+
+ g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
+
+ for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
+ send_queue = MODEST_TNY_SEND_QUEUE (node->data);
+
+ /* Check if msg uid is being processed inside send queue */
+ found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
+ }
+ state->sent_in_progress = found;
+ }
+
+ /* Free */
+ g_free(msg_uid);
+ g_object_unref (header);
+ g_slist_free (send_queues);
+
+ return state;
+}
+
+
+DimmedState *
+modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
+{
+ DimmedState *state = NULL;
+
+ g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
+
+ if (MODEST_IS_MAIN_WINDOW (window))
+ state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
+ else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
+ state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
+ }
+
+ return state;
+}
+