Make modest_tny_mime_part_is_msg detection content type case insensitive.
[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
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_container_get_focus_child ((GtkContainer *) win);
722
723         if (!dimmed && GTK_IS_ENTRY (focused)) {
724                 const gchar *current_text;
725                 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
726                 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
727         }
728
729         if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
730                 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
731                 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
732         }
733
734         if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
735                 dimmed = FALSE;
736         return dimmed;
737 }
738
739 gboolean 
740 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
741 {
742         ModestDimmingRule *rule = NULL;
743         gboolean dimmed = FALSE;
744
745         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
746         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
747         rule = MODEST_DIMMING_RULE (user_data);
748
749         /* Check dimmed rule */ 
750         dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);                       
751
752         if (!dimmed) {
753                 dimmed = _purged_attach_selected (win, FALSE, NULL);
754                 if (dimmed) {
755                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
756                 }
757         }
758                 
759         return dimmed;
760 }
761
762 static gboolean
763 _not_valid_attachments (ModestWindow *win, gboolean save_not_remove)
764 {
765         gint n_attachments;
766         TnyList *attachments;
767         gboolean result = FALSE;
768
769         /* Get atachments */
770         attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
771         n_attachments = tny_list_get_length (attachments);
772
773         /* Check unique */              
774         if (!result) {
775                 result = n_attachments < 1;
776         }
777                 
778         /* Check attached type (view operation not required) */
779         if (!result)  {
780                 gint n_valid = 0;
781
782                 TnyIterator *iter;
783                 iter = tny_list_create_iterator (attachments);
784                 while (!tny_iterator_is_done (iter)) {
785                         gboolean is_valid = TRUE;
786                         TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
787                         TnyList *nested_list = tny_simple_list_new ();
788                         tny_mime_part_get_parts (mime_part, nested_list);
789
790                         if (tny_mime_part_is_purged (mime_part)) {
791                                 is_valid = FALSE;
792                         }
793                         
794                         if (is_valid && modest_tny_mime_part_is_msg (mime_part)) {
795                                 TnyMsg *window_msg;
796                                 window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
797                                 if (window_msg) {
798                                         if (save_not_remove && (TnyMimePart *) window_msg != mime_part) {
799                                                 is_valid = FALSE;
800                                         }
801                                         g_object_unref (window_msg);
802                                 }
803                                 if (is_valid && save_not_remove && tny_list_get_length (nested_list) > 0) {
804                                         is_valid = FALSE;
805                                 }
806                         }
807                         g_object_unref (nested_list);
808                         g_object_unref (mime_part);
809                         tny_iterator_next (iter);
810
811                         if (is_valid) 
812                                 n_valid++;
813                 }
814                 g_object_unref (iter);
815                 result = (n_valid == 0);
816         }
817         g_object_unref (attachments);
818         return result;
819
820 }
821
822 gboolean 
823 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
824 {
825         ModestDimmingRule *rule = NULL;
826         gboolean dimmed = FALSE;
827
828         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
829         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
830         rule = MODEST_DIMMING_RULE (user_data);
831
832         /* Check dimmed rule */ 
833
834         dimmed = _not_valid_attachments (win, TRUE);
835         return dimmed;
836 }
837
838 gboolean 
839 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
840 {
841         ModestDimmingRule *rule = NULL;
842         const DimmedState *state = NULL;
843         gboolean dimmed = FALSE;
844
845         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
846         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
847         rule = MODEST_DIMMING_RULE (user_data);
848         state = modest_window_get_dimming_state (win);
849
850
851         /* Check in view window if there's any attachment selected */
852         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
853                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
854                 if (dimmed)
855                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
856         }
857
858         if (!dimmed) {
859
860                 dimmed = _selected_msg_sent_in_progress (win);
861                 if (dimmed) {
862                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
863                 }
864         }
865
866         /* cannot purge in editable drafts nor pop folders */
867         if (!dimmed) {
868                 dimmed = _invalid_folder_for_purge (win, rule);
869                 if (dimmed)
870                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
871         }
872
873         /* Check if all attachments are already purged */
874         if (!dimmed) {
875                 dimmed = _purged_attach_selected (win, TRUE, rule);
876         }
877
878         return dimmed;
879 }
880
881 gboolean
882 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
883 {
884         ModestDimmingRule *rule = NULL;
885         gboolean dimmed = FALSE;
886
887         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
888         rule = MODEST_DIMMING_RULE (user_data);
889
890         /* Check dimmed rule */
891         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
892                 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
893         }
894
895         return dimmed;
896 }
897
898 gboolean
899 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
900 {
901         ModestDimmingRule *rule = NULL;
902         gboolean dimmed = FALSE;
903
904         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
905         rule = MODEST_DIMMING_RULE (user_data);
906
907         /* Check dimmed rule */
908         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
909                 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
910         }
911
912         return dimmed;
913 }
914
915 gboolean
916 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
917 {
918         ModestDimmingRule *rule = NULL;
919         const DimmedState *state = NULL;
920         gboolean dimmed = FALSE;
921
922         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
923         rule = MODEST_DIMMING_RULE (user_data);
924         state = modest_window_get_dimming_state (win);
925
926         /* Check common dimming rules */
927         dimmed = _invalid_clipboard_selected (win, rule);
928
929         return dimmed;
930 }
931
932 gboolean 
933 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
934 {
935         ModestDimmingRule *rule = NULL;
936         const DimmedState *state = NULL;
937         gboolean dimmed = FALSE;
938
939         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
940         rule = MODEST_DIMMING_RULE (user_data);
941         state = modest_window_get_dimming_state (win);
942
943         /* Check common dimming rules */
944         dimmed = _invalid_clipboard_selected (win, rule);
945
946         return dimmed;
947 }
948
949 gboolean
950 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
951 {
952         ModestDimmingRule *rule = NULL;
953         gboolean dimmed = FALSE;
954         
955         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
956         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
957         rule = MODEST_DIMMING_RULE (user_data);
958
959         /* Check common dimming rules */
960         ModestMsgEditFormat format;
961         format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
962
963         dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
964         if (dimmed)
965                 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
966
967         if (!dimmed) {
968                 GtkWidget *body;
969                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
970                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
971                 
972                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
973                 if (dimmed)
974                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
975         }
976                
977         
978         return dimmed;
979 }
980
981 gboolean 
982 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
983 {
984         ModestDimmingRule *rule = NULL;
985         gboolean dimmed = FALSE;
986         
987         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
988         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
989         rule = MODEST_DIMMING_RULE (user_data);
990
991         GtkWidget *body;
992         body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
993                                                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
994         
995         dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
996         if (dimmed)
997                 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
998         
999         return dimmed;
1000 }
1001
1002 gboolean 
1003 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1004 {
1005         ModestDimmingRule *rule = NULL;
1006         gboolean dimmed = FALSE;
1007         GtkWidget *focused = NULL;
1008         
1009         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1010         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1011         rule = MODEST_DIMMING_RULE (user_data);
1012
1013         focused = gtk_container_get_focus_child ((GtkContainer *) win);
1014
1015         dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1016         
1017         if (!dimmed) {
1018                 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1019         }
1020
1021         if (!dimmed) {
1022                 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1023                 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1024
1025                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1026                   ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1027         }
1028         
1029         return dimmed;
1030 }
1031
1032 gboolean 
1033 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1034 {
1035         ModestDimmingRule *rule = NULL;
1036         gboolean dimmed = FALSE;
1037         TnyList *selected_attachments = NULL;
1038         gint n_att_selected = 0;
1039         GtkWidget *attachments_view;
1040         
1041         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1042         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1043         rule = MODEST_DIMMING_RULE (user_data);
1044
1045         attachments_view = modest_msg_edit_window_get_child_widget (
1046                                                                     MODEST_MSG_EDIT_WINDOW (win),
1047                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1048         
1049         selected_attachments = modest_attachments_view_get_attachments (
1050                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1051         n_att_selected = tny_list_get_length (selected_attachments);
1052         g_object_unref (selected_attachments);
1053         
1054         dimmed = (n_att_selected < 1);  
1055         
1056         return dimmed;
1057 }
1058
1059 gboolean 
1060 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1061 {
1062         ModestDimmingRule *rule = NULL;
1063         gboolean dimmed = FALSE;
1064         GtkWidget *body_field;
1065
1066         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1067         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1068         rule = MODEST_DIMMING_RULE (user_data);
1069
1070         body_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1071                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1072
1073         if (!dimmed) {
1074                 GtkWidget *to_field, *cc_field, *bcc_field;
1075                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1076                 cc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1077                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1078                 to_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1079                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1080                 bcc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1081                                                                      MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1082                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1083                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1084                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1085
1086                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1087                            gtk_text_buffer_get_char_count (cc_buffer) +
1088                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1089                 if (dimmed)
1090                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1091         }
1092         
1093         return dimmed;
1094 }
1095
1096 gboolean 
1097 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1098 {
1099         ModestDimmingRule *rule = NULL;
1100         gboolean dimmed = FALSE;
1101         
1102         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1103         rule = MODEST_DIMMING_RULE (user_data);
1104
1105         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1106
1107         /* Check dimmed rule */
1108         dimmed = _transfer_mode_enabled (win);
1109         if (dimmed)
1110                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1111         
1112         if (!dimmed) {
1113                 dimmed = modest_msg_view_window_first_message_selected (
1114                                 MODEST_MSG_VIEW_WINDOW(win));
1115                 modest_dimming_rule_set_notification (rule, NULL);
1116         }
1117
1118         return dimmed;
1119 }
1120
1121 gboolean 
1122 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1123 {
1124         ModestDimmingRule *rule = NULL;
1125         gboolean dimmed = FALSE;
1126
1127         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1128         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1129         rule = MODEST_DIMMING_RULE (user_data);
1130
1131         /* Check dimmed rule */ 
1132         dimmed = _transfer_mode_enabled (win);                  
1133         if (dimmed)
1134                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1135         
1136         if (!dimmed) {
1137                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1138                 modest_dimming_rule_set_notification (rule, NULL);
1139         }
1140
1141         return dimmed;
1142 }
1143
1144
1145 gboolean
1146 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1147 {
1148         gboolean dimmed;
1149         ModestAccountMgr *mgr;
1150
1151         mgr = modest_runtime_get_account_mgr();
1152         dimmed = !modest_account_mgr_has_accounts(mgr, TRUE);
1153
1154         /* Dimm it if we only have metaaccounts */
1155         if (!dimmed) {
1156                 ModestProtocolRegistry *reg = modest_runtime_get_protocol_registry ();
1157                 GSList *account_names = modest_account_mgr_account_names (mgr, TRUE);
1158
1159                 if (account_names) {
1160                         ModestProtocolType store_protocol;
1161                         gboolean found = FALSE;
1162                         GSList *iter = account_names;
1163                         const gchar *tag = MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS;
1164
1165                         while (iter && !found) {
1166                                 gchar* account_name;
1167
1168                                 account_name = (gchar *) iter->data;
1169                                 store_protocol = modest_account_mgr_get_store_protocol (mgr, account_name);
1170
1171                                 if (!modest_protocol_registry_protocol_type_has_tag (reg, store_protocol, tag))
1172                                         found = TRUE;
1173                                 else
1174                                         iter = g_slist_next (iter);
1175                         }
1176                         modest_account_mgr_free_account_names (account_names);
1177                         dimmed = !found;
1178                 }
1179         }
1180
1181         return dimmed;
1182 }
1183
1184 gboolean
1185 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
1186 {
1187         /* We dim if no msg send is in progress (and then cancelling send all has no
1188          * effect */
1189         return !_msgs_send_in_progress ();
1190 }
1191
1192 gboolean 
1193 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1194 {
1195         ModestDimmingRule *rule = NULL;
1196         gboolean dimmed = FALSE;
1197         ModestAccountMgr *mgr;
1198         const gchar* account_name;
1199
1200         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1201         rule = MODEST_DIMMING_RULE (user_data);
1202         mgr = modest_runtime_get_account_mgr();
1203
1204         /* Check dimmed rule */
1205         account_name = modest_window_get_active_account (win);
1206
1207         if (account_name)
1208                 dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
1209         else
1210                 dimmed = TRUE;
1211
1212         if (dimmed)
1213                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1214
1215         return dimmed;
1216 }
1217
1218 gboolean 
1219 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1220 {
1221         ModestDimmingRule *rule = NULL;
1222         gboolean dimmed = FALSE;
1223
1224         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1225         rule = MODEST_DIMMING_RULE (user_data);
1226  
1227         /* Check dimmed rule */ 
1228         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1229         if (g_slist_length (account_names) < 1)
1230                 dimmed = TRUE;
1231         if (dimmed)
1232                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1233
1234         modest_account_mgr_free_account_names (account_names);
1235
1236         if (!dimmed) {
1237                 dimmed = _send_receive_in_progress (win);
1238         }
1239
1240         return dimmed;
1241 }
1242
1243 gboolean
1244 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1245 {
1246         GSList *recipients = NULL;
1247         gboolean has_recipients_to_add;
1248
1249         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1250
1251         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1252                 TnyMsg *msg;
1253
1254                 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1255
1256                 /* Message is loaded asynchronously, so this could happen */
1257                 if (!msg) {
1258                         TnyHeader *header;
1259
1260                         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
1261                         if (!header)
1262                                 return TRUE;
1263
1264                         recipients = modest_tny_msg_header_get_all_recipients_list (header);
1265                         g_object_unref (header);
1266                 } else {
1267                         recipients = modest_tny_msg_get_all_recipients_list (msg);
1268                         g_object_unref (msg);
1269                 }
1270         } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1271                 /* Check if there are pending addresses to add */
1272                 return !modest_msg_edit_window_has_pending_addresses ((ModestMsgEditWindow *) win);
1273         }
1274
1275         has_recipients_to_add = FALSE;
1276
1277         if (recipients) {
1278                 GSList *node;
1279                 for (node = recipients; node != NULL; node = g_slist_next (node)) {
1280                         const gchar *recipient = (const gchar *) node->data;
1281                         if (modest_text_utils_validate_recipient (recipient, NULL)) {
1282                                 if (!modest_address_book_has_address (recipient)) {
1283                                         has_recipients_to_add = TRUE;
1284                                         break;
1285                                 }
1286                         }
1287                 }
1288                 g_slist_foreach (recipients, (GFunc) g_free, NULL);
1289                 g_slist_free (recipients);
1290         }
1291
1292         return !has_recipients_to_add;
1293 }
1294
1295 /* *********************** static utility functions ******************** */
1296
1297 static gboolean
1298 _selected_folder_is_any_of_type (ModestWindow *win,
1299                                  TnyFolderType types[], 
1300                                  guint ntypes)
1301 {
1302         TnyFolderStore *folder = NULL;
1303         TnyFolderType folder_type;
1304         guint i=0;
1305         gboolean result = FALSE;
1306
1307         /*Get current folder */
1308         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1309                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1310                 for (i=0; i < ntypes; i++) {
1311                         result = result || folder_type == types[i];
1312                 }
1313         }
1314
1315         /* free */
1316         if (folder)
1317                 g_object_unref (folder);
1318
1319         return result;
1320 }
1321
1322 static gboolean
1323 _invalid_clipboard_selected (ModestWindow *win,
1324                              ModestDimmingRule *rule) 
1325 {
1326         gboolean result = FALSE;
1327         GtkWidget *focused = NULL;
1328
1329         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1330
1331         /* Get focuesed widget */
1332         focused = gtk_container_get_focus_child ((GtkContainer *) win);
1333
1334         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1335                 gboolean has_selection = FALSE;
1336                 if (GTK_IS_TEXT_VIEW (focused)) {
1337                         GtkTextBuffer *buffer = NULL;
1338                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1339                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
1340                 } else if (GTK_IS_EDITABLE (focused)) {
1341                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
1342                 }
1343                 result = !has_selection;
1344         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1345                 if (focused) {
1346                         MODEST_DEBUG_BLOCK (g_debug ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
1347                         if (GTK_IS_LABEL (focused) && 
1348                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
1349                                 result = TRUE;
1350                         } else if (GTK_IS_TEXT_VIEW (focused)) {
1351                                 GtkTextBuffer *buffer;
1352                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1353                                 result = !gtk_text_buffer_get_has_selection (buffer);
1354                         } else if (GTK_IS_HTML (focused)) {
1355                                 const gchar *sel;
1356                                 int len = -1;
1357                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1358                                 result = ((sel == NULL) || (sel[0] == '\0'));
1359                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
1360                                 result = TRUE;
1361                         } else {
1362                                 GtkClipboard *clipboard;
1363                                 gchar *selection;
1364
1365                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1366                                 /* Get clipboard selection*/
1367                                 selection = gtk_clipboard_wait_for_text (clipboard);
1368                                 /* Check dimming */
1369                                 result = (selection == NULL);
1370                                 g_free (selection);
1371                         }
1372                 } else {
1373                         result = TRUE;
1374                 }
1375                 if (result)
1376                         modest_dimming_rule_set_notification (rule, "");
1377         }
1378
1379         return result;
1380 }
1381
1382
1383 static gboolean
1384 _invalid_attach_selected (ModestWindow *win,
1385                           gboolean unique,
1386                           gboolean for_view,
1387                           gboolean for_remove,
1388                           ModestDimmingRule *rule) 
1389 {
1390         TnyList *attachments;
1391         gint n_selected;
1392         gboolean nested_attachments = FALSE;
1393         gboolean selected_messages = FALSE;
1394         gboolean result = FALSE;
1395
1396         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1397
1398         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1399
1400                 /* Get selected atachments */
1401                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1402                 n_selected = tny_list_get_length (attachments);
1403
1404                 /* Check unique */
1405                 if (!result) {
1406                         if (unique)
1407                                 result = n_selected != 1;
1408                         else
1409
1410                                 result = n_selected < 1;
1411                 }
1412
1413                 /* Check attached type (view operation not required) */
1414                 if (!result && !for_view)  {
1415                         TnyIterator *iter;
1416                         iter = tny_list_create_iterator (attachments);
1417                         while (!tny_iterator_is_done (iter) && !result) {
1418                                 gboolean not_selectable = FALSE;
1419                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1420                                 TnyList *nested_list = tny_simple_list_new ();
1421                                 tny_mime_part_get_parts (mime_part, nested_list);
1422
1423                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
1424                                         TnyMsg *window_msg;
1425                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1426                                         if ((TnyMimePart *) window_msg != mime_part) {
1427                                                 selected_messages = TRUE;
1428                                                 not_selectable = TRUE;
1429                                         }
1430                                         g_object_unref (window_msg);
1431                                 }
1432                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1433                                         nested_attachments = TRUE;
1434                                         not_selectable = TRUE;
1435                                 }
1436                                 if (not_selectable)
1437                                         n_selected --;
1438                                 g_object_unref (nested_list);
1439                                 g_object_unref (mime_part);
1440                                 tny_iterator_next (iter);
1441                         }
1442                         g_object_unref (iter);
1443                 }
1444
1445                 /* No valid attachment available */
1446                 if (n_selected == 0)
1447                         result = TRUE;
1448
1449                 /* Set notifications */
1450                 if (result && rule != NULL) {
1451                         if (selected_messages) {
1452                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1453                         } else if (nested_attachments) {
1454                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1455                         } else if (n_selected == 0) {
1456                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1457                         } else if (unique) {
1458                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1459                         }
1460                 }
1461
1462                 /* Free */
1463                 g_object_unref (attachments);
1464         }
1465
1466         return result;
1467 }
1468
1469 static gboolean
1470 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
1471 {
1472         TnyList *attachments = NULL;
1473         TnyIterator *iter;
1474         gint purged = 0;
1475         gint n_attachments = 0;
1476         gboolean result = FALSE;
1477
1478         /* This should check if _all_ the attachments are already purged. If only some
1479          * of them are purged, then it does not cause dim as there's a confirmation dialog
1480          * for removing only local attachments */
1481
1482         /* Get selected atachments */
1483         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1484                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1485         }
1486
1487         if (attachments == NULL)
1488                 return FALSE;
1489
1490         if (tny_list_get_length (attachments) == 0) {
1491                 g_object_unref (attachments);
1492                 return FALSE;
1493         }
1494
1495         iter = tny_list_create_iterator (attachments);
1496         while (!tny_iterator_is_done (iter)) {
1497                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1498                 if (tny_mime_part_is_purged (mime_part)) {
1499                         purged++;
1500                 }
1501                 n_attachments++;
1502                 g_object_unref (mime_part);
1503                 tny_iterator_next (iter);
1504         }
1505         g_object_unref (iter);
1506
1507         /* Free */
1508         g_object_unref (attachments);
1509
1510         if (all)
1511                 result = (purged == n_attachments);
1512         else
1513                 result = (purged > 0);
1514
1515         /* This string no longer exists, refer to NB#75415 for more info
1516         if (result && (rule != NULL))
1517                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1518         */
1519
1520         return result;
1521 }
1522
1523 static gboolean
1524 _msg_download_in_progress (ModestWindow *win)
1525 {
1526         gboolean result = FALSE;
1527
1528         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
1529
1530         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1531                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
1532         }
1533
1534         return result;
1535 }
1536
1537 static void
1538 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
1539 {
1540         GSList **send_queues = (GSList **) userdata;
1541         *send_queues = g_slist_prepend (*send_queues, value);
1542 }
1543
1544 static gboolean
1545 _selected_msg_sent_in_progress (ModestWindow *win)
1546 {
1547         const DimmedState *state = modest_window_get_dimming_state (win);
1548         return (state) ? state->sent_in_progress : TRUE;
1549 }
1550
1551
1552 static gboolean
1553 _invalid_folder_for_purge (ModestWindow *win, 
1554                            ModestDimmingRule *rule)
1555 {
1556         TnyFolder *folder = NULL;
1557         TnyAccount *account = NULL;
1558         gboolean result = FALSE;
1559
1560         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1561
1562                 /* Get folder and account of message */
1563                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1564                 g_return_val_if_fail(msg != NULL, TRUE);
1565                 folder = tny_msg_get_folder (msg);
1566                 g_object_unref (msg);
1567                 if (folder == NULL) {
1568                         result = TRUE;
1569                         goto frees;
1570                 }
1571         } else {
1572                 g_return_val_if_reached (FALSE);
1573         }
1574         account = modest_tny_folder_get_account (folder);
1575         if (account == NULL) goto frees;
1576
1577         /* Check account */
1578         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
1579                 TnyFolderType types[2];
1580                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1581                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1582
1583                 if (_selected_folder_is_any_of_type (win, types, 2)) {
1584                         result = TRUE;
1585                 }
1586         } else {
1587                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
1588                 /* If it's a remote folder then dim */
1589                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
1590                                                                     protocol_type,
1591                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
1592                         result = TRUE;
1593                 }
1594         }
1595         
1596 frees:
1597         if (folder != NULL)
1598                 g_object_unref (folder);
1599         if (account != NULL)
1600                 g_object_unref (account);
1601         
1602         return result;
1603 }
1604
1605 static gboolean
1606 _transfer_mode_enabled (ModestWindow *win)
1607 {
1608         gboolean result = FALSE;
1609
1610         /* Check dimming */
1611         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1612                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
1613         } else if (MODEST_IS_FOLDER_WINDOW (win)) {
1614                 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
1615         } else if (MODEST_IS_HEADER_WINDOW (win)) {
1616                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
1617         } else {
1618                 g_warning("_transfer_mode_enabled called with wrong window type");
1619         }
1620
1621         return result;
1622 }
1623
1624 static gboolean
1625 _all_msgs_in_sending_status (ModestHeaderView *header_view)
1626 {
1627         GtkTreeModel *model;
1628         GtkTreeIter iter;
1629         gboolean all_sending = TRUE;
1630
1631         model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
1632         if (gtk_tree_model_get_iter_first (model, &iter)) {
1633                 do {
1634                         TnyHeader *header;
1635
1636                         gtk_tree_model_get (model, &iter,
1637                                             TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1638                                             &header,
1639                                             -1);
1640
1641                         if (header) {
1642                                 if (modest_tny_all_send_queues_get_msg_status (header) !=
1643                                     MODEST_TNY_SEND_QUEUE_SENDING)
1644                                         all_sending = FALSE;
1645                                 g_object_unref (header);
1646                         }
1647
1648                 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
1649         }
1650         return all_sending;
1651 }
1652
1653 gboolean 
1654 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
1655                                            gpointer user_data)
1656 {
1657         ModestDimmingRule *rule = NULL;
1658
1659         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1660         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1661         rule = MODEST_DIMMING_RULE (user_data);
1662
1663         /* Check dimmed rule */ 
1664         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
1665 }
1666
1667 gboolean
1668 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
1669                                          gpointer user_data)
1670 {
1671         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1672
1673         ModestMsgEditFormat format =
1674           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1675
1676         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
1677 }
1678
1679 static gboolean 
1680 _send_receive_in_progress (ModestWindow *win)
1681 {
1682         ModestMailOperationQueue *queue;
1683         GSList *op_list, *node;
1684         gboolean found_send_receive;
1685
1686         queue = modest_runtime_get_mail_operation_queue ();
1687         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
1688
1689         found_send_receive = FALSE;
1690         for (node = op_list; node != NULL; node = g_slist_next (node)) {
1691                 ModestMailOperation *op;
1692
1693                 op = (ModestMailOperation *) node->data;
1694                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
1695                         found_send_receive = TRUE;
1696                         break;
1697                 }
1698         }
1699
1700         if (op_list) {
1701                 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
1702                 g_slist_free (op_list);
1703         }
1704
1705         return found_send_receive;
1706 }
1707
1708 static gboolean
1709 _msgs_send_in_progress (void)
1710 {
1711         ModestCacheMgr *cache_mgr;
1712         GHashTable *send_queue_cache;
1713         ModestTnySendQueue *send_queue;
1714         GSList *send_queues = NULL, *node = NULL;
1715         gboolean found = FALSE;
1716
1717         cache_mgr = modest_runtime_get_cache_mgr ();
1718         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
1719                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
1720
1721         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
1722
1723         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
1724                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
1725
1726                 /* Check if msg uid is being processed inside send queue */
1727                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
1728                         found = TRUE;
1729                         break;
1730                 }
1731         }
1732
1733         g_slist_free (send_queues);
1734
1735         return found;
1736 }
1737
1738 /*****************************************************************************/
1739 /********************** HILDON2 only dimming rules ***************************/
1740 /*****************************************************************************/
1741
1742 gboolean 
1743 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
1744 {
1745         ModestDimmingRule *rule = NULL;
1746         gboolean dimmed = FALSE;
1747
1748         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
1749         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1750         rule = MODEST_DIMMING_RULE (user_data);
1751
1752         /* Check dimmed rule */ 
1753         dimmed = _transfer_mode_enabled (win);
1754         if (dimmed)
1755                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1756
1757         if (!dimmed)
1758                 dimmed = _forbid_outgoing_xfers (win);
1759
1760         if (!dimmed) {
1761                 GtkWidget *header_view;
1762                 TnyFolder *folder;
1763
1764                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
1765                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
1766                 if (folder) {
1767                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
1768                                 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
1769
1770                         if (!dimmed &&
1771                             (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
1772                                 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
1773                         }
1774                         g_object_unref (folder);
1775                 }
1776         }
1777
1778         return dimmed;
1779 }
1780
1781 gboolean 
1782 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
1783 {
1784         ModestDimmingRule *rule = NULL;
1785         gboolean dimmed = FALSE;
1786
1787         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
1788         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1789         rule = MODEST_DIMMING_RULE (user_data);
1790
1791         /* Check dimmed rule */ 
1792         dimmed = _transfer_mode_enabled (win);
1793         if (dimmed)
1794                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1795
1796         if (!dimmed)
1797                 dimmed = _forbid_outgoing_xfers (win);
1798
1799         if (!dimmed && MODEST_IS_FOLDER_WINDOW (win)) {
1800                 ModestFolderView *folder_view;
1801                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1802                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1803                                                                        MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
1804         }
1805
1806         if (!dimmed) {
1807                 dimmed = _transfer_mode_enabled (win);
1808                 if (dimmed)
1809                         modest_dimming_rule_set_notification (rule, "");
1810         }
1811
1812         return dimmed;
1813 }
1814
1815 gboolean 
1816 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
1817 {
1818         ModestDimmingRule *rule = NULL;
1819         gboolean dimmed = FALSE;
1820
1821         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
1822         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1823         rule = MODEST_DIMMING_RULE (user_data);
1824
1825         /* Check dimmed rule */ 
1826         dimmed = _transfer_mode_enabled (win);
1827         if (dimmed)
1828                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1829
1830         if (MODEST_IS_FOLDER_WINDOW (win)) {
1831                 ModestFolderView *folder_view;
1832                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1833                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1834                                                                        MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
1835         }
1836
1837         if (!dimmed) {
1838                 dimmed = _transfer_mode_enabled (win);
1839                 if (dimmed)
1840                         modest_dimming_rule_set_notification (rule, "");
1841         }
1842
1843         return dimmed;
1844 }
1845
1846 gboolean
1847 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
1848 {
1849         return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);
1850 }