Properly use libalarm API (fixes NB#91719).
[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         
1861         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1862         rule = MODEST_DIMMING_RULE (user_data);
1863  
1864         /* Check dimmed rule */ 
1865         dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1866                                                   TRUE);        
1867         if (dimmed)
1868                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1869
1870         return dimmed;
1871 }
1872
1873 gboolean 
1874 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1875 {
1876         ModestDimmingRule *rule = NULL;
1877         gboolean dimmed = FALSE;
1878         
1879         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1880         rule = MODEST_DIMMING_RULE (user_data);
1881  
1882         /* Check dimmed rule */ 
1883         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1884         if (g_slist_length (account_names) <= 1)
1885                 dimmed = TRUE;
1886         if (dimmed)
1887                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1888         
1889         modest_account_mgr_free_account_names (account_names);
1890
1891         if (!dimmed) {
1892                 dimmed = _send_receive_in_progress (win);
1893         }
1894
1895         return dimmed;
1896 }
1897
1898 #ifdef MODEST_TOOLKIT_HILDON2
1899 gboolean
1900 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1901 {
1902         TnyMsg *msg;
1903         GSList *recipients, *node;
1904         gboolean has_recipients_to_add;
1905
1906         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1907         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1908
1909         msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1910
1911         /* Message is loaded asynchronously, so this could happen */
1912         if (!msg)
1913                 return TRUE;
1914
1915         recipients = modest_tny_msg_get_all_recipients_list (msg);
1916
1917         has_recipients_to_add = FALSE;
1918         for (node = recipients; node != NULL; node = g_slist_next (node)) {
1919                 if (!modest_address_book_has_address ((const gchar *) node->data)) {
1920                         has_recipients_to_add = TRUE;
1921                         break;
1922                 }
1923         }
1924
1925         g_slist_foreach (recipients, (GFunc) g_free, NULL);
1926         g_slist_free (recipients);
1927         g_object_unref (msg);
1928   
1929         return !has_recipients_to_add;
1930 }
1931 #else
1932 gboolean
1933 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1934 {
1935         ModestDimmingRule *rule = NULL;
1936         gboolean dimmed = FALSE;
1937         GtkWidget *focused = NULL;
1938
1939         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1940         rule = MODEST_DIMMING_RULE (user_data);
1941         focused = gtk_window_get_focus (GTK_WINDOW (win));
1942
1943         dimmed = !focused;
1944
1945         if (!dimmed) {
1946                 gchar *selection = NULL;
1947                 if (GTK_IS_TEXT_VIEW (focused)) {
1948                         GtkTextIter start, end;
1949                         GtkTextBuffer *buffer = NULL;
1950                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1951                         if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
1952                                 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1953                         }
1954                 } else if (GTK_IS_LABEL (focused)) {
1955                         selection = modest_text_utils_label_get_selection (GTK_LABEL (focused));
1956                 } else {
1957                         gboolean do_check = TRUE;
1958                         GtkClipboard *clipboard;
1959                         if (GTK_IS_HTML (focused)) {
1960                                 const gchar *sel;
1961                                 int len = -1;
1962                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1963                                 do_check = !((sel == NULL) || (sel[0] == '\0'));
1964                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
1965                                 do_check = FALSE;
1966                         }
1967                         if (do_check) {
1968                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1969                                 selection = gtk_clipboard_wait_for_text (clipboard);
1970                         } else {
1971                                 selection = NULL;
1972                         }
1973                 }
1974                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1975         }
1976
1977         return dimmed;
1978 }
1979 #endif
1980
1981 /* *********************** static utility functions ******************** */
1982
1983
1984 static gboolean
1985 _selected_folder_not_writeable (ModestMainWindow *win,
1986                                 gboolean for_paste)
1987 {
1988         GtkWidget *folder_view = NULL;
1989         TnyFolderStore *parent_folder = NULL;
1990         ModestEmailClipboard *clipboard = NULL;
1991         ModestTnyFolderRules rules;
1992         gboolean is_local_acc = FALSE;
1993         gboolean xfer_folders = FALSE;
1994         gboolean result = FALSE;
1995
1996         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1997
1998         /* Get folder view */
1999         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2000                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2001         /* If no folder view, always dimmed */
2002         if (!folder_view)
2003                 return TRUE;
2004         
2005         /* Get selected folder as parent of new folder to create */
2006         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2007         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2008                 /* If it's the local account and its transfering folders, then do not dim */            
2009                 if (TNY_IS_ACCOUNT (parent_folder)) {
2010                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
2011                         if (for_paste) {
2012                                 clipboard = modest_runtime_get_email_clipboard ();
2013                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
2014                         }
2015                 }
2016
2017                 if (for_paste) 
2018                         result = !(is_local_acc && xfer_folders); 
2019                 else
2020                         result = !is_local_acc;
2021                 goto frees;             
2022         }
2023         
2024         /* Check dimmed rule */ 
2025         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2026         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
2027
2028         /* free */
2029  frees:
2030         if (parent_folder != NULL)
2031                 g_object_unref (parent_folder);
2032
2033         return result;
2034 }
2035
2036 static gboolean
2037 _selected_folder_not_deletable (ModestMainWindow *win)
2038 {
2039         GtkWidget *folder_view = NULL;
2040         TnyFolderStore *parent_folder = NULL;
2041         ModestTnyFolderRules rules;
2042         gboolean result = FALSE;
2043
2044         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2045
2046         /* Get folder view */
2047         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2048                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2049         /* If no folder view, always dimmed */
2050         if (!folder_view)
2051                 return TRUE;
2052         
2053         /* Get selected folder as parent of new folder to create */
2054         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2055         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2056                 result = TRUE;
2057                 goto frees;             
2058         }
2059         
2060         /* Check dimmed rule */ 
2061         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2062         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
2063
2064         /* free */
2065  frees:
2066         if (parent_folder != NULL)
2067                 g_object_unref (parent_folder);
2068
2069         return result;
2070 }
2071
2072 static gboolean
2073 _selected_folder_not_moveable (ModestMainWindow *win)
2074 {
2075         GtkWidget *folder_view = NULL;
2076         TnyFolderStore *parent_folder = NULL;
2077         ModestTnyFolderRules rules;
2078         gboolean result = FALSE;
2079
2080         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2081
2082         /* Get folder view */
2083         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2084                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2085         /* If no folder view, always dimmed */
2086         if (!folder_view)
2087                 return TRUE;
2088         
2089         /* Get selected folder as parent of new folder to create */
2090         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2091         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2092                 result = TRUE;
2093                 goto frees;             
2094         }
2095         
2096         /* Check dimmed rule */ 
2097         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2098         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
2099
2100         /* free */
2101  frees:
2102         if (parent_folder != NULL)
2103                 g_object_unref (parent_folder);
2104
2105         return result;
2106 }
2107
2108 static gboolean
2109 _selected_folder_not_renameable (ModestMainWindow *win)
2110 {
2111         GtkWidget *folder_view = NULL;
2112         TnyFolderStore *parent_folder = NULL;
2113         ModestTnyFolderRules rules;
2114         gboolean result = FALSE;
2115
2116         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2117
2118         /* Get folder view */
2119         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2120                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2121         /* If no folder view, always dimmed */
2122         if (!folder_view)
2123                 return TRUE;
2124         
2125         /* Get selected folder as parent of new folder to create */
2126         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2127         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2128                 result = TRUE;
2129                 goto frees;             
2130         }
2131         
2132         /* Check dimmed rule */ 
2133         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2134         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
2135
2136         /* free */
2137  frees:
2138         if (parent_folder != NULL)
2139                 g_object_unref (parent_folder);
2140
2141         return result;
2142 }
2143
2144 static gboolean
2145 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
2146 {
2147         TnyFolderType types[2];
2148         gboolean result = FALSE;
2149
2150         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2151
2152         types[0] = TNY_FOLDER_TYPE_ROOT; 
2153         types[1] = TNY_FOLDER_TYPE_INBOX; 
2154
2155         /* Check folder type */
2156         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2157
2158         /* Check pop and MMC accounts */
2159         if (!result) {
2160                 result = _selected_folder_is_root (win);
2161         }
2162                 
2163         return result;
2164 }
2165
2166
2167 static gboolean
2168 _selected_folder_is_root (ModestMainWindow *win)
2169 {
2170         TnyFolderType types[1];
2171         gboolean result = FALSE;
2172
2173         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2174
2175         /* All accounts are root items: */
2176         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2177                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2178         if (folder_view) {                                      
2179                 gboolean is_account = FALSE;
2180                 TnyFolderStore *folder_store = 
2181                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2182                 if (folder_store) {
2183                         is_account = TNY_IS_ACCOUNT (folder_store);
2184
2185                         g_object_unref (folder_store);
2186                         folder_store = NULL;
2187                 }
2188                 
2189                 if (is_account)
2190                         return TRUE;
2191         }
2192                 
2193         /* Try something more precise: */
2194         types[0] = TNY_FOLDER_TYPE_ROOT; 
2195
2196         /* Check folder type */
2197         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2198                 
2199         return result;
2200 }
2201
2202 static gboolean
2203 _header_view_is_all_selected (ModestMainWindow *win)
2204 {
2205         const DimmedState *state = NULL;
2206
2207         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2208
2209         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2210
2211         return state->all_selected;
2212 }
2213
2214 static gboolean
2215 _selected_folder_is_empty (ModestMainWindow *win)
2216 {
2217         GtkWidget *folder_view = NULL, *header_view = NULL;
2218         TnyFolderStore *folder = NULL;
2219         gboolean result = FALSE;
2220
2221         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2222
2223         /* Get folder view */
2224         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2225                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2226
2227         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2228                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2229
2230         /* If no folder view, always dimmed */
2231         if (!folder_view || !header_view)
2232                 return TRUE;
2233         
2234         /* Get selected folder as parent of new folder to create */
2235         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2236         if (!(folder && TNY_IS_FOLDER(folder))) {
2237                 if (folder)
2238                         g_object_unref (folder);
2239                 return TRUE;
2240         }
2241         
2242         /* Check folder type */
2243         if (modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)) ||
2244             tny_folder_get_all_count (TNY_FOLDER (folder)) == 0)
2245                 result = TRUE;
2246
2247         /* free */
2248         g_object_unref (folder);
2249
2250         return result;
2251 }
2252
2253 static gboolean
2254 _folder_view_has_focus (ModestWindow *win)
2255 {
2256         GtkWidget *folder_view = NULL;
2257
2258         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2259
2260         /* Get folder view */
2261         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2262                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2263         if (!folder_view)
2264                 return FALSE;
2265         
2266         if (gtk_widget_is_focus(folder_view))
2267                 return TRUE;
2268
2269         return FALSE;
2270 }
2271
2272 static gboolean
2273 _selected_folder_is_same_as_source (ModestWindow *win)
2274 {
2275         ModestEmailClipboard *clipboard = NULL;
2276         GtkWidget *folder_view = NULL;
2277         TnyFolderStore *folder = NULL;
2278         gboolean result = FALSE;
2279
2280         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2281
2282         /* Get folder view */
2283         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2284                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2285         if (!folder_view)
2286                 return FALSE;
2287         
2288         /* Get selected folder as destination folder */
2289         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2290         if (!(folder && TNY_IS_FOLDER(folder))) {
2291                 result = FALSE;
2292                 goto frees;
2293         }
2294         
2295         /* Check clipboard is cleared */
2296         clipboard = modest_runtime_get_email_clipboard ();
2297         if (modest_email_clipboard_cleared (clipboard)) {
2298                 result = FALSE;
2299                 goto frees;
2300         }
2301                 
2302         /* Check source folder */
2303         result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2304         
2305         /* Free */
2306  frees:
2307         g_object_unref (folder);
2308         
2309         return result;
2310 }
2311
2312 static gboolean
2313 _selected_folder_is_any_of_type (ModestWindow *win,
2314                                  TnyFolderType types[], 
2315                                  guint ntypes)
2316 {
2317         GtkWidget *folder_view = NULL;
2318         TnyFolderStore *folder = NULL;
2319         TnyFolderType folder_type;
2320         guint i=0;
2321         gboolean result = FALSE;
2322
2323         /*Get current folder */
2324         if (MODEST_IS_MAIN_WINDOW(win)) {
2325
2326                 /* Get folder view */
2327                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2328                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2329                 /* If no folder view, always dimmed */
2330                 if (!folder_view)
2331                         return FALSE;
2332         
2333                 /* Get selected folder as parent of new folder to create */
2334                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2335
2336                 if (!(folder && TNY_IS_FOLDER(folder))) {
2337                         if (folder)
2338                                 g_object_unref (folder);
2339                         return FALSE;
2340                 }
2341                 
2342                 /* Check folder type */
2343                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2344         }
2345         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2346                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2347                 for (i=0; i < ntypes; i++) {
2348                         result = result || folder_type == types[i];
2349                 }
2350         }
2351
2352
2353         /* free */
2354         if (folder)
2355                 g_object_unref (folder);
2356
2357         return result;  
2358 }
2359
2360 static gboolean
2361 _folder_is_any_of_type (TnyFolder *folder,
2362                         TnyFolderType types[], 
2363                         guint ntypes)
2364 {
2365         TnyFolderType folder_type;
2366         gboolean result = FALSE;
2367         guint i;
2368
2369         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2370
2371         /* Get folder type */
2372         folder_type = modest_tny_folder_guess_folder_type (folder);
2373         if (folder_type == TNY_FOLDER_TYPE_INVALID)
2374                 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2375         
2376         /* Check foler type */
2377         for (i=0; i < ntypes; i++) {
2378                 result = result || folder_type == types[i];
2379         }
2380
2381         return result;
2382 }
2383
2384 static gboolean
2385 _clipboard_is_empty (ModestWindow *win)
2386 {
2387         gboolean result = FALSE;
2388         
2389         if (MODEST_IS_MAIN_WINDOW (win)) {
2390                 ModestEmailClipboard *clipboard = NULL;
2391                 clipboard = modest_runtime_get_email_clipboard ();
2392                 if (modest_email_clipboard_cleared (clipboard)) 
2393                  result = TRUE;  
2394         }
2395
2396         return result;
2397 }
2398
2399 static gboolean
2400 _invalid_clipboard_selected (ModestWindow *win,
2401                              ModestDimmingRule *rule) 
2402 {
2403         const DimmedState *state = NULL;
2404         gboolean result = FALSE;
2405         GtkWidget *focused = NULL;
2406
2407         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2408         state = modest_window_get_dimming_state (win);
2409         /* Get focuesed widget */
2410         focused = gtk_window_get_focus (GTK_WINDOW (win));
2411
2412         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2413                 gboolean has_selection = FALSE;
2414                 if (GTK_IS_TEXT_VIEW (focused)) {
2415                         GtkTextBuffer *buffer = NULL;
2416                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2417                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
2418                 } else if (GTK_IS_EDITABLE (focused)) {
2419                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2420                 }
2421                 result = !has_selection;
2422         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2423                 if (focused) {
2424                         MODEST_DEBUG_BLOCK (g_message ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2425                         if (GTK_IS_LABEL (focused) && 
2426                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2427                                 result = TRUE;
2428                         } else if (GTK_IS_TEXT_VIEW (focused)) {
2429                                 GtkTextBuffer *buffer;
2430                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2431                                 result = !gtk_text_buffer_get_has_selection (buffer);
2432                         } else if (GTK_IS_HTML (focused)) {
2433                                 const gchar *sel;
2434                                 int len = -1;
2435                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2436                                 result = ((sel == NULL) || (sel[0] == '\0'));
2437                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2438                                 result = TRUE;
2439                         } else {
2440                                 GtkClipboard *clipboard;
2441                                 gchar *selection;
2442
2443                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2444                                 /* Get clipboard selection*/
2445                                 selection = gtk_clipboard_wait_for_text (clipboard);
2446                                 /* Check dimming */
2447                                 result = (selection == NULL);
2448                                 g_free (selection);
2449                         } 
2450                 } else {
2451                         result = TRUE;
2452                 }
2453                 
2454                 if (result)
2455                         modest_dimming_rule_set_notification (rule, "");
2456                 
2457         }               
2458         else if (MODEST_IS_MAIN_WINDOW (win)) {
2459                 /* Check dimming */
2460                 result = state->n_selected == 0;
2461                 if (result)
2462                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));                  
2463         }
2464         
2465         return result;
2466 }
2467
2468
2469 static gboolean
2470 _invalid_attach_selected (ModestWindow *win,
2471                           gboolean unique,
2472                           gboolean for_view,
2473                           gboolean for_remove,
2474                           ModestDimmingRule *rule) 
2475 {
2476         TnyList *attachments;
2477         gint n_selected;
2478         TnyHeaderFlags flags;
2479         gboolean nested_attachments = FALSE;
2480         gboolean selected_messages = FALSE;
2481         const DimmedState *state = NULL;
2482         gboolean result = FALSE;
2483
2484         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2485         state = modest_window_get_dimming_state (win);
2486
2487         if (MODEST_IS_MAIN_WINDOW (win)) {
2488                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2489                 if (!result)
2490                         result = !state->any_has_attachments;
2491         }
2492         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2493                 
2494                 /* Get selected atachments */
2495                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2496                 n_selected = tny_list_get_length (attachments);
2497
2498                 /* Check unique */              
2499                 if (!result) {
2500                         if (unique) 
2501                                 result = n_selected != 1;
2502                         else
2503                                 
2504                                 result = n_selected < 1;
2505                 }
2506                 
2507                 /* Check attached type (view operation not required) */
2508                 if (!result && !for_view)  {
2509                         TnyIterator *iter;
2510                         iter = tny_list_create_iterator (attachments);
2511                         while (!tny_iterator_is_done (iter) && !result) {
2512                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2513                                 TnyList *nested_list = tny_simple_list_new ();
2514
2515                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
2516                                         TnyMsg *window_msg;
2517                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2518                                         if ((TnyMimePart *) window_msg != mime_part) {
2519                                                 selected_messages = TRUE;
2520                                                 result = TRUE;
2521                                         }
2522                                         g_object_unref (window_msg);
2523                                 }
2524                                 tny_mime_part_get_parts (mime_part, nested_list);
2525                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2526                                         nested_attachments = TRUE;
2527                                         result = TRUE;
2528                                 }
2529                                 g_object_unref (nested_list);
2530                                 g_object_unref (mime_part);
2531                                 tny_iterator_next (iter);
2532                         }
2533                         g_object_unref (iter);
2534                 }
2535                 
2536                 /* Set notifications */
2537                 if (result && rule != NULL) {
2538                         if (selected_messages) {
2539                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2540                         } else if (nested_attachments) {
2541                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2542                         } else if (n_selected == 0) {
2543                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2544                         } else if (unique) {
2545                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2546                         }
2547                 }
2548                 
2549                 /* Free */
2550                 g_object_unref (attachments);
2551         }
2552
2553         return result;
2554 }
2555
2556 static gboolean
2557 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2558 {
2559         TnyList *attachments = NULL;
2560         TnyIterator *iter;
2561         gint purged = 0;
2562         gint n_attachments = 0;
2563         gboolean result = FALSE;
2564
2565         /* This should check if _all_ the attachments are already purged. If only some
2566          * of them are purged, then it does not cause dim as there's a confirmation dialog
2567          * for removing only local attachments */
2568
2569         /* Get selected atachments */
2570         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2571                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2572         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2573                 /* If we're in main window, we won't know if there are already purged attachments */
2574                 return FALSE;
2575         }
2576
2577         if (attachments == NULL)
2578                 return FALSE;
2579
2580         if (tny_list_get_length (attachments) == 0) {
2581                 g_object_unref (attachments);
2582                 return FALSE;
2583         }
2584
2585         iter = tny_list_create_iterator (attachments);
2586         while (!tny_iterator_is_done (iter)) {
2587                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2588                 if (tny_mime_part_is_purged (mime_part)) {
2589                         purged++;
2590                 }
2591                 n_attachments++;
2592                 g_object_unref (mime_part);
2593                 tny_iterator_next (iter);
2594         }
2595         g_object_unref (iter);
2596                 
2597         /* Free */
2598         g_object_unref (attachments);
2599
2600         if (all)
2601                 result = (purged == n_attachments);
2602         else
2603                 result = (purged > 0);
2604
2605         /* This string no longer exists, refer to NB#75415 for more info
2606         if (result && (rule != NULL))
2607                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2608         */
2609
2610         return result;
2611 }
2612
2613 static gboolean
2614 _invalid_msg_selected (ModestMainWindow *win,
2615                        gboolean unique,
2616                        ModestDimmingRule *rule) 
2617 {
2618         GtkWidget *folder_view = NULL;
2619         const DimmedState *state = NULL;
2620         gboolean result = FALSE;
2621
2622         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2623         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2624         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2625                 
2626         /* Get folder view to check focus */
2627         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2628                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2629
2630         /* Check dimmed rule (TODO: check focus on widgets */   
2631         if (!result) {
2632                 result = ((state->n_selected == 0 ) ||
2633                           (gtk_widget_is_focus (folder_view)));
2634                 if (result)
2635                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2636         }
2637         if (!result && unique) {
2638                 result = state->n_selected > 1;
2639                 if (result)
2640                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2641         }
2642
2643         return result;
2644 }
2645
2646
2647 static gboolean
2648 _msg_download_in_progress (ModestWindow *win)
2649 {
2650         gboolean result = FALSE;
2651
2652         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2653
2654         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2655                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2656         }
2657         else if (MODEST_IS_MAIN_WINDOW (win)) {
2658                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2659         }
2660
2661         return result;
2662 }
2663
2664 static gboolean
2665 _msg_download_completed (ModestMainWindow *win)
2666 {
2667         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2668         return state->any_marked_as_cached;
2669 }
2670
2671 static void 
2672 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2673 {
2674         GSList **send_queues = (GSList **) userdata;
2675         *send_queues = g_slist_prepend (*send_queues, value);
2676 }
2677
2678 static gboolean
2679 _selected_msg_sent_in_progress (ModestWindow *win)
2680 {
2681         const DimmedState *state = modest_window_get_dimming_state (win);
2682         return state->sent_in_progress;
2683 }
2684
2685
2686 static gboolean
2687 _invalid_folder_for_purge (ModestWindow *win, 
2688                            ModestDimmingRule *rule)
2689 {
2690         TnyFolder *folder = NULL;
2691         TnyAccount *account = NULL;
2692         gboolean result = FALSE;
2693
2694         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2695
2696                 /* Get folder and account of message */
2697                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2698                 g_return_val_if_fail(msg != NULL, TRUE);                        
2699                 folder = tny_msg_get_folder (msg);      
2700                 g_object_unref (msg);
2701                 if (folder == NULL) {
2702                         result = TRUE;
2703                         goto frees;
2704                 }
2705         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2706                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2707                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2708                 if (!folder_view)
2709                         return FALSE;
2710                 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2711                 /* Could be a folder store */
2712                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2713                         goto frees;             
2714         } else {
2715                 g_return_val_if_reached (FALSE);
2716         }
2717         account = modest_tny_folder_get_account (folder);
2718         if (account == NULL) goto frees;                        
2719                 
2720         /* Check account */
2721         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2722                 TnyFolderType types[2];
2723                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2724                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2725                 
2726                 if (_selected_folder_is_any_of_type (win, types, 2)) {
2727                         result = TRUE;
2728                 }
2729         } else {
2730                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
2731                 /* If it's a remote folder then dim */
2732                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
2733                                                                     protocol_type,
2734                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
2735                         result = TRUE;
2736                 }
2737         }
2738         
2739 frees:
2740         if (folder != NULL)
2741                 g_object_unref (folder);
2742         if (account != NULL)
2743                 g_object_unref (account);
2744         
2745         return result;
2746 }
2747
2748 static gboolean
2749 _transfer_mode_enabled (ModestWindow *win)
2750 {
2751         gboolean result = FALSE;
2752
2753         /* Check dimming */
2754         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2755                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2756         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2757                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2758 #ifdef MODEST_TOOLKIT_HILDON2
2759         } else if (MODEST_IS_HEADER_WINDOW (win)) {
2760                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
2761 #endif
2762         } else {
2763                 g_warning("_transfer_mode_enabled called with wrong window type");
2764         }
2765
2766         return result;
2767 }
2768
2769 static gboolean
2770 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2771 {
2772         GtkWidget *folder_view = NULL;
2773         TnyFolderStore *folder = NULL;
2774         ModestEmailClipboard *clipboard = NULL;
2775         const gchar *folder_name = NULL;
2776         gboolean result = FALSE;
2777
2778         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2779
2780         /*Get current parent folder */
2781         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2782                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2783         /* If no folder view, always dimmed */
2784         if (!folder_view) return FALSE;
2785         
2786         /* Get selected folder as parent of new folder to create */
2787         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));     
2788         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
2789         
2790         /* get modest clipboard and source folder */
2791         clipboard = modest_runtime_get_email_clipboard ();
2792         folder_name = modest_email_clipboard_get_folder_name (clipboard);
2793         if (folder_name == NULL) goto frees;
2794
2795         /* Check source subfolders names */
2796         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
2797                                                             TRUE);
2798                 
2799         /* Free */
2800  frees:
2801         if (folder != NULL) 
2802                 g_object_unref (folder);
2803
2804
2805         return result;
2806 }       
2807
2808 gboolean 
2809 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
2810                                            gpointer user_data)
2811 {
2812         ModestDimmingRule *rule = NULL;
2813
2814         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2815         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2816         rule = MODEST_DIMMING_RULE (user_data);
2817
2818         /* Check dimmed rule */ 
2819         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
2820 }
2821
2822 gboolean
2823 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
2824                                          gpointer user_data)
2825 {
2826         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2827
2828         ModestMsgEditFormat format =
2829           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
2830
2831         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
2832 }
2833
2834 static gboolean 
2835 _send_receive_in_progress (ModestWindow *win)
2836 {
2837         ModestMailOperationQueue *queue;
2838         GSList *op_list, *node;
2839         gboolean found_send_receive;
2840
2841         queue = modest_runtime_get_mail_operation_queue ();
2842         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
2843
2844         found_send_receive = FALSE;
2845         for (node = op_list; node != NULL; node = g_slist_next (node)) {
2846                 ModestMailOperation *op;
2847
2848                 op = (ModestMailOperation *) node->data;
2849                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
2850                         found_send_receive = TRUE;
2851                         break;
2852                 }
2853         }
2854
2855         g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
2856         g_slist_free (op_list);
2857
2858         return found_send_receive;
2859 }
2860
2861 static gboolean
2862 _msgs_send_in_progress (void)
2863 {
2864         ModestCacheMgr *cache_mgr;
2865         GHashTable *send_queue_cache;
2866         ModestTnySendQueue *send_queue;
2867         GSList *send_queues = NULL, *node = NULL;
2868         gboolean found = FALSE;
2869
2870         cache_mgr = modest_runtime_get_cache_mgr ();
2871         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
2872                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
2873         
2874         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
2875                 
2876         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
2877                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
2878                 
2879                 /* Check if msg uid is being processed inside send queue */
2880                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
2881                         found = TRUE;
2882                         break;
2883                 }
2884         }
2885
2886         g_slist_free (send_queues);
2887
2888         return found;
2889 }