9090c235a921a015002e5ffe47a254278a80ded7
[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("ckct_ib_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("ckct_ib_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
464         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
465
466         dimmed = !modest_msg_view_window_has_blocked_external_images (MODEST_MSG_VIEW_WINDOW (win));
467
468         return dimmed;
469 }
470
471
472 gboolean 
473 modest_ui_dimming_rules_on_mark_as_read_msg_in_view (ModestWindow *win, gpointer user_data)
474 {
475         ModestDimmingRule *rule = NULL;
476         TnyHeader *header;
477         TnyHeaderFlags flags;
478         gboolean dimmed = FALSE;
479
480
481         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
482         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
483         rule = MODEST_DIMMING_RULE (user_data);
484
485         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
486         if (!header) {
487                 dimmed = TRUE;
488         }
489
490         /* If the viewer is showing a message sent as attachment */
491         if (!dimmed)
492                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
493
494         if (!dimmed) {
495                 flags = tny_header_get_flags (header);
496                 if (flags & TNY_HEADER_FLAG_SEEN)
497                         dimmed = TRUE;
498         }
499
500         if (header)
501                 g_object_unref (header);
502         return dimmed;
503 }
504
505
506 gboolean 
507 modest_ui_dimming_rules_on_mark_as_unread_msg_in_view (ModestWindow *win, gpointer user_data)
508 {
509         ModestDimmingRule *rule = NULL;
510         TnyHeader *header;
511         TnyHeaderFlags flags;
512         gboolean dimmed = FALSE;
513         
514
515         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
516         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
517         rule = MODEST_DIMMING_RULE (user_data);
518         
519         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
520         if (!header) {
521                 dimmed = TRUE;
522         }
523
524         /* If the viewer is showing a message sent as attachment */
525         if (!dimmed)
526                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
527
528         if (!dimmed) {
529                 flags = tny_header_get_flags (header);
530                 if (!(flags & TNY_HEADER_FLAG_SEEN))
531                         dimmed = TRUE;
532         }
533
534         if (header)
535                 g_object_unref (header);
536         return dimmed;
537 }
538
539 gboolean 
540 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
541 {
542         ModestDimmingRule *rule = NULL;
543         gboolean dimmed = FALSE;
544
545         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
546         rule = MODEST_DIMMING_RULE (user_data);
547
548         if (MODEST_IS_HEADER_WINDOW (win))
549 #ifdef MODEST_TOOLKIT_HILDON2
550                 dimmed = modest_ui_dimming_rules_on_header_window_move_to (win, user_data);
551 #else
552         dimmed = TRUE;
553 #endif
554         else if (MODEST_IS_FOLDER_WINDOW (win))
555 #ifdef MODEST_TOOLKIT_HILDON2
556                 dimmed = modest_ui_dimming_rules_on_folder_window_move_to (win, user_data);
557 #else
558         dimmed = TRUE;
559 #endif
560         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
561                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
562
563         return dimmed;
564 }
565
566
567 static gboolean
568 _forbid_outgoing_xfers (ModestWindow *window)
569 {
570         const gchar *account_name = NULL;
571         TnyAccount *account = NULL;
572         gboolean dimmed = FALSE;
573
574 #ifdef MODEST_TOOLKIT_HILDON2
575         /* We cannot just get the active account because the active
576            account of a header window that shows the headers of a
577            local account is the ID of the remote account */
578         if (MODEST_IS_HEADER_WINDOW (window)) {
579                 ModestHeaderView *header_view;
580                 TnyFolder *folder;
581
582                 header_view = modest_header_window_get_header_view ((ModestHeaderWindow *) window);
583                 folder = modest_header_view_get_folder (header_view);
584
585                 if (folder) {
586                         account = modest_tny_folder_get_account (folder);
587                         g_object_unref (folder);
588                 }
589         }
590 #endif
591
592         if (!account) {
593                 account_name = modest_window_get_active_account (window);
594                 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
595                                                                        account_name,
596                                                                        TNY_ACCOUNT_TYPE_STORE);
597         }
598
599         if (account) {
600                 ModestProtocolType protocol_type;
601
602                 protocol_type = modest_tny_account_get_protocol_type (account);
603                 dimmed  = modest_protocol_registry_protocol_type_has_tag
604                         (modest_runtime_get_protocol_registry (),
605                          protocol_type,
606                          MODEST_PROTOCOL_REGISTRY_STORE_FORBID_OUTGOING_XFERS);
607
608                 g_object_unref (account);
609         }
610         return dimmed;
611 }
612
613 gboolean
614 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
615 {
616         ModestDimmingRule *rule = NULL;
617         gboolean dimmed = FALSE;
618
619         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
620         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
621         rule = MODEST_DIMMING_RULE (user_data);
622
623         /* This could happen if we load the msg view window with a
624            preview before loading the full message */
625         TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
626         if (!msg) {
627                 return TRUE;
628         } else {
629                 g_object_unref (msg);
630         }
631
632         /* Check dimmed rule */
633         dimmed = _transfer_mode_enabled (win);
634         if (dimmed)
635                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
636
637         if (!dimmed)
638                 dimmed = _forbid_outgoing_xfers (win);
639
640         if (!dimmed) {
641                 const DimmedState *state = modest_window_get_dimming_state (win);
642                 if (state) {
643                         dimmed = state->any_marked_as_deleted;
644                         if (dimmed) {
645                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
646                                 modest_dimming_rule_set_notification (rule, msg);
647                                 g_free (msg);
648                         }
649                 }
650         }
651
652         if (!dimmed) {
653                 dimmed = _selected_msg_sent_in_progress (win);
654                 if (dimmed)
655                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
656         }
657
658         /* This could happen if we're viewing a message of the outbox
659            that has been already sent */
660         if (!dimmed)
661                 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
662
663         if (!dimmed) {
664                 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
665                         /* The move_to button should be dimmed when viewing an attachment,
666                          * but should be enabled when viewing a message from the list, 
667                          * or when viewing a search result.
668                          */
669                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
670                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
671                         }
672                 }
673                 if (dimmed) 
674                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
675         }
676
677         return dimmed;
678 }
679
680 gboolean 
681 modest_ui_dimming_rules_on_find_in_msg (ModestWindow *win, gpointer user_data)
682 {
683         ModestDimmingRule *rule = NULL;
684         gboolean dimmed = FALSE;
685
686         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
687         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
688         rule = MODEST_DIMMING_RULE (user_data);
689
690         /* This could happen if we load the msg view window with a
691            preview before loading the full message */
692         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
693                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
694                 if (!msg) {
695                         return TRUE;
696                 } else {
697                         g_object_unref (msg);
698                 }
699         }
700
701         /* Check dimmed rule */ 
702         dimmed = _transfer_mode_enabled (win);
703         if (dimmed)
704                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
705
706         return dimmed;
707 }
708
709
710 gboolean 
711 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
712 {
713         ModestDimmingRule *rule = NULL;
714         gboolean dimmed = FALSE;
715         GtkWidget *focused = NULL;
716
717         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
718         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
719         rule = MODEST_DIMMING_RULE (user_data);
720
721         focused = gtk_window_get_focus (GTK_WINDOW (win));
722
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_window_get_focus (GTK_WINDOW (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                 if (dimmed)
1091                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1092         }
1093         
1094         return dimmed;
1095 }
1096
1097 gboolean 
1098 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1099 {
1100         ModestDimmingRule *rule = NULL;
1101         gboolean dimmed = FALSE;
1102         
1103         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1104         rule = MODEST_DIMMING_RULE (user_data);
1105
1106         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1107
1108         /* Check dimmed rule */
1109         dimmed = _transfer_mode_enabled (win);
1110         if (dimmed)
1111                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1112         
1113         if (!dimmed) {
1114                 dimmed = modest_msg_view_window_first_message_selected (
1115                                 MODEST_MSG_VIEW_WINDOW(win));
1116                 modest_dimming_rule_set_notification (rule, NULL);
1117         }
1118
1119         return dimmed;
1120 }
1121
1122 gboolean 
1123 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1124 {
1125         ModestDimmingRule *rule = NULL;
1126         gboolean dimmed = FALSE;
1127
1128         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1129         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1130         rule = MODEST_DIMMING_RULE (user_data);
1131
1132         /* Check dimmed rule */ 
1133         dimmed = _transfer_mode_enabled (win);                  
1134         if (dimmed)
1135                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1136         
1137         if (!dimmed) {
1138                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1139                 modest_dimming_rule_set_notification (rule, NULL);
1140         }
1141
1142         return dimmed;
1143 }
1144
1145
1146 gboolean
1147 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1148 {
1149         gboolean dimmed;
1150         ModestAccountMgr *mgr;
1151
1152         mgr = modest_runtime_get_account_mgr();
1153         dimmed = !modest_account_mgr_has_accounts(mgr, TRUE);
1154
1155         /* Dimm it if we only have metaaccounts */
1156         if (!dimmed) {
1157                 ModestProtocolRegistry *reg = modest_runtime_get_protocol_registry ();
1158                 GSList *account_names = modest_account_mgr_account_names (mgr, TRUE);
1159
1160                 if (account_names) {
1161                         ModestProtocolType store_protocol;
1162                         gboolean found = FALSE;
1163                         GSList *iter = account_names;
1164                         const gchar *tag = MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS;
1165
1166                         while (iter && !found) {
1167                                 gchar* account_name;
1168
1169                                 account_name = (gchar *) iter->data;
1170                                 store_protocol = modest_account_mgr_get_store_protocol (mgr, account_name);
1171
1172                                 if (!modest_protocol_registry_protocol_type_has_tag (reg, store_protocol, tag))
1173                                         found = TRUE;
1174                                 else
1175                                         iter = g_slist_next (iter);
1176                         }
1177                         modest_account_mgr_free_account_names (account_names);
1178                         dimmed = !found;
1179                 }
1180         }
1181
1182         return dimmed;
1183 }
1184
1185 gboolean
1186 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
1187 {
1188         /* We dim if no msg send is in progress (and then cancelling send all has no
1189          * effect */
1190         return !_msgs_send_in_progress ();
1191 }
1192
1193 gboolean 
1194 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1195 {
1196         ModestDimmingRule *rule = NULL;
1197         gboolean dimmed = FALSE;
1198         ModestAccountMgr *mgr;
1199         const gchar* account_name;
1200
1201         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1202         rule = MODEST_DIMMING_RULE (user_data);
1203         mgr = modest_runtime_get_account_mgr();
1204
1205         /* Check dimmed rule */
1206         account_name = modest_window_get_active_account (win);
1207
1208         if (account_name)
1209                 dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
1210         else
1211                 dimmed = TRUE;
1212
1213         if (dimmed)
1214                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1215
1216         return dimmed;
1217 }
1218
1219 gboolean 
1220 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1221 {
1222         ModestDimmingRule *rule = NULL;
1223         gboolean dimmed = FALSE;
1224
1225         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1226         rule = MODEST_DIMMING_RULE (user_data);
1227  
1228         /* Check dimmed rule */ 
1229         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1230         if (g_slist_length (account_names) < 1)
1231                 dimmed = TRUE;
1232         if (dimmed)
1233                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1234
1235         modest_account_mgr_free_account_names (account_names);
1236
1237         if (!dimmed) {
1238                 dimmed = _send_receive_in_progress (win);
1239         }
1240
1241         return dimmed;
1242 }
1243
1244 gboolean
1245 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1246 {
1247         GSList *recipients = NULL;
1248         gboolean has_recipients_to_add;
1249
1250         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1251
1252         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1253                 TnyMsg *msg;
1254
1255                 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1256
1257                 /* Message is loaded asynchronously, so this could happen */
1258                 if (!msg) {
1259                         TnyHeader *header;
1260
1261                         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
1262                         if (!header)
1263                                 return TRUE;
1264
1265                         recipients = modest_tny_msg_header_get_all_recipients_list (header);
1266                         g_object_unref (header);
1267                 } else {
1268                         recipients = modest_tny_msg_get_all_recipients_list (msg);
1269                         g_object_unref (msg);
1270                 }
1271         } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1272                 /* Check if there are pending addresses to add */
1273                 return !modest_msg_edit_window_has_pending_addresses ((ModestMsgEditWindow *) win);
1274         }
1275
1276         has_recipients_to_add = FALSE;
1277
1278         if (recipients) {
1279                 GSList *node;
1280                 for (node = recipients; node != NULL; node = g_slist_next (node)) {
1281                         const gchar *recipient = (const gchar *) node->data;
1282                         if (modest_text_utils_validate_recipient (recipient, NULL)) {
1283                                 if (!modest_address_book_has_address (recipient)) {
1284                                         has_recipients_to_add = TRUE;
1285                                         break;
1286                                 }
1287                         }
1288                 }
1289                 g_slist_foreach (recipients, (GFunc) g_free, NULL);
1290                 g_slist_free (recipients);
1291         }
1292
1293         return !has_recipients_to_add;
1294 }
1295
1296 /* *********************** static utility functions ******************** */
1297
1298 static gboolean
1299 _selected_folder_is_any_of_type (ModestWindow *win,
1300                                  TnyFolderType types[], 
1301                                  guint ntypes)
1302 {
1303         TnyFolderStore *folder = NULL;
1304         TnyFolderType folder_type;
1305         guint i=0;
1306         gboolean result = FALSE;
1307
1308         /*Get current folder */
1309         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1310                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1311                 for (i=0; i < ntypes; i++) {
1312                         result = result || folder_type == types[i];
1313                 }
1314         }
1315
1316         /* free */
1317         if (folder)
1318                 g_object_unref (folder);
1319
1320         return result;
1321 }
1322
1323 static gboolean
1324 _invalid_clipboard_selected (ModestWindow *win,
1325                              ModestDimmingRule *rule) 
1326 {
1327         gboolean result = FALSE;
1328         GtkWidget *focused = NULL;
1329
1330         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1331
1332         /* Get focuesed widget */
1333         focused = gtk_window_get_focus (GTK_WINDOW (win));
1334
1335         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1336                 gboolean has_selection = FALSE;
1337                 if (GTK_IS_TEXT_VIEW (focused)) {
1338                         GtkTextBuffer *buffer = NULL;
1339                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1340                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
1341                 } else if (GTK_IS_EDITABLE (focused)) {
1342                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
1343                 }
1344                 result = !has_selection;
1345         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1346                 if (focused) {
1347                         MODEST_DEBUG_BLOCK (g_debug ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
1348                         if (GTK_IS_LABEL (focused) && 
1349                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
1350                                 result = TRUE;
1351                         } else if (GTK_IS_TEXT_VIEW (focused)) {
1352                                 GtkTextBuffer *buffer;
1353                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1354                                 result = !gtk_text_buffer_get_has_selection (buffer);
1355                         } else if (GTK_IS_HTML (focused)) {
1356                                 const gchar *sel;
1357                                 int len = -1;
1358                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1359                                 result = ((sel == NULL) || (sel[0] == '\0'));
1360                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
1361                                 result = TRUE;
1362                         } else {
1363                                 GtkClipboard *clipboard;
1364                                 gchar *selection;
1365
1366                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1367                                 /* Get clipboard selection*/
1368                                 selection = gtk_clipboard_wait_for_text (clipboard);
1369                                 /* Check dimming */
1370                                 result = (selection == NULL);
1371                                 g_free (selection);
1372                         }
1373                 } else {
1374                         result = TRUE;
1375                 }
1376                 if (result)
1377                         modest_dimming_rule_set_notification (rule, "");
1378         }
1379
1380         return result;
1381 }
1382
1383
1384 static gboolean
1385 _invalid_attach_selected (ModestWindow *win,
1386                           gboolean unique,
1387                           gboolean for_view,
1388                           gboolean for_remove,
1389                           ModestDimmingRule *rule) 
1390 {
1391         TnyList *attachments;
1392         gint n_selected;
1393         gboolean nested_attachments = FALSE;
1394         gboolean selected_messages = FALSE;
1395         gboolean result = FALSE;
1396
1397         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1398
1399         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1400
1401                 /* Get selected atachments */
1402                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1403                 n_selected = tny_list_get_length (attachments);
1404
1405                 /* Check unique */
1406                 if (!result) {
1407                         if (unique)
1408                                 result = n_selected != 1;
1409                         else
1410
1411                                 result = n_selected < 1;
1412                 }
1413
1414                 /* Check attached type (view operation not required) */
1415                 if (!result && !for_view)  {
1416                         TnyIterator *iter;
1417                         iter = tny_list_create_iterator (attachments);
1418                         while (!tny_iterator_is_done (iter) && !result) {
1419                                 gboolean not_selectable = FALSE;
1420                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1421                                 TnyList *nested_list = tny_simple_list_new ();
1422                                 tny_mime_part_get_parts (mime_part, nested_list);
1423
1424                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
1425                                         TnyMsg *window_msg;
1426                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1427                                         if ((TnyMimePart *) window_msg != mime_part) {
1428                                                 selected_messages = TRUE;
1429                                                 not_selectable = TRUE;
1430                                         }
1431                                         g_object_unref (window_msg);
1432                                 }
1433                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1434                                         nested_attachments = TRUE;
1435                                         not_selectable = TRUE;
1436                                 }
1437                                 if (not_selectable)
1438                                         n_selected --;
1439                                 g_object_unref (nested_list);
1440                                 g_object_unref (mime_part);
1441                                 tny_iterator_next (iter);
1442                         }
1443                         g_object_unref (iter);
1444                 }
1445
1446                 /* No valid attachment available */
1447                 if (n_selected == 0)
1448                         result = TRUE;
1449
1450                 /* Set notifications */
1451                 if (result && rule != NULL) {
1452                         if (selected_messages) {
1453                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1454                         } else if (nested_attachments) {
1455                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1456                         } else if (n_selected == 0) {
1457                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1458                         } else if (unique) {
1459                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1460                         }
1461                 }
1462
1463                 /* Free */
1464                 g_object_unref (attachments);
1465         }
1466
1467         return result;
1468 }
1469
1470 static gboolean
1471 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
1472 {
1473         TnyList *attachments = NULL;
1474         TnyIterator *iter;
1475         gint purged = 0;
1476         gint n_attachments = 0;
1477         gboolean result = FALSE;
1478
1479         /* This should check if _all_ the attachments are already purged. If only some
1480          * of them are purged, then it does not cause dim as there's a confirmation dialog
1481          * for removing only local attachments */
1482
1483         /* Get selected atachments */
1484         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1485                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1486         }
1487
1488         if (attachments == NULL)
1489                 return FALSE;
1490
1491         if (tny_list_get_length (attachments) == 0) {
1492                 g_object_unref (attachments);
1493                 return FALSE;
1494         }
1495
1496         iter = tny_list_create_iterator (attachments);
1497         while (!tny_iterator_is_done (iter)) {
1498                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1499                 if (tny_mime_part_is_purged (mime_part)) {
1500                         purged++;
1501                 }
1502                 n_attachments++;
1503                 g_object_unref (mime_part);
1504                 tny_iterator_next (iter);
1505         }
1506         g_object_unref (iter);
1507
1508         /* Free */
1509         g_object_unref (attachments);
1510
1511         if (all)
1512                 result = (purged == n_attachments);
1513         else
1514                 result = (purged > 0);
1515
1516         /* This string no longer exists, refer to NB#75415 for more info
1517         if (result && (rule != NULL))
1518                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1519         */
1520
1521         return result;
1522 }
1523
1524 static gboolean
1525 _msg_download_in_progress (ModestWindow *win)
1526 {
1527         gboolean result = FALSE;
1528
1529         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
1530
1531         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1532                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
1533         }
1534
1535         return result;
1536 }
1537
1538 static void
1539 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
1540 {
1541         GSList **send_queues = (GSList **) userdata;
1542         *send_queues = g_slist_prepend (*send_queues, value);
1543 }
1544
1545 static gboolean
1546 _selected_msg_sent_in_progress (ModestWindow *win)
1547 {
1548         const DimmedState *state = modest_window_get_dimming_state (win);
1549         return (state) ? state->sent_in_progress : TRUE;
1550 }
1551
1552
1553 static gboolean
1554 _invalid_folder_for_purge (ModestWindow *win, 
1555                            ModestDimmingRule *rule)
1556 {
1557         TnyFolder *folder = NULL;
1558         TnyAccount *account = NULL;
1559         gboolean result = FALSE;
1560
1561         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1562
1563                 /* Get folder and account of message */
1564                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1565                 g_return_val_if_fail(msg != NULL, TRUE);
1566                 folder = tny_msg_get_folder (msg);
1567                 g_object_unref (msg);
1568                 if (folder == NULL) {
1569                         result = TRUE;
1570                         goto frees;
1571                 }
1572         } else {
1573                 g_return_val_if_reached (FALSE);
1574         }
1575         account = modest_tny_folder_get_account (folder);
1576         if (account == NULL) goto frees;
1577
1578         /* Check account */
1579         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
1580                 TnyFolderType types[2];
1581                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1582                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1583
1584                 if (_selected_folder_is_any_of_type (win, types, 2)) {
1585                         result = TRUE;
1586                 }
1587         } else {
1588                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
1589                 /* If it's a remote folder then dim */
1590                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
1591                                                                     protocol_type,
1592                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
1593                         result = TRUE;
1594                 }
1595         }
1596         
1597 frees:
1598         if (folder != NULL)
1599                 g_object_unref (folder);
1600         if (account != NULL)
1601                 g_object_unref (account);
1602         
1603         return result;
1604 }
1605
1606 static gboolean
1607 _transfer_mode_enabled (ModestWindow *win)
1608 {
1609         gboolean result = FALSE;
1610
1611         /* Check dimming */
1612         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1613                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
1614         } else if (MODEST_IS_FOLDER_WINDOW (win)) {
1615                 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
1616         } else if (MODEST_IS_HEADER_WINDOW (win)) {
1617                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
1618         } else {
1619                 g_warning("_transfer_mode_enabled called with wrong window type");
1620         }
1621
1622         return result;
1623 }
1624
1625 static gboolean
1626 _all_msgs_in_sending_status (ModestHeaderView *header_view)
1627 {
1628         GtkTreeModel *model;
1629         GtkTreeIter iter;
1630         gboolean all_sending = TRUE;
1631
1632         model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
1633         if (gtk_tree_model_get_iter_first (model, &iter)) {
1634                 do {
1635                         TnyHeader *header;
1636
1637                         gtk_tree_model_get (model, &iter,
1638                                             TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1639                                             &header,
1640                                             -1);
1641
1642                         if (header) {
1643                                 if (modest_tny_all_send_queues_get_msg_status (header) !=
1644                                     MODEST_TNY_SEND_QUEUE_SENDING)
1645                                         all_sending = FALSE;
1646                                 g_object_unref (header);
1647                         }
1648
1649                 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
1650         }
1651         return all_sending;
1652 }
1653
1654 gboolean 
1655 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
1656                                            gpointer user_data)
1657 {
1658         ModestDimmingRule *rule = NULL;
1659
1660         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1661         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1662         rule = MODEST_DIMMING_RULE (user_data);
1663
1664         /* Check dimmed rule */ 
1665         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
1666 }
1667
1668 gboolean
1669 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
1670                                          gpointer user_data)
1671 {
1672         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1673
1674         ModestMsgEditFormat format =
1675           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1676
1677         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
1678 }
1679
1680 static gboolean 
1681 _send_receive_in_progress (ModestWindow *win)
1682 {
1683         ModestMailOperationQueue *queue;
1684         GSList *op_list, *node;
1685         gboolean found_send_receive;
1686
1687         queue = modest_runtime_get_mail_operation_queue ();
1688         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
1689
1690         found_send_receive = FALSE;
1691         for (node = op_list; node != NULL; node = g_slist_next (node)) {
1692                 ModestMailOperation *op;
1693
1694                 op = (ModestMailOperation *) node->data;
1695                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
1696                         found_send_receive = TRUE;
1697                         break;
1698                 }
1699         }
1700
1701         if (op_list) {
1702                 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
1703                 g_slist_free (op_list);
1704         }
1705
1706         return found_send_receive;
1707 }
1708
1709 static gboolean
1710 _msgs_send_in_progress (void)
1711 {
1712         ModestCacheMgr *cache_mgr;
1713         GHashTable *send_queue_cache;
1714         ModestTnySendQueue *send_queue;
1715         GSList *send_queues = NULL, *node = NULL;
1716         gboolean found = FALSE;
1717
1718         cache_mgr = modest_runtime_get_cache_mgr ();
1719         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
1720                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
1721
1722         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
1723
1724         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
1725                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
1726
1727                 /* Check if msg uid is being processed inside send queue */
1728                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
1729                         found = TRUE;
1730                         break;
1731                 }
1732         }
1733
1734         g_slist_free (send_queues);
1735
1736         return found;
1737 }
1738
1739 /*****************************************************************************/
1740 /********************** HILDON2 only dimming rules ***************************/
1741 /*****************************************************************************/
1742
1743 gboolean 
1744 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
1745 {
1746         ModestDimmingRule *rule = NULL;
1747         gboolean dimmed = FALSE;
1748
1749         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
1750         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1751         rule = MODEST_DIMMING_RULE (user_data);
1752
1753         /* Check dimmed rule */ 
1754         dimmed = _transfer_mode_enabled (win);
1755         if (dimmed)
1756                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1757
1758         if (!dimmed)
1759                 dimmed = _forbid_outgoing_xfers (win);
1760
1761         if (!dimmed) {
1762                 GtkWidget *header_view;
1763                 TnyFolder *folder;
1764
1765                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
1766                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
1767                 if (folder) {
1768                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
1769                                 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
1770
1771                         if (!dimmed &&
1772                             (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
1773                                 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
1774                         }
1775                         g_object_unref (folder);
1776                 }
1777         }
1778
1779         return dimmed;
1780 }
1781
1782 gboolean 
1783 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
1784 {
1785         ModestDimmingRule *rule = NULL;
1786         gboolean dimmed = FALSE;
1787
1788         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
1789         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1790         rule = MODEST_DIMMING_RULE (user_data);
1791
1792         /* Check dimmed rule */ 
1793         dimmed = _transfer_mode_enabled (win);
1794         if (dimmed)
1795                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1796
1797         if (!dimmed)
1798                 dimmed = _forbid_outgoing_xfers (win);
1799
1800         if (!dimmed && MODEST_IS_FOLDER_WINDOW (win)) {
1801                 ModestFolderView *folder_view;
1802                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1803                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1804                                                                        MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
1805         }
1806
1807         if (!dimmed) {
1808                 dimmed = _transfer_mode_enabled (win);
1809                 if (dimmed)
1810                         modest_dimming_rule_set_notification (rule, "");
1811         }
1812
1813         return dimmed;
1814 }
1815
1816 gboolean 
1817 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
1818 {
1819         ModestDimmingRule *rule = NULL;
1820         gboolean dimmed = FALSE;
1821
1822         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
1823         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1824         rule = MODEST_DIMMING_RULE (user_data);
1825
1826         /* Check dimmed rule */ 
1827         dimmed = _transfer_mode_enabled (win);
1828         if (dimmed)
1829                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1830
1831         if (MODEST_IS_FOLDER_WINDOW (win)) {
1832                 ModestFolderView *folder_view;
1833                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1834                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1835                                                                        MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
1836         }
1837
1838         if (!dimmed) {
1839                 dimmed = _transfer_mode_enabled (win);
1840                 if (dimmed)
1841                         modest_dimming_rule_set_notification (rule, "");
1842         }
1843
1844         return dimmed;
1845 }
1846
1847 gboolean
1848 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
1849 {
1850         return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);
1851 }