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