New msg in viewer should be available on retrieving messages.
[modest] / src / modest-ui-dimming-rules.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29  
30 #ifdef HAVE_CONFIG_H
31 #include <config.h>
32 #endif /*HAVE_CONFIG_H*/
33
34 #include <string.h>
35 #include "modest-ui-dimming-rules.h"
36 #include "modest-ui-actions.h"
37 #include "modest-dimming-rule.h"
38 #include "modest-debug.h"
39 #include "modest-tny-folder.h"
40 #include "modest-tny-account.h"
41 #include "modest-tny-msg.h"
42 #include "modest-tny-mime-part.h"
43 #include "modest-text-utils.h"
44 #include <modest-address-book.h>
45 #include <widgets/modest-attachments-view.h>
46 #include <modest-runtime.h>
47 #include <tny-simple-list.h>
48 #include <widgets/modest-recpt-editor.h>
49 #include <gtkhtml/gtkhtml.h>
50 #include <modest-runtime.h>
51 #ifdef MODEST_TOOLKIT_HILDON2
52 #include <modest-header-window.h>
53 #endif
54
55
56 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
57 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
58 static gboolean _invalid_attach_selected (ModestWindow *win, 
59                                           gboolean unique, gboolean for_view, gboolean for_remove,
60                                           ModestDimmingRule *rule);
61 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
62 static gboolean _clipboard_is_empty (ModestWindow *win);
63 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
64 static gboolean _selected_folder_not_writeable (ModestMainWindow *win, gboolean for_paste);
65 static gboolean _selected_folder_not_moveable (ModestMainWindow *win);
66 static gboolean _selected_folder_not_renameable (ModestMainWindow *win);
67 static gboolean _selected_folder_not_deletable (ModestMainWindow *win);
68 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
69 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
70 static gboolean _selected_folder_is_root (ModestMainWindow *win);
71 static gboolean _header_view_is_all_selected (ModestMainWindow *win);
72 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
73 static gboolean _folder_view_has_focus (ModestWindow *win);
74 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
75 static gboolean _msg_download_in_progress (ModestWindow *win);
76 static gboolean _msg_download_completed (ModestMainWindow *win);
77 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
78 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
79 static gboolean _transfer_mode_enabled (ModestWindow *win);
80 static gboolean _selected_folder_has_subfolder_with_same_name (ModestWindow *win);
81 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
82 static gboolean _send_receive_in_progress (ModestWindow *win);
83 static gboolean _msgs_send_in_progress (void);
84
85
86 static DimmedState *
87 _define_main_window_dimming_state (ModestMainWindow *window)
88 {
89         DimmedState *state = NULL;
90         GtkWidget *focused_widget = NULL;
91         GtkWidget *header_view = NULL;
92         GtkTreeModel *model = NULL;
93         TnyList *selected_headers = NULL;
94         TnyIterator *iter = NULL;
95         TnyHeader *header = NULL;
96         ModestCacheMgr *cache_mgr = NULL;
97         GHashTable *send_queue_cache = NULL;
98         ModestTnySendQueue *send_queue = NULL;
99         GSList *send_queues = NULL, *node = NULL;
100         ModestWindowMgr *mgr = NULL;
101         gboolean found = FALSE;
102         gchar *msg_uid = NULL;
103         TnyHeaderFlags flags;
104         gboolean all_deleted = TRUE;
105         gboolean all_seen = TRUE;
106         gboolean all_cached = TRUE;
107         gboolean all_has_attach = TRUE;
108         TnyFolder *folder = NULL;
109
110         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
111
112         /* Init state */
113         state = g_slice_new0 (DimmedState);
114         state->n_selected = 0;
115         state->already_opened_msg = 0;
116         state->any_marked_as_deleted = FALSE;
117         state->all_marked_as_deleted = FALSE;
118         state->any_marked_as_seen = FALSE;
119         state->all_marked_as_seen = FALSE;
120         state->any_marked_as_cached = FALSE;
121         state->all_marked_as_cached = FALSE;
122         state->any_has_attachments = FALSE;
123         state->all_has_attachments = FALSE;
124         state->sent_in_progress = FALSE;
125         state->all_selected = FALSE;
126
127         /* Get focused widget */
128         focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
129         if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
130                 state->n_selected++;
131                 return state;
132         } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
133                 header_view = focused_widget;           
134         } else {
135                 header_view = modest_main_window_get_child_widget (window, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
136         }
137         
138         /* Get header view and selected headers */
139         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
140         if (!selected_headers) 
141                 return state;
142
143         /* Examine selected headers */
144         iter = tny_list_create_iterator (selected_headers);
145         while (!tny_iterator_is_done (iter)) {
146                 header = TNY_HEADER (tny_iterator_get_current (iter));
147                 flags = tny_header_get_flags (header);
148                 
149                 /* No selected */
150                 state->n_selected++;
151                 
152                 /* Already opened */
153                 mgr = modest_runtime_get_window_mgr ();
154                 if (modest_window_mgr_find_registered_header (mgr, header, NULL))
155                         state->already_opened_msg++;
156                 
157
158                 /* Mark as deleted */           
159                 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
160                 state->all_marked_as_deleted = all_deleted;
161                 if (!state->any_marked_as_deleted)
162                         state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
163                 
164                 /* Mark as seen */
165                 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
166                 state->all_marked_as_seen = all_seen;
167                 if (!state->any_marked_as_seen)
168                         state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
169                 
170                 /* Mark as cached */
171                 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
172                 state->all_marked_as_cached = all_cached;
173                 if (!state->any_marked_as_cached)
174                         state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
175                 
176                 /* Mark has_attachments */
177                 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
178                 state->all_has_attachments = all_has_attach;
179                 if (!state->any_has_attachments)
180                         state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
181         
182                 /* sent in progress */
183                 folder = tny_header_get_folder (header);
184                 if (folder) {
185                         if (modest_tny_folder_guess_folder_type (folder) == TNY_FOLDER_TYPE_OUTBOX) {
186                                 msg_uid = modest_tny_send_queue_get_msg_id (header);
187                                 if (!state->sent_in_progress) {
188                                         cache_mgr = modest_runtime_get_cache_mgr ();
189                                         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
190                                                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
191                         
192                                         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
193                                         
194                                         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
195                                                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
196                                                 
197                                                 /* Check if msg uid is being processed inside send queue */
198                                                 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);          
199                                         }
200                                         state->sent_in_progress = found;
201                                 }
202                         }
203                         g_object_unref (folder);
204                 }
205                 tny_iterator_next (iter);
206                 g_object_unref (header);
207         }
208
209         /* check if all the headers are selected or not */
210         model = gtk_tree_view_get_model(GTK_TREE_VIEW(header_view));
211         if (model != NULL){
212                 gint count;
213                 count = gtk_tree_model_iter_n_children(model, NULL);
214                 if(state->n_selected == count)
215                         state->all_selected = TRUE;
216         }
217
218         /* Free */
219         g_free(msg_uid);
220         g_object_unref(selected_headers);
221         g_object_unref(iter);
222         g_slist_free (send_queues);
223         
224         return state;
225 }
226
227 static DimmedState *
228 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
229 {
230         DimmedState *state = NULL;
231         TnyHeader *header = NULL;
232         ModestCacheMgr *cache_mgr = NULL;
233         GHashTable *send_queue_cache = NULL;
234         ModestTnySendQueue *send_queue = NULL;
235         GSList *send_queues = NULL, *node = NULL;
236         gboolean found = FALSE;
237         gchar *msg_uid = NULL;
238         TnyHeaderFlags flags;
239         gboolean all_deleted = TRUE;
240         gboolean all_seen = TRUE;
241         gboolean all_cached = TRUE;
242         gboolean all_has_attach = TRUE;
243                         
244         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
245
246         /* Init state */
247         state = g_slice_new0 (DimmedState);
248         state->n_selected = 0;
249         state->already_opened_msg = 0;
250         state->any_marked_as_deleted = FALSE;
251         state->all_marked_as_deleted = FALSE;
252         state->any_marked_as_seen = FALSE;
253         state->all_marked_as_seen = FALSE;
254         state->any_marked_as_cached = FALSE;
255         state->all_marked_as_cached = FALSE;
256         state->any_has_attachments = FALSE;
257         state->all_has_attachments = FALSE;
258         state->sent_in_progress = FALSE;
259
260         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
261         if (header == NULL)
262                 return state;
263         g_return_val_if_fail (TNY_IS_HEADER(header), state);
264         flags = tny_header_get_flags (header);
265
266         /* Selected */
267         state->n_selected++;
268
269         /* Mark as deleted */           
270         all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
271         state->all_marked_as_deleted = all_deleted;
272         if (!state->any_marked_as_deleted)
273                 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
274         
275         /* Mark as seen */
276         all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
277         state->all_marked_as_seen = all_seen;
278         if (!state->any_marked_as_seen)
279                 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
280         
281         /* Mark as cached */
282         all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
283         state->all_marked_as_cached = all_cached;
284         if (!state->any_marked_as_cached)
285                 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
286         
287         /* Mark has_attachments */
288         all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
289         state->all_has_attachments = all_has_attach;
290         if (!state->any_has_attachments)
291                 state->any_has_attachments = (flags & TNY_HEADER_FLAG_ATTACHMENTS)?1:0;
292         
293         /* sent in progress */
294         msg_uid = modest_tny_send_queue_get_msg_id (header);
295         if (!state->sent_in_progress) {
296                 cache_mgr = modest_runtime_get_cache_mgr ();
297                 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
298                                                                MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
299                 
300                 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
301                 
302                 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
303                         send_queue = MODEST_TNY_SEND_QUEUE (node->data);
304                         
305                         /* Check if msg uid is being processed inside send queue */
306                         found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);          
307                 }
308                 state->sent_in_progress = found;
309         }
310         
311         /* Free */
312         g_free(msg_uid);
313         g_object_unref (header);
314         g_slist_free (send_queues);
315
316         return state;
317 }
318
319    
320 DimmedState *
321 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
322 {
323         DimmedState *state = NULL;
324
325         g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
326         
327         if (MODEST_IS_MAIN_WINDOW (window)) 
328                 state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
329         else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
330                 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));         
331         }
332         
333         return state;
334 }
335
336 gboolean 
337 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
338 {
339         ModestDimmingRule *rule = NULL;
340         gboolean dimmed = FALSE;
341
342         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
343         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
344         rule = MODEST_DIMMING_RULE (user_data);
345                 
346         /* Check dimmed rule */ 
347         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
348 #ifndef MODEST_TOOLKIT_HILDON2
349                 dimmed = _msg_download_in_progress (win);
350                 if (dimmed)
351                         modest_dimming_rule_set_notification (rule, "");
352 #endif
353         } else if (MODEST_IS_MAIN_WINDOW(win)) {
354                 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
355                                                           TRUE);        
356                 if (dimmed)
357                         modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
358         }
359
360         return dimmed;
361 }
362
363 gboolean 
364 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
365 {
366         ModestDimmingRule *rule = NULL;
367         GtkWidget *folder_view = NULL;
368         TnyFolderStore *parent_folder = NULL;
369         gboolean dimmed = FALSE;
370
371         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
372         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
373         rule = MODEST_DIMMING_RULE (user_data);
374
375         dimmed = _transfer_mode_enabled (win);
376         if (dimmed) {
377                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
378                 return dimmed;
379         }
380
381         /* Get selected folder as parent of new folder to create */
382         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
383                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
384         if (!folder_view) /* folder view may not have been created yet */
385                 return TRUE;    
386
387         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
388         if (!parent_folder)
389                 return TRUE;
390         
391         if (TNY_IS_ACCOUNT (parent_folder)) {
392                 /* If it's the local account then do not dim */
393                 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
394                         dimmed = FALSE;
395                 } else {
396                         ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (parent_folder));
397                         if (protocol_type != MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
398                                 ModestProtocolRegistry *protocol_registry;
399
400                                 protocol_registry = modest_runtime_get_protocol_registry ();
401                                 /* If account does not support folders (pop) then dim */
402                                 dimmed = (!modest_protocol_registry_protocol_type_has_tag (protocol_registry, protocol_type,
403                                                                                            MODEST_PROTOCOL_REGISTRY_STORE_HAS_FOLDERS));
404                                 if (dimmed)
405                                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
406                         }
407                 }
408         } else {        
409                 TnyFolderType types[3];
410                                 
411                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
412                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
413                 types[2] = TNY_FOLDER_TYPE_SENT;
414
415                 /* Apply folder rules */        
416                 if (!dimmed) {
417                         dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), FALSE);
418                         if (dimmed)
419                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
420                 }
421                 if (!dimmed) {
422                         dimmed = _selected_folder_is_any_of_type (win, types, 3);
423                         if (dimmed)
424                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
425                 }
426         }
427
428         /* if not the folder is selected then dim */
429         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
430                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
431         if (folder_view && !gtk_widget_is_focus (folder_view)) 
432                 dimmed = TRUE;
433
434         g_object_unref (parent_folder);
435
436         return dimmed;
437 }
438
439 gboolean 
440 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
441 {
442         ModestDimmingRule *rule = NULL;
443         GtkWidget *folder_view = NULL;
444         GtkWidget *header_view = NULL;  
445         gboolean dimmed = FALSE;
446
447         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
448         rule = MODEST_DIMMING_RULE (user_data);
449         
450         if (MODEST_IS_MAIN_WINDOW (win)) {
451                 /* Get the folder view */
452                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
453                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
454                 
455                 /* Get header view */
456                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
457                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
458
459                 if (header_view && gtk_widget_is_focus (header_view)) 
460                         dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
461
462                 if (folder_view && gtk_widget_is_focus (folder_view)) 
463                         dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
464
465                 if (header_view && folder_view &&
466                     !gtk_widget_is_focus (header_view) &&
467                     !gtk_widget_is_focus (folder_view)) {
468                         dimmed = TRUE;
469                         modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));
470                 }
471                         
472 #ifdef MODEST_TOOLKIT_HILDON2
473         } else if (MODEST_IS_HEADER_WINDOW (win)) {
474
475                 if (!dimmed) {
476                         dimmed = _transfer_mode_enabled (win);
477                 }
478                 if (dimmed)
479                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
480
481                 if (!dimmed) {
482                         GtkWidget *header_view;
483                         TnyFolder *folder;
484
485                         header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
486                         folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
487                         if (folder) {
488                                 dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0);
489                                 g_object_unref (folder);
490                         }
491                 }
492
493 #endif
494         } else {
495                 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
496         }
497
498         return dimmed;
499 }
500
501
502
503 gboolean 
504 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
505 {
506         ModestDimmingRule *rule = NULL;
507         TnyFolderType types[6];
508         gboolean dimmed = FALSE;
509
510         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
511         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
512         rule = MODEST_DIMMING_RULE (user_data);
513
514         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
515         types[1] = TNY_FOLDER_TYPE_OUTBOX;
516         types[2] = TNY_FOLDER_TYPE_SENT;
517         types[3] = TNY_FOLDER_TYPE_INBOX;
518         types[4] = TNY_FOLDER_TYPE_ROOT;
519         types[5] = TNY_FOLDER_TYPE_ARCHIVE;
520
521                 
522         /* Check dimmed rule */ 
523         dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
524         if (dimmed)
525                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
526         if (!dimmed) {
527                 dimmed = _selected_folder_is_any_of_type (win, types, 6);
528                 if (dimmed)
529                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
530         }
531         if (!dimmed) {
532                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
533                 if (dimmed)
534                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
535         }
536         if (!dimmed) {
537                 dimmed = _transfer_mode_enabled (win);
538                 if (dimmed)
539                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
540         }
541
542         return dimmed;
543 }
544
545 gboolean
546 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
547 {
548         ModestDimmingRule *rule = NULL;
549         gboolean dimmed = FALSE;
550
551 #ifdef MODEST_TOOLKIT_HILDON2
552         if (MODEST_IS_HEADER_WINDOW (win)) {
553                 return FALSE;
554         }
555 #endif          
556
557         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
558         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
559         rule = MODEST_DIMMING_RULE (user_data);
560
561         /* Check dimmed rule */ 
562         dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
563
564         if (!dimmed)
565                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
566
567         return dimmed;
568         
569 }
570
571 gboolean 
572 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
573 {
574         ModestDimmingRule *rule = NULL;
575         TnyFolderType types[4];
576         gboolean dimmed = FALSE;
577
578         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
579         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
580         rule = MODEST_DIMMING_RULE (user_data);
581
582         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
583         types[1] = TNY_FOLDER_TYPE_OUTBOX;
584         types[2] = TNY_FOLDER_TYPE_SENT;
585         types[3] = TNY_FOLDER_TYPE_ARCHIVE;
586         
587         /* Check dimmed rule */ 
588         dimmed = _selected_folder_not_renameable (MODEST_MAIN_WINDOW(win));
589         if (dimmed)
590                 modest_dimming_rule_set_notification (rule, "");
591         if (!dimmed) {
592                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
593                 if (dimmed)
594                         modest_dimming_rule_set_notification (rule, "");
595         }
596         if (!dimmed) {
597                 dimmed = _selected_folder_is_any_of_type (win, types, 4);
598                 if (dimmed)
599                         modest_dimming_rule_set_notification (rule, "");
600         }
601         if (!dimmed) {
602                 dimmed = _transfer_mode_enabled (win);
603                 if (dimmed)
604                         modest_dimming_rule_set_notification (rule, "");
605         }
606
607         return dimmed;
608 }
609
610 gboolean 
611 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
612 {
613         ModestDimmingRule *rule = NULL;
614         gboolean dimmed = FALSE;
615         const DimmedState *state = NULL;
616
617         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
618         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
619         rule = MODEST_DIMMING_RULE (user_data);
620         state = modest_window_get_dimming_state (win);          
621
622         /* Check dimmed rule */ 
623         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);      
624         if (!dimmed) {
625                 dimmed = state->any_marked_as_deleted;
626                 if (dimmed) {
627                         gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
628                         modest_dimming_rule_set_notification (rule, msg);
629                         g_free (msg);
630                 }
631         }
632         if (!dimmed) {
633                 dimmed = _selected_msg_sent_in_progress (win);
634                 if (dimmed)
635                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
636         }
637
638         return dimmed;
639 }
640
641 gboolean 
642 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
643 {
644         ModestDimmingRule *rule = NULL;
645         gboolean dimmed = FALSE;
646         TnyFolderType types[3];
647
648         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
649         rule = MODEST_DIMMING_RULE (user_data);
650
651         types[0] = TNY_FOLDER_TYPE_DRAFTS;
652         types[1] = TNY_FOLDER_TYPE_OUTBOX;
653         types[2] = TNY_FOLDER_TYPE_ROOT;
654
655         /* Check dimmed rule */
656         dimmed = _selected_folder_is_any_of_type (win, types, 3);
657         if (dimmed)
658                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
659
660         /* main window dimming rules */
661         if (MODEST_IS_MAIN_WINDOW(win)) {
662                 
663                 if (!dimmed) {
664                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
665                         if (dimmed)
666                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
667                 }
668                 if (!dimmed) {
669                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
670                 }
671         /* msg view window dimming rules */
672         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
673                 
674                 /* Check dimmed rule */ 
675                 if (!dimmed) {
676                         dimmed = _transfer_mode_enabled (win);                  
677                         if (dimmed)
678                                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
679                 }
680                 if (!dimmed) {
681                         dimmed = _msg_download_in_progress (win);
682                         if (dimmed)
683                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
684                 }
685         }
686         
687         return dimmed;
688 }
689
690
691 gboolean 
692 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
693 {
694         ModestDimmingRule *rule = NULL;
695         gboolean dimmed = FALSE;
696
697         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
698         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
699         rule = MODEST_DIMMING_RULE (user_data);
700                 
701         /* Check dimmed rule */ 
702         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);     
703         if (!dimmed) {
704                 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
705                 if (dimmed)
706                         modest_dimming_rule_set_notification (rule, "");
707         }
708
709         return dimmed;
710 }
711
712 gboolean 
713 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
714 {
715         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
716
717         return TRUE;
718 }
719
720 static gboolean
721 _message_already_sent (ModestMsgViewWindow *view_window)
722 {
723         TnyHeader *header;
724         TnyFolder *folder;
725         gboolean already_sent = FALSE;
726
727         header = modest_msg_view_window_get_header (view_window);
728         if (header) {
729                 folder = tny_header_get_folder (header);
730                 if (folder) {
731                         if (modest_tny_folder_guess_folder_type (folder) ==
732                             TNY_FOLDER_TYPE_OUTBOX) {                           
733                                 ModestTnySendQueueStatus status = 
734                                         modest_tny_all_send_queues_get_msg_status (header);
735                                 if (status == MODEST_TNY_SEND_QUEUE_UNKNOWN ||
736                                     status == MODEST_TNY_SEND_QUEUE_SENDING)
737                                         already_sent = TRUE;
738                         }
739                         g_object_unref (folder);
740                 }
741                 g_object_unref (header);
742         }
743         return already_sent;
744 }
745
746
747 gboolean 
748 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
749 {
750         ModestDimmingRule *rule = NULL;
751         const DimmedState *state = NULL;
752         gboolean dimmed = FALSE;
753
754         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
755         rule = MODEST_DIMMING_RULE (user_data);
756         state = modest_window_get_dimming_state (win);          
757         
758         /* Check dimmed rule */         
759         if (MODEST_IS_MAIN_WINDOW (win)) {
760                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
761                 if (dimmed)
762                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));  
763                 if (!dimmed) {
764                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
765                 }
766                 if (!dimmed) {
767                         dimmed = state->sent_in_progress;
768                         if (dimmed)
769                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
770                 }
771                 if (!dimmed) {
772                         dimmed = state->any_marked_as_deleted;
773                         if (dimmed) {
774                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
775                                 modest_dimming_rule_set_notification (rule, msg);
776                                 g_free (msg);
777                         }
778                 }
779                 if (!dimmed) {
780                         dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
781                         if (dimmed) {
782                                 gchar *message = NULL;
783
784                                 message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), 
785                                                           state->already_opened_msg);
786                                 modest_dimming_rule_set_notification (rule, message);
787                                 g_free(message);
788                         }
789                         
790                 }
791         } 
792         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
793                 dimmed = _transfer_mode_enabled (win);                  
794                 if (dimmed)
795                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));             
796                 if (!dimmed) {
797                         dimmed = state->any_marked_as_deleted;
798                         if (dimmed) {
799                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
800                                 modest_dimming_rule_set_notification (rule, msg);
801                                 g_free (msg);
802                         }
803                 }
804                 if (!dimmed) {
805                         dimmed = state->sent_in_progress;
806                         if (dimmed)
807                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
808                 }
809
810                 /* This could happen if we're viewing a message of the
811                    outbox that has been already sent */
812                 if (!dimmed)
813                         dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
814                 
815                 /* The delete button should be dimmed when viewing an attachment,
816                  * but should be enabled when viewing a message from the list, 
817                  * or when viewing a search result.
818                  */
819                 if (!dimmed) {
820                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
821                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
822                                 if (dimmed) {
823                                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
824                                 }
825                         }
826                 }
827         }
828
829         return dimmed;
830 }
831
832 gboolean 
833 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
834 {
835         ModestDimmingRule *rule = NULL;
836         GtkWidget *header_view = NULL;
837         gboolean dimmed = FALSE;
838
839         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
840         rule = MODEST_DIMMING_RULE (user_data);
841         
842         /* main window dimming rules */
843         if (MODEST_IS_MAIN_WINDOW(win)) {
844                                 
845                 /* Check dimmed rule */
846                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
847                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
848                 
849                 /* If the header view has the focus: */
850                 if (header_view && gtk_widget_is_focus (header_view)) {
851                         /* Check dimmed rule */ 
852                         if (!dimmed)
853                                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
854                 }
855                 else {
856                         /* If the folder view has the focus: */
857                         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
858                                 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
859                         if (folder_view && gtk_widget_is_focus (folder_view)) {
860                                 TnyFolderStore *folder_store
861                                         = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
862                                 if (folder_store) {
863                                         /* Only enable for folders, not accounts,
864                                          * though the UI spec is not clear about that.
865                                          * If we enable this for accounts then we must 
866                                          * add code to handle them in modest_ui_actions_on_details(). */
867                                         if (!TNY_IS_FOLDER(folder_store)) {
868                                                 dimmed = TRUE;
869                                                 modest_dimming_rule_set_notification (rule, "");
870                                         }
871
872                                         g_object_unref (folder_store);
873                                 } else {
874                                         dimmed = TRUE;
875                                         modest_dimming_rule_set_notification (rule, "");
876                                 }
877                                 if (!dimmed) {
878                                         dimmed = _msg_download_in_progress (win);
879                                         if (dimmed)
880                                                 modest_dimming_rule_set_notification (rule, "");
881                                 }
882
883                         } else {
884                                 return TRUE;
885                         }
886                 }
887
888         /* msg view window dimming rules */
889         } else {
890                 /* Check dimmed rule */ 
891                 if (MODEST_IS_MSG_VIEW_WINDOW (win))
892                         dimmed = _msg_download_in_progress (win);
893                 if (dimmed)
894                         modest_dimming_rule_set_notification (rule, "");                
895                 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
896                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
897                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
898                         }
899                         if (dimmed)
900                                 modest_dimming_rule_set_notification (rule, "");
901                 }
902         }
903
904         return dimmed;
905 }
906
907
908 gboolean 
909 modest_ui_dimming_rules_on_mark_as_read_msg_in_view (ModestWindow *win, gpointer user_data)
910 {
911         ModestDimmingRule *rule = NULL;
912         TnyHeader *header;
913         TnyHeaderFlags flags;
914         gboolean dimmed = FALSE;
915         
916
917         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
918         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
919         rule = MODEST_DIMMING_RULE (user_data);
920         
921         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
922         if (!header) {
923                 dimmed = TRUE;
924         }
925
926         if (!dimmed) {
927                 flags = tny_header_get_flags (header);
928                 if (flags & TNY_HEADER_FLAG_SEEN)
929                         dimmed = TRUE;
930         }
931
932         if (header)
933                 g_object_unref (header);
934         return dimmed;
935 }
936
937
938 gboolean 
939 modest_ui_dimming_rules_on_mark_as_unread_msg_in_view (ModestWindow *win, gpointer user_data)
940 {
941         ModestDimmingRule *rule = NULL;
942         TnyHeader *header;
943         TnyHeaderFlags flags;
944         gboolean dimmed = FALSE;
945         
946
947         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
948         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
949         rule = MODEST_DIMMING_RULE (user_data);
950         
951         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
952         if (!header) {
953                 dimmed = TRUE;
954         }
955
956         if (!dimmed) {
957                 flags = tny_header_get_flags (header);
958                 if (!(flags & TNY_HEADER_FLAG_SEEN))
959                         dimmed = TRUE;
960         }
961
962         if (header)
963                 g_object_unref (header);
964         return dimmed;
965 }
966
967 gboolean 
968 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
969 {
970         ModestDimmingRule *rule = NULL;
971         TnyHeaderFlags flags;
972         const DimmedState *state = NULL;
973         gboolean dimmed = FALSE;
974
975         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
976         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
977         rule = MODEST_DIMMING_RULE (user_data);
978         state = modest_window_get_dimming_state (win);          
979         
980         flags = TNY_HEADER_FLAG_SEEN; 
981
982         /* Check dimmed rule */ 
983         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);     
984         if (!dimmed) {
985                 dimmed = state->all_marked_as_seen;
986                 if (dimmed)
987                         modest_dimming_rule_set_notification (rule, "");
988         }       
989
990         return dimmed;
991 }
992
993 gboolean 
994 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
995 {
996         ModestDimmingRule *rule = NULL;
997         TnyHeaderFlags flags;
998         const DimmedState *state = NULL;
999         gboolean dimmed = FALSE;
1000
1001         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1002         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1003         rule = MODEST_DIMMING_RULE (user_data);
1004         state = modest_window_get_dimming_state (win);          
1005         
1006         flags = TNY_HEADER_FLAG_SEEN; 
1007
1008         /* Check dimmed rule */ 
1009         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1010         if (!dimmed) {
1011                 dimmed = !state->any_marked_as_seen;
1012                 if (dimmed)
1013                         modest_dimming_rule_set_notification (rule, "");
1014         }
1015
1016         return dimmed;
1017 }
1018
1019 gboolean 
1020 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
1021 {
1022         ModestDimmingRule *rule = NULL;
1023         gboolean dimmed = FALSE;
1024
1025         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1026         rule = MODEST_DIMMING_RULE (user_data);
1027
1028         if (MODEST_IS_MAIN_WINDOW (win)) 
1029                 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
1030 #ifdef MODEST_TOOLKIT_HILDON2
1031         else if (MODEST_IS_HEADER_WINDOW (win))
1032                 dimmed = modest_ui_dimming_rules_on_header_window_move_to (win, user_data);
1033 #endif
1034         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
1035                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
1036
1037         return dimmed;
1038 }
1039
1040
1041 gboolean 
1042 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
1043 {
1044         GtkWidget *folder_view = NULL;
1045         ModestDimmingRule *rule = NULL;
1046         const DimmedState *state = NULL;
1047         gboolean dimmed = FALSE;
1048         
1049         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1050         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1051         rule = MODEST_DIMMING_RULE (user_data);
1052         state = modest_window_get_dimming_state (win);          
1053         
1054         /* Get the folder view */
1055         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1056                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1057
1058         
1059         /* Check diming rules for folders transfer  */
1060         if (folder_view && gtk_widget_is_focus (folder_view)) {
1061                 TnyFolderType types[5];
1062                 
1063                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1064                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1065                 types[2] = TNY_FOLDER_TYPE_SENT;
1066                 types[3] = TNY_FOLDER_TYPE_ROOT; 
1067                 types[4] = TNY_FOLDER_TYPE_INBOX; 
1068                 
1069                 /* Apply folder rules */        
1070                 dimmed = _selected_folder_not_moveable (MODEST_MAIN_WINDOW(win));
1071                 if (dimmed)
1072                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));           
1073                 if (!dimmed) {
1074                         dimmed = _selected_folder_is_any_of_type (win, types, 5);
1075                         if (dimmed)
1076                                 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1077                 }
1078         }
1079         
1080         /* Check diming rules for messages transfer  */
1081         if (!dimmed) {
1082                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1083                 if (dimmed) {
1084                         gchar *message = g_strdup_printf(_("emev_nc_unabletomove_items"),
1085                                                          state->already_opened_msg);
1086                         modest_dimming_rule_set_notification (rule, message);
1087                         g_free(message);
1088                 }
1089         }
1090         if (!dimmed) {
1091                 if (!(folder_view && gtk_widget_is_focus (folder_view)))
1092                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1093                 
1094         }
1095         if (!dimmed) {
1096                 dimmed = _selected_msg_sent_in_progress (win);
1097                 if (dimmed)
1098                         modest_dimming_rule_set_notification (rule, _("sfil_ib_unable_to_move_selected_items"));
1099         }
1100         
1101         return dimmed;
1102 }
1103
1104 gboolean 
1105 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
1106 {
1107         ModestDimmingRule *rule = NULL;
1108         gboolean dimmed = FALSE;
1109
1110         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1111         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1112         rule = MODEST_DIMMING_RULE (user_data);
1113
1114         /* Check dimmed rule */ 
1115         dimmed = _transfer_mode_enabled (win);                  
1116         if (dimmed)
1117                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
1118         if (!dimmed) {
1119                 dimmed = modest_window_get_dimming_state (win)->any_marked_as_deleted;
1120                 if (dimmed) {
1121                         gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
1122                         modest_dimming_rule_set_notification (rule, msg);
1123                         g_free (msg);
1124                 }
1125         }
1126         
1127         if (!dimmed) {
1128                 dimmed = _selected_msg_sent_in_progress (win);
1129                 if (dimmed)
1130                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1131         }
1132
1133         /* This could happen if we're viewing a message of the outbox
1134            that has been already sent */
1135         if (!dimmed)
1136                 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
1137
1138         if (!dimmed) {
1139                 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1140                         /* The move_to button should be dimmed when viewing an attachment,
1141                          * but should be enabled when viewing a message from the list, 
1142                          * or when viewing a search result.
1143                          */
1144                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
1145                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1146                         }
1147                 }
1148                 
1149                 if (dimmed) 
1150                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1151         }
1152
1153         return dimmed;
1154 }
1155
1156 #ifdef MODEST_TOOLKIT_HILDON2
1157 gboolean 
1158 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
1159 {
1160         ModestDimmingRule *rule = NULL;
1161         gboolean dimmed = FALSE;
1162
1163         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
1164         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1165         rule = MODEST_DIMMING_RULE (user_data);
1166
1167         /* Check dimmed rule */ 
1168         dimmed = _transfer_mode_enabled (win);                  
1169         if (dimmed)
1170                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
1171
1172         if (!dimmed) {
1173                 GtkWidget *header_view;
1174                 TnyFolder *folder;
1175
1176                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
1177                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
1178                 if (folder) {
1179                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0);
1180                         g_object_unref (folder);
1181                 }
1182         }
1183
1184         return dimmed;
1185 }
1186 #endif
1187
1188 gboolean 
1189 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
1190 {
1191         ModestDimmingRule *rule = NULL;
1192         gboolean dimmed = FALSE;
1193
1194         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1195         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1196         rule = MODEST_DIMMING_RULE (user_data);
1197
1198         /* Check dimmed rule */ 
1199         dimmed = _transfer_mode_enabled (win);                  
1200         if (dimmed)
1201                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
1202
1203         return dimmed;
1204 }
1205
1206 gboolean 
1207 modest_ui_dimming_rules_on_paste (ModestWindow *win, gpointer user_data)
1208 {
1209         ModestDimmingRule *rule = NULL;
1210         TnyFolderType types[3];
1211         gboolean dimmed = FALSE;
1212         
1213         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1214         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1215         rule = MODEST_DIMMING_RULE (user_data);
1216
1217         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1218         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1219         types[2] = TNY_FOLDER_TYPE_SENT;
1220         
1221         /* Check dimmed rule */ 
1222         dimmed = _clipboard_is_empty (win);
1223         if (dimmed)
1224                 modest_dimming_rule_set_notification (rule, 
1225                                                       dgettext("hildon-common-strings", 
1226                                                                "ecoc_ib_edwin_nothing_to_paste"));
1227         if (!dimmed) {
1228                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1229                 if (dimmed)
1230                         modest_dimming_rule_set_notification (rule, 
1231                                                               dgettext("hildon-common-strings", 
1232                                                                        "ckct_ib_unable_to_paste_here"));
1233         }
1234         if (!dimmed) {
1235                 dimmed = !_folder_view_has_focus (win);
1236                 if (dimmed)
1237                         modest_dimming_rule_set_notification (rule,
1238                                         dgettext("hildon-common-strings",
1239                                         "ckct_ib_unable_to_paste_here"));
1240         }
1241         if (!dimmed) {
1242                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), TRUE);
1243                 if (dimmed) 
1244                         modest_dimming_rule_set_notification (rule, 
1245                                                               dgettext("hildon-common-strings", 
1246                                                                        "ckct_ib_unable_to_paste_here"));
1247         }
1248         if (!dimmed) {
1249                 dimmed = _selected_folder_is_same_as_source (win);
1250                 if (dimmed)
1251                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1252         }
1253         if (!dimmed) {
1254                 dimmed = _selected_folder_has_subfolder_with_same_name (win);
1255                 if (dimmed)
1256                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1257         }
1258         
1259         return dimmed;
1260 }
1261
1262
1263 gboolean 
1264 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1265 {
1266         ModestDimmingRule *rule = NULL;
1267         gboolean dimmed = FALSE;
1268         GtkWidget *focused = NULL;
1269
1270         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1271         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1272         rule = MODEST_DIMMING_RULE (user_data);
1273
1274         focused = gtk_window_get_focus (GTK_WINDOW (win));
1275
1276         /* Main window dimming rules */ 
1277         if (MODEST_IS_MAIN_WINDOW (win))
1278                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1279
1280         if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
1281                 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1282
1283         if (!dimmed && GTK_IS_ENTRY (focused)) {
1284                 const gchar *current_text;
1285                 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
1286                 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
1287         }
1288
1289         if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
1290                 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1291                 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
1292         }
1293
1294         if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
1295                 dimmed = FALSE;
1296         return dimmed;
1297 }
1298
1299 gboolean 
1300 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1301 {
1302         ModestDimmingRule *rule = NULL;
1303         gboolean dimmed = FALSE;
1304
1305         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1306         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1307         rule = MODEST_DIMMING_RULE (user_data);
1308
1309         /* Check dimmed rule */ 
1310         dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);                       
1311
1312         if (!dimmed) {
1313                 dimmed = _purged_attach_selected (win, FALSE, NULL);
1314                 if (dimmed) {
1315                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1316                 }
1317         }
1318                 
1319         return dimmed;
1320 }
1321
1322 gboolean 
1323 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1324 {
1325         ModestDimmingRule *rule = NULL;
1326         gboolean dimmed = FALSE;
1327
1328         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1329         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1330         rule = MODEST_DIMMING_RULE (user_data);
1331
1332         /* Check dimmed rule */ 
1333         dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1334
1335         if (!dimmed) {
1336                 dimmed = _purged_attach_selected (win, FALSE, NULL);
1337                 if (dimmed) {
1338                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1339                 }
1340         }
1341                 
1342         return dimmed;
1343 }
1344
1345 gboolean 
1346 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1347 {
1348         ModestDimmingRule *rule = NULL;
1349         const DimmedState *state = NULL;
1350         gboolean dimmed = FALSE;
1351
1352         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1353         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1354         rule = MODEST_DIMMING_RULE (user_data);
1355         state = modest_window_get_dimming_state (win);          
1356
1357         /* Check in main window if there's only one message selected */
1358         if (MODEST_IS_MAIN_WINDOW (win)) {
1359                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1360         }
1361
1362         /* Check in view window if there's any attachment selected */
1363         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1364                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1365                 if (dimmed)
1366                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1367         }
1368
1369 #ifndef MODEST_TOOLKIT_HILDON2
1370         /* Messages as attachments could not be removed */
1371         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1372                 TnyList *attachments;
1373                 TnyIterator *iter;
1374                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW (win));
1375                 if (attachments) {
1376                         iter = tny_list_create_iterator (attachments);
1377                         while (!tny_iterator_is_done (iter) && !dimmed) {
1378                                 TnyMimePart *mime_part = (TnyMimePart *)
1379                                         tny_iterator_get_current (iter);
1380                                 if (modest_tny_mime_part_is_msg (mime_part))
1381                                         dimmed = TRUE;
1382                                 g_object_unref (mime_part);
1383                                 tny_iterator_next (iter);
1384                         }
1385                         g_object_unref (iter);
1386                         g_object_unref (attachments);
1387                 }
1388         }
1389 #endif
1390
1391         if (!dimmed) {
1392
1393                 dimmed = _selected_msg_sent_in_progress (win);
1394                 if (dimmed) {
1395                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1396                 }
1397         }
1398
1399         /* cannot purge in editable drafts nor pop folders */
1400         if (!dimmed) {
1401                 dimmed = _invalid_folder_for_purge (win, rule);
1402                 if (dimmed)
1403                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1404         }
1405
1406         /* Check if the selected message in main window has attachments */
1407         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1408                 dimmed = !(state->any_has_attachments);
1409                 if (dimmed)
1410                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1411         }
1412
1413         /* Check if all attachments are already purged */
1414         if (!dimmed) {
1415                 dimmed = _purged_attach_selected (win, TRUE, rule);
1416         }
1417
1418         /* Check if the message is already downloaded */
1419         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1420                 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1421                 if (dimmed)
1422                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1423         }
1424
1425         return dimmed;
1426 }
1427
1428 gboolean 
1429 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1430 {
1431         ModestDimmingRule *rule = NULL;
1432         gboolean dimmed = FALSE;
1433         
1434         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1435         rule = MODEST_DIMMING_RULE (user_data);
1436
1437         /* Check dimmed rule */ 
1438         if (MODEST_IS_MAIN_WINDOW (win)) {
1439                 dimmed = _clipboard_is_empty (win); 
1440                 if (dimmed)
1441                         modest_dimming_rule_set_notification (rule, "");
1442         }
1443
1444         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1445                 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
1446         }
1447                                 
1448         return dimmed;  
1449 }
1450
1451 gboolean 
1452 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
1453 {
1454         ModestDimmingRule *rule = NULL;
1455         gboolean dimmed = FALSE;
1456         
1457         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1458         rule = MODEST_DIMMING_RULE (user_data);
1459
1460         /* Check dimmed rule */ 
1461         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1462                 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
1463         }
1464                                 
1465         return dimmed;  
1466 }
1467
1468 gboolean 
1469 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1470 {
1471         ModestDimmingRule *rule = NULL;
1472         const DimmedState *state = NULL;
1473         gboolean dimmed = FALSE;
1474         
1475         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1476         rule = MODEST_DIMMING_RULE (user_data);
1477         state = modest_window_get_dimming_state (win);
1478
1479         /* Check common dimming rules */
1480         dimmed = _invalid_clipboard_selected (win, rule);
1481
1482         /* Check window specific dimming rules */
1483         if (MODEST_IS_MAIN_WINDOW (win)) {
1484                 /* Get focused widget */
1485                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1486                 
1487                 if (MODEST_IS_HEADER_VIEW (focused)) {
1488                         if (!dimmed) { 
1489                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1490                                 if (dimmed)
1491                                         modest_dimming_rule_set_notification (rule, "");
1492                         }
1493                         if (!dimmed) {
1494                                 dimmed = _selected_msg_sent_in_progress (win);
1495                                 if (dimmed)
1496                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1497                         }
1498                         if (!dimmed) {
1499                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1500                                 if(dimmed)
1501                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1502                         }
1503                 }
1504                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1505                         TnyFolderType types[3];
1506                         
1507                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1508                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1509                         types[2] = TNY_FOLDER_TYPE_SENT;
1510                         
1511                         /* Apply folder rules */        
1512                         if (!dimmed) {
1513                                 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
1514                                 if (dimmed)
1515                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1516                         }
1517                         if (!dimmed) {
1518                                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1519                                 if (dimmed)
1520                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1521                         }
1522                         if (!dimmed) {
1523                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1524                                 if (dimmed)
1525                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1526                         }
1527                 }
1528         }
1529
1530         return dimmed;
1531 }
1532
1533 gboolean 
1534 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1535 {
1536         ModestDimmingRule *rule = NULL;
1537         const DimmedState *state = NULL;
1538         gboolean dimmed = FALSE;
1539
1540         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1541         rule = MODEST_DIMMING_RULE (user_data);
1542         state = modest_window_get_dimming_state (win);
1543
1544         /* Check common dimming rules */
1545         dimmed = _invalid_clipboard_selected (win, rule);       
1546         
1547         /* Check window specific dimming rules */
1548         if (MODEST_IS_MAIN_WINDOW (win)) {
1549                 /* Get focused widget */
1550                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1551                 
1552                 if (MODEST_IS_HEADER_VIEW (focused)) {
1553                         if (!dimmed) {
1554                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1555                                 if (dimmed)
1556                                         modest_dimming_rule_set_notification (rule, "");
1557                         }               
1558                         if (!dimmed) {
1559                                 dimmed = _selected_msg_sent_in_progress (win);
1560                                 if (dimmed)
1561                                         modest_dimming_rule_set_notification (rule, _(""));
1562                         }
1563                         if (!dimmed) {
1564                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1565                                 if(dimmed)
1566                                         modest_dimming_rule_set_notification (rule, _(""));
1567                         }
1568                 }
1569                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1570                         TnyFolderType types[3];
1571                         
1572                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1573                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1574                         types[2] = TNY_FOLDER_TYPE_SENT;
1575
1576                         if (!dimmed) {
1577                                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1578                                 if (dimmed)
1579                                         modest_dimming_rule_set_notification (rule, _(""));
1580                         }
1581                         if (!dimmed) {
1582                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1583                                 if (dimmed)
1584                                         modest_dimming_rule_set_notification (rule, _(""));
1585                         }
1586                 }
1587         }
1588                 
1589         return dimmed;
1590 }
1591
1592 gboolean 
1593 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
1594 {
1595         ModestDimmingRule *rule = NULL;
1596         const DimmedState *state = NULL;
1597         gboolean dimmed = FALSE;
1598         
1599         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1600         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1601         rule = MODEST_DIMMING_RULE (user_data);
1602         state = modest_window_get_dimming_state (win);
1603
1604
1605         /* Check common dimming rules */
1606         ModestMsgEditFormat format;
1607         format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1608
1609         dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
1610         if (dimmed)
1611                 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
1612
1613         if (!dimmed) {
1614                 GtkWidget *body;
1615                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1616                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1617                 
1618                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1619                 if (dimmed)
1620                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1621         }
1622                
1623         
1624         return dimmed;
1625 }
1626
1627 gboolean 
1628 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
1629 {
1630         ModestDimmingRule *rule = NULL;
1631         const DimmedState *state = NULL;
1632         gboolean dimmed = FALSE;
1633         
1634         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1635         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1636         rule = MODEST_DIMMING_RULE (user_data);
1637         state = modest_window_get_dimming_state (win);
1638
1639         GtkWidget *body;
1640         body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1641                                                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1642         
1643         dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1644         if (dimmed)
1645                 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1646         
1647         return dimmed;
1648 }
1649
1650 gboolean 
1651 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1652 {
1653         ModestDimmingRule *rule = NULL;
1654         const DimmedState *state = NULL;
1655         gboolean dimmed = FALSE;
1656         GtkWidget *focused = NULL;
1657         
1658         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1659         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1660         rule = MODEST_DIMMING_RULE (user_data);
1661         state = modest_window_get_dimming_state (win);
1662
1663         focused = gtk_window_get_focus (GTK_WINDOW (win));
1664
1665         dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1666         
1667         if (!dimmed) {
1668                 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1669         }
1670
1671         if (!dimmed) {
1672                 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1673                 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1674
1675                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1676                   ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1677         }
1678         
1679         return dimmed;
1680 }
1681
1682 gboolean 
1683 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1684 {
1685         ModestDimmingRule *rule = NULL;
1686         const DimmedState *state = NULL;
1687         gboolean dimmed = FALSE;
1688         TnyList *selected_attachments = NULL;
1689         gint n_att_selected = 0;
1690         GtkWidget *attachments_view;
1691         
1692         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1693         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1694         rule = MODEST_DIMMING_RULE (user_data);
1695         state = modest_window_get_dimming_state (win);
1696
1697         attachments_view = modest_msg_edit_window_get_child_widget (
1698                                                                     MODEST_MSG_EDIT_WINDOW (win),
1699                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1700         
1701         selected_attachments = modest_attachments_view_get_selection (
1702                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1703         n_att_selected = tny_list_get_length (selected_attachments);
1704         g_object_unref (selected_attachments);
1705         
1706         dimmed = (n_att_selected < 1);  
1707         
1708         return dimmed;
1709 }
1710
1711 gboolean 
1712 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1713 {
1714         ModestDimmingRule *rule = NULL;
1715         const DimmedState *state = NULL;
1716         gboolean dimmed = FALSE;
1717         GtkWidget *subject_field, *body_field;
1718         GtkTextBuffer *body_buffer;
1719         const gchar *subject = NULL;
1720         
1721         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1722         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1723         rule = MODEST_DIMMING_RULE (user_data);
1724         state = modest_window_get_dimming_state (win);
1725
1726         body_field = modest_msg_edit_window_get_child_widget (
1727                                                               MODEST_MSG_EDIT_WINDOW (win),
1728                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1729         subject_field = modest_msg_edit_window_get_child_widget (
1730                                                                  MODEST_MSG_EDIT_WINDOW (win),
1731                                                                  MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT);
1732         body_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (body_field));
1733         subject = gtk_entry_get_text (GTK_ENTRY (subject_field));
1734
1735         dimmed = (subject == NULL || subject[0] == '\0');
1736         if (dimmed)
1737                 modest_dimming_rule_set_notification (rule, _("mcen_ib_subject_not_modified"));
1738                
1739         if (!dimmed) {
1740                 GtkWidget *to_field, *cc_field, *bcc_field;
1741                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1742                 cc_field = modest_msg_edit_window_get_child_widget (
1743                         MODEST_MSG_EDIT_WINDOW (win),
1744                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1745                 to_field = modest_msg_edit_window_get_child_widget (
1746                         MODEST_MSG_EDIT_WINDOW (win),
1747                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1748                 bcc_field = modest_msg_edit_window_get_child_widget (
1749                         MODEST_MSG_EDIT_WINDOW (win),
1750                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1751                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1752                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1753                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1754
1755                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1756                            gtk_text_buffer_get_char_count (cc_buffer) +
1757                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1758                 if (dimmed)
1759                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1760         }
1761         
1762         return dimmed;
1763 }
1764
1765 gboolean 
1766 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1767 {
1768         ModestDimmingRule *rule = NULL;
1769         gboolean dimmed = FALSE;
1770         
1771         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1772         rule = MODEST_DIMMING_RULE (user_data);
1773
1774         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1775
1776         /* Check dimmed rule */
1777         dimmed = _transfer_mode_enabled (win);
1778         if (dimmed)
1779                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1780         
1781         if (!dimmed) {
1782                 dimmed = modest_msg_view_window_first_message_selected (
1783                                 MODEST_MSG_VIEW_WINDOW(win));
1784                 modest_dimming_rule_set_notification (rule, NULL);
1785         }
1786
1787         return dimmed;
1788 }
1789
1790 gboolean 
1791 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1792 {
1793         ModestDimmingRule *rule = NULL;
1794         gboolean dimmed = FALSE;
1795
1796         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1797         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1798         rule = MODEST_DIMMING_RULE (user_data);
1799
1800         /* Check dimmed rule */ 
1801         dimmed = _transfer_mode_enabled (win);                  
1802         if (dimmed)
1803                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1804         
1805         if (!dimmed) {
1806                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1807                 modest_dimming_rule_set_notification (rule, NULL);
1808         }               
1809
1810         return dimmed;
1811 }
1812
1813
1814 gboolean 
1815 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1816 {
1817         return !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1818                                                 TRUE);  
1819 }
1820
1821 gboolean 
1822 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1823 {
1824         ModestDimmingRule *rule = NULL;
1825         TnyFolderType types[1];
1826         const DimmedState *state = NULL;
1827         gboolean dimmed = FALSE;
1828
1829         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1830         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1831         rule = MODEST_DIMMING_RULE (user_data);
1832         state = modest_window_get_dimming_state (win);
1833
1834         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
1835
1836         /* Check dimmed rules */        
1837         dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1838         if (dimmed) 
1839                 modest_dimming_rule_set_notification (rule, "");        
1840         if (!dimmed) {
1841                 dimmed = !state->sent_in_progress;
1842                 if (dimmed)
1843                         modest_dimming_rule_set_notification (rule, "");
1844         }
1845
1846         return dimmed;
1847 }
1848
1849 gboolean 
1850 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
1851 {
1852         /* We dim if no msg send is in progress (and then cancelling send all has no
1853          * effect */
1854         return !_msgs_send_in_progress ();
1855 }
1856
1857 gboolean 
1858 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1859 {
1860         ModestDimmingRule *rule = NULL;
1861         gboolean dimmed = FALSE;
1862         ModestAccountMgr *mgr;
1863         const gchar* account_name;
1864
1865         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1866         rule = MODEST_DIMMING_RULE (user_data);
1867         mgr = modest_runtime_get_account_mgr();
1868
1869         /* Check dimmed rule */
1870         account_name = modest_window_get_active_account (win);
1871         dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
1872
1873         if (dimmed)
1874                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1875
1876         return dimmed;
1877 }
1878
1879 gboolean 
1880 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1881 {
1882         ModestDimmingRule *rule = NULL;
1883         gboolean dimmed = FALSE;
1884         
1885         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1886         rule = MODEST_DIMMING_RULE (user_data);
1887  
1888         /* Check dimmed rule */ 
1889         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1890         if (g_slist_length (account_names) <= 1)
1891                 dimmed = TRUE;
1892         if (dimmed)
1893                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1894
1895         modest_account_mgr_free_account_names (account_names);
1896
1897         if (!dimmed) {
1898                 dimmed = _send_receive_in_progress (win);
1899         }
1900
1901         return dimmed;
1902 }
1903
1904 #ifdef MODEST_TOOLKIT_HILDON2
1905 gboolean
1906 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1907 {
1908         TnyMsg *msg;
1909         GSList *recipients, *node;
1910         gboolean has_recipients_to_add;
1911
1912         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1913         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1914
1915         msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1916
1917         /* Message is loaded asynchronously, so this could happen */
1918         if (!msg)
1919                 return TRUE;
1920
1921         recipients = modest_tny_msg_get_all_recipients_list (msg);
1922
1923         has_recipients_to_add = FALSE;
1924         for (node = recipients; node != NULL; node = g_slist_next (node)) {
1925                 if (!modest_address_book_has_address ((const gchar *) node->data)) {
1926                         has_recipients_to_add = TRUE;
1927                         break;
1928                 }
1929         }
1930
1931         g_slist_foreach (recipients, (GFunc) g_free, NULL);
1932         g_slist_free (recipients);
1933         g_object_unref (msg);
1934   
1935         return !has_recipients_to_add;
1936 }
1937 #else
1938 gboolean
1939 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1940 {
1941         ModestDimmingRule *rule = NULL;
1942         gboolean dimmed = FALSE;
1943         GtkWidget *focused = NULL;
1944
1945         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1946         rule = MODEST_DIMMING_RULE (user_data);
1947         focused = gtk_window_get_focus (GTK_WINDOW (win));
1948
1949         dimmed = !focused;
1950
1951         if (!dimmed) {
1952                 gchar *selection = NULL;
1953                 if (GTK_IS_TEXT_VIEW (focused)) {
1954                         GtkTextIter start, end;
1955                         GtkTextBuffer *buffer = NULL;
1956                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1957                         if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
1958                                 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1959                         }
1960                 } else if (GTK_IS_LABEL (focused)) {
1961                         selection = modest_text_utils_label_get_selection (GTK_LABEL (focused));
1962                 } else {
1963                         gboolean do_check = TRUE;
1964                         GtkClipboard *clipboard;
1965                         if (GTK_IS_HTML (focused)) {
1966                                 const gchar *sel;
1967                                 int len = -1;
1968                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1969                                 do_check = !((sel == NULL) || (sel[0] == '\0'));
1970                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
1971                                 do_check = FALSE;
1972                         }
1973                         if (do_check) {
1974                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1975                                 selection = gtk_clipboard_wait_for_text (clipboard);
1976                         } else {
1977                                 selection = NULL;
1978                         }
1979                 }
1980                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1981         }
1982
1983         return dimmed;
1984 }
1985 #endif
1986
1987 /* *********************** static utility functions ******************** */
1988
1989
1990 static gboolean
1991 _selected_folder_not_writeable (ModestMainWindow *win,
1992                                 gboolean for_paste)
1993 {
1994         GtkWidget *folder_view = NULL;
1995         TnyFolderStore *parent_folder = NULL;
1996         ModestEmailClipboard *clipboard = NULL;
1997         ModestTnyFolderRules rules;
1998         gboolean is_local_acc = FALSE;
1999         gboolean xfer_folders = FALSE;
2000         gboolean result = FALSE;
2001
2002         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2003
2004         /* Get folder view */
2005         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2006                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2007         /* If no folder view, always dimmed */
2008         if (!folder_view)
2009                 return TRUE;
2010         
2011         /* Get selected folder as parent of new folder to create */
2012         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2013         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2014                 /* If it's the local account and its transfering folders, then do not dim */            
2015                 if (TNY_IS_ACCOUNT (parent_folder)) {
2016                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
2017                         if (for_paste) {
2018                                 clipboard = modest_runtime_get_email_clipboard ();
2019                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
2020                         }
2021                 }
2022
2023                 if (for_paste) 
2024                         result = !(is_local_acc && xfer_folders); 
2025                 else
2026                         result = !is_local_acc;
2027                 goto frees;             
2028         }
2029         
2030         /* Check dimmed rule */ 
2031         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2032         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
2033
2034         /* free */
2035  frees:
2036         if (parent_folder != NULL)
2037                 g_object_unref (parent_folder);
2038
2039         return result;
2040 }
2041
2042 static gboolean
2043 _selected_folder_not_deletable (ModestMainWindow *win)
2044 {
2045         GtkWidget *folder_view = NULL;
2046         TnyFolderStore *parent_folder = NULL;
2047         ModestTnyFolderRules rules;
2048         gboolean result = FALSE;
2049
2050         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2051
2052         /* Get folder view */
2053         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2054                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2055         /* If no folder view, always dimmed */
2056         if (!folder_view)
2057                 return TRUE;
2058         
2059         /* Get selected folder as parent of new folder to create */
2060         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2061         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2062                 result = TRUE;
2063                 goto frees;             
2064         }
2065         
2066         /* Check dimmed rule */ 
2067         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2068         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
2069
2070         /* free */
2071  frees:
2072         if (parent_folder != NULL)
2073                 g_object_unref (parent_folder);
2074
2075         return result;
2076 }
2077
2078 static gboolean
2079 _selected_folder_not_moveable (ModestMainWindow *win)
2080 {
2081         GtkWidget *folder_view = NULL;
2082         TnyFolderStore *parent_folder = NULL;
2083         ModestTnyFolderRules rules;
2084         gboolean result = FALSE;
2085
2086         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2087
2088         /* Get folder view */
2089         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2090                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2091         /* If no folder view, always dimmed */
2092         if (!folder_view)
2093                 return TRUE;
2094         
2095         /* Get selected folder as parent of new folder to create */
2096         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2097         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2098                 result = TRUE;
2099                 goto frees;             
2100         }
2101         
2102         /* Check dimmed rule */ 
2103         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2104         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
2105
2106         /* free */
2107  frees:
2108         if (parent_folder != NULL)
2109                 g_object_unref (parent_folder);
2110
2111         return result;
2112 }
2113
2114 static gboolean
2115 _selected_folder_not_renameable (ModestMainWindow *win)
2116 {
2117         GtkWidget *folder_view = NULL;
2118         TnyFolderStore *parent_folder = NULL;
2119         ModestTnyFolderRules rules;
2120         gboolean result = FALSE;
2121
2122         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2123
2124         /* Get folder view */
2125         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2126                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2127         /* If no folder view, always dimmed */
2128         if (!folder_view)
2129                 return TRUE;
2130         
2131         /* Get selected folder as parent of new folder to create */
2132         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2133         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2134                 result = TRUE;
2135                 goto frees;             
2136         }
2137         
2138         /* Check dimmed rule */ 
2139         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2140         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
2141
2142         /* free */
2143  frees:
2144         if (parent_folder != NULL)
2145                 g_object_unref (parent_folder);
2146
2147         return result;
2148 }
2149
2150 static gboolean
2151 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
2152 {
2153         TnyFolderType types[2];
2154         gboolean result = FALSE;
2155
2156         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2157
2158         types[0] = TNY_FOLDER_TYPE_ROOT; 
2159         types[1] = TNY_FOLDER_TYPE_INBOX; 
2160
2161         /* Check folder type */
2162         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2163
2164         /* Check pop and MMC accounts */
2165         if (!result) {
2166                 result = _selected_folder_is_root (win);
2167         }
2168                 
2169         return result;
2170 }
2171
2172
2173 static gboolean
2174 _selected_folder_is_root (ModestMainWindow *win)
2175 {
2176         TnyFolderType types[1];
2177         gboolean result = FALSE;
2178
2179         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2180
2181         /* All accounts are root items: */
2182         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2183                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2184         if (folder_view) {                                      
2185                 gboolean is_account = FALSE;
2186                 TnyFolderStore *folder_store = 
2187                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2188                 if (folder_store) {
2189                         is_account = TNY_IS_ACCOUNT (folder_store);
2190
2191                         g_object_unref (folder_store);
2192                         folder_store = NULL;
2193                 }
2194                 
2195                 if (is_account)
2196                         return TRUE;
2197         }
2198                 
2199         /* Try something more precise: */
2200         types[0] = TNY_FOLDER_TYPE_ROOT; 
2201
2202         /* Check folder type */
2203         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2204                 
2205         return result;
2206 }
2207
2208 static gboolean
2209 _header_view_is_all_selected (ModestMainWindow *win)
2210 {
2211         const DimmedState *state = NULL;
2212
2213         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2214
2215         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2216
2217         return state->all_selected;
2218 }
2219
2220 static gboolean
2221 _selected_folder_is_empty (ModestMainWindow *win)
2222 {
2223         GtkWidget *folder_view = NULL, *header_view = NULL;
2224         TnyFolderStore *folder = NULL;
2225         gboolean result = FALSE;
2226
2227         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2228
2229         /* Get folder view */
2230         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2231                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2232
2233         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2234                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2235
2236         /* If no folder view, always dimmed */
2237         if (!folder_view || !header_view)
2238                 return TRUE;
2239         
2240         /* Get selected folder as parent of new folder to create */
2241         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2242         if (!(folder && TNY_IS_FOLDER(folder))) {
2243                 if (folder)
2244                         g_object_unref (folder);
2245                 return TRUE;
2246         }
2247         
2248         /* Check folder type */
2249         if (modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)) ||
2250             tny_folder_get_all_count (TNY_FOLDER (folder)) == 0)
2251                 result = TRUE;
2252
2253         /* free */
2254         g_object_unref (folder);
2255
2256         return result;
2257 }
2258
2259 static gboolean
2260 _folder_view_has_focus (ModestWindow *win)
2261 {
2262         GtkWidget *folder_view = NULL;
2263
2264         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2265
2266         /* Get folder view */
2267         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2268                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2269         if (!folder_view)
2270                 return FALSE;
2271         
2272         if (gtk_widget_is_focus(folder_view))
2273                 return TRUE;
2274
2275         return FALSE;
2276 }
2277
2278 static gboolean
2279 _selected_folder_is_same_as_source (ModestWindow *win)
2280 {
2281         ModestEmailClipboard *clipboard = NULL;
2282         GtkWidget *folder_view = NULL;
2283         TnyFolderStore *folder = NULL;
2284         gboolean result = FALSE;
2285
2286         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2287
2288         /* Get folder view */
2289         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2290                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2291         if (!folder_view)
2292                 return FALSE;
2293         
2294         /* Get selected folder as destination folder */
2295         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2296         if (!(folder && TNY_IS_FOLDER(folder))) {
2297                 result = FALSE;
2298                 goto frees;
2299         }
2300         
2301         /* Check clipboard is cleared */
2302         clipboard = modest_runtime_get_email_clipboard ();
2303         if (modest_email_clipboard_cleared (clipboard)) {
2304                 result = FALSE;
2305                 goto frees;
2306         }
2307                 
2308         /* Check source folder */
2309         result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2310         
2311         /* Free */
2312  frees:
2313         g_object_unref (folder);
2314         
2315         return result;
2316 }
2317
2318 static gboolean
2319 _selected_folder_is_any_of_type (ModestWindow *win,
2320                                  TnyFolderType types[], 
2321                                  guint ntypes)
2322 {
2323         GtkWidget *folder_view = NULL;
2324         TnyFolderStore *folder = NULL;
2325         TnyFolderType folder_type;
2326         guint i=0;
2327         gboolean result = FALSE;
2328
2329         /*Get current folder */
2330         if (MODEST_IS_MAIN_WINDOW(win)) {
2331
2332                 /* Get folder view */
2333                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2334                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2335                 /* If no folder view, always dimmed */
2336                 if (!folder_view)
2337                         return FALSE;
2338         
2339                 /* Get selected folder as parent of new folder to create */
2340                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2341
2342                 if (!(folder && TNY_IS_FOLDER(folder))) {
2343                         if (folder)
2344                                 g_object_unref (folder);
2345                         return FALSE;
2346                 }
2347                 
2348                 /* Check folder type */
2349                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2350         }
2351         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2352                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2353                 for (i=0; i < ntypes; i++) {
2354                         result = result || folder_type == types[i];
2355                 }
2356         }
2357
2358
2359         /* free */
2360         if (folder)
2361                 g_object_unref (folder);
2362
2363         return result;  
2364 }
2365
2366 static gboolean
2367 _folder_is_any_of_type (TnyFolder *folder,
2368                         TnyFolderType types[], 
2369                         guint ntypes)
2370 {
2371         TnyFolderType folder_type;
2372         gboolean result = FALSE;
2373         guint i;
2374
2375         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2376
2377         /* Get folder type */
2378         folder_type = modest_tny_folder_guess_folder_type (folder);
2379         if (folder_type == TNY_FOLDER_TYPE_INVALID)
2380                 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2381         
2382         /* Check foler type */
2383         for (i=0; i < ntypes; i++) {
2384                 result = result || folder_type == types[i];
2385         }
2386
2387         return result;
2388 }
2389
2390 static gboolean
2391 _clipboard_is_empty (ModestWindow *win)
2392 {
2393         gboolean result = FALSE;
2394         
2395         if (MODEST_IS_MAIN_WINDOW (win)) {
2396                 ModestEmailClipboard *clipboard = NULL;
2397                 clipboard = modest_runtime_get_email_clipboard ();
2398                 if (modest_email_clipboard_cleared (clipboard)) 
2399                  result = TRUE;  
2400         }
2401
2402         return result;
2403 }
2404
2405 static gboolean
2406 _invalid_clipboard_selected (ModestWindow *win,
2407                              ModestDimmingRule *rule) 
2408 {
2409         const DimmedState *state = NULL;
2410         gboolean result = FALSE;
2411         GtkWidget *focused = NULL;
2412
2413         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2414         state = modest_window_get_dimming_state (win);
2415         /* Get focuesed widget */
2416         focused = gtk_window_get_focus (GTK_WINDOW (win));
2417
2418         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2419                 gboolean has_selection = FALSE;
2420                 if (GTK_IS_TEXT_VIEW (focused)) {
2421                         GtkTextBuffer *buffer = NULL;
2422                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2423                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
2424                 } else if (GTK_IS_EDITABLE (focused)) {
2425                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2426                 }
2427                 result = !has_selection;
2428         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2429                 if (focused) {
2430                         MODEST_DEBUG_BLOCK (g_message ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2431                         if (GTK_IS_LABEL (focused) && 
2432                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2433                                 result = TRUE;
2434                         } else if (GTK_IS_TEXT_VIEW (focused)) {
2435                                 GtkTextBuffer *buffer;
2436                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2437                                 result = !gtk_text_buffer_get_has_selection (buffer);
2438                         } else if (GTK_IS_HTML (focused)) {
2439                                 const gchar *sel;
2440                                 int len = -1;
2441                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2442                                 result = ((sel == NULL) || (sel[0] == '\0'));
2443                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2444                                 result = TRUE;
2445                         } else {
2446                                 GtkClipboard *clipboard;
2447                                 gchar *selection;
2448
2449                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2450                                 /* Get clipboard selection*/
2451                                 selection = gtk_clipboard_wait_for_text (clipboard);
2452                                 /* Check dimming */
2453                                 result = (selection == NULL);
2454                                 g_free (selection);
2455                         } 
2456                 } else {
2457                         result = TRUE;
2458                 }
2459                 
2460                 if (result)
2461                         modest_dimming_rule_set_notification (rule, "");
2462                 
2463         }               
2464         else if (MODEST_IS_MAIN_WINDOW (win)) {
2465                 /* Check dimming */
2466                 result = state->n_selected == 0;
2467                 if (result)
2468                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));                  
2469         }
2470         
2471         return result;
2472 }
2473
2474
2475 static gboolean
2476 _invalid_attach_selected (ModestWindow *win,
2477                           gboolean unique,
2478                           gboolean for_view,
2479                           gboolean for_remove,
2480                           ModestDimmingRule *rule) 
2481 {
2482         TnyList *attachments;
2483         gint n_selected;
2484         TnyHeaderFlags flags;
2485         gboolean nested_attachments = FALSE;
2486         gboolean selected_messages = FALSE;
2487         const DimmedState *state = NULL;
2488         gboolean result = FALSE;
2489
2490         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2491         state = modest_window_get_dimming_state (win);
2492
2493         if (MODEST_IS_MAIN_WINDOW (win)) {
2494                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2495                 if (!result)
2496                         result = !state->any_has_attachments;
2497         }
2498         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2499                 
2500                 /* Get selected atachments */
2501                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2502                 n_selected = tny_list_get_length (attachments);
2503
2504                 /* Check unique */              
2505                 if (!result) {
2506                         if (unique) 
2507                                 result = n_selected != 1;
2508                         else
2509                                 
2510                                 result = n_selected < 1;
2511                 }
2512                 
2513                 /* Check attached type (view operation not required) */
2514                 if (!result && !for_view)  {
2515                         TnyIterator *iter;
2516                         iter = tny_list_create_iterator (attachments);
2517                         while (!tny_iterator_is_done (iter) && !result) {
2518                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2519                                 TnyList *nested_list = tny_simple_list_new ();
2520
2521                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
2522                                         TnyMsg *window_msg;
2523                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2524                                         if ((TnyMimePart *) window_msg != mime_part) {
2525                                                 selected_messages = TRUE;
2526                                                 result = TRUE;
2527                                         }
2528                                         g_object_unref (window_msg);
2529                                 }
2530                                 tny_mime_part_get_parts (mime_part, nested_list);
2531                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2532                                         nested_attachments = TRUE;
2533                                         result = TRUE;
2534                                 }
2535                                 g_object_unref (nested_list);
2536                                 g_object_unref (mime_part);
2537                                 tny_iterator_next (iter);
2538                         }
2539                         g_object_unref (iter);
2540                 }
2541                 
2542                 /* Set notifications */
2543                 if (result && rule != NULL) {
2544                         if (selected_messages) {
2545                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2546                         } else if (nested_attachments) {
2547                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2548                         } else if (n_selected == 0) {
2549                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2550                         } else if (unique) {
2551                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2552                         }
2553                 }
2554                 
2555                 /* Free */
2556                 g_object_unref (attachments);
2557         }
2558
2559         return result;
2560 }
2561
2562 static gboolean
2563 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2564 {
2565         TnyList *attachments = NULL;
2566         TnyIterator *iter;
2567         gint purged = 0;
2568         gint n_attachments = 0;
2569         gboolean result = FALSE;
2570
2571         /* This should check if _all_ the attachments are already purged. If only some
2572          * of them are purged, then it does not cause dim as there's a confirmation dialog
2573          * for removing only local attachments */
2574
2575         /* Get selected atachments */
2576         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2577                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2578         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2579                 /* If we're in main window, we won't know if there are already purged attachments */
2580                 return FALSE;
2581         }
2582
2583         if (attachments == NULL)
2584                 return FALSE;
2585
2586         if (tny_list_get_length (attachments) == 0) {
2587                 g_object_unref (attachments);
2588                 return FALSE;
2589         }
2590
2591         iter = tny_list_create_iterator (attachments);
2592         while (!tny_iterator_is_done (iter)) {
2593                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2594                 if (tny_mime_part_is_purged (mime_part)) {
2595                         purged++;
2596                 }
2597                 n_attachments++;
2598                 g_object_unref (mime_part);
2599                 tny_iterator_next (iter);
2600         }
2601         g_object_unref (iter);
2602                 
2603         /* Free */
2604         g_object_unref (attachments);
2605
2606         if (all)
2607                 result = (purged == n_attachments);
2608         else
2609                 result = (purged > 0);
2610
2611         /* This string no longer exists, refer to NB#75415 for more info
2612         if (result && (rule != NULL))
2613                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2614         */
2615
2616         return result;
2617 }
2618
2619 static gboolean
2620 _invalid_msg_selected (ModestMainWindow *win,
2621                        gboolean unique,
2622                        ModestDimmingRule *rule) 
2623 {
2624         GtkWidget *folder_view = NULL;
2625         const DimmedState *state = NULL;
2626         gboolean result = FALSE;
2627
2628         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2629         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2630         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2631                 
2632         /* Get folder view to check focus */
2633         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2634                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2635
2636         /* Check dimmed rule (TODO: check focus on widgets */   
2637         if (!result) {
2638                 result = ((state->n_selected == 0 ) ||
2639                           (gtk_widget_is_focus (folder_view)));
2640                 if (result)
2641                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2642         }
2643         if (!result && unique) {
2644                 result = state->n_selected > 1;
2645                 if (result)
2646                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2647         }
2648
2649         return result;
2650 }
2651
2652
2653 static gboolean
2654 _msg_download_in_progress (ModestWindow *win)
2655 {
2656         gboolean result = FALSE;
2657
2658         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2659
2660         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2661                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2662         }
2663         else if (MODEST_IS_MAIN_WINDOW (win)) {
2664                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2665         }
2666
2667         return result;
2668 }
2669
2670 static gboolean
2671 _msg_download_completed (ModestMainWindow *win)
2672 {
2673         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2674         return state->any_marked_as_cached;
2675 }
2676
2677 static void 
2678 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2679 {
2680         GSList **send_queues = (GSList **) userdata;
2681         *send_queues = g_slist_prepend (*send_queues, value);
2682 }
2683
2684 static gboolean
2685 _selected_msg_sent_in_progress (ModestWindow *win)
2686 {
2687         const DimmedState *state = modest_window_get_dimming_state (win);
2688         return state->sent_in_progress;
2689 }
2690
2691
2692 static gboolean
2693 _invalid_folder_for_purge (ModestWindow *win, 
2694                            ModestDimmingRule *rule)
2695 {
2696         TnyFolder *folder = NULL;
2697         TnyAccount *account = NULL;
2698         gboolean result = FALSE;
2699
2700         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2701
2702                 /* Get folder and account of message */
2703                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2704                 g_return_val_if_fail(msg != NULL, TRUE);                        
2705                 folder = tny_msg_get_folder (msg);      
2706                 g_object_unref (msg);
2707                 if (folder == NULL) {
2708                         result = TRUE;
2709                         goto frees;
2710                 }
2711         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2712                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2713                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2714                 if (!folder_view)
2715                         return FALSE;
2716                 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2717                 /* Could be a folder store */
2718                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2719                         goto frees;             
2720         } else {
2721                 g_return_val_if_reached (FALSE);
2722         }
2723         account = modest_tny_folder_get_account (folder);
2724         if (account == NULL) goto frees;                        
2725                 
2726         /* Check account */
2727         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2728                 TnyFolderType types[2];
2729                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2730                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2731                 
2732                 if (_selected_folder_is_any_of_type (win, types, 2)) {
2733                         result = TRUE;
2734                 }
2735         } else {
2736                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
2737                 /* If it's a remote folder then dim */
2738                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
2739                                                                     protocol_type,
2740                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
2741                         result = TRUE;
2742                 }
2743         }
2744         
2745 frees:
2746         if (folder != NULL)
2747                 g_object_unref (folder);
2748         if (account != NULL)
2749                 g_object_unref (account);
2750         
2751         return result;
2752 }
2753
2754 static gboolean
2755 _transfer_mode_enabled (ModestWindow *win)
2756 {
2757         gboolean result = FALSE;
2758
2759         /* Check dimming */
2760         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2761                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2762         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2763                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2764 #ifdef MODEST_TOOLKIT_HILDON2
2765         } else if (MODEST_IS_HEADER_WINDOW (win)) {
2766                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
2767 #endif
2768         } else {
2769                 g_warning("_transfer_mode_enabled called with wrong window type");
2770         }
2771
2772         return result;
2773 }
2774
2775 static gboolean
2776 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2777 {
2778         GtkWidget *folder_view = NULL;
2779         TnyFolderStore *folder = NULL;
2780         ModestEmailClipboard *clipboard = NULL;
2781         const gchar *folder_name = NULL;
2782         gboolean result = FALSE;
2783
2784         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2785
2786         /*Get current parent folder */
2787         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2788                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2789         /* If no folder view, always dimmed */
2790         if (!folder_view) return FALSE;
2791         
2792         /* Get selected folder as parent of new folder to create */
2793         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));     
2794         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
2795         
2796         /* get modest clipboard and source folder */
2797         clipboard = modest_runtime_get_email_clipboard ();
2798         folder_name = modest_email_clipboard_get_folder_name (clipboard);
2799         if (folder_name == NULL) goto frees;
2800
2801         /* Check source subfolders names */
2802         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
2803                                                             TRUE);
2804                 
2805         /* Free */
2806  frees:
2807         if (folder != NULL) 
2808                 g_object_unref (folder);
2809
2810
2811         return result;
2812 }       
2813
2814 gboolean 
2815 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
2816                                            gpointer user_data)
2817 {
2818         ModestDimmingRule *rule = NULL;
2819
2820         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2821         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2822         rule = MODEST_DIMMING_RULE (user_data);
2823
2824         /* Check dimmed rule */ 
2825         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
2826 }
2827
2828 gboolean
2829 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
2830                                          gpointer user_data)
2831 {
2832         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2833
2834         ModestMsgEditFormat format =
2835           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
2836
2837         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
2838 }
2839
2840 static gboolean 
2841 _send_receive_in_progress (ModestWindow *win)
2842 {
2843         ModestMailOperationQueue *queue;
2844         GSList *op_list, *node;
2845         gboolean found_send_receive;
2846
2847         queue = modest_runtime_get_mail_operation_queue ();
2848         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
2849
2850         found_send_receive = FALSE;
2851         for (node = op_list; node != NULL; node = g_slist_next (node)) {
2852                 ModestMailOperation *op;
2853
2854                 op = (ModestMailOperation *) node->data;
2855                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
2856                         found_send_receive = TRUE;
2857                         break;
2858                 }
2859         }
2860
2861         g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
2862         g_slist_free (op_list);
2863
2864         return found_send_receive;
2865 }
2866
2867 static gboolean
2868 _msgs_send_in_progress (void)
2869 {
2870         ModestCacheMgr *cache_mgr;
2871         GHashTable *send_queue_cache;
2872         ModestTnySendQueue *send_queue;
2873         GSList *send_queues = NULL, *node = NULL;
2874         gboolean found = FALSE;
2875
2876         cache_mgr = modest_runtime_get_cache_mgr ();
2877         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
2878                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
2879         
2880         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
2881                 
2882         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
2883                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
2884                 
2885                 /* Check if msg uid is being processed inside send queue */
2886                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
2887                         found = TRUE;
2888                         break;
2889                 }
2890         }
2891
2892         g_slist_free (send_queues);
2893
2894         return found;
2895 }