Fixed dimming rules for moving/deleting messages
[modest] / src / modest-ui-dimming-rules.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29  
30 #ifdef HAVE_CONFIG_H
31 #include <config.h>
32 #endif /*HAVE_CONFIG_H*/
33
34 #include <string.h>
35 #include "modest-ui-dimming-rules.h"
36 #include "modest-ui-actions.h"
37 #include "modest-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                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
424                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
425                                 if (dimmed) {
426                                         modest_dimming_rule_set_notification (rule, _CS_UNABLE_TO_DELETE);
427                                 }
428                         }
429                 }
430         }
431
432         return dimmed;
433 }
434
435 gboolean 
436 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
437 {
438         ModestDimmingRule *rule = NULL;
439         gboolean dimmed = FALSE;
440
441         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
442         rule = MODEST_DIMMING_RULE (user_data);
443
444         {
445                 /* Check dimmed rule */ 
446                 if (MODEST_IS_MSG_VIEW_WINDOW (win))
447                         dimmed = _msg_download_in_progress (win);
448                 if (dimmed)
449                         modest_dimming_rule_set_notification (rule, "");
450         }
451
452         return dimmed;
453 }
454
455 gboolean
456 modest_ui_dimming_rules_on_fetch_images (ModestWindow *win, gpointer user_data)
457 {
458         gboolean dimmed = FALSE;
459         ModestDimmingRule *rule = NULL;
460
461         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
462         rule = MODEST_DIMMING_RULE (user_data);
463
464         dimmed = !modest_msg_view_window_has_blocked_external_images (MODEST_MSG_VIEW_WINDOW (win));
465
466         if (!dimmed) {
467                 dimmed = _transfer_mode_enabled (win);
468                 if (dimmed)
469                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
470         }
471         if (!dimmed) {
472                 dimmed = _msg_download_in_progress (win);
473                 if (dimmed)
474                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
475         }
476
477         return dimmed;
478 }
479
480
481 gboolean 
482 modest_ui_dimming_rules_on_mark_as_read_msg_in_view (ModestWindow *win, gpointer user_data)
483 {
484         ModestDimmingRule *rule = NULL;
485         TnyHeader *header;
486         TnyHeaderFlags flags;
487         gboolean dimmed = FALSE;
488
489
490         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
491         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
492         rule = MODEST_DIMMING_RULE (user_data);
493
494         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
495         if (!header) {
496                 dimmed = TRUE;
497         }
498
499         /* If the viewer is showing a message sent as attachment */
500         if (!dimmed)
501                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
502
503         if (!dimmed) {
504                 flags = tny_header_get_flags (header);
505                 if (flags & TNY_HEADER_FLAG_SEEN)
506                         dimmed = TRUE;
507         }
508
509         if (header)
510                 g_object_unref (header);
511         return dimmed;
512 }
513
514
515 gboolean 
516 modest_ui_dimming_rules_on_mark_as_unread_msg_in_view (ModestWindow *win, gpointer user_data)
517 {
518         ModestDimmingRule *rule = NULL;
519         TnyHeader *header;
520         TnyHeaderFlags flags;
521         gboolean dimmed = FALSE;
522         
523
524         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
525         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
526         rule = MODEST_DIMMING_RULE (user_data);
527         
528         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
529         if (!header) {
530                 dimmed = TRUE;
531         }
532
533         /* If the viewer is showing a message sent as attachment */
534         if (!dimmed)
535                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
536
537         if (!dimmed) {
538                 flags = tny_header_get_flags (header);
539                 if (!(flags & TNY_HEADER_FLAG_SEEN))
540                         dimmed = TRUE;
541         }
542
543         if (header)
544                 g_object_unref (header);
545         return dimmed;
546 }
547
548 gboolean 
549 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
550 {
551         ModestDimmingRule *rule = NULL;
552         gboolean dimmed = FALSE;
553
554         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
555         rule = MODEST_DIMMING_RULE (user_data);
556
557         if (MODEST_IS_HEADER_WINDOW (win))
558                 dimmed = modest_ui_dimming_rules_on_header_window_move_to (win, user_data);
559         else if (MODEST_IS_FOLDER_WINDOW (win))
560                 dimmed = modest_ui_dimming_rules_on_folder_window_move_to (win, user_data);
561         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
562                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
563
564         return dimmed;
565 }
566
567
568 static gboolean
569 _forbid_outgoing_xfers (ModestWindow *window)
570 {
571         const gchar *account_name = NULL;
572         TnyAccount *account = NULL;
573         gboolean dimmed = FALSE;
574
575 #ifdef MODEST_TOOLKIT_HILDON2
576         /* We cannot just get the active account because the active
577            account of a header window that shows the headers of a
578            local account is the ID of the remote account */
579         if (MODEST_IS_HEADER_WINDOW (window)) {
580                 ModestHeaderView *header_view;
581                 TnyFolder *folder;
582
583                 header_view = modest_header_window_get_header_view ((ModestHeaderWindow *) window);
584                 folder = modest_header_view_get_folder (header_view);
585
586                 if (folder) {
587                         account = modest_tny_folder_get_account (folder);
588                         g_object_unref (folder);
589                 }
590         }
591 #endif
592
593         if (!account) {
594                 account_name = modest_window_get_active_account (window);
595                 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
596                                                                        account_name,
597                                                                        TNY_ACCOUNT_TYPE_STORE);
598         }
599
600         if (account) {
601                 ModestProtocolType protocol_type;
602
603                 protocol_type = modest_tny_account_get_protocol_type (account);
604                 dimmed  = modest_protocol_registry_protocol_type_has_tag
605                         (modest_runtime_get_protocol_registry (),
606                          protocol_type,
607                          MODEST_PROTOCOL_REGISTRY_STORE_FORBID_OUTGOING_XFERS);
608
609                 g_object_unref (account);
610         }
611         return dimmed;
612 }
613
614 gboolean
615 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
616 {
617         ModestDimmingRule *rule = NULL;
618         gboolean dimmed = FALSE;
619
620         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
621         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
622         rule = MODEST_DIMMING_RULE (user_data);
623
624         /* This could happen if we load the msg view window with a
625            preview before loading the full message */
626         TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
627         if (!msg) {
628                 return TRUE;
629         } else {
630                 g_object_unref (msg);
631         }
632
633         /* Check dimmed rule */
634         dimmed = _transfer_mode_enabled (win);
635         if (dimmed)
636                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
637
638         if (!dimmed)
639                 dimmed = _forbid_outgoing_xfers (win);
640
641         if (!dimmed) {
642                 const DimmedState *state = modest_window_get_dimming_state (win);
643                 if (state) {
644                         dimmed = state->any_marked_as_deleted;
645                         if (dimmed) {
646                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
647                                 modest_dimming_rule_set_notification (rule, msg);
648                                 g_free (msg);
649                         }
650                 }
651         }
652
653         if (!dimmed) {
654                 dimmed = _selected_msg_sent_in_progress (win);
655                 if (dimmed)
656                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
657         }
658
659         /* This could happen if we're viewing a message of the outbox
660            that has been already sent */
661         if (!dimmed)
662                 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
663
664         if (!dimmed) {
665                 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
666                         /* The move_to button should be dimmed when viewing an attachment,
667                          * but should be enabled when viewing a message from the list, 
668                          * or when viewing a search result.
669                          */
670                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
671                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
672                         }
673                 }
674                 if (dimmed) 
675                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
676         }
677
678         return dimmed;
679 }
680
681 gboolean 
682 modest_ui_dimming_rules_on_find_in_msg (ModestWindow *win, gpointer user_data)
683 {
684         ModestDimmingRule *rule = NULL;
685         gboolean dimmed = FALSE;
686
687         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
688         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
689         rule = MODEST_DIMMING_RULE (user_data);
690
691         /* This could happen if we load the msg view window with a
692            preview before loading the full message */
693         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
694                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
695                 if (!msg) {
696                         return TRUE;
697                 } else {
698                         g_object_unref (msg);
699                 }
700         }
701
702         /* Check dimmed rule */ 
703         dimmed = _transfer_mode_enabled (win);
704         if (dimmed)
705                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
706
707         return dimmed;
708 }
709
710
711 gboolean 
712 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
713 {
714         ModestDimmingRule *rule = NULL;
715         gboolean dimmed = FALSE;
716         GtkWidget *focused = NULL;
717
718         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
719         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
720         rule = MODEST_DIMMING_RULE (user_data);
721
722         focused = gtk_container_get_focus_child ((GtkContainer *) win);
723
724         if (!dimmed && GTK_IS_ENTRY (focused)) {
725                 const gchar *current_text;
726                 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
727                 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
728         }
729
730         if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
731                 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
732                 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
733         }
734
735         if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
736                 dimmed = FALSE;
737         return dimmed;
738 }
739
740 gboolean 
741 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
742 {
743         ModestDimmingRule *rule = NULL;
744         gboolean dimmed = FALSE;
745
746         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
747         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
748         rule = MODEST_DIMMING_RULE (user_data);
749
750         /* Check dimmed rule */ 
751         dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);                       
752
753         if (!dimmed) {
754                 dimmed = _purged_attach_selected (win, FALSE, NULL);
755                 if (dimmed) {
756                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
757                 }
758         }
759                 
760         return dimmed;
761 }
762
763 static gboolean
764 _not_valid_attachments (ModestWindow *win, gboolean save_not_remove)
765 {
766         gint n_attachments;
767         TnyList *attachments;
768         gboolean result = FALSE;
769
770         /* Get atachments */
771         attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
772         n_attachments = tny_list_get_length (attachments);
773
774         /* Check unique */              
775         if (!result) {
776                 result = n_attachments < 1;
777         }
778                 
779         /* Check attached type (view operation not required) */
780         if (!result)  {
781                 gint n_valid = 0;
782
783                 TnyIterator *iter;
784                 iter = tny_list_create_iterator (attachments);
785                 while (!tny_iterator_is_done (iter)) {
786                         gboolean is_valid = TRUE;
787                         TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
788                         TnyList *nested_list = tny_simple_list_new ();
789                         tny_mime_part_get_parts (mime_part, nested_list);
790
791                         if (tny_mime_part_is_purged (mime_part)) {
792                                 is_valid = FALSE;
793                         }
794                         
795                         if (is_valid && modest_tny_mime_part_is_msg (mime_part)) {
796                                 TnyMsg *window_msg;
797                                 window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
798                                 if (window_msg) {
799                                         if (save_not_remove && (TnyMimePart *) window_msg != mime_part) {
800                                                 is_valid = FALSE;
801                                         }
802                                         g_object_unref (window_msg);
803                                 }
804                                 if (is_valid && save_not_remove && tny_list_get_length (nested_list) > 0) {
805                                         is_valid = FALSE;
806                                 }
807                         }
808                         g_object_unref (nested_list);
809                         g_object_unref (mime_part);
810                         tny_iterator_next (iter);
811
812                         if (is_valid) 
813                                 n_valid++;
814                 }
815                 g_object_unref (iter);
816                 result = (n_valid == 0);
817         }
818         g_object_unref (attachments);
819         return result;
820
821 }
822
823 gboolean 
824 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
825 {
826         ModestDimmingRule *rule = NULL;
827         gboolean dimmed = FALSE;
828
829         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
830         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
831         rule = MODEST_DIMMING_RULE (user_data);
832
833         /* Check dimmed rule */ 
834
835         dimmed = _not_valid_attachments (win, TRUE);
836         return dimmed;
837 }
838
839 gboolean 
840 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
841 {
842         ModestDimmingRule *rule = NULL;
843         const DimmedState *state = NULL;
844         gboolean dimmed = FALSE;
845
846         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
847         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
848         rule = MODEST_DIMMING_RULE (user_data);
849         state = modest_window_get_dimming_state (win);
850
851
852         /* Check in view window if there's any attachment selected */
853         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
854                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
855                 if (dimmed)
856                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
857         }
858
859         if (!dimmed) {
860
861                 dimmed = _selected_msg_sent_in_progress (win);
862                 if (dimmed) {
863                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
864                 }
865         }
866
867         /* cannot purge in editable drafts nor pop folders */
868         if (!dimmed) {
869                 dimmed = _invalid_folder_for_purge (win, rule);
870                 if (dimmed)
871                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
872         }
873
874         /* Check if all attachments are already purged */
875         if (!dimmed) {
876                 dimmed = _purged_attach_selected (win, TRUE, rule);
877         }
878
879         return dimmed;
880 }
881
882 gboolean
883 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
884 {
885         ModestDimmingRule *rule = NULL;
886         gboolean dimmed = FALSE;
887
888         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
889         rule = MODEST_DIMMING_RULE (user_data);
890
891         /* Check dimmed rule */
892         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
893                 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
894         }
895
896         return dimmed;
897 }
898
899 gboolean
900 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
901 {
902         ModestDimmingRule *rule = NULL;
903         gboolean dimmed = FALSE;
904
905         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
906         rule = MODEST_DIMMING_RULE (user_data);
907
908         /* Check dimmed rule */
909         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
910                 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
911         }
912
913         return dimmed;
914 }
915
916 gboolean
917 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
918 {
919         ModestDimmingRule *rule = NULL;
920         const DimmedState *state = NULL;
921         gboolean dimmed = FALSE;
922
923         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
924         rule = MODEST_DIMMING_RULE (user_data);
925         state = modest_window_get_dimming_state (win);
926
927         /* Check common dimming rules */
928         dimmed = _invalid_clipboard_selected (win, rule);
929
930         return dimmed;
931 }
932
933 gboolean 
934 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
935 {
936         ModestDimmingRule *rule = NULL;
937         const DimmedState *state = NULL;
938         gboolean dimmed = FALSE;
939
940         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
941         rule = MODEST_DIMMING_RULE (user_data);
942         state = modest_window_get_dimming_state (win);
943
944         /* Check common dimming rules */
945         dimmed = _invalid_clipboard_selected (win, rule);
946
947         return dimmed;
948 }
949
950 gboolean
951 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
952 {
953         ModestDimmingRule *rule = NULL;
954         gboolean dimmed = FALSE;
955         
956         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
957         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
958         rule = MODEST_DIMMING_RULE (user_data);
959
960         /* Check common dimming rules */
961         ModestMsgEditFormat format;
962         format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
963
964         dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
965         if (dimmed)
966                 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
967
968         if (!dimmed) {
969                 GtkWidget *body;
970                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
971                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
972                 
973                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
974                 if (dimmed)
975                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
976         }
977                
978         
979         return dimmed;
980 }
981
982 gboolean 
983 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
984 {
985         ModestDimmingRule *rule = NULL;
986         gboolean dimmed = FALSE;
987         
988         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
989         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
990         rule = MODEST_DIMMING_RULE (user_data);
991
992         GtkWidget *body;
993         body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
994                                                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
995         
996         dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
997         if (dimmed)
998                 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
999         
1000         return dimmed;
1001 }
1002
1003 gboolean 
1004 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1005 {
1006         ModestDimmingRule *rule = NULL;
1007         gboolean dimmed = FALSE;
1008         GtkWidget *focused = NULL;
1009         
1010         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1011         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1012         rule = MODEST_DIMMING_RULE (user_data);
1013
1014         focused = gtk_container_get_focus_child ((GtkContainer *) win);
1015
1016         dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1017         
1018         if (!dimmed) {
1019                 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1020         }
1021
1022         if (!dimmed) {
1023                 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1024                 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1025
1026                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1027                   ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1028         }
1029         
1030         return dimmed;
1031 }
1032
1033 gboolean 
1034 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1035 {
1036         ModestDimmingRule *rule = NULL;
1037         gboolean dimmed = FALSE;
1038         TnyList *selected_attachments = NULL;
1039         gint n_att_selected = 0;
1040         GtkWidget *attachments_view;
1041         
1042         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1043         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1044         rule = MODEST_DIMMING_RULE (user_data);
1045
1046         attachments_view = modest_msg_edit_window_get_child_widget (
1047                                                                     MODEST_MSG_EDIT_WINDOW (win),
1048                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1049         
1050         selected_attachments = modest_attachments_view_get_attachments (
1051                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1052         n_att_selected = tny_list_get_length (selected_attachments);
1053         g_object_unref (selected_attachments);
1054         
1055         dimmed = (n_att_selected < 1);  
1056         
1057         return dimmed;
1058 }
1059
1060 gboolean
1061 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1062 {
1063         ModestDimmingRule *rule = NULL;
1064         gboolean dimmed = FALSE;
1065         GtkWidget *body_field;
1066
1067         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1068         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1069         rule = MODEST_DIMMING_RULE (user_data);
1070
1071         body_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1072                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1073
1074         if (!dimmed) {
1075                 GtkWidget *to_field, *cc_field, *bcc_field;
1076                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1077                 cc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1078                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1079                 to_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1080                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1081                 bcc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1082                                                                      MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1083                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1084                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1085                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1086
1087                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1088                            gtk_text_buffer_get_char_count (cc_buffer) +
1089                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1090
1091                 if (!dimmed) {
1092                         if (modest_text_utils_no_recipient (to_buffer) &&
1093                             modest_text_utils_no_recipient (cc_buffer) &&
1094                             modest_text_utils_no_recipient (bcc_buffer))
1095                                 dimmed = TRUE;
1096                 }
1097
1098                 if (dimmed)
1099                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1100         }
1101         
1102         return dimmed;
1103 }
1104
1105 gboolean 
1106 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1107 {
1108         ModestDimmingRule *rule = NULL;
1109         gboolean dimmed = FALSE;
1110         
1111         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1112         rule = MODEST_DIMMING_RULE (user_data);
1113
1114         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1115
1116         /* Check dimmed rule */
1117         dimmed = _transfer_mode_enabled (win);
1118         if (dimmed)
1119                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1120         
1121         if (!dimmed) {
1122                 dimmed = modest_msg_view_window_first_message_selected (
1123                                 MODEST_MSG_VIEW_WINDOW(win));
1124                 modest_dimming_rule_set_notification (rule, NULL);
1125         }
1126
1127         return dimmed;
1128 }
1129
1130 gboolean 
1131 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1132 {
1133         ModestDimmingRule *rule = NULL;
1134         gboolean dimmed = FALSE;
1135
1136         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1137         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1138         rule = MODEST_DIMMING_RULE (user_data);
1139
1140         /* Check dimmed rule */ 
1141         dimmed = _transfer_mode_enabled (win);                  
1142         if (dimmed)
1143                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1144         
1145         if (!dimmed) {
1146                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1147                 modest_dimming_rule_set_notification (rule, NULL);
1148         }
1149
1150         return dimmed;
1151 }
1152
1153
1154 gboolean
1155 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1156 {
1157         gboolean dimmed;
1158         ModestAccountMgr *mgr;
1159
1160         mgr = modest_runtime_get_account_mgr();
1161         dimmed = !modest_account_mgr_has_accounts(mgr, TRUE);
1162
1163         /* Dimm it if we only have metaaccounts */
1164         if (!dimmed) {
1165                 ModestProtocolRegistry *reg = modest_runtime_get_protocol_registry ();
1166                 GSList *account_names = modest_account_mgr_account_names (mgr, TRUE);
1167
1168                 if (account_names) {
1169                         ModestProtocolType store_protocol;
1170                         gboolean found = FALSE;
1171                         GSList *iter = account_names;
1172                         const gchar *tag = MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS;
1173
1174                         while (iter && !found) {
1175                                 gchar* account_name;
1176
1177                                 account_name = (gchar *) iter->data;
1178                                 store_protocol = modest_account_mgr_get_store_protocol (mgr, account_name);
1179
1180                                 if (!modest_protocol_registry_protocol_type_has_tag (reg, store_protocol, tag))
1181                                         found = TRUE;
1182                                 else
1183                                         iter = g_slist_next (iter);
1184                         }
1185                         modest_account_mgr_free_account_names (account_names);
1186                         dimmed = !found;
1187                 }
1188         }
1189
1190         return dimmed;
1191 }
1192
1193 gboolean
1194 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
1195 {
1196         /* We dim if no msg send is in progress (and then cancelling send all has no
1197          * effect */
1198         return !_msgs_send_in_progress ();
1199 }
1200
1201 gboolean 
1202 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1203 {
1204         ModestDimmingRule *rule = NULL;
1205         gboolean dimmed = FALSE;
1206         ModestAccountMgr *mgr;
1207         const gchar* account_name;
1208
1209         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1210         rule = MODEST_DIMMING_RULE (user_data);
1211         mgr = modest_runtime_get_account_mgr();
1212
1213         /* Check dimmed rule */
1214         account_name = modest_window_get_active_account (win);
1215
1216         if (account_name)
1217                 dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
1218         else
1219                 dimmed = TRUE;
1220
1221         if (dimmed)
1222                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1223
1224         return dimmed;
1225 }
1226
1227 gboolean 
1228 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1229 {
1230         ModestDimmingRule *rule = NULL;
1231         gboolean dimmed = FALSE;
1232
1233         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1234         rule = MODEST_DIMMING_RULE (user_data);
1235  
1236         /* Check dimmed rule */ 
1237         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1238         if (g_slist_length (account_names) < 1)
1239                 dimmed = TRUE;
1240         if (dimmed)
1241                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1242
1243         modest_account_mgr_free_account_names (account_names);
1244
1245         if (!dimmed) {
1246                 dimmed = _send_receive_in_progress (win);
1247         }
1248
1249         return dimmed;
1250 }
1251
1252 gboolean
1253 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1254 {
1255         GSList *recipients = NULL;
1256         gboolean has_recipients_to_add;
1257
1258         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1259
1260         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1261                 TnyMsg *msg;
1262
1263                 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1264
1265                 /* Message is loaded asynchronously, so this could happen */
1266                 if (!msg) {
1267                         TnyHeader *header;
1268
1269                         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
1270                         if (!header)
1271                                 return TRUE;
1272
1273                         recipients = modest_tny_msg_header_get_all_recipients_list (header);
1274                         g_object_unref (header);
1275                 } else {
1276                         recipients = modest_tny_msg_get_all_recipients_list (msg);
1277                         g_object_unref (msg);
1278                 }
1279         } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1280                 /* Check if there are pending addresses to add */
1281                 return !modest_msg_edit_window_has_pending_addresses ((ModestMsgEditWindow *) win);
1282         }
1283
1284         has_recipients_to_add = FALSE;
1285
1286         if (recipients) {
1287                 GSList *node;
1288                 for (node = recipients; node != NULL; node = g_slist_next (node)) {
1289                         const gchar *recipient = (const gchar *) node->data;
1290                         if (modest_text_utils_validate_recipient (recipient, NULL)) {
1291                                 if (!modest_address_book_has_address (recipient)) {
1292                                         has_recipients_to_add = TRUE;
1293                                         break;
1294                                 }
1295                         }
1296                 }
1297                 g_slist_foreach (recipients, (GFunc) g_free, NULL);
1298                 g_slist_free (recipients);
1299         }
1300
1301         return !has_recipients_to_add;
1302 }
1303
1304 /* *********************** static utility functions ******************** */
1305
1306 static gboolean
1307 _selected_folder_is_any_of_type (ModestWindow *win,
1308                                  TnyFolderType types[], 
1309                                  guint ntypes)
1310 {
1311         TnyFolderStore *folder = NULL;
1312         TnyFolderType folder_type;
1313         guint i=0;
1314         gboolean result = FALSE;
1315
1316         /*Get current folder */
1317         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1318                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1319                 for (i=0; i < ntypes; i++) {
1320                         result = result || folder_type == types[i];
1321                 }
1322         }
1323
1324         /* free */
1325         if (folder)
1326                 g_object_unref (folder);
1327
1328         return result;
1329 }
1330
1331 static gboolean
1332 _invalid_clipboard_selected (ModestWindow *win,
1333                              ModestDimmingRule *rule) 
1334 {
1335         gboolean result = FALSE;
1336         GtkWidget *focused = NULL;
1337
1338         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1339
1340         /* Get focuesed widget */
1341         focused = gtk_container_get_focus_child ((GtkContainer *) win);
1342
1343         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1344                 gboolean has_selection = FALSE;
1345                 if (GTK_IS_TEXT_VIEW (focused)) {
1346                         GtkTextBuffer *buffer = NULL;
1347                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1348                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
1349                 } else if (GTK_IS_EDITABLE (focused)) {
1350                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
1351                 }
1352                 result = !has_selection;
1353         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1354                 if (focused) {
1355                         MODEST_DEBUG_BLOCK (g_debug ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
1356                         if (GTK_IS_LABEL (focused) && 
1357                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
1358                                 result = TRUE;
1359                         } else if (GTK_IS_TEXT_VIEW (focused)) {
1360                                 GtkTextBuffer *buffer;
1361                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1362                                 result = !gtk_text_buffer_get_has_selection (buffer);
1363                         } else if (GTK_IS_HTML (focused)) {
1364                                 const gchar *sel;
1365                                 int len = -1;
1366                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1367                                 result = ((sel == NULL) || (sel[0] == '\0'));
1368                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
1369                                 result = TRUE;
1370                         } else {
1371                                 GtkClipboard *clipboard;
1372                                 gchar *selection;
1373
1374                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1375                                 /* Get clipboard selection*/
1376                                 selection = gtk_clipboard_wait_for_text (clipboard);
1377                                 /* Check dimming */
1378                                 result = (selection == NULL);
1379                                 g_free (selection);
1380                         }
1381                 } else {
1382                         result = TRUE;
1383                 }
1384                 if (result)
1385                         modest_dimming_rule_set_notification (rule, "");
1386         }
1387
1388         return result;
1389 }
1390
1391
1392 static gboolean
1393 _invalid_attach_selected (ModestWindow *win,
1394                           gboolean unique,
1395                           gboolean for_view,
1396                           gboolean for_remove,
1397                           ModestDimmingRule *rule) 
1398 {
1399         TnyList *attachments;
1400         gint n_selected;
1401         gboolean nested_attachments = FALSE;
1402         gboolean selected_messages = FALSE;
1403         gboolean result = FALSE;
1404
1405         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1406
1407         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1408
1409                 /* Get selected atachments */
1410                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1411                 n_selected = tny_list_get_length (attachments);
1412
1413                 /* Check unique */
1414                 if (!result) {
1415                         if (unique)
1416                                 result = n_selected != 1;
1417                         else
1418
1419                                 result = n_selected < 1;
1420                 }
1421
1422                 /* Check attached type (view operation not required) */
1423                 if (!result && !for_view)  {
1424                         TnyIterator *iter;
1425                         iter = tny_list_create_iterator (attachments);
1426                         while (!tny_iterator_is_done (iter) && !result) {
1427                                 gboolean not_selectable = FALSE;
1428                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1429                                 TnyList *nested_list = tny_simple_list_new ();
1430                                 tny_mime_part_get_parts (mime_part, nested_list);
1431
1432                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
1433                                         TnyMsg *window_msg;
1434                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1435                                         if ((TnyMimePart *) window_msg != mime_part) {
1436                                                 selected_messages = TRUE;
1437                                                 not_selectable = TRUE;
1438                                         }
1439                                         g_object_unref (window_msg);
1440                                 }
1441                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1442                                         nested_attachments = TRUE;
1443                                         not_selectable = TRUE;
1444                                 }
1445                                 if (not_selectable)
1446                                         n_selected --;
1447                                 g_object_unref (nested_list);
1448                                 g_object_unref (mime_part);
1449                                 tny_iterator_next (iter);
1450                         }
1451                         g_object_unref (iter);
1452                 }
1453
1454                 /* No valid attachment available */
1455                 if (n_selected == 0)
1456                         result = TRUE;
1457
1458                 /* Set notifications */
1459                 if (result && rule != NULL) {
1460                         if (selected_messages) {
1461                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1462                         } else if (nested_attachments) {
1463                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1464                         } else if (n_selected == 0) {
1465                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1466                         } else if (unique) {
1467                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1468                         }
1469                 }
1470
1471                 /* Free */
1472                 g_object_unref (attachments);
1473         }
1474
1475         return result;
1476 }
1477
1478 static gboolean
1479 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
1480 {
1481         TnyList *attachments = NULL;
1482         TnyIterator *iter;
1483         gint purged = 0;
1484         gint n_attachments = 0;
1485         gboolean result = FALSE;
1486
1487         /* This should check if _all_ the attachments are already purged. If only some
1488          * of them are purged, then it does not cause dim as there's a confirmation dialog
1489          * for removing only local attachments */
1490
1491         /* Get selected atachments */
1492         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1493                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1494         }
1495
1496         if (attachments == NULL)
1497                 return FALSE;
1498
1499         if (tny_list_get_length (attachments) == 0) {
1500                 g_object_unref (attachments);
1501                 return FALSE;
1502         }
1503
1504         iter = tny_list_create_iterator (attachments);
1505         while (!tny_iterator_is_done (iter)) {
1506                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1507                 if (tny_mime_part_is_purged (mime_part)) {
1508                         purged++;
1509                 }
1510                 n_attachments++;
1511                 g_object_unref (mime_part);
1512                 tny_iterator_next (iter);
1513         }
1514         g_object_unref (iter);
1515
1516         /* Free */
1517         g_object_unref (attachments);
1518
1519         if (all)
1520                 result = (purged == n_attachments);
1521         else
1522                 result = (purged > 0);
1523
1524         /* This string no longer exists, refer to NB#75415 for more info
1525         if (result && (rule != NULL))
1526                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1527         */
1528
1529         return result;
1530 }
1531
1532 static gboolean
1533 _msg_download_in_progress (ModestWindow *win)
1534 {
1535         gboolean result = FALSE;
1536
1537         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
1538
1539         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1540                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
1541         }
1542
1543         return result;
1544 }
1545
1546 static void
1547 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
1548 {
1549         GSList **send_queues = (GSList **) userdata;
1550         *send_queues = g_slist_prepend (*send_queues, value);
1551 }
1552
1553 static gboolean
1554 _selected_msg_sent_in_progress (ModestWindow *win)
1555 {
1556         const DimmedState *state = modest_window_get_dimming_state (win);
1557         return (state) ? state->sent_in_progress : TRUE;
1558 }
1559
1560
1561 static gboolean
1562 _invalid_folder_for_purge (ModestWindow *win, 
1563                            ModestDimmingRule *rule)
1564 {
1565         TnyFolder *folder = NULL;
1566         TnyAccount *account = NULL;
1567         gboolean result = FALSE;
1568
1569         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1570
1571                 /* Get folder and account of message */
1572                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1573                 g_return_val_if_fail(msg != NULL, TRUE);
1574                 folder = tny_msg_get_folder (msg);
1575                 g_object_unref (msg);
1576                 if (folder == NULL) {
1577                         result = TRUE;
1578                         goto frees;
1579                 }
1580         } else {
1581                 g_return_val_if_reached (FALSE);
1582         }
1583         account = modest_tny_folder_get_account (folder);
1584         if (account == NULL) goto frees;
1585
1586         /* Check account */
1587         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
1588                 TnyFolderType types[2];
1589                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1590                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1591
1592                 if (_selected_folder_is_any_of_type (win, types, 2)) {
1593                         result = TRUE;
1594                 }
1595         } else {
1596                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
1597                 /* If it's a remote folder then dim */
1598                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
1599                                                                     protocol_type,
1600                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
1601                         result = TRUE;
1602                 }
1603         }
1604         
1605 frees:
1606         if (folder != NULL)
1607                 g_object_unref (folder);
1608         if (account != NULL)
1609                 g_object_unref (account);
1610         
1611         return result;
1612 }
1613
1614 static gboolean
1615 _transfer_mode_enabled (ModestWindow *win)
1616 {
1617         gboolean result = FALSE;
1618
1619         /* Check dimming */
1620         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1621                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
1622         } else if (MODEST_IS_FOLDER_WINDOW (win)) {
1623                 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
1624         } else if (MODEST_IS_HEADER_WINDOW (win)) {
1625                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
1626         } else {
1627                 g_warning("_transfer_mode_enabled called with wrong window type");
1628         }
1629
1630         return result;
1631 }
1632
1633 static gboolean
1634 _all_msgs_in_sending_status (ModestHeaderView *header_view)
1635 {
1636         GtkTreeModel *model;
1637         GtkTreeIter iter;
1638         gboolean all_sending = TRUE;
1639
1640         model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
1641         if (gtk_tree_model_get_iter_first (model, &iter)) {
1642                 do {
1643                         TnyHeader *header;
1644
1645                         gtk_tree_model_get (model, &iter,
1646                                             TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1647                                             &header,
1648                                             -1);
1649
1650                         if (header) {
1651                                 if (modest_tny_all_send_queues_get_msg_status (header) !=
1652                                     MODEST_TNY_SEND_QUEUE_SENDING)
1653                                         all_sending = FALSE;
1654                                 g_object_unref (header);
1655                         }
1656
1657                 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
1658         }
1659         return all_sending;
1660 }
1661
1662 gboolean 
1663 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
1664                                            gpointer user_data)
1665 {
1666         ModestDimmingRule *rule = NULL;
1667
1668         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1669         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1670         rule = MODEST_DIMMING_RULE (user_data);
1671
1672         /* Check dimmed rule */ 
1673         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
1674 }
1675
1676 gboolean
1677 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
1678                                          gpointer user_data)
1679 {
1680         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1681
1682         ModestMsgEditFormat format =
1683           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1684
1685         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
1686 }
1687
1688 static gboolean 
1689 _send_receive_in_progress (ModestWindow *win)
1690 {
1691         ModestMailOperationQueue *queue;
1692         GSList *op_list, *node;
1693         gboolean found_send_receive;
1694
1695         queue = modest_runtime_get_mail_operation_queue ();
1696         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
1697
1698         found_send_receive = FALSE;
1699         for (node = op_list; node != NULL; node = g_slist_next (node)) {
1700                 ModestMailOperation *op;
1701
1702                 op = (ModestMailOperation *) node->data;
1703                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
1704                         found_send_receive = TRUE;
1705                         break;
1706                 }
1707         }
1708
1709         if (op_list) {
1710                 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
1711                 g_slist_free (op_list);
1712         }
1713
1714         return found_send_receive;
1715 }
1716
1717 static gboolean
1718 _msgs_send_in_progress (void)
1719 {
1720         ModestCacheMgr *cache_mgr;
1721         GHashTable *send_queue_cache;
1722         ModestTnySendQueue *send_queue;
1723         GSList *send_queues = NULL, *node = NULL;
1724         gboolean found = FALSE;
1725
1726         cache_mgr = modest_runtime_get_cache_mgr ();
1727         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
1728                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
1729
1730         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
1731
1732         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
1733                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
1734
1735                 /* Check if msg uid is being processed inside send queue */
1736                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
1737                         found = TRUE;
1738                         break;
1739                 }
1740         }
1741
1742         g_slist_free (send_queues);
1743
1744         return found;
1745 }
1746
1747 gboolean 
1748 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
1749 {
1750         ModestDimmingRule *rule = NULL;
1751         gboolean dimmed = FALSE;
1752
1753         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
1754         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1755         rule = MODEST_DIMMING_RULE (user_data);
1756
1757         /* Check dimmed rule */ 
1758         dimmed = _transfer_mode_enabled (win);
1759         if (dimmed)
1760                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1761
1762         if (!dimmed)
1763                 dimmed = _forbid_outgoing_xfers (win);
1764
1765         if (!dimmed) {
1766                 GtkWidget *header_view;
1767                 TnyFolder *folder;
1768
1769                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
1770                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
1771                 if (folder) {
1772                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
1773                                 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
1774
1775                         if (!dimmed &&
1776                             (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
1777                                 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
1778                         }
1779                         g_object_unref (folder);
1780                 }
1781         }
1782
1783         return dimmed;
1784 }
1785
1786 gboolean 
1787 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
1788 {
1789         ModestDimmingRule *rule = NULL;
1790         gboolean dimmed = FALSE;
1791
1792         g_return_val_if_fail (MODEST_IS_FOLDER_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 = _forbid_outgoing_xfers (win);
1803
1804         if (!dimmed && MODEST_IS_FOLDER_WINDOW (win)) {
1805                 ModestFolderView *folder_view;
1806                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1807                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1808                                                                        MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
1809         }
1810
1811         if (!dimmed) {
1812                 dimmed = _transfer_mode_enabled (win);
1813                 if (dimmed)
1814                         modest_dimming_rule_set_notification (rule, "");
1815         }
1816
1817         return dimmed;
1818 }
1819
1820 gboolean
1821 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
1822 {
1823         ModestDimmingRule *rule = NULL;
1824         gboolean dimmed = FALSE;
1825
1826         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
1827         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1828         rule = MODEST_DIMMING_RULE (user_data);
1829
1830         /* Check dimmed rule */
1831         dimmed = _transfer_mode_enabled (win);
1832         if (dimmed)
1833                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1834
1835         if (MODEST_IS_FOLDER_WINDOW (win)) {
1836                 ModestFolderView *folder_view;
1837                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1838                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1839                                                                        MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
1840         }
1841
1842         if (!dimmed) {
1843                 dimmed = _transfer_mode_enabled (win);
1844                 if (dimmed)
1845                         modest_dimming_rule_set_notification (rule, "");
1846         }
1847
1848         return dimmed;
1849 }
1850
1851 gboolean
1852 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
1853 {
1854         return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);
1855 }