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