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