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