* Fixes NB#97865, replaced the rename folder logical id
[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         /* Messages as attachments could not be removed */
1368         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1369                 TnyList *attachments;
1370                 TnyIterator *iter;
1371                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW (win));
1372                 if (attachments) {
1373                         iter = tny_list_create_iterator (attachments);
1374                         while (!tny_iterator_is_done (iter) && !dimmed) {
1375                                 TnyMimePart *mime_part = (TnyMimePart *)
1376                                         tny_iterator_get_current (iter);
1377                                 if (modest_tny_mime_part_is_msg (mime_part))
1378                                         dimmed = TRUE;
1379                                 g_object_unref (mime_part);
1380                                 tny_iterator_next (iter);
1381                         }
1382                         g_object_unref (iter);
1383                         g_object_unref (attachments);
1384                 }
1385         }
1386
1387         if (!dimmed) {
1388
1389                 dimmed = _selected_msg_sent_in_progress (win);
1390                 if (dimmed) {
1391                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1392                 }
1393         }
1394
1395         /* cannot purge in editable drafts nor pop folders */
1396         if (!dimmed) {
1397                 dimmed = _invalid_folder_for_purge (win, rule);
1398                 if (dimmed)
1399                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1400         }
1401
1402         /* Check if the selected message in main window has attachments */
1403         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1404                 dimmed = !(state->any_has_attachments);
1405                 if (dimmed)
1406                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1407         }
1408
1409         /* Check if all attachments are already purged */
1410         if (!dimmed) {
1411                 dimmed = _purged_attach_selected (win, TRUE, rule);
1412         }
1413
1414         /* Check if the message is already downloaded */
1415         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1416                 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1417                 if (dimmed)
1418                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1419         }
1420
1421         return dimmed;
1422 }
1423
1424 gboolean 
1425 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1426 {
1427         ModestDimmingRule *rule = NULL;
1428         gboolean dimmed = FALSE;
1429         
1430         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1431         rule = MODEST_DIMMING_RULE (user_data);
1432
1433         /* Check dimmed rule */ 
1434         if (MODEST_IS_MAIN_WINDOW (win)) {
1435                 dimmed = _clipboard_is_empty (win); 
1436                 if (dimmed)
1437                         modest_dimming_rule_set_notification (rule, "");
1438         }
1439
1440         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1441                 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
1442         }
1443                                 
1444         return dimmed;  
1445 }
1446
1447 gboolean 
1448 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
1449 {
1450         ModestDimmingRule *rule = NULL;
1451         gboolean dimmed = FALSE;
1452         
1453         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1454         rule = MODEST_DIMMING_RULE (user_data);
1455
1456         /* Check dimmed rule */ 
1457         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1458                 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
1459         }
1460                                 
1461         return dimmed;  
1462 }
1463
1464 gboolean 
1465 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1466 {
1467         ModestDimmingRule *rule = NULL;
1468         const DimmedState *state = NULL;
1469         gboolean dimmed = FALSE;
1470         
1471         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1472         rule = MODEST_DIMMING_RULE (user_data);
1473         state = modest_window_get_dimming_state (win);
1474
1475         /* Check common dimming rules */
1476         dimmed = _invalid_clipboard_selected (win, rule);
1477
1478         /* Check window specific dimming rules */
1479         if (MODEST_IS_MAIN_WINDOW (win)) {
1480                 /* Get focused widget */
1481                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1482                 
1483                 if (MODEST_IS_HEADER_VIEW (focused)) {
1484                         if (!dimmed) { 
1485                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1486                                 if (dimmed)
1487                                         modest_dimming_rule_set_notification (rule, "");
1488                         }
1489                         if (!dimmed) {
1490                                 dimmed = _selected_msg_sent_in_progress (win);
1491                                 if (dimmed)
1492                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1493                         }
1494                         if (!dimmed) {
1495                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1496                                 if(dimmed)
1497                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1498                         }
1499                 }
1500                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1501                         TnyFolderType types[3];
1502                         
1503                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1504                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1505                         types[2] = TNY_FOLDER_TYPE_SENT;
1506                         
1507                         /* Apply folder rules */        
1508                         if (!dimmed) {
1509                                 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
1510                                 if (dimmed)
1511                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1512                         }
1513                         if (!dimmed) {
1514                                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1515                                 if (dimmed)
1516                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1517                         }
1518                         if (!dimmed) {
1519                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1520                                 if (dimmed)
1521                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1522                         }
1523                 }
1524         }
1525
1526         return dimmed;
1527 }
1528
1529 gboolean 
1530 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1531 {
1532         ModestDimmingRule *rule = NULL;
1533         const DimmedState *state = NULL;
1534         gboolean dimmed = FALSE;
1535
1536         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1537         rule = MODEST_DIMMING_RULE (user_data);
1538         state = modest_window_get_dimming_state (win);
1539
1540         /* Check common dimming rules */
1541         dimmed = _invalid_clipboard_selected (win, rule);       
1542         
1543         /* Check window specific dimming rules */
1544         if (MODEST_IS_MAIN_WINDOW (win)) {
1545                 /* Get focused widget */
1546                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1547                 
1548                 if (MODEST_IS_HEADER_VIEW (focused)) {
1549                         if (!dimmed) {
1550                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1551                                 if (dimmed)
1552                                         modest_dimming_rule_set_notification (rule, "");
1553                         }               
1554                         if (!dimmed) {
1555                                 dimmed = _selected_msg_sent_in_progress (win);
1556                                 if (dimmed)
1557                                         modest_dimming_rule_set_notification (rule, _(""));
1558                         }
1559                         if (!dimmed) {
1560                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1561                                 if(dimmed)
1562                                         modest_dimming_rule_set_notification (rule, _(""));
1563                         }
1564                 }
1565                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1566                         TnyFolderType types[3];
1567                         
1568                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1569                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1570                         types[2] = TNY_FOLDER_TYPE_SENT;
1571
1572                         if (!dimmed) {
1573                                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1574                                 if (dimmed)
1575                                         modest_dimming_rule_set_notification (rule, _(""));
1576                         }
1577                         if (!dimmed) {
1578                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1579                                 if (dimmed)
1580                                         modest_dimming_rule_set_notification (rule, _(""));
1581                         }
1582                 }
1583         }
1584                 
1585         return dimmed;
1586 }
1587
1588 gboolean 
1589 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
1590 {
1591         ModestDimmingRule *rule = NULL;
1592         const DimmedState *state = NULL;
1593         gboolean dimmed = FALSE;
1594         
1595         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1596         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1597         rule = MODEST_DIMMING_RULE (user_data);
1598         state = modest_window_get_dimming_state (win);
1599
1600
1601         /* Check common dimming rules */
1602         ModestMsgEditFormat format;
1603         format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1604
1605         dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
1606         if (dimmed)
1607                 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
1608
1609         if (!dimmed) {
1610                 GtkWidget *body;
1611                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1612                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1613                 
1614                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1615                 if (dimmed)
1616                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1617         }
1618                
1619         
1620         return dimmed;
1621 }
1622
1623 gboolean 
1624 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
1625 {
1626         ModestDimmingRule *rule = NULL;
1627         const DimmedState *state = NULL;
1628         gboolean dimmed = FALSE;
1629         
1630         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1631         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1632         rule = MODEST_DIMMING_RULE (user_data);
1633         state = modest_window_get_dimming_state (win);
1634
1635         GtkWidget *body;
1636         body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1637                                                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1638         
1639         dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1640         if (dimmed)
1641                 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1642         
1643         return dimmed;
1644 }
1645
1646 gboolean 
1647 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1648 {
1649         ModestDimmingRule *rule = NULL;
1650         const DimmedState *state = NULL;
1651         gboolean dimmed = FALSE;
1652         GtkWidget *focused = NULL;
1653         
1654         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1655         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1656         rule = MODEST_DIMMING_RULE (user_data);
1657         state = modest_window_get_dimming_state (win);
1658
1659         focused = gtk_window_get_focus (GTK_WINDOW (win));
1660
1661         dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1662         
1663         if (!dimmed) {
1664                 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1665         }
1666
1667         if (!dimmed) {
1668                 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1669                 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1670
1671                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1672                   ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1673         }
1674         
1675         return dimmed;
1676 }
1677
1678 gboolean 
1679 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1680 {
1681         ModestDimmingRule *rule = NULL;
1682         const DimmedState *state = NULL;
1683         gboolean dimmed = FALSE;
1684         TnyList *selected_attachments = NULL;
1685         gint n_att_selected = 0;
1686         GtkWidget *attachments_view;
1687         
1688         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1689         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1690         rule = MODEST_DIMMING_RULE (user_data);
1691         state = modest_window_get_dimming_state (win);
1692
1693         attachments_view = modest_msg_edit_window_get_child_widget (
1694                                                                     MODEST_MSG_EDIT_WINDOW (win),
1695                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1696         
1697         selected_attachments = modest_attachments_view_get_selection (
1698                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1699         n_att_selected = tny_list_get_length (selected_attachments);
1700         g_object_unref (selected_attachments);
1701         
1702         dimmed = (n_att_selected < 1);  
1703         
1704         return dimmed;
1705 }
1706
1707 gboolean 
1708 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1709 {
1710         ModestDimmingRule *rule = NULL;
1711         const DimmedState *state = NULL;
1712         gboolean dimmed = FALSE;
1713         GtkWidget *subject_field, *body_field;
1714         GtkTextBuffer *body_buffer;
1715         const gchar *subject = NULL;
1716         
1717         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1718         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1719         rule = MODEST_DIMMING_RULE (user_data);
1720         state = modest_window_get_dimming_state (win);
1721
1722         body_field = modest_msg_edit_window_get_child_widget (
1723                                                               MODEST_MSG_EDIT_WINDOW (win),
1724                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1725         subject_field = modest_msg_edit_window_get_child_widget (
1726                                                                  MODEST_MSG_EDIT_WINDOW (win),
1727                                                                  MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT);
1728         body_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (body_field));
1729         subject = gtk_entry_get_text (GTK_ENTRY (subject_field));
1730
1731         dimmed = (subject == NULL || subject[0] == '\0');
1732         if (dimmed)
1733                 modest_dimming_rule_set_notification (rule, _("mcen_ib_subject_not_modified"));
1734                
1735         if (!dimmed) {
1736                 GtkWidget *to_field, *cc_field, *bcc_field;
1737                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1738                 cc_field = modest_msg_edit_window_get_child_widget (
1739                         MODEST_MSG_EDIT_WINDOW (win),
1740                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1741                 to_field = modest_msg_edit_window_get_child_widget (
1742                         MODEST_MSG_EDIT_WINDOW (win),
1743                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1744                 bcc_field = modest_msg_edit_window_get_child_widget (
1745                         MODEST_MSG_EDIT_WINDOW (win),
1746                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1747                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1748                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1749                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1750
1751                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1752                            gtk_text_buffer_get_char_count (cc_buffer) +
1753                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1754                 if (dimmed)
1755                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1756         }
1757         
1758         return dimmed;
1759 }
1760
1761 gboolean 
1762 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1763 {
1764         ModestDimmingRule *rule = NULL;
1765         gboolean dimmed = FALSE;
1766         
1767         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1768         rule = MODEST_DIMMING_RULE (user_data);
1769
1770         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1771
1772         /* Check dimmed rule */
1773         dimmed = _transfer_mode_enabled (win);
1774         if (dimmed)
1775                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1776         
1777         if (!dimmed) {
1778                 dimmed = modest_msg_view_window_first_message_selected (
1779                                 MODEST_MSG_VIEW_WINDOW(win));
1780                 modest_dimming_rule_set_notification (rule, NULL);
1781         }
1782
1783         return dimmed;
1784 }
1785
1786 gboolean 
1787 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1788 {
1789         ModestDimmingRule *rule = NULL;
1790         gboolean dimmed = FALSE;
1791
1792         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1793         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1794         rule = MODEST_DIMMING_RULE (user_data);
1795
1796         /* Check dimmed rule */ 
1797         dimmed = _transfer_mode_enabled (win);                  
1798         if (dimmed)
1799                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1800         
1801         if (!dimmed) {
1802                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1803                 modest_dimming_rule_set_notification (rule, NULL);
1804         }               
1805
1806         return dimmed;
1807 }
1808
1809
1810 gboolean 
1811 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1812 {
1813         return !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1814                                                 TRUE);  
1815 }
1816
1817 gboolean 
1818 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1819 {
1820         ModestDimmingRule *rule = NULL;
1821         TnyFolderType types[1];
1822         const DimmedState *state = NULL;
1823         gboolean dimmed = FALSE;
1824
1825         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1826         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1827         rule = MODEST_DIMMING_RULE (user_data);
1828         state = modest_window_get_dimming_state (win);
1829
1830         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
1831
1832         /* Check dimmed rules */        
1833         dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1834         if (dimmed) 
1835                 modest_dimming_rule_set_notification (rule, "");        
1836         if (!dimmed) {
1837                 dimmed = !state->sent_in_progress;
1838                 if (dimmed)
1839                         modest_dimming_rule_set_notification (rule, "");
1840         }
1841
1842         return dimmed;
1843 }
1844
1845 gboolean 
1846 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
1847 {
1848         /* We dim if no msg send is in progress (and then cancelling send all has no
1849          * effect */
1850         return !_msgs_send_in_progress ();
1851 }
1852
1853 gboolean 
1854 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1855 {
1856         ModestDimmingRule *rule = NULL;
1857         gboolean dimmed = FALSE;
1858         
1859         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1860         rule = MODEST_DIMMING_RULE (user_data);
1861  
1862         /* Check dimmed rule */ 
1863         dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1864                                                   TRUE);        
1865         if (dimmed)
1866                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1867
1868         return dimmed;
1869 }
1870
1871 gboolean 
1872 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1873 {
1874         ModestDimmingRule *rule = NULL;
1875         gboolean dimmed = FALSE;
1876         
1877         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1878         rule = MODEST_DIMMING_RULE (user_data);
1879  
1880         /* Check dimmed rule */ 
1881         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1882         if (g_slist_length (account_names) <= 1)
1883                 dimmed = TRUE;
1884         if (dimmed)
1885                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1886         
1887         modest_account_mgr_free_account_names (account_names);
1888
1889         if (!dimmed) {
1890                 dimmed = _send_receive_in_progress (win);
1891         }
1892
1893         return dimmed;
1894 }
1895
1896 #ifdef MODEST_TOOLKIT_HILDON2
1897 gboolean
1898 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1899 {
1900         TnyMsg *msg;
1901         GSList *recipients, *node;
1902         gboolean has_recipients_to_add;
1903
1904         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1905         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1906
1907         msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1908
1909         /* Message is loaded asynchronously, so this could happen */
1910         if (!msg)
1911                 return TRUE;
1912
1913         recipients = modest_tny_msg_get_all_recipients_list (msg);
1914
1915         has_recipients_to_add = FALSE;
1916         for (node = recipients; node != NULL; node = g_slist_next (node)) {
1917                 if (!modest_address_book_has_address ((const gchar *) node->data)) {
1918                         has_recipients_to_add = TRUE;
1919                         break;
1920                 }
1921         }
1922
1923         g_slist_foreach (recipients, (GFunc) g_free, NULL);
1924         g_slist_free (recipients);
1925         g_object_unref (msg);
1926   
1927         return !has_recipients_to_add;
1928 }
1929 #else
1930 gboolean
1931 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1932 {
1933         ModestDimmingRule *rule = NULL;
1934         gboolean dimmed = FALSE;
1935         GtkWidget *focused = NULL;
1936
1937         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1938         rule = MODEST_DIMMING_RULE (user_data);
1939         focused = gtk_window_get_focus (GTK_WINDOW (win));
1940
1941         dimmed = !focused;
1942
1943         if (!dimmed) {
1944                 gchar *selection = NULL;
1945                 if (GTK_IS_TEXT_VIEW (focused)) {
1946                         GtkTextIter start, end;
1947                         GtkTextBuffer *buffer = NULL;
1948                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1949                         if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
1950                                 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1951                         }
1952                 } else if (GTK_IS_LABEL (focused)) {
1953                         selection = modest_text_utils_label_get_selection (GTK_LABEL (focused));
1954                 } else {
1955                         gboolean do_check = TRUE;
1956                         GtkClipboard *clipboard;
1957                         if (GTK_IS_HTML (focused)) {
1958                                 const gchar *sel;
1959                                 int len = -1;
1960                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1961                                 do_check = !((sel == NULL) || (sel[0] == '\0'));
1962                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
1963                                 do_check = FALSE;
1964                         }
1965                         if (do_check) {
1966                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1967                                 selection = gtk_clipboard_wait_for_text (clipboard);
1968                         } else {
1969                                 selection = NULL;
1970                         }
1971                 }
1972                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1973         }
1974
1975         return dimmed;
1976 }
1977 #endif
1978
1979 /* *********************** static utility functions ******************** */
1980
1981
1982 static gboolean
1983 _selected_folder_not_writeable (ModestMainWindow *win,
1984                                 gboolean for_paste)
1985 {
1986         GtkWidget *folder_view = NULL;
1987         TnyFolderStore *parent_folder = NULL;
1988         ModestEmailClipboard *clipboard = NULL;
1989         ModestTnyFolderRules rules;
1990         gboolean is_local_acc = FALSE;
1991         gboolean xfer_folders = FALSE;
1992         gboolean result = FALSE;
1993
1994         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1995
1996         /* Get folder view */
1997         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1998                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1999         /* If no folder view, always dimmed */
2000         if (!folder_view)
2001                 return TRUE;
2002         
2003         /* Get selected folder as parent of new folder to create */
2004         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2005         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2006                 /* If it's the local account and its transfering folders, then do not dim */            
2007                 if (TNY_IS_ACCOUNT (parent_folder)) {
2008                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
2009                         if (for_paste) {
2010                                 clipboard = modest_runtime_get_email_clipboard ();
2011                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
2012                         }
2013                 }
2014
2015                 if (for_paste) 
2016                         result = !(is_local_acc && xfer_folders); 
2017                 else
2018                         result = !is_local_acc;
2019                 goto frees;             
2020         }
2021         
2022         /* Check dimmed rule */ 
2023         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2024         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
2025
2026         /* free */
2027  frees:
2028         if (parent_folder != NULL)
2029                 g_object_unref (parent_folder);
2030
2031         return result;
2032 }
2033
2034 static gboolean
2035 _selected_folder_not_deletable (ModestMainWindow *win)
2036 {
2037         GtkWidget *folder_view = NULL;
2038         TnyFolderStore *parent_folder = NULL;
2039         ModestTnyFolderRules rules;
2040         gboolean result = FALSE;
2041
2042         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2043
2044         /* Get folder view */
2045         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2046                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2047         /* If no folder view, always dimmed */
2048         if (!folder_view)
2049                 return TRUE;
2050         
2051         /* Get selected folder as parent of new folder to create */
2052         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2053         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2054                 result = TRUE;
2055                 goto frees;             
2056         }
2057         
2058         /* Check dimmed rule */ 
2059         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2060         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
2061
2062         /* free */
2063  frees:
2064         if (parent_folder != NULL)
2065                 g_object_unref (parent_folder);
2066
2067         return result;
2068 }
2069
2070 static gboolean
2071 _selected_folder_not_moveable (ModestMainWindow *win)
2072 {
2073         GtkWidget *folder_view = NULL;
2074         TnyFolderStore *parent_folder = NULL;
2075         ModestTnyFolderRules rules;
2076         gboolean result = FALSE;
2077
2078         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2079
2080         /* Get folder view */
2081         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2082                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2083         /* If no folder view, always dimmed */
2084         if (!folder_view)
2085                 return TRUE;
2086         
2087         /* Get selected folder as parent of new folder to create */
2088         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2089         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2090                 result = TRUE;
2091                 goto frees;             
2092         }
2093         
2094         /* Check dimmed rule */ 
2095         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2096         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
2097
2098         /* free */
2099  frees:
2100         if (parent_folder != NULL)
2101                 g_object_unref (parent_folder);
2102
2103         return result;
2104 }
2105
2106 static gboolean
2107 _selected_folder_not_renameable (ModestMainWindow *win)
2108 {
2109         GtkWidget *folder_view = NULL;
2110         TnyFolderStore *parent_folder = NULL;
2111         ModestTnyFolderRules rules;
2112         gboolean result = FALSE;
2113
2114         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2115
2116         /* Get folder view */
2117         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2118                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2119         /* If no folder view, always dimmed */
2120         if (!folder_view)
2121                 return TRUE;
2122         
2123         /* Get selected folder as parent of new folder to create */
2124         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2125         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2126                 result = TRUE;
2127                 goto frees;             
2128         }
2129         
2130         /* Check dimmed rule */ 
2131         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2132         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
2133
2134         /* free */
2135  frees:
2136         if (parent_folder != NULL)
2137                 g_object_unref (parent_folder);
2138
2139         return result;
2140 }
2141
2142 static gboolean
2143 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
2144 {
2145         TnyFolderType types[2];
2146         gboolean result = FALSE;
2147
2148         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2149
2150         types[0] = TNY_FOLDER_TYPE_ROOT; 
2151         types[1] = TNY_FOLDER_TYPE_INBOX; 
2152
2153         /* Check folder type */
2154         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2155
2156         /* Check pop and MMC accounts */
2157         if (!result) {
2158                 result = _selected_folder_is_root (win);
2159         }
2160                 
2161         return result;
2162 }
2163
2164
2165 static gboolean
2166 _selected_folder_is_root (ModestMainWindow *win)
2167 {
2168         TnyFolderType types[1];
2169         gboolean result = FALSE;
2170
2171         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2172
2173         /* All accounts are root items: */
2174         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2175                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2176         if (folder_view) {                                      
2177                 gboolean is_account = FALSE;
2178                 TnyFolderStore *folder_store = 
2179                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2180                 if (folder_store) {
2181                         is_account = TNY_IS_ACCOUNT (folder_store);
2182
2183                         g_object_unref (folder_store);
2184                         folder_store = NULL;
2185                 }
2186                 
2187                 if (is_account)
2188                         return TRUE;
2189         }
2190                 
2191         /* Try something more precise: */
2192         types[0] = TNY_FOLDER_TYPE_ROOT; 
2193
2194         /* Check folder type */
2195         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2196                 
2197         return result;
2198 }
2199
2200 static gboolean
2201 _header_view_is_all_selected (ModestMainWindow *win)
2202 {
2203         const DimmedState *state = NULL;
2204
2205         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2206
2207         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2208
2209         return state->all_selected;
2210 }
2211
2212 static gboolean
2213 _selected_folder_is_empty (ModestMainWindow *win)
2214 {
2215         GtkWidget *folder_view = NULL, *header_view = NULL;
2216         TnyFolderStore *folder = NULL;
2217         gboolean result = FALSE;
2218
2219         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2220
2221         /* Get folder view */
2222         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2223                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2224
2225         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2226                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2227
2228         /* If no folder view, always dimmed */
2229         if (!folder_view || !header_view)
2230                 return TRUE;
2231         
2232         /* Get selected folder as parent of new folder to create */
2233         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2234         if (!(folder && TNY_IS_FOLDER(folder))) {
2235                 if (folder)
2236                         g_object_unref (folder);
2237                 return TRUE;
2238         }
2239         
2240         /* Check folder type */
2241         if (modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)) ||
2242             tny_folder_get_all_count (TNY_FOLDER (folder)) == 0)
2243                 result = TRUE;
2244
2245         /* free */
2246         g_object_unref (folder);
2247
2248         return result;
2249 }
2250
2251 static gboolean
2252 _folder_view_has_focus (ModestWindow *win)
2253 {
2254         GtkWidget *folder_view = NULL;
2255
2256         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2257
2258         /* Get folder view */
2259         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2260                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2261         if (!folder_view)
2262                 return FALSE;
2263         
2264         if (gtk_widget_is_focus(folder_view))
2265                 return TRUE;
2266
2267         return FALSE;
2268 }
2269
2270 static gboolean
2271 _selected_folder_is_same_as_source (ModestWindow *win)
2272 {
2273         ModestEmailClipboard *clipboard = NULL;
2274         GtkWidget *folder_view = NULL;
2275         TnyFolderStore *folder = NULL;
2276         gboolean result = FALSE;
2277
2278         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2279
2280         /* Get folder view */
2281         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2282                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2283         if (!folder_view)
2284                 return FALSE;
2285         
2286         /* Get selected folder as destination folder */
2287         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2288         if (!(folder && TNY_IS_FOLDER(folder))) {
2289                 result = FALSE;
2290                 goto frees;
2291         }
2292         
2293         /* Check clipboard is cleared */
2294         clipboard = modest_runtime_get_email_clipboard ();
2295         if (modest_email_clipboard_cleared (clipboard)) {
2296                 result = FALSE;
2297                 goto frees;
2298         }
2299                 
2300         /* Check source folder */
2301         result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2302         
2303         /* Free */
2304  frees:
2305         g_object_unref (folder);
2306         
2307         return result;
2308 }
2309
2310 static gboolean
2311 _selected_folder_is_any_of_type (ModestWindow *win,
2312                                  TnyFolderType types[], 
2313                                  guint ntypes)
2314 {
2315         GtkWidget *folder_view = NULL;
2316         TnyFolderStore *folder = NULL;
2317         TnyFolderType folder_type;
2318         guint i=0;
2319         gboolean result = FALSE;
2320
2321         /*Get current folder */
2322         if (MODEST_IS_MAIN_WINDOW(win)) {
2323
2324                 /* Get folder view */
2325                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2326                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2327                 /* If no folder view, always dimmed */
2328                 if (!folder_view)
2329                         return FALSE;
2330         
2331                 /* Get selected folder as parent of new folder to create */
2332                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2333
2334                 if (!(folder && TNY_IS_FOLDER(folder))) {
2335                         if (folder)
2336                                 g_object_unref (folder);
2337                         return FALSE;
2338                 }
2339                 
2340                 /* Check folder type */
2341                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2342         }
2343         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2344                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2345                 for (i=0; i < ntypes; i++) {
2346                         result = result || folder_type == types[i];
2347                 }
2348         }
2349
2350
2351         /* free */
2352         if (folder)
2353                 g_object_unref (folder);
2354
2355         return result;  
2356 }
2357
2358 static gboolean
2359 _folder_is_any_of_type (TnyFolder *folder,
2360                         TnyFolderType types[], 
2361                         guint ntypes)
2362 {
2363         TnyFolderType folder_type;
2364         gboolean result = FALSE;
2365         guint i;
2366
2367         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2368
2369         /* Get folder type */
2370         folder_type = modest_tny_folder_guess_folder_type (folder);
2371         if (folder_type == TNY_FOLDER_TYPE_INVALID)
2372                 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2373         
2374         /* Check foler type */
2375         for (i=0; i < ntypes; i++) {
2376                 result = result || folder_type == types[i];
2377         }
2378
2379         return result;
2380 }
2381
2382 static gboolean
2383 _clipboard_is_empty (ModestWindow *win)
2384 {
2385         gboolean result = FALSE;
2386         
2387         if (MODEST_IS_MAIN_WINDOW (win)) {
2388                 ModestEmailClipboard *clipboard = NULL;
2389                 clipboard = modest_runtime_get_email_clipboard ();
2390                 if (modest_email_clipboard_cleared (clipboard)) 
2391                  result = TRUE;  
2392         }
2393
2394         return result;
2395 }
2396
2397 static gboolean
2398 _invalid_clipboard_selected (ModestWindow *win,
2399                              ModestDimmingRule *rule) 
2400 {
2401         const DimmedState *state = NULL;
2402         gboolean result = FALSE;
2403         GtkWidget *focused = NULL;
2404
2405         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2406         state = modest_window_get_dimming_state (win);
2407         /* Get focuesed widget */
2408         focused = gtk_window_get_focus (GTK_WINDOW (win));
2409
2410         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2411                 gboolean has_selection = FALSE;
2412                 if (GTK_IS_TEXT_VIEW (focused)) {
2413                         GtkTextBuffer *buffer = NULL;
2414                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2415                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
2416                 } else if (GTK_IS_EDITABLE (focused)) {
2417                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2418                 }
2419                 result = !has_selection;
2420         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2421                 if (focused) {
2422                         MODEST_DEBUG_BLOCK (g_message ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2423                         if (GTK_IS_LABEL (focused) && 
2424                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2425                                 result = TRUE;
2426                         } else if (GTK_IS_TEXT_VIEW (focused)) {
2427                                 GtkTextBuffer *buffer;
2428                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2429                                 result = !gtk_text_buffer_get_has_selection (buffer);
2430                         } else if (GTK_IS_HTML (focused)) {
2431                                 const gchar *sel;
2432                                 int len = -1;
2433                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2434                                 result = ((sel == NULL) || (sel[0] == '\0'));
2435                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2436                                 result = TRUE;
2437                         } else {
2438                                 GtkClipboard *clipboard;
2439                                 gchar *selection;
2440
2441                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2442                                 /* Get clipboard selection*/
2443                                 selection = gtk_clipboard_wait_for_text (clipboard);
2444                                 /* Check dimming */
2445                                 result = (selection == NULL);
2446                                 g_free (selection);
2447                         } 
2448                 } else {
2449                         result = TRUE;
2450                 }
2451                 
2452                 if (result)
2453                         modest_dimming_rule_set_notification (rule, "");
2454                 
2455         }               
2456         else if (MODEST_IS_MAIN_WINDOW (win)) {
2457                 /* Check dimming */
2458                 result = state->n_selected == 0;
2459                 if (result)
2460                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));                  
2461         }
2462         
2463         return result;
2464 }
2465
2466
2467 static gboolean
2468 _invalid_attach_selected (ModestWindow *win,
2469                           gboolean unique,
2470                           gboolean for_view,
2471                           gboolean for_remove,
2472                           ModestDimmingRule *rule) 
2473 {
2474         TnyList *attachments;
2475         gint n_selected;
2476         TnyHeaderFlags flags;
2477         gboolean nested_attachments = FALSE;
2478         gboolean selected_messages = FALSE;
2479         const DimmedState *state = NULL;
2480         gboolean result = FALSE;
2481
2482         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2483         state = modest_window_get_dimming_state (win);
2484
2485         if (MODEST_IS_MAIN_WINDOW (win)) {
2486                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2487                 if (!result)
2488                         result = !state->any_has_attachments;
2489         }
2490         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2491                 
2492                 /* Get selected atachments */
2493                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2494                 n_selected = tny_list_get_length (attachments);
2495
2496                 /* Check unique */              
2497                 if (!result) {
2498                         if (unique) 
2499                                 result = n_selected != 1;
2500                         else
2501                                 
2502                                 result = n_selected < 1;
2503                 }
2504                 
2505                 /* Check attached type (view operation not required) */
2506                 if (!result && !for_view)  {
2507                         TnyIterator *iter;
2508                         iter = tny_list_create_iterator (attachments);
2509                         while (!tny_iterator_is_done (iter) && !result) {
2510                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2511                                 TnyList *nested_list = tny_simple_list_new ();
2512
2513                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
2514                                         TnyMsg *window_msg;
2515                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2516                                         if ((TnyMimePart *) window_msg != mime_part) {
2517                                                 selected_messages = TRUE;
2518                                                 result = TRUE;
2519                                         }
2520                                         g_object_unref (window_msg);
2521                                 }
2522                                 tny_mime_part_get_parts (mime_part, nested_list);
2523                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2524                                         nested_attachments = TRUE;
2525                                         result = TRUE;
2526                                 }
2527                                 g_object_unref (nested_list);
2528                                 g_object_unref (mime_part);
2529                                 tny_iterator_next (iter);
2530                         }
2531                         g_object_unref (iter);
2532                 }
2533                 
2534                 /* Set notifications */
2535                 if (result && rule != NULL) {
2536                         if (selected_messages) {
2537                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2538                         } else if (nested_attachments) {
2539                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2540                         } else if (n_selected == 0) {
2541                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2542                         } else if (unique) {
2543                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2544                         }
2545                 }
2546                 
2547                 /* Free */
2548                 g_object_unref (attachments);
2549         }
2550
2551         return result;
2552 }
2553
2554 static gboolean
2555 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2556 {
2557         TnyList *attachments = NULL;
2558         TnyIterator *iter;
2559         gint purged = 0;
2560         gint n_attachments = 0;
2561         gboolean result = FALSE;
2562
2563         /* This should check if _all_ the attachments are already purged. If only some
2564          * of them are purged, then it does not cause dim as there's a confirmation dialog
2565          * for removing only local attachments */
2566
2567         /* Get selected atachments */
2568         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2569                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2570         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2571                 /* If we're in main window, we won't know if there are already purged attachments */
2572                 return FALSE;
2573         }
2574
2575         if (attachments == NULL)
2576                 return FALSE;
2577
2578         if (tny_list_get_length (attachments) == 0) {
2579                 g_object_unref (attachments);
2580                 return FALSE;
2581         }
2582
2583         iter = tny_list_create_iterator (attachments);
2584         while (!tny_iterator_is_done (iter)) {
2585                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2586                 if (tny_mime_part_is_purged (mime_part)) {
2587                         purged++;
2588                 }
2589                 n_attachments++;
2590                 g_object_unref (mime_part);
2591                 tny_iterator_next (iter);
2592         }
2593         g_object_unref (iter);
2594                 
2595         /* Free */
2596         g_object_unref (attachments);
2597
2598         if (all)
2599                 result = (purged == n_attachments);
2600         else
2601                 result = (purged > 0);
2602
2603         /* This string no longer exists, refer to NB#75415 for more info
2604         if (result && (rule != NULL))
2605                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2606         */
2607
2608         return result;
2609 }
2610
2611 static gboolean
2612 _invalid_msg_selected (ModestMainWindow *win,
2613                        gboolean unique,
2614                        ModestDimmingRule *rule) 
2615 {
2616         GtkWidget *folder_view = NULL;
2617         const DimmedState *state = NULL;
2618         gboolean result = FALSE;
2619
2620         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2621         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2622         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2623                 
2624         /* Get folder view to check focus */
2625         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2626                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2627
2628         /* Check dimmed rule (TODO: check focus on widgets */   
2629         if (!result) {
2630                 result = ((state->n_selected == 0 ) ||
2631                           (gtk_widget_is_focus (folder_view)));
2632                 if (result)
2633                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2634         }
2635         if (!result && unique) {
2636                 result = state->n_selected > 1;
2637                 if (result)
2638                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2639         }
2640
2641         return result;
2642 }
2643
2644
2645 static gboolean
2646 _msg_download_in_progress (ModestWindow *win)
2647 {
2648         gboolean result = FALSE;
2649
2650         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2651
2652         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2653                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2654         }
2655         else if (MODEST_IS_MAIN_WINDOW (win)) {
2656                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2657         }
2658
2659         return result;
2660 }
2661
2662 static gboolean
2663 _msg_download_completed (ModestMainWindow *win)
2664 {
2665         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2666         return state->any_marked_as_cached;
2667 }
2668
2669 static void 
2670 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2671 {
2672         GSList **send_queues = (GSList **) userdata;
2673         *send_queues = g_slist_prepend (*send_queues, value);
2674 }
2675
2676 static gboolean
2677 _selected_msg_sent_in_progress (ModestWindow *win)
2678 {
2679         const DimmedState *state = modest_window_get_dimming_state (win);
2680         return state->sent_in_progress;
2681 }
2682
2683
2684 static gboolean
2685 _invalid_folder_for_purge (ModestWindow *win, 
2686                            ModestDimmingRule *rule)
2687 {
2688         TnyFolder *folder = NULL;
2689         TnyAccount *account = NULL;
2690         gboolean result = FALSE;
2691
2692         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2693
2694                 /* Get folder and account of message */
2695                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2696                 g_return_val_if_fail(msg != NULL, TRUE);                        
2697                 folder = tny_msg_get_folder (msg);      
2698                 g_object_unref (msg);
2699                 if (folder == NULL) {
2700                         result = TRUE;
2701                         goto frees;
2702                 }
2703         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2704                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2705                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2706                 if (!folder_view)
2707                         return FALSE;
2708                 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2709                 /* Could be a folder store */
2710                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2711                         goto frees;             
2712         } else {
2713                 g_return_val_if_reached (FALSE);
2714         }
2715         account = modest_tny_folder_get_account (folder);
2716         if (account == NULL) goto frees;                        
2717                 
2718         /* Check account */
2719         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2720                 TnyFolderType types[2];
2721                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2722                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2723                 
2724                 if (_selected_folder_is_any_of_type (win, types, 2)) {
2725                         result = TRUE;
2726                 }
2727         } else {
2728                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
2729                 /* If it's a remote folder then dim */
2730                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
2731                                                                     protocol_type,
2732                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
2733                         result = TRUE;
2734                 }
2735         }
2736         
2737 frees:
2738         if (folder != NULL)
2739                 g_object_unref (folder);
2740         if (account != NULL)
2741                 g_object_unref (account);
2742         
2743         return result;
2744 }
2745
2746 static gboolean
2747 _transfer_mode_enabled (ModestWindow *win)
2748 {
2749         gboolean result = FALSE;
2750
2751         /* Check dimming */
2752         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2753                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2754         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2755                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2756 #ifdef MODEST_TOOLKIT_HILDON2
2757         } else if (MODEST_IS_HEADER_WINDOW (win)) {
2758                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
2759 #endif
2760         } else {
2761                 g_warning("_transfer_mode_enabled called with wrong window type");
2762         }
2763
2764         return result;
2765 }
2766
2767 static gboolean
2768 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2769 {
2770         GtkWidget *folder_view = NULL;
2771         TnyFolderStore *folder = NULL;
2772         ModestEmailClipboard *clipboard = NULL;
2773         const gchar *folder_name = NULL;
2774         gboolean result = FALSE;
2775
2776         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2777
2778         /*Get current parent folder */
2779         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2780                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2781         /* If no folder view, always dimmed */
2782         if (!folder_view) return FALSE;
2783         
2784         /* Get selected folder as parent of new folder to create */
2785         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));     
2786         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
2787         
2788         /* get modest clipboard and source folder */
2789         clipboard = modest_runtime_get_email_clipboard ();
2790         folder_name = modest_email_clipboard_get_folder_name (clipboard);
2791         if (folder_name == NULL) goto frees;
2792
2793         /* Check source subfolders names */
2794         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
2795                                                             TRUE);
2796                 
2797         /* Free */
2798  frees:
2799         if (folder != NULL) 
2800                 g_object_unref (folder);
2801
2802
2803         return result;
2804 }       
2805
2806 gboolean 
2807 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
2808                                            gpointer user_data)
2809 {
2810         ModestDimmingRule *rule = NULL;
2811
2812         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2813         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2814         rule = MODEST_DIMMING_RULE (user_data);
2815
2816         /* Check dimmed rule */ 
2817         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
2818 }
2819
2820 gboolean
2821 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
2822                                          gpointer user_data)
2823 {
2824         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2825
2826         ModestMsgEditFormat format =
2827           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
2828
2829         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
2830 }
2831
2832 static gboolean 
2833 _send_receive_in_progress (ModestWindow *win)
2834 {
2835         ModestMailOperationQueue *queue;
2836         GSList *op_list, *node;
2837         gboolean found_send_receive;
2838
2839         queue = modest_runtime_get_mail_operation_queue ();
2840         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
2841
2842         found_send_receive = FALSE;
2843         for (node = op_list; node != NULL; node = g_slist_next (node)) {
2844                 ModestMailOperation *op;
2845
2846                 op = (ModestMailOperation *) node->data;
2847                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
2848                         found_send_receive = TRUE;
2849                         break;
2850                 }
2851         }
2852
2853         g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
2854         g_slist_free (op_list);
2855
2856         return found_send_receive;
2857 }
2858
2859 static gboolean
2860 _msgs_send_in_progress (void)
2861 {
2862         ModestCacheMgr *cache_mgr;
2863         GHashTable *send_queue_cache;
2864         ModestTnySendQueue *send_queue;
2865         GSList *send_queues = NULL, *node = NULL;
2866         gboolean found = FALSE;
2867
2868         cache_mgr = modest_runtime_get_cache_mgr ();
2869         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
2870                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
2871         
2872         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
2873                 
2874         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
2875                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
2876                 
2877                 /* Check if msg uid is being processed inside send queue */
2878                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
2879                         found = TRUE;
2880                         break;
2881                 }
2882         }
2883
2884         g_slist_free (send_queues);
2885
2886         return found;
2887 }