Better attachments detection for text/calendar
[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-account-mgr-helpers.h"
38 #include "modest-dimming-rule.h"
39 #include "modest-debug.h"
40 #include "modest-tny-folder.h"
41 #include "modest-tny-account.h"
42 #include "modest-tny-msg.h"
43 #include "modest-tny-mime-part.h"
44 #include "modest-text-utils.h"
45 #include "widgets/modest-folder-view.h"
46 #include "modest-address-book.h"
47 #include <widgets/modest-attachments-view.h>
48 #include <modest-runtime.h>
49 #include <tny-simple-list.h>
50 #include <tny-merge-folder.h>
51 #include <widgets/modest-recpt-editor.h>
52 #include <gtkhtml/gtkhtml.h>
53 #include <modest-runtime.h>
54 #include <widgets/modest-header-window.h>
55 #include <widgets/modest-folder-window.h>
56
57
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 _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
63 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
64 static gboolean _msg_download_in_progress (ModestWindow *win);
65 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
66 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
67 static gboolean _transfer_mode_enabled (ModestWindow *win);
68 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
69 static gboolean _send_receive_in_progress (ModestWindow *win);
70 static gboolean _msgs_send_in_progress (void);
71 static gboolean _all_msgs_in_sending_status (ModestHeaderView *header_view) G_GNUC_UNUSED;
72 static gboolean _forbid_outgoing_xfers (ModestWindow *window);
73
74
75
76 static DimmedState *
77 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
78 {
79         DimmedState *state = NULL;
80         TnyHeader *header = NULL;
81         ModestCacheMgr *cache_mgr = NULL;
82         GHashTable *send_queue_cache = NULL;
83         ModestTnySendQueue *send_queue = NULL;
84         GSList *send_queues = NULL, *node = NULL;
85         gboolean found = FALSE;
86         gchar *msg_uid = NULL;
87         TnyHeaderFlags flags;
88         gboolean all_deleted = TRUE;
89         gboolean all_seen = TRUE;
90         gboolean all_cached = TRUE;
91         gboolean all_has_attach = TRUE;
92                         
93         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
94
95         /* Init state */
96         state = g_slice_new0 (DimmedState);
97         state->n_selected = 0;
98         state->already_opened_msg = 0;
99         state->any_marked_as_deleted = FALSE;
100         state->all_marked_as_deleted = FALSE;
101         state->any_marked_as_seen = FALSE;
102         state->all_marked_as_seen = FALSE;
103         state->any_marked_as_cached = FALSE;
104         state->all_marked_as_cached = FALSE;
105         state->any_has_attachments = FALSE;
106         state->all_has_attachments = FALSE;
107         state->sent_in_progress = FALSE;
108
109         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
110         if (header == NULL)
111                 return state;
112         g_return_val_if_fail (TNY_IS_HEADER(header), state);
113         flags = tny_header_get_flags (header);
114
115         /* Selected */
116         state->n_selected++;
117
118         /* Mark as deleted */           
119         all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
120         state->all_marked_as_deleted = all_deleted;
121         if (!state->any_marked_as_deleted)
122                 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
123         
124         /* Mark as seen */
125         all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
126         state->all_marked_as_seen = all_seen;
127         if (!state->any_marked_as_seen)
128                 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
129         
130         /* Mark as cached */
131         all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
132         state->all_marked_as_cached = all_cached;
133         if (!state->any_marked_as_cached)
134                 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
135         
136         /* Mark has_attachments */
137         all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
138         state->all_has_attachments = all_has_attach;
139         if (!state->any_has_attachments)
140                 state->any_has_attachments = (flags & TNY_HEADER_FLAG_ATTACHMENTS)?1:0;
141         
142         /* sent in progress */
143         msg_uid = modest_tny_send_queue_get_msg_id (header);
144         if (!state->sent_in_progress) {
145                 cache_mgr = modest_runtime_get_cache_mgr ();
146                 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
147                                                                MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
148                 
149                 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
150                 
151                 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
152                         send_queue = MODEST_TNY_SEND_QUEUE (node->data);
153                         
154                         /* Check if msg uid is being processed inside send queue */
155                         found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);          
156                 }
157                 state->sent_in_progress = found;
158         }
159         
160         /* Free */
161         g_free(msg_uid);
162         g_object_unref (header);
163         g_slist_free (send_queues);
164
165         return state;
166 }
167
168    
169 DimmedState *
170 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
171 {
172         DimmedState *state = NULL;
173
174         g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
175
176
177         if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
178                 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
179         }
180
181         return state;
182 }
183
184 gboolean
185 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
186 {
187         ModestDimmingRule *rule = NULL;
188         gboolean dimmed = FALSE;
189
190         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
191         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
192         rule = MODEST_DIMMING_RULE (user_data);
193
194         /* Check dimmed rule */
195         return dimmed;
196 }
197
198
199 gboolean 
200 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
201 {
202         ModestDimmingRule *rule = NULL;
203         gboolean dimmed = FALSE;
204
205         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
206         rule = MODEST_DIMMING_RULE (user_data);
207
208         if (MODEST_IS_FOLDER_WINDOW (win)) {
209                 dimmed = modest_ui_dimming_rules_on_folder_window_delete (win, user_data);
210         } else if (MODEST_IS_HEADER_WINDOW (win)) {
211
212                 if (!dimmed)
213                         dimmed = _transfer_mode_enabled (win);
214
215                 if (dimmed)
216                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
217
218                 if (!dimmed) {
219                         GtkWidget *header_view;
220                         TnyFolder *folder;
221
222                         header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
223                         folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
224                         if (folder) {
225                                 dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
226                                         modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
227
228                                 if (!dimmed &&
229                                     (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
230                                         dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
231                                 }
232                                 g_object_unref (folder);
233                         }
234                 }
235         }
236
237         return dimmed;
238 }
239
240
241 gboolean
242 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
243 {
244         gboolean dimmed = FALSE;
245
246         if (MODEST_IS_HEADER_WINDOW (win)) {
247                 return FALSE;
248         }
249
250         return dimmed;
251 }
252
253 gboolean
254 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
255 {
256         ModestDimmingRule *rule = NULL;
257         TnyFolderType types[4];
258         gboolean dimmed = FALSE;
259
260         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
261         rule = MODEST_DIMMING_RULE (user_data);
262
263         types[0] = TNY_FOLDER_TYPE_DRAFTS;
264         types[1] = TNY_FOLDER_TYPE_OUTBOX;
265         types[2] = TNY_FOLDER_TYPE_SENT;
266         types[3] = TNY_FOLDER_TYPE_ARCHIVE;
267
268         if (MODEST_IS_FOLDER_WINDOW (win)) {
269                 ModestFolderView *folder_view;
270                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
271                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
272                                                                        MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE);
273         }
274
275         if (!dimmed) {
276                 dimmed = _selected_folder_is_any_of_type (win, types, 4);
277                 if (dimmed)
278                         modest_dimming_rule_set_notification (rule, "");
279         }
280
281         return dimmed;
282 }
283
284
285 gboolean 
286 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
287 {
288         ModestDimmingRule *rule = NULL;
289         gboolean dimmed = FALSE;
290         TnyFolderType types[3];
291
292         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
293         rule = MODEST_DIMMING_RULE (user_data);
294
295         types[0] = TNY_FOLDER_TYPE_DRAFTS;
296         types[1] = TNY_FOLDER_TYPE_OUTBOX;
297         types[2] = TNY_FOLDER_TYPE_ROOT;
298
299         /* Check dimmed rule */
300         dimmed = _selected_folder_is_any_of_type (win, types, 3);
301         if (dimmed)
302                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
303
304
305         /* msg view window dimming rules */
306         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
307
308                 /* This could happen if we load the msg view window with a
309                    preview before loading the full message */
310                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
311                 if (!msg) {
312                         dimmed = TRUE;
313                 } else {
314                         g_object_unref (msg);
315                 }
316
317                 if (!dimmed) {
318                         dimmed = _transfer_mode_enabled (win);
319                         if (dimmed)
320                                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
321                 }
322                 if (!dimmed) {
323                         dimmed = _msg_download_in_progress (win);
324                         if (dimmed)
325                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
326                 }
327         }
328
329         return dimmed;
330 }
331
332
333 gboolean 
334 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
335 {
336         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
337
338         return TRUE;
339 }
340
341 static gboolean
342 _message_already_sent (ModestMsgViewWindow *view_window)
343 {
344         TnyHeader *header;
345         TnyFolder *folder;
346         gboolean already_sent = FALSE;
347
348         header = modest_msg_view_window_get_header (view_window);
349         if (header) {
350                 folder = tny_header_get_folder (header);
351                 if (folder) {
352                         if (modest_tny_folder_guess_folder_type (folder) ==
353                             TNY_FOLDER_TYPE_OUTBOX) {
354                                 ModestTnySendQueueStatus status = 
355                                         modest_tny_all_send_queues_get_msg_status (header);
356                                 if (status == MODEST_TNY_SEND_QUEUE_UNKNOWN ||
357                                     status == MODEST_TNY_SEND_QUEUE_SENDING)
358                                         already_sent = TRUE;
359                         }
360                         g_object_unref (folder);
361                 }
362                 g_object_unref (header);
363         }
364         return already_sent;
365 }
366
367
368 gboolean 
369 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
370 {
371         ModestDimmingRule *rule = NULL;
372         const DimmedState *state = NULL;
373         gboolean dimmed = FALSE;
374
375         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
376         rule = MODEST_DIMMING_RULE (user_data);
377         state = modest_window_get_dimming_state (win);
378
379         /* If we're in transfer mode then do not allow to delete messages */
380         dimmed = _transfer_mode_enabled (win);
381         if (dimmed) {
382                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
383                 return dimmed;
384         }
385
386         /* Check dimmed rule */ 
387         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
388                 /* This could happen if we load the msg view window with a
389                    preview before loading the full message */
390                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
391                 if (!msg) {
392                         dimmed = TRUE;
393                 } else {
394                         g_object_unref (msg);
395                 }
396
397                 if (!dimmed) {
398                         if (state)
399                                 dimmed = state->any_marked_as_deleted;
400                         if (dimmed) {
401                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
402                                 modest_dimming_rule_set_notification (rule, msg);
403                                 g_free (msg);
404                         }
405                 }
406                 if (!dimmed) {
407                         if (state)
408                                 dimmed = state->sent_in_progress;
409                         if (dimmed)
410                                 modest_dimming_rule_set_notification (rule, _CS_UNABLE_TO_DELETE);
411                 }
412
413                 /* This could happen if we're viewing a message of the
414                    outbox that has been already sent */
415                 if (!dimmed)
416                         dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
417
418                 /* The delete button should be dimmed when viewing an attachment,
419                  * but should be enabled when viewing a message from the list, 
420                  * or when viewing a search result.
421                  */
422                 if (!dimmed) {
423                         TnyMsg *top_msg = NULL;
424                         top_msg = modest_msg_view_window_get_top_message ((ModestMsgViewWindow *) win);
425                         if (top_msg != NULL) {
426                                 g_object_unref (top_msg);
427                                 dimmed = TRUE;
428                         }
429                         if (dimmed) {
430                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
431                         }
432                 }
433         }
434
435         return dimmed;
436 }
437
438 gboolean 
439 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
440 {
441         ModestDimmingRule *rule = NULL;
442         gboolean dimmed = FALSE;
443
444         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
445         rule = MODEST_DIMMING_RULE (user_data);
446
447         {
448                 /* Check dimmed rule */ 
449                 if (MODEST_IS_MSG_VIEW_WINDOW (win))
450                         dimmed = _msg_download_in_progress (win);
451                 if (dimmed)
452                         modest_dimming_rule_set_notification (rule, "");
453         }
454
455         return dimmed;
456 }
457
458 gboolean
459 modest_ui_dimming_rules_on_fetch_images (ModestWindow *win, gpointer user_data)
460 {
461         gboolean dimmed = FALSE;
462         ModestDimmingRule *rule = NULL;
463
464         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
465         rule = MODEST_DIMMING_RULE (user_data);
466
467         dimmed = !modest_msg_view_window_has_blocked_external_images (MODEST_MSG_VIEW_WINDOW (win));
468
469         if (!dimmed) {
470                 dimmed = _transfer_mode_enabled (win);
471                 if (dimmed)
472                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
473         }
474         if (!dimmed) {
475                 dimmed = _msg_download_in_progress (win);
476                 if (dimmed)
477                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
478         }
479
480         return dimmed;
481 }
482
483
484 gboolean 
485 modest_ui_dimming_rules_on_mark_as_read_msg_in_view (ModestWindow *win, gpointer user_data)
486 {
487         ModestDimmingRule *rule = NULL;
488         TnyHeader *header;
489         TnyHeaderFlags flags;
490         gboolean dimmed = FALSE;
491
492
493         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
494         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
495         rule = MODEST_DIMMING_RULE (user_data);
496
497         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
498         if (!header) {
499                 dimmed = TRUE;
500         }
501
502         /* If the viewer is showing a message sent as attachment */
503         if (!dimmed)
504                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
505
506         if (!dimmed) {
507                 flags = tny_header_get_flags (header);
508                 if (flags & TNY_HEADER_FLAG_SEEN)
509                         dimmed = TRUE;
510         }
511
512         if (header)
513                 g_object_unref (header);
514         return dimmed;
515 }
516
517
518 gboolean 
519 modest_ui_dimming_rules_on_mark_as_unread_msg_in_view (ModestWindow *win, gpointer user_data)
520 {
521         ModestDimmingRule *rule = NULL;
522         TnyHeader *header;
523         TnyHeaderFlags flags;
524         gboolean dimmed = FALSE;
525         
526
527         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
528         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
529         rule = MODEST_DIMMING_RULE (user_data);
530         
531         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
532         if (!header) {
533                 dimmed = TRUE;
534         }
535
536         /* If the viewer is showing a message sent as attachment */
537         if (!dimmed)
538                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
539
540         if (!dimmed) {
541                 flags = tny_header_get_flags (header);
542                 if (!(flags & TNY_HEADER_FLAG_SEEN))
543                         dimmed = TRUE;
544         }
545
546         if (header)
547                 g_object_unref (header);
548         return dimmed;
549 }
550
551 gboolean 
552 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
553 {
554         ModestDimmingRule *rule = NULL;
555         gboolean dimmed = FALSE;
556
557         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
558         rule = MODEST_DIMMING_RULE (user_data);
559
560         if (MODEST_IS_HEADER_WINDOW (win))
561                 dimmed = modest_ui_dimming_rules_on_header_window_move_to (win, user_data);
562         else if (MODEST_IS_FOLDER_WINDOW (win))
563                 dimmed = modest_ui_dimming_rules_on_folder_window_move_to (win, user_data);
564         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
565                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
566
567         return dimmed;
568 }
569
570
571 static gboolean
572 _forbid_outgoing_xfers (ModestWindow *window)
573 {
574         const gchar *account_name = NULL;
575         TnyAccount *account = NULL;
576         gboolean dimmed = FALSE;
577
578 #ifdef MODEST_TOOLKIT_HILDON2
579         /* We cannot just get the active account because the active
580            account of a header window that shows the headers of a
581            local account is the ID of the remote account */
582         if (MODEST_IS_HEADER_WINDOW (window)) {
583                 ModestHeaderView *header_view;
584                 TnyFolder *folder;
585
586                 header_view = modest_header_window_get_header_view ((ModestHeaderWindow *) window);
587                 folder = modest_header_view_get_folder (header_view);
588
589                 if (folder) {
590                         account = modest_tny_folder_get_account (folder);
591                         g_object_unref (folder);
592                 }
593         }
594 #endif
595
596         if (!account) {
597                 account_name = modest_window_get_active_account (window);
598                 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
599                                                                        account_name,
600                                                                        TNY_ACCOUNT_TYPE_STORE);
601         }
602
603         if (account) {
604                 ModestProtocolType protocol_type;
605
606                 protocol_type = modest_tny_account_get_protocol_type (account);
607                 dimmed  = modest_protocol_registry_protocol_type_has_tag
608                         (modest_runtime_get_protocol_registry (),
609                          protocol_type,
610                          MODEST_PROTOCOL_REGISTRY_STORE_FORBID_OUTGOING_XFERS);
611
612                 g_object_unref (account);
613         }
614         return dimmed;
615 }
616
617 gboolean
618 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
619 {
620         ModestDimmingRule *rule = NULL;
621         gboolean dimmed = FALSE;
622
623         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
624         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
625         rule = MODEST_DIMMING_RULE (user_data);
626
627         /* This could happen if we load the msg view window with a
628            preview before loading the full message */
629         TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
630         if (!msg) {
631                 return TRUE;
632         } else {
633                 g_object_unref (msg);
634         }
635
636         /* Check dimmed rule */
637         dimmed = _transfer_mode_enabled (win);
638         if (dimmed)
639                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
640
641         if (!dimmed)
642                 dimmed = _forbid_outgoing_xfers (win);
643
644         if (!dimmed) {
645                 const DimmedState *state = modest_window_get_dimming_state (win);
646                 if (state) {
647                         dimmed = state->any_marked_as_deleted;
648                         if (dimmed) {
649                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
650                                 modest_dimming_rule_set_notification (rule, msg);
651                                 g_free (msg);
652                         }
653                 }
654         }
655
656         if (!dimmed) {
657                 dimmed = _selected_msg_sent_in_progress (win);
658                 if (dimmed)
659                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
660         }
661
662         /* This could happen if we're viewing a message of the outbox
663            that has been already sent */
664         if (!dimmed)
665                 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
666
667         if (!dimmed) {
668                 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
669                         /* The move_to button should be dimmed when viewing an attachment,
670                          * but should be enabled when viewing a message from the list, 
671                          * or when viewing a search result.
672                          */
673                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
674                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
675                         }
676                 }
677                 if (dimmed) 
678                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
679         }
680
681         return dimmed;
682 }
683
684 gboolean 
685 modest_ui_dimming_rules_on_find_in_msg (ModestWindow *win, gpointer user_data)
686 {
687         ModestDimmingRule *rule = NULL;
688         gboolean dimmed = FALSE;
689
690         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
691         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
692         rule = MODEST_DIMMING_RULE (user_data);
693
694         /* This could happen if we load the msg view window with a
695            preview before loading the full message */
696         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
697                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
698                 if (!msg) {
699                         return TRUE;
700                 } else {
701                         g_object_unref (msg);
702                 }
703         }
704
705         /* Check dimmed rule */ 
706         dimmed = _transfer_mode_enabled (win);
707         if (dimmed)
708                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
709
710         return dimmed;
711 }
712
713
714 gboolean 
715 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
716 {
717         ModestDimmingRule *rule = NULL;
718         gboolean dimmed = FALSE;
719         GtkWidget *focused = NULL;
720
721         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
722         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
723         rule = MODEST_DIMMING_RULE (user_data);
724
725         focused = gtk_container_get_focus_child ((GtkContainer *) win);
726
727         if (!dimmed && GTK_IS_ENTRY (focused)) {
728                 const gchar *current_text;
729                 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
730                 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
731         }
732
733         if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
734                 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
735                 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
736         }
737
738         if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
739                 dimmed = FALSE;
740         return dimmed;
741 }
742
743 gboolean 
744 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
745 {
746         ModestDimmingRule *rule = NULL;
747         gboolean dimmed = FALSE;
748
749         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
750         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
751         rule = MODEST_DIMMING_RULE (user_data);
752
753         /* Check dimmed rule */ 
754         dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);                       
755
756         if (!dimmed) {
757                 dimmed = _purged_attach_selected (win, FALSE, NULL);
758                 if (dimmed) {
759                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
760                 }
761         }
762                 
763         return dimmed;
764 }
765
766 static gboolean
767 _not_valid_attachments (ModestWindow *win, gboolean save_not_remove)
768 {
769         gint n_attachments;
770         TnyList *attachments;
771         gboolean result = FALSE;
772
773         /* Get atachments */
774         attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
775         n_attachments = tny_list_get_length (attachments);
776
777         /* Check unique */              
778         if (!result) {
779                 result = n_attachments < 1;
780         }
781                 
782         /* Check attached type (view operation not required) */
783         if (!result)  {
784                 gint n_valid = 0;
785
786                 TnyIterator *iter;
787                 iter = tny_list_create_iterator (attachments);
788                 while (!tny_iterator_is_done (iter)) {
789                         gboolean is_valid = TRUE;
790                         TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
791                         TnyList *nested_list = tny_simple_list_new ();
792                         tny_mime_part_get_parts (mime_part, nested_list);
793
794                         if (tny_mime_part_is_purged (mime_part)) {
795                                 is_valid = FALSE;
796                         }
797                         
798                         if (is_valid && modest_tny_mime_part_is_msg (mime_part)) {
799                                 TnyMsg *window_msg;
800                                 window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
801                                 if (window_msg) {
802                                         if (save_not_remove && (TnyMimePart *) window_msg != mime_part) {
803                                                 is_valid = FALSE;
804                                         }
805                                         g_object_unref (window_msg);
806                                 }
807                                 if (is_valid && save_not_remove && tny_list_get_length (nested_list) > 0) {
808                                         is_valid = FALSE;
809                                 }
810                         }
811                         g_object_unref (nested_list);
812                         g_object_unref (mime_part);
813                         tny_iterator_next (iter);
814
815                         if (is_valid) 
816                                 n_valid++;
817                 }
818                 g_object_unref (iter);
819                 result = (n_valid == 0);
820         }
821         g_object_unref (attachments);
822         return result;
823
824 }
825
826 gboolean 
827 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
828 {
829         ModestDimmingRule *rule = NULL;
830         gboolean dimmed = FALSE;
831
832         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
833         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
834         rule = MODEST_DIMMING_RULE (user_data);
835
836         /* Check dimmed rule */ 
837
838         dimmed = _not_valid_attachments (win, TRUE);
839         return dimmed;
840 }
841
842 gboolean 
843 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
844 {
845         ModestDimmingRule *rule = NULL;
846         const DimmedState *state = NULL;
847         gboolean dimmed = FALSE;
848
849         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
850         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
851         rule = MODEST_DIMMING_RULE (user_data);
852         state = modest_window_get_dimming_state (win);
853
854
855         /* Check in view window if there's any attachment selected */
856         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
857                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
858                 if (dimmed)
859                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
860         }
861
862         if (!dimmed) {
863
864                 dimmed = _selected_msg_sent_in_progress (win);
865                 if (dimmed) {
866                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
867                 }
868         }
869
870         /* cannot purge in editable drafts nor pop folders */
871         if (!dimmed) {
872                 dimmed = _invalid_folder_for_purge (win, rule);
873                 if (dimmed)
874                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
875         }
876
877         /* Check if all attachments are already purged */
878         if (!dimmed) {
879                 dimmed = _purged_attach_selected (win, TRUE, rule);
880         }
881
882         return dimmed;
883 }
884
885 gboolean
886 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
887 {
888         ModestDimmingRule *rule = NULL;
889         gboolean dimmed = FALSE;
890
891         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
892         rule = MODEST_DIMMING_RULE (user_data);
893
894         /* Check dimmed rule */
895         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
896                 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
897         }
898
899         return dimmed;
900 }
901
902 gboolean
903 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
904 {
905         ModestDimmingRule *rule = NULL;
906         gboolean dimmed = FALSE;
907
908         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
909         rule = MODEST_DIMMING_RULE (user_data);
910
911         /* Check dimmed rule */
912         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
913                 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
914         }
915
916         return dimmed;
917 }
918
919 gboolean
920 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
921 {
922         ModestDimmingRule *rule = NULL;
923         const DimmedState *state = NULL;
924         gboolean dimmed = FALSE;
925
926         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
927         rule = MODEST_DIMMING_RULE (user_data);
928         state = modest_window_get_dimming_state (win);
929
930         /* Check common dimming rules */
931         dimmed = _invalid_clipboard_selected (win, rule);
932
933         return dimmed;
934 }
935
936 gboolean 
937 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
938 {
939         ModestDimmingRule *rule = NULL;
940         const DimmedState *state = NULL;
941         gboolean dimmed = FALSE;
942
943         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
944         rule = MODEST_DIMMING_RULE (user_data);
945         state = modest_window_get_dimming_state (win);
946
947         /* Check common dimming rules */
948         dimmed = _invalid_clipboard_selected (win, rule);
949
950         return dimmed;
951 }
952
953 gboolean
954 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
955 {
956         ModestDimmingRule *rule = NULL;
957         gboolean dimmed = FALSE;
958         
959         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
960         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
961         rule = MODEST_DIMMING_RULE (user_data);
962
963         /* Check common dimming rules */
964         ModestMsgEditFormat format;
965         format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
966
967         dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
968         if (dimmed)
969                 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
970
971         if (!dimmed) {
972                 GtkWidget *body;
973                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
974                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
975                 
976                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
977                 if (dimmed)
978                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
979         }
980                
981         
982         return dimmed;
983 }
984
985 gboolean 
986 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
987 {
988         ModestDimmingRule *rule = NULL;
989         gboolean dimmed = FALSE;
990         
991         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
992         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
993         rule = MODEST_DIMMING_RULE (user_data);
994
995         GtkWidget *body;
996         body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
997                                                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
998         
999         dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1000         if (dimmed)
1001                 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1002         
1003         return dimmed;
1004 }
1005
1006 gboolean 
1007 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1008 {
1009         ModestDimmingRule *rule = NULL;
1010         gboolean dimmed = FALSE;
1011         GtkWidget *focused = NULL;
1012         
1013         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1014         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1015         rule = MODEST_DIMMING_RULE (user_data);
1016
1017         focused = gtk_container_get_focus_child ((GtkContainer *) win);
1018
1019         dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1020         
1021         if (!dimmed) {
1022                 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1023         }
1024
1025         if (!dimmed) {
1026                 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1027                 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1028
1029                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1030                   ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1031         }
1032         
1033         return dimmed;
1034 }
1035
1036 gboolean 
1037 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1038 {
1039         ModestDimmingRule *rule = NULL;
1040         gboolean dimmed = FALSE;
1041         TnyList *selected_attachments = NULL;
1042         gint n_att_selected = 0;
1043         GtkWidget *attachments_view;
1044         
1045         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1046         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1047         rule = MODEST_DIMMING_RULE (user_data);
1048
1049         attachments_view = modest_msg_edit_window_get_child_widget (
1050                                                                     MODEST_MSG_EDIT_WINDOW (win),
1051                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1052         
1053         selected_attachments = modest_attachments_view_get_attachments (
1054                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1055         n_att_selected = tny_list_get_length (selected_attachments);
1056         g_object_unref (selected_attachments);
1057         
1058         dimmed = (n_att_selected < 1);  
1059         
1060         return dimmed;
1061 }
1062
1063 gboolean
1064 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1065 {
1066         ModestDimmingRule *rule = NULL;
1067         gboolean dimmed = FALSE;
1068         GtkWidget *body_field;
1069
1070         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1071         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1072         rule = MODEST_DIMMING_RULE (user_data);
1073
1074         body_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1075                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1076
1077         if (!dimmed) {
1078                 GtkWidget *to_field, *cc_field, *bcc_field;
1079                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1080                 cc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1081                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1082                 to_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1083                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1084                 bcc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1085                                                                      MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1086                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1087                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1088                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1089
1090                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1091                            gtk_text_buffer_get_char_count (cc_buffer) +
1092                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1093
1094                 if (!dimmed) {
1095                         if (modest_text_utils_no_recipient (to_buffer) &&
1096                             modest_text_utils_no_recipient (cc_buffer) &&
1097                             modest_text_utils_no_recipient (bcc_buffer))
1098                                 dimmed = TRUE;
1099                 }
1100
1101                 if (dimmed)
1102                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1103         }
1104         
1105         return dimmed;
1106 }
1107
1108 gboolean 
1109 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1110 {
1111         ModestDimmingRule *rule = NULL;
1112         gboolean dimmed = FALSE;
1113         
1114         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1115         rule = MODEST_DIMMING_RULE (user_data);
1116
1117         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1118
1119         /* Check dimmed rule */
1120         dimmed = _transfer_mode_enabled (win);
1121         if (dimmed)
1122                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1123         
1124         if (!dimmed) {
1125                 dimmed = modest_msg_view_window_first_message_selected (
1126                                 MODEST_MSG_VIEW_WINDOW(win));
1127                 modest_dimming_rule_set_notification (rule, NULL);
1128         }
1129
1130         return dimmed;
1131 }
1132
1133 gboolean 
1134 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1135 {
1136         ModestDimmingRule *rule = NULL;
1137         gboolean dimmed = FALSE;
1138
1139         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1140         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1141         rule = MODEST_DIMMING_RULE (user_data);
1142
1143         /* Check dimmed rule */ 
1144         dimmed = _transfer_mode_enabled (win);                  
1145         if (dimmed)
1146                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1147         
1148         if (!dimmed) {
1149                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1150                 modest_dimming_rule_set_notification (rule, NULL);
1151         }
1152
1153         return dimmed;
1154 }
1155
1156
1157 gboolean
1158 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1159 {
1160         gboolean dimmed;
1161         ModestAccountMgr *mgr;
1162
1163         mgr = modest_runtime_get_account_mgr();
1164         dimmed = !modest_account_mgr_has_accounts(mgr, TRUE);
1165
1166         /* Dimm it if we only have metaaccounts */
1167         if (!dimmed) {
1168                 ModestProtocolRegistry *reg = modest_runtime_get_protocol_registry ();
1169                 GSList *account_names = modest_account_mgr_account_names (mgr, TRUE);
1170
1171                 if (account_names) {
1172                         ModestProtocolType store_protocol;
1173                         gboolean found = FALSE;
1174                         GSList *iter = account_names;
1175                         const gchar *tag = MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS;
1176
1177                         while (iter && !found) {
1178                                 gchar* account_name;
1179
1180                                 account_name = (gchar *) iter->data;
1181                                 store_protocol = modest_account_mgr_get_store_protocol (mgr, account_name);
1182
1183                                 if (!modest_protocol_registry_protocol_type_has_tag (reg, store_protocol, tag))
1184                                         found = TRUE;
1185                                 else
1186                                         iter = g_slist_next (iter);
1187                         }
1188                         modest_account_mgr_free_account_names (account_names);
1189                         dimmed = !found;
1190                 }
1191         }
1192
1193         return dimmed;
1194 }
1195
1196 gboolean
1197 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
1198 {
1199         /* We dim if no msg send is in progress (and then cancelling send all has no
1200          * effect */
1201         return !_msgs_send_in_progress ();
1202 }
1203
1204 gboolean 
1205 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1206 {
1207         ModestDimmingRule *rule = NULL;
1208         gboolean dimmed = FALSE;
1209         ModestAccountMgr *mgr;
1210         const gchar* account_name;
1211
1212         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1213         rule = MODEST_DIMMING_RULE (user_data);
1214         mgr = modest_runtime_get_account_mgr();
1215
1216         /* Check dimmed rule */
1217         account_name = modest_window_get_active_account (win);
1218
1219         if (account_name)
1220                 dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
1221         else
1222                 dimmed = TRUE;
1223
1224         if (dimmed)
1225                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1226
1227         return dimmed;
1228 }
1229
1230 gboolean 
1231 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1232 {
1233         ModestDimmingRule *rule = NULL;
1234         gboolean dimmed = FALSE;
1235
1236         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1237         rule = MODEST_DIMMING_RULE (user_data);
1238  
1239         /* Check dimmed rule */ 
1240         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1241         if (g_slist_length (account_names) < 1)
1242                 dimmed = TRUE;
1243         if (dimmed)
1244                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1245
1246         modest_account_mgr_free_account_names (account_names);
1247
1248         if (!dimmed) {
1249                 dimmed = _send_receive_in_progress (win);
1250         }
1251
1252         return dimmed;
1253 }
1254
1255 gboolean
1256 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1257 {
1258         GSList *recipients = NULL;
1259         gboolean has_recipients_to_add;
1260
1261         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1262
1263         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1264                 TnyMsg *msg;
1265
1266                 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1267
1268                 /* Message is loaded asynchronously, so this could happen */
1269                 if (!msg) {
1270                         TnyHeader *header;
1271
1272                         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
1273                         if (!header)
1274                                 return TRUE;
1275
1276                         recipients = modest_tny_msg_header_get_all_recipients_list (header);
1277                         g_object_unref (header);
1278                 } else {
1279                         recipients = modest_tny_msg_get_all_recipients_list (msg);
1280                         g_object_unref (msg);
1281                 }
1282         } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1283                 /* Check if there are pending addresses to add */
1284                 return !modest_msg_edit_window_has_pending_addresses ((ModestMsgEditWindow *) win);
1285         }
1286
1287         has_recipients_to_add = FALSE;
1288
1289         if (recipients) {
1290                 GSList *node;
1291                 for (node = recipients; node != NULL; node = g_slist_next (node)) {
1292                         const gchar *recipient = (const gchar *) node->data;
1293                         if (modest_text_utils_validate_recipient (recipient, NULL)) {
1294                                 if (!modest_address_book_has_address (recipient)) {
1295                                         has_recipients_to_add = TRUE;
1296                                         break;
1297                                 }
1298                         }
1299                 }
1300                 g_slist_foreach (recipients, (GFunc) g_free, NULL);
1301                 g_slist_free (recipients);
1302         }
1303
1304         return !has_recipients_to_add;
1305 }
1306
1307 /* *********************** static utility functions ******************** */
1308
1309 static gboolean
1310 _selected_folder_is_any_of_type (ModestWindow *win,
1311                                  TnyFolderType types[], 
1312                                  guint ntypes)
1313 {
1314         TnyFolderStore *folder = NULL;
1315         TnyFolderType folder_type;
1316         guint i=0;
1317         gboolean result = FALSE;
1318
1319         /*Get current folder */
1320         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1321                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1322                 for (i=0; i < ntypes; i++) {
1323                         result = result || folder_type == types[i];
1324                 }
1325         }
1326
1327         /* free */
1328         if (folder)
1329                 g_object_unref (folder);
1330
1331         return result;
1332 }
1333
1334 static gboolean
1335 _invalid_clipboard_selected (ModestWindow *win,
1336                              ModestDimmingRule *rule) 
1337 {
1338         gboolean result = FALSE;
1339         GtkWidget *focused = NULL;
1340
1341         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1342
1343         /* Get focuesed widget */
1344         focused = gtk_container_get_focus_child ((GtkContainer *) win);
1345
1346         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1347                 gboolean has_selection = FALSE;
1348                 if (GTK_IS_TEXT_VIEW (focused)) {
1349                         GtkTextBuffer *buffer = NULL;
1350                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1351                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
1352                 } else if (GTK_IS_EDITABLE (focused)) {
1353                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
1354                 }
1355                 result = !has_selection;
1356         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1357                 if (focused) {
1358                         MODEST_DEBUG_BLOCK (g_debug ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
1359                         if (GTK_IS_LABEL (focused) && 
1360                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
1361                                 result = TRUE;
1362                         } else if (GTK_IS_TEXT_VIEW (focused)) {
1363                                 GtkTextBuffer *buffer;
1364                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1365                                 result = !gtk_text_buffer_get_has_selection (buffer);
1366                         } else if (GTK_IS_HTML (focused)) {
1367                                 const gchar *sel;
1368                                 int len = -1;
1369                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1370                                 result = ((sel == NULL) || (sel[0] == '\0'));
1371                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
1372                                 result = TRUE;
1373                         } else {
1374                                 GtkClipboard *clipboard;
1375                                 gchar *selection;
1376
1377                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1378                                 /* Get clipboard selection*/
1379                                 selection = gtk_clipboard_wait_for_text (clipboard);
1380                                 /* Check dimming */
1381                                 result = (selection == NULL);
1382                                 g_free (selection);
1383                         }
1384                 } else {
1385                         result = TRUE;
1386                 }
1387                 if (result)
1388                         modest_dimming_rule_set_notification (rule, "");
1389         }
1390
1391         return result;
1392 }
1393
1394
1395 static gboolean
1396 _invalid_attach_selected (ModestWindow *win,
1397                           gboolean unique,
1398                           gboolean for_view,
1399                           gboolean for_remove,
1400                           ModestDimmingRule *rule) 
1401 {
1402         TnyList *attachments;
1403         gint n_selected;
1404         gboolean nested_attachments = FALSE;
1405         gboolean selected_messages = FALSE;
1406         gboolean result = FALSE;
1407
1408         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1409
1410         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1411
1412                 /* Get selected atachments */
1413                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1414                 n_selected = tny_list_get_length (attachments);
1415
1416                 /* Check unique */
1417                 if (!result) {
1418                         if (unique)
1419                                 result = n_selected != 1;
1420                         else
1421
1422                                 result = n_selected < 1;
1423                 }
1424
1425                 /* Check attached type (view operation not required) */
1426                 if (!result && !for_view)  {
1427                         TnyIterator *iter;
1428                         iter = tny_list_create_iterator (attachments);
1429                         while (!tny_iterator_is_done (iter) && !result) {
1430                                 gboolean not_selectable = FALSE;
1431                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1432                                 TnyList *nested_list = tny_simple_list_new ();
1433                                 tny_mime_part_get_parts (mime_part, nested_list);
1434
1435                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
1436                                         TnyMsg *window_msg;
1437                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1438                                         if ((TnyMimePart *) window_msg != mime_part) {
1439                                                 selected_messages = TRUE;
1440                                                 not_selectable = TRUE;
1441                                         }
1442                                         g_object_unref (window_msg);
1443                                 }
1444                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1445                                         nested_attachments = TRUE;
1446                                         not_selectable = TRUE;
1447                                 }
1448                                 if (not_selectable)
1449                                         n_selected --;
1450                                 g_object_unref (nested_list);
1451                                 g_object_unref (mime_part);
1452                                 tny_iterator_next (iter);
1453                         }
1454                         g_object_unref (iter);
1455                 }
1456
1457                 /* No valid attachment available */
1458                 if (n_selected == 0)
1459                         result = TRUE;
1460
1461                 /* Set notifications */
1462                 if (result && rule != NULL) {
1463                         if (selected_messages) {
1464                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1465                         } else if (nested_attachments) {
1466                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1467                         } else if (n_selected == 0) {
1468                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1469                         } else if (unique) {
1470                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1471                         }
1472                 }
1473
1474                 /* Free */
1475                 g_object_unref (attachments);
1476         }
1477
1478         return result;
1479 }
1480
1481 static gboolean
1482 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
1483 {
1484         TnyList *attachments = NULL;
1485         TnyIterator *iter;
1486         gint purged = 0;
1487         gint n_attachments = 0;
1488         gboolean result = FALSE;
1489
1490         /* This should check if _all_ the attachments are already purged. If only some
1491          * of them are purged, then it does not cause dim as there's a confirmation dialog
1492          * for removing only local attachments */
1493
1494         /* Get selected atachments */
1495         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1496                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1497         }
1498
1499         if (attachments == NULL)
1500                 return FALSE;
1501
1502         if (tny_list_get_length (attachments) == 0) {
1503                 g_object_unref (attachments);
1504                 return FALSE;
1505         }
1506
1507         iter = tny_list_create_iterator (attachments);
1508         while (!tny_iterator_is_done (iter)) {
1509                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1510                 if (tny_mime_part_is_purged (mime_part)) {
1511                         purged++;
1512                 }
1513                 n_attachments++;
1514                 g_object_unref (mime_part);
1515                 tny_iterator_next (iter);
1516         }
1517         g_object_unref (iter);
1518
1519         /* Free */
1520         g_object_unref (attachments);
1521
1522         if (all)
1523                 result = (purged == n_attachments);
1524         else
1525                 result = (purged > 0);
1526
1527         /* This string no longer exists, refer to NB#75415 for more info
1528         if (result && (rule != NULL))
1529                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1530         */
1531
1532         return result;
1533 }
1534
1535 static gboolean
1536 _msg_download_in_progress (ModestWindow *win)
1537 {
1538         gboolean result = FALSE;
1539
1540         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
1541
1542         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1543                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
1544         }
1545
1546         return result;
1547 }
1548
1549 static void
1550 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
1551 {
1552         GSList **send_queues = (GSList **) userdata;
1553         *send_queues = g_slist_prepend (*send_queues, value);
1554 }
1555
1556 static gboolean
1557 _selected_msg_sent_in_progress (ModestWindow *win)
1558 {
1559         const DimmedState *state = modest_window_get_dimming_state (win);
1560         return (state) ? state->sent_in_progress : TRUE;
1561 }
1562
1563
1564 static gboolean
1565 _invalid_folder_for_purge (ModestWindow *win, 
1566                            ModestDimmingRule *rule)
1567 {
1568         TnyFolder *folder = NULL;
1569         TnyAccount *account = NULL;
1570         gboolean result = FALSE;
1571
1572         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1573
1574                 /* Get folder and account of message */
1575                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1576                 g_return_val_if_fail(msg != NULL, TRUE);
1577                 folder = tny_msg_get_folder (msg);
1578                 g_object_unref (msg);
1579                 if (folder == NULL) {
1580                         result = TRUE;
1581                         goto frees;
1582                 }
1583         } else {
1584                 g_return_val_if_reached (FALSE);
1585         }
1586         account = modest_tny_folder_get_account (folder);
1587         if (account == NULL) goto frees;
1588
1589         /* Check account */
1590         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
1591                 TnyFolderType types[2];
1592                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1593                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1594
1595                 if (_selected_folder_is_any_of_type (win, types, 2)) {
1596                         result = TRUE;
1597                 }
1598         } else {
1599                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
1600                 /* If it's a remote folder then dim */
1601                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
1602                                                                     protocol_type,
1603                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
1604                         result = TRUE;
1605                 }
1606         }
1607         
1608 frees:
1609         if (folder != NULL)
1610                 g_object_unref (folder);
1611         if (account != NULL)
1612                 g_object_unref (account);
1613         
1614         return result;
1615 }
1616
1617 static gboolean
1618 _transfer_mode_enabled (ModestWindow *win)
1619 {
1620         gboolean result = FALSE;
1621
1622         /* Check dimming */
1623         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1624                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
1625         } else if (MODEST_IS_FOLDER_WINDOW (win)) {
1626                 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
1627         } else if (MODEST_IS_HEADER_WINDOW (win)) {
1628                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
1629         } else {
1630                 g_warning("_transfer_mode_enabled called with wrong window type");
1631         }
1632
1633         return result;
1634 }
1635
1636 static gboolean
1637 _all_msgs_in_sending_status (ModestHeaderView *header_view)
1638 {
1639         GtkTreeModel *model;
1640         GtkTreeIter iter;
1641         gboolean all_sending = TRUE;
1642
1643         model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
1644         if (gtk_tree_model_get_iter_first (model, &iter)) {
1645                 do {
1646                         TnyHeader *header;
1647
1648                         gtk_tree_model_get (model, &iter,
1649                                             TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1650                                             &header,
1651                                             -1);
1652
1653                         if (header) {
1654                                 if (modest_tny_all_send_queues_get_msg_status (header) !=
1655                                     MODEST_TNY_SEND_QUEUE_SENDING)
1656                                         all_sending = FALSE;
1657                                 g_object_unref (header);
1658                         }
1659
1660                 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
1661         }
1662         return all_sending;
1663 }
1664
1665 gboolean 
1666 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
1667                                            gpointer user_data)
1668 {
1669         ModestDimmingRule *rule = NULL;
1670
1671         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1672         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1673         rule = MODEST_DIMMING_RULE (user_data);
1674
1675         /* Check dimmed rule */ 
1676         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
1677 }
1678
1679 gboolean
1680 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
1681                                          gpointer user_data)
1682 {
1683         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1684
1685         ModestMsgEditFormat format =
1686           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1687
1688         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
1689 }
1690
1691 static gboolean 
1692 _send_receive_in_progress (ModestWindow *win)
1693 {
1694         ModestMailOperationQueue *queue;
1695         GSList *op_list, *node;
1696         gboolean found_send_receive;
1697
1698         queue = modest_runtime_get_mail_operation_queue ();
1699         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
1700
1701         found_send_receive = FALSE;
1702         for (node = op_list; node != NULL; node = g_slist_next (node)) {
1703                 ModestMailOperation *op;
1704
1705                 op = (ModestMailOperation *) node->data;
1706                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
1707                         found_send_receive = TRUE;
1708                         break;
1709                 }
1710         }
1711
1712         if (op_list) {
1713                 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
1714                 g_slist_free (op_list);
1715         }
1716
1717         return found_send_receive;
1718 }
1719
1720 static gboolean
1721 _msgs_send_in_progress (void)
1722 {
1723         ModestCacheMgr *cache_mgr;
1724         GHashTable *send_queue_cache;
1725         ModestTnySendQueue *send_queue;
1726         GSList *send_queues = NULL, *node = NULL;
1727         gboolean found = FALSE;
1728
1729         cache_mgr = modest_runtime_get_cache_mgr ();
1730         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
1731                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
1732
1733         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
1734
1735         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
1736                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
1737
1738                 /* Check if msg uid is being processed inside send queue */
1739                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
1740                         found = TRUE;
1741                         break;
1742                 }
1743         }
1744
1745         g_slist_free (send_queues);
1746
1747         return found;
1748 }
1749
1750 gboolean 
1751 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
1752 {
1753         ModestDimmingRule *rule = NULL;
1754         gboolean dimmed = FALSE;
1755
1756         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
1757         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1758         rule = MODEST_DIMMING_RULE (user_data);
1759
1760         /* Check dimmed rule */ 
1761         dimmed = _transfer_mode_enabled (win);
1762         if (dimmed)
1763                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1764
1765         if (!dimmed)
1766                 dimmed = _forbid_outgoing_xfers (win);
1767
1768         if (!dimmed) {
1769                 GtkWidget *header_view;
1770                 TnyFolder *folder;
1771
1772                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
1773                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
1774                 if (folder) {
1775                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
1776                                 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
1777
1778                         if (!dimmed &&
1779                             (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
1780                                 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
1781                         }
1782                         g_object_unref (folder);
1783                 }
1784         }
1785
1786         return dimmed;
1787 }
1788
1789 gboolean 
1790 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
1791 {
1792         ModestDimmingRule *rule = NULL;
1793         gboolean dimmed = FALSE;
1794
1795         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
1796         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1797         rule = MODEST_DIMMING_RULE (user_data);
1798
1799         /* Check dimmed rule */ 
1800         dimmed = _transfer_mode_enabled (win);
1801         if (dimmed)
1802                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1803
1804         if (!dimmed)
1805                 dimmed = _forbid_outgoing_xfers (win);
1806
1807         if (!dimmed && MODEST_IS_FOLDER_WINDOW (win)) {
1808                 ModestFolderView *folder_view;
1809                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1810                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1811                                                                        MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
1812         }
1813
1814         if (!dimmed) {
1815                 dimmed = _transfer_mode_enabled (win);
1816                 if (dimmed)
1817                         modest_dimming_rule_set_notification (rule, "");
1818         }
1819
1820         return dimmed;
1821 }
1822
1823 gboolean
1824 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
1825 {
1826         ModestDimmingRule *rule = NULL;
1827         gboolean dimmed = FALSE;
1828
1829         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
1830         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1831         rule = MODEST_DIMMING_RULE (user_data);
1832
1833         /* Check dimmed rule */
1834         dimmed = _transfer_mode_enabled (win);
1835         if (dimmed)
1836                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1837
1838         if (MODEST_IS_FOLDER_WINDOW (win)) {
1839                 ModestFolderView *folder_view;
1840                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1841                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1842                                                                        MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
1843         }
1844
1845         if (!dimmed) {
1846                 dimmed = _transfer_mode_enabled (win);
1847                 if (dimmed)
1848                         modest_dimming_rule_set_notification (rule, "");
1849         }
1850
1851         return dimmed;
1852 }
1853
1854 gboolean
1855 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
1856 {
1857         return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);
1858 }