Modified dimming rule of "Add to contacts" to support edit windows
[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 #ifdef MODEST_TOOLKIT_HILDON2
55 #include <modest-header-window.h>
56 #include <modest-folder-window.h>
57 #endif
58
59
60 static gboolean _invalid_attach_selected (ModestWindow *win, 
61                                           gboolean unique, gboolean for_view, gboolean for_remove,
62                                           ModestDimmingRule *rule);
63 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
64 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
65 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
66 static gboolean _msg_download_in_progress (ModestWindow *win);
67 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
68 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
69 static gboolean _transfer_mode_enabled (ModestWindow *win);
70 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
71 static gboolean _send_receive_in_progress (ModestWindow *win);
72 static gboolean _msgs_send_in_progress (void);
73 static gboolean _all_msgs_in_sending_status (ModestHeaderView *header_view) G_GNUC_UNUSED;
74 static gboolean _forbid_outgoing_xfers (ModestWindow *window);
75
76 #ifndef MODEST_TOOLKIT_HILDON2
77 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
78 static gboolean _clipboard_is_empty (ModestWindow *win);
79 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
80 static gboolean _selected_folder_not_writeable (ModestMainWindow *win, gboolean for_paste);
81 static gboolean _selected_folder_not_moveable (ModestMainWindow *win);
82 static gboolean _selected_folder_not_renameable (ModestMainWindow *win);
83 static gboolean _selected_folder_not_deletable (ModestMainWindow *win);
84 static gboolean _selected_folder_is_root (ModestMainWindow *win);
85 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
86 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
87 static gboolean _header_view_is_all_selected (ModestMainWindow *win);
88 static gboolean _folder_view_has_focus (ModestWindow *win);
89 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
90 static gboolean _msg_download_completed (ModestMainWindow *win);
91 static gboolean _selected_folder_has_subfolder_with_same_name (ModestWindow *win);
92 #endif
93
94 #ifndef MODEST_TOOLKIT_HILDON2
95 static DimmedState *
96 _define_main_window_dimming_state (ModestMainWindow *window)
97 {
98         DimmedState *state = NULL;
99         GtkWidget *focused_widget = NULL;
100         GtkWidget *header_view = NULL;
101         GtkTreeModel *model = NULL;
102         TnyList *selected_headers = NULL;
103         TnyIterator *iter = NULL;
104         TnyHeader *header = NULL;
105         ModestCacheMgr *cache_mgr = NULL;
106         GHashTable *send_queue_cache = NULL;
107         ModestTnySendQueue *send_queue = NULL;
108         GSList *send_queues = NULL, *node = NULL;
109         ModestWindowMgr *mgr = NULL;
110         gboolean found = FALSE;
111         gchar *msg_uid = NULL;
112         TnyHeaderFlags flags;
113         gboolean all_deleted = TRUE;
114         gboolean all_seen = TRUE;
115         gboolean all_cached = TRUE;
116         gboolean all_has_attach = TRUE;
117         TnyFolder *folder = NULL;
118
119         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
120
121         /* Init state */
122         state = g_slice_new0 (DimmedState);
123         state->n_selected = 0;
124         state->already_opened_msg = 0;
125         state->any_marked_as_deleted = FALSE;
126         state->all_marked_as_deleted = FALSE;
127         state->any_marked_as_seen = FALSE;
128         state->all_marked_as_seen = FALSE;
129         state->any_marked_as_cached = FALSE;
130         state->all_marked_as_cached = FALSE;
131         state->any_has_attachments = FALSE;
132         state->all_has_attachments = FALSE;
133         state->sent_in_progress = FALSE;
134         state->all_selected = FALSE;
135
136         /* Get focused widget */
137         focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
138         if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
139                 state->n_selected++;
140                 return state;
141         } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
142                 header_view = focused_widget;           
143         } else {
144                 header_view = modest_main_window_get_child_widget (window, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
145         }
146         
147         /* Get header view and selected headers */
148         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
149         if (!selected_headers) 
150                 return state;
151
152         /* Examine selected headers */
153         iter = tny_list_create_iterator (selected_headers);
154         while (!tny_iterator_is_done (iter)) {
155                 header = TNY_HEADER (tny_iterator_get_current (iter));
156                 flags = tny_header_get_flags (header);
157                 
158                 /* No selected */
159                 state->n_selected++;
160                 
161                 /* Already opened */
162                 mgr = modest_runtime_get_window_mgr ();
163                 if (modest_window_mgr_find_registered_header (mgr, header, NULL))
164                         state->already_opened_msg++;
165                 
166
167                 /* Mark as deleted */           
168                 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
169                 state->all_marked_as_deleted = all_deleted;
170                 if (!state->any_marked_as_deleted)
171                         state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
172                 
173                 /* Mark as seen */
174                 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
175                 state->all_marked_as_seen = all_seen;
176                 if (!state->any_marked_as_seen)
177                         state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
178                 
179                 /* Mark as cached */
180                 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
181                 state->all_marked_as_cached = all_cached;
182                 if (!state->any_marked_as_cached)
183                         state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
184                 
185                 /* Mark has_attachments */
186                 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
187                 state->all_has_attachments = all_has_attach;
188                 if (!state->any_has_attachments)
189                         state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
190         
191                 /* sent in progress */
192                 folder = tny_header_get_folder (header);
193                 if (folder) {
194                         if (modest_tny_folder_guess_folder_type (folder) == TNY_FOLDER_TYPE_OUTBOX) {
195                                 msg_uid = modest_tny_send_queue_get_msg_id (header);
196                                 if (!state->sent_in_progress) {
197                                         cache_mgr = modest_runtime_get_cache_mgr ();
198                                         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
199                                                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
200                         
201                                         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
202                                         
203                                         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
204                                                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
205                                                 
206                                                 /* Check if msg uid is being processed inside send queue */
207                                                 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);          
208                                         }
209                                         state->sent_in_progress = found;
210                                 }
211                         }
212                         g_object_unref (folder);
213                 }
214                 tny_iterator_next (iter);
215                 g_object_unref (header);
216         }
217
218         /* check if all the headers are selected or not */
219         model = gtk_tree_view_get_model(GTK_TREE_VIEW(header_view));
220         if (model != NULL){
221                 gint count;
222                 count = gtk_tree_model_iter_n_children(model, NULL);
223                 if(state->n_selected == count)
224                         state->all_selected = TRUE;
225         }
226
227         /* Free */
228         g_free(msg_uid);
229         g_object_unref(selected_headers);
230         g_object_unref(iter);
231         g_slist_free (send_queues);
232         
233         return state;
234 }
235 #endif
236
237 static DimmedState *
238 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
239 {
240         DimmedState *state = NULL;
241         TnyHeader *header = NULL;
242         ModestCacheMgr *cache_mgr = NULL;
243         GHashTable *send_queue_cache = NULL;
244         ModestTnySendQueue *send_queue = NULL;
245         GSList *send_queues = NULL, *node = NULL;
246         gboolean found = FALSE;
247         gchar *msg_uid = NULL;
248         TnyHeaderFlags flags;
249         gboolean all_deleted = TRUE;
250         gboolean all_seen = TRUE;
251         gboolean all_cached = TRUE;
252         gboolean all_has_attach = TRUE;
253                         
254         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
255
256         /* Init state */
257         state = g_slice_new0 (DimmedState);
258         state->n_selected = 0;
259         state->already_opened_msg = 0;
260         state->any_marked_as_deleted = FALSE;
261         state->all_marked_as_deleted = FALSE;
262         state->any_marked_as_seen = FALSE;
263         state->all_marked_as_seen = FALSE;
264         state->any_marked_as_cached = FALSE;
265         state->all_marked_as_cached = FALSE;
266         state->any_has_attachments = FALSE;
267         state->all_has_attachments = FALSE;
268         state->sent_in_progress = FALSE;
269
270         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
271         if (header == NULL)
272                 return state;
273         g_return_val_if_fail (TNY_IS_HEADER(header), state);
274         flags = tny_header_get_flags (header);
275
276         /* Selected */
277         state->n_selected++;
278
279         /* Mark as deleted */           
280         all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
281         state->all_marked_as_deleted = all_deleted;
282         if (!state->any_marked_as_deleted)
283                 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
284         
285         /* Mark as seen */
286         all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
287         state->all_marked_as_seen = all_seen;
288         if (!state->any_marked_as_seen)
289                 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
290         
291         /* Mark as cached */
292         all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
293         state->all_marked_as_cached = all_cached;
294         if (!state->any_marked_as_cached)
295                 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
296         
297         /* Mark has_attachments */
298         all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
299         state->all_has_attachments = all_has_attach;
300         if (!state->any_has_attachments)
301                 state->any_has_attachments = (flags & TNY_HEADER_FLAG_ATTACHMENTS)?1:0;
302         
303         /* sent in progress */
304         msg_uid = modest_tny_send_queue_get_msg_id (header);
305         if (!state->sent_in_progress) {
306                 cache_mgr = modest_runtime_get_cache_mgr ();
307                 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
308                                                                MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
309                 
310                 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
311                 
312                 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
313                         send_queue = MODEST_TNY_SEND_QUEUE (node->data);
314                         
315                         /* Check if msg uid is being processed inside send queue */
316                         found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);          
317                 }
318                 state->sent_in_progress = found;
319         }
320         
321         /* Free */
322         g_free(msg_uid);
323         g_object_unref (header);
324         g_slist_free (send_queues);
325
326         return state;
327 }
328
329    
330 DimmedState *
331 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
332 {
333         DimmedState *state = NULL;
334
335         g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
336
337
338         if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
339                 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
340         }
341 #ifndef MODEST_TOOLKIT_HILDON2
342         else if (MODEST_IS_MAIN_WINDOW (window)) {
343                 state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
344         }
345 #endif
346
347         return state;
348 }
349
350 gboolean
351 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
352 {
353         ModestDimmingRule *rule = NULL;
354         gboolean dimmed = FALSE;
355
356         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
357         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
358         rule = MODEST_DIMMING_RULE (user_data);
359
360         /* Check dimmed rule */
361 #ifndef MODEST_TOOLKIT_HILDON2
362         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
363                 dimmed = _msg_download_in_progress (win);
364                 if (dimmed)
365                         modest_dimming_rule_set_notification (rule, "");
366         } else if (MODEST_IS_MAIN_WINDOW(win)) {
367                 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
368                                                           TRUE);
369                 if (dimmed)
370                         modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
371         }
372 #endif
373         return dimmed;
374 }
375
376 #ifndef MODEST_TOOLKIT_HILDON2
377 gboolean
378 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
379 {
380         ModestDimmingRule *rule = NULL;
381         GtkWidget *folder_view = NULL;
382         TnyFolderStore *parent_folder = NULL;
383         gboolean dimmed = FALSE;
384
385         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
386         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
387
388         rule = MODEST_DIMMING_RULE (user_data);
389
390         dimmed = _transfer_mode_enabled (win);
391         if (dimmed) {
392                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
393                 return dimmed;
394         }
395
396         /* Get selected folder as parent of new folder to create */
397         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
398                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
399         if (!folder_view) /* folder view may not have been created yet */
400                 return TRUE;
401
402         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
403         if (!parent_folder)
404                 return TRUE;
405
406         if (TNY_IS_ACCOUNT (parent_folder)) {
407                 /* If it's the local account then do not dim */
408                 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
409                         dimmed = FALSE;
410                 } else {
411                         ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (parent_folder));
412                         if (protocol_type != MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
413                                 ModestProtocolRegistry *protocol_registry;
414
415                                 protocol_registry = modest_runtime_get_protocol_registry ();
416                                 /* If account does not support folders (pop) then dim */
417                                 dimmed = (!modest_protocol_registry_protocol_type_has_tag (protocol_registry, protocol_type,
418                                                                                            MODEST_PROTOCOL_REGISTRY_STORE_HAS_FOLDERS));
419                                 if (dimmed)
420                                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
421                         }
422                 }
423         } else {        
424                 TnyFolderType types[3];
425                                 
426                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
427                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
428                 types[2] = TNY_FOLDER_TYPE_SENT;
429
430                 /* Apply folder rules */        
431                 if (!dimmed) {
432                         dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), FALSE);
433                         if (dimmed)
434                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
435                 }
436                 if (!dimmed) {
437                         dimmed = _selected_folder_is_any_of_type (win, types, 3);
438                         if (dimmed)
439                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
440                 }
441         }
442
443         /* if not the folder is selected then dim */
444         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
445                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
446         if (folder_view && !gtk_widget_is_focus (folder_view)) 
447                 dimmed = TRUE;
448
449         g_object_unref (parent_folder);
450
451         return dimmed;
452 }
453 #endif
454
455 gboolean 
456 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
457 {
458         ModestDimmingRule *rule = NULL;
459         gboolean dimmed = FALSE;
460
461         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
462         rule = MODEST_DIMMING_RULE (user_data);
463
464 #ifdef MODEST_TOOLKIT_HILDON2
465         if (MODEST_IS_FOLDER_WINDOW (win)) {
466                 dimmed = modest_ui_dimming_rules_on_folder_window_delete (win, user_data);
467         } else if (MODEST_IS_HEADER_WINDOW (win)) {
468
469                 if (!dimmed)
470                         dimmed = _transfer_mode_enabled (win);
471
472                 if (dimmed)
473                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
474
475                 if (!dimmed) {
476                         GtkWidget *header_view;
477                         TnyFolder *folder;
478
479                         header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
480                         folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
481                         if (folder) {
482                                 dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
483                                         modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
484
485                                 if (!dimmed &&
486                                     (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
487                                         dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
488                                 }
489                                 g_object_unref (folder);
490                         }
491                 }
492 #else
493         GtkWidget *folder_view = NULL;
494         GtkWidget *header_view = NULL;
495
496         if (MODEST_IS_MAIN_WINDOW (win)) {
497                 /* Get the folder view */
498                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
499                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
500
501                 /* Get header view */
502                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
503                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
504
505                 if (header_view && gtk_widget_is_focus (header_view)) 
506                         dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
507
508                 if (folder_view && gtk_widget_is_focus (folder_view)) 
509                         dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
510
511                 if (header_view && folder_view &&
512                     !gtk_widget_is_focus (header_view) &&
513                     !gtk_widget_is_focus (folder_view)) {
514                         dimmed = TRUE;
515                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
516                 }
517         } else {
518                 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
519 #endif
520         }
521
522         return dimmed;
523 }
524
525 #ifndef MODEST_TOOLKIT_HILDON2
526 gboolean 
527 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
528 {
529         ModestDimmingRule *rule = NULL;
530         TnyFolderType types[6];
531         gboolean dimmed = FALSE;
532
533         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
534         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
535         rule = MODEST_DIMMING_RULE (user_data);
536
537         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
538         types[1] = TNY_FOLDER_TYPE_OUTBOX;
539         types[2] = TNY_FOLDER_TYPE_SENT;
540         types[3] = TNY_FOLDER_TYPE_INBOX;
541         types[4] = TNY_FOLDER_TYPE_ROOT;
542         types[5] = TNY_FOLDER_TYPE_ARCHIVE;
543
544                 
545         /* Check dimmed rule */ 
546         dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
547         if (dimmed)
548                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
549         if (!dimmed) {
550                 dimmed = _selected_folder_is_any_of_type (win, types, 6);
551                 if (dimmed)
552                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
553         }
554         if (!dimmed) {
555                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
556                 if (dimmed)
557                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
558         }
559         if (!dimmed) {
560                 dimmed = _transfer_mode_enabled (win);
561                 if (dimmed)
562                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
563         }
564
565         return dimmed;
566 }
567 #endif
568
569 gboolean
570 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
571 {
572         gboolean dimmed = FALSE;
573
574 #ifdef MODEST_TOOLKIT_HILDON2
575         if (MODEST_IS_HEADER_WINDOW (win)) {
576                 return FALSE;
577         }
578 #else
579         ModestDimmingRule *rule = NULL;
580
581         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
582         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
583
584         rule = MODEST_DIMMING_RULE (user_data);
585
586         /* Check dimmed rule */ 
587         dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
588
589         if (!dimmed)
590                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
591 #endif
592
593         return dimmed;
594 }
595
596 gboolean
597 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
598 {
599         ModestDimmingRule *rule = NULL;
600         TnyFolderType types[4];
601         gboolean dimmed = FALSE;
602
603         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
604         rule = MODEST_DIMMING_RULE (user_data);
605
606         types[0] = TNY_FOLDER_TYPE_DRAFTS;
607         types[1] = TNY_FOLDER_TYPE_OUTBOX;
608         types[2] = TNY_FOLDER_TYPE_SENT;
609         types[3] = TNY_FOLDER_TYPE_ARCHIVE;
610
611 #ifndef MODEST_TOOLKIT_HILDON2
612         /* Check dimmed rule */
613         if (MODEST_IS_MAIN_WINDOW (win)) {
614                 dimmed = _selected_folder_not_renameable (MODEST_MAIN_WINDOW(win));
615                 if (dimmed)
616                         modest_dimming_rule_set_notification (rule, "");
617                 if (!dimmed) {
618                         dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
619                         if (dimmed)
620                                 modest_dimming_rule_set_notification (rule, "");
621                 }
622         }
623 #else
624         if (MODEST_IS_FOLDER_WINDOW (win)) {
625                 ModestFolderView *folder_view;
626                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
627                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
628                                                                        MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE);
629         }
630 #endif
631
632         if (!dimmed) {
633                 dimmed = _selected_folder_is_any_of_type (win, types, 4);
634                 if (dimmed)
635                         modest_dimming_rule_set_notification (rule, "");
636         }
637
638         return dimmed;
639 }
640
641 #ifndef MODEST_TOOLKIT_HILDON2
642 gboolean
643 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
644 {
645         ModestDimmingRule *rule = NULL;
646         gboolean dimmed = FALSE;
647         const DimmedState *state = NULL;
648
649         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
650         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
651         rule = MODEST_DIMMING_RULE (user_data);
652         state = modest_window_get_dimming_state (win);
653
654         /* Check dimmed rule */
655         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
656         if (!dimmed) {
657                 if (state)
658                         dimmed = state->any_marked_as_deleted;
659                 if (dimmed) {
660                         gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
661                         modest_dimming_rule_set_notification (rule, msg);
662                         g_free (msg);
663                 }
664         }
665         if (!dimmed) {
666                 dimmed = _selected_msg_sent_in_progress (win);
667                 if (dimmed)
668                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
669         }
670
671         return dimmed;
672 }
673 #endif
674
675 gboolean 
676 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
677 {
678         ModestDimmingRule *rule = NULL;
679         gboolean dimmed = FALSE;
680         TnyFolderType types[3];
681
682         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
683         rule = MODEST_DIMMING_RULE (user_data);
684
685         types[0] = TNY_FOLDER_TYPE_DRAFTS;
686         types[1] = TNY_FOLDER_TYPE_OUTBOX;
687         types[2] = TNY_FOLDER_TYPE_ROOT;
688
689         /* Check dimmed rule */
690         dimmed = _selected_folder_is_any_of_type (win, types, 3);
691         if (dimmed)
692                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
693
694
695         /* msg view window dimming rules */
696         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
697
698                 /* This could happen if we load the msg view window with a
699                    preview before loading the full message */
700                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
701                 if (!msg) {
702                         dimmed = TRUE;
703                 } else {
704                         g_object_unref (msg);
705                 }
706
707                 if (!dimmed) {
708                         dimmed = _transfer_mode_enabled (win);
709                         if (dimmed)
710                                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
711                 }
712                 if (!dimmed) {
713                         dimmed = _msg_download_in_progress (win);
714                         if (dimmed)
715                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
716                 }
717 #ifndef MODEST_TOOLKIT_HILDON2
718         /* main window dimming rules */
719         } else if (MODEST_IS_MAIN_WINDOW(win)) {
720                 if (!dimmed) {
721                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
722                         if (dimmed)
723                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
724                 }
725                 if (!dimmed) {
726                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
727                 }
728 #endif
729         }
730
731         return dimmed;
732 }
733
734 #ifndef MODEST_TOOLKIT_HILDON2
735 gboolean
736 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
737 {
738         ModestDimmingRule *rule = NULL;
739         gboolean dimmed = FALSE;
740
741         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
742         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
743         rule = MODEST_DIMMING_RULE (user_data);
744
745         /* Check dimmed rule */ 
746         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);     
747         if (!dimmed) {
748                 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
749                 if (dimmed)
750                         modest_dimming_rule_set_notification (rule, "");
751         }
752
753         return dimmed;
754 }
755 #endif
756
757 gboolean 
758 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
759 {
760         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
761
762         return TRUE;
763 }
764
765 static gboolean
766 _message_already_sent (ModestMsgViewWindow *view_window)
767 {
768         TnyHeader *header;
769         TnyFolder *folder;
770         gboolean already_sent = FALSE;
771
772         header = modest_msg_view_window_get_header (view_window);
773         if (header) {
774                 folder = tny_header_get_folder (header);
775                 if (folder) {
776                         if (modest_tny_folder_guess_folder_type (folder) ==
777                             TNY_FOLDER_TYPE_OUTBOX) {
778                                 ModestTnySendQueueStatus status = 
779                                         modest_tny_all_send_queues_get_msg_status (header);
780                                 if (status == MODEST_TNY_SEND_QUEUE_UNKNOWN ||
781                                     status == MODEST_TNY_SEND_QUEUE_SENDING)
782                                         already_sent = TRUE;
783                         }
784                         g_object_unref (folder);
785                 }
786                 g_object_unref (header);
787         }
788         return already_sent;
789 }
790
791
792 gboolean 
793 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
794 {
795         ModestDimmingRule *rule = NULL;
796         const DimmedState *state = NULL;
797         gboolean dimmed = FALSE;
798
799         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
800         rule = MODEST_DIMMING_RULE (user_data);
801         state = modest_window_get_dimming_state (win);
802
803         /* If we're in transfer mode then do not allow to delete messages */
804         dimmed = _transfer_mode_enabled (win);
805         if (dimmed) {
806                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
807                 return dimmed;
808         }
809
810         /* Check dimmed rule */ 
811 #ifdef MODEST_TOOLKIT_HILDON2
812         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
813                 /* This could happen if we load the msg view window with a
814                    preview before loading the full message */
815                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
816                 if (!msg) {
817                         dimmed = TRUE;
818                 } else {
819                         g_object_unref (msg);
820                 }
821
822                 if (!dimmed) {
823                         if (state)
824                                 dimmed = state->any_marked_as_deleted;
825                         if (dimmed) {
826                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
827                                 modest_dimming_rule_set_notification (rule, msg);
828                                 g_free (msg);
829                         }
830                 }
831                 if (!dimmed) {
832                         if (state)
833                                 dimmed = state->sent_in_progress;
834                         if (dimmed)
835                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
836                 }
837
838                 /* This could happen if we're viewing a message of the
839                    outbox that has been already sent */
840                 if (!dimmed)
841                         dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
842
843                 /* The delete button should be dimmed when viewing an attachment,
844                  * but should be enabled when viewing a message from the list, 
845                  * or when viewing a search result.
846                  */
847                 if (!dimmed) {
848                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
849                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
850                                 if (dimmed) {
851                                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
852                                 }
853                         }
854                 }
855 #else
856         } else if (MODEST_IS_MAIN_WINDOW (win)) {
857                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
858                 if (dimmed)
859                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
860                 if (!dimmed) {
861                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
862                 }
863                 if (!dimmed) {
864                         if (state)
865                                 dimmed = state->sent_in_progress;
866                         if (dimmed)
867                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
868                 }
869                 if (!dimmed) {
870                         if (state)
871                                 dimmed = state->any_marked_as_deleted;
872                         if (dimmed) {
873                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
874                                 modest_dimming_rule_set_notification (rule, msg);
875                                 g_free (msg);
876                         }
877                 }
878                 if (!dimmed) {
879                         if (state) {
880                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
881                                 if (dimmed) {
882                                         gchar *message = NULL;
883
884                                         message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"),
885                                                                   state->already_opened_msg);
886                                         modest_dimming_rule_set_notification (rule, message);
887                                         g_free(message);
888                                 }
889                         }
890                 }
891 #endif
892         }
893
894         return dimmed;
895 }
896
897 gboolean 
898 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
899 {
900         ModestDimmingRule *rule = NULL;
901         gboolean dimmed = FALSE;
902
903         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
904         rule = MODEST_DIMMING_RULE (user_data);
905
906 #ifndef MODEST_TOOLKIT_HILDON2
907         /* main window dimming rules */
908         if (MODEST_IS_MAIN_WINDOW(win)) {
909                 GtkWidget *header_view = NULL;
910
911                 /* Check dimmed rule */
912                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
913                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
914
915                 /* If the header view has the focus: */
916                 if (header_view && gtk_widget_is_focus (header_view)) {
917                         /* Check dimmed rule */ 
918                         if (!dimmed)
919                                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
920                 }
921                 else {
922                         /* If the folder view has the focus: */
923                         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
924                                 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
925                         if (folder_view && gtk_widget_is_focus (folder_view)) {
926                                 TnyFolderStore *folder_store
927                                         = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
928                                 if (folder_store) {
929                                         /* Only enable for folders, not accounts,
930                                          * though the UI spec is not clear about that.
931                                          * If we enable this for accounts then we must 
932                                          * add code to handle them in modest_ui_actions_on_details(). */
933                                         if (!TNY_IS_FOLDER(folder_store)) {
934                                                 dimmed = TRUE;
935                                                 modest_dimming_rule_set_notification (rule, "");
936                                         }
937
938                                         g_object_unref (folder_store);
939                                 } else {
940                                         dimmed = TRUE;
941                                         modest_dimming_rule_set_notification (rule, "");
942                                 }
943                                 if (!dimmed) {
944                                         dimmed = _msg_download_in_progress (win);
945                                         if (dimmed)
946                                                 modest_dimming_rule_set_notification (rule, "");
947                                 }
948
949                         } else {
950                                 return TRUE;
951                         }
952                 }
953         /* msg view window dimming rules */
954         } else {
955 #else
956                 {
957 #endif
958                 /* Check dimmed rule */ 
959                 if (MODEST_IS_MSG_VIEW_WINDOW (win))
960                         dimmed = _msg_download_in_progress (win);
961                 if (dimmed)
962                         modest_dimming_rule_set_notification (rule, "");
963         }
964
965         return dimmed;
966 }
967
968 gboolean
969 modest_ui_dimming_rules_on_fetch_images (ModestWindow *win, gpointer user_data)
970 {
971         gboolean dimmed = FALSE;
972
973         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
974
975         dimmed = !modest_msg_view_window_has_blocked_external_images (MODEST_MSG_VIEW_WINDOW (win));
976
977         return dimmed;
978 }
979
980
981 gboolean 
982 modest_ui_dimming_rules_on_mark_as_read_msg_in_view (ModestWindow *win, gpointer user_data)
983 {
984         ModestDimmingRule *rule = NULL;
985         TnyHeader *header;
986         TnyHeaderFlags flags;
987         gboolean dimmed = FALSE;
988
989
990         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
991         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
992         rule = MODEST_DIMMING_RULE (user_data);
993
994         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
995         if (!header) {
996                 dimmed = TRUE;
997         }
998
999         /* If the viewer is showing a message sent as attachment */
1000         if (!dimmed)
1001                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1002
1003         if (!dimmed) {
1004                 flags = tny_header_get_flags (header);
1005                 if (flags & TNY_HEADER_FLAG_SEEN)
1006                         dimmed = TRUE;
1007         }
1008
1009         if (header)
1010                 g_object_unref (header);
1011         return dimmed;
1012 }
1013
1014
1015 gboolean 
1016 modest_ui_dimming_rules_on_mark_as_unread_msg_in_view (ModestWindow *win, gpointer user_data)
1017 {
1018         ModestDimmingRule *rule = NULL;
1019         TnyHeader *header;
1020         TnyHeaderFlags flags;
1021         gboolean dimmed = FALSE;
1022         
1023
1024         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1025         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1026         rule = MODEST_DIMMING_RULE (user_data);
1027         
1028         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
1029         if (!header) {
1030                 dimmed = TRUE;
1031         }
1032
1033         /* If the viewer is showing a message sent as attachment */
1034         if (!dimmed)
1035                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1036
1037         if (!dimmed) {
1038                 flags = tny_header_get_flags (header);
1039                 if (!(flags & TNY_HEADER_FLAG_SEEN))
1040                         dimmed = TRUE;
1041         }
1042
1043         if (header)
1044                 g_object_unref (header);
1045         return dimmed;
1046 }
1047
1048 #ifndef MODEST_TOOLKIT_HILDON2
1049 gboolean
1050 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
1051 {
1052         ModestDimmingRule *rule = NULL;
1053         TnyHeaderFlags flags;
1054         const DimmedState *state = NULL;
1055         gboolean dimmed = FALSE;
1056
1057         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1058         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1059         rule = MODEST_DIMMING_RULE (user_data);
1060         state = modest_window_get_dimming_state (win);
1061
1062         flags = TNY_HEADER_FLAG_SEEN;
1063
1064         /* Check dimmed rule */
1065         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1066         if (!dimmed) {
1067                 if (state)
1068                         dimmed = state->all_marked_as_seen;
1069                 if (dimmed)
1070                         modest_dimming_rule_set_notification (rule, "");
1071         }
1072         return dimmed;
1073 }
1074
1075 gboolean
1076 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
1077 {
1078         ModestDimmingRule *rule = NULL;
1079         TnyHeaderFlags flags;
1080         const DimmedState *state = NULL;
1081         gboolean dimmed = FALSE;
1082
1083         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1084         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1085         rule = MODEST_DIMMING_RULE (user_data);
1086         state = modest_window_get_dimming_state (win);
1087
1088         flags = TNY_HEADER_FLAG_SEEN;
1089
1090         /* Check dimmed rule */
1091         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1092         if (!dimmed) {
1093                 if (state)
1094                         dimmed = !state->any_marked_as_seen;
1095                 if (dimmed)
1096                         modest_dimming_rule_set_notification (rule, "");
1097         }
1098
1099         return dimmed;
1100 }
1101 #endif
1102
1103 gboolean 
1104 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
1105 {
1106         ModestDimmingRule *rule = NULL;
1107         gboolean dimmed = FALSE;
1108
1109         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1110         rule = MODEST_DIMMING_RULE (user_data);
1111
1112 #ifndef MODEST_TOOLKIT_HILDON2
1113         if (MODEST_IS_MAIN_WINDOW (win)) 
1114                 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
1115 #else
1116         if (MODEST_IS_HEADER_WINDOW (win))
1117                 dimmed = modest_ui_dimming_rules_on_header_window_move_to (win, user_data);
1118         else if (MODEST_IS_FOLDER_WINDOW (win))
1119                 dimmed = modest_ui_dimming_rules_on_folder_window_move_to (win, user_data);
1120 #endif
1121         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
1122                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
1123
1124         return dimmed;
1125 }
1126
1127 #ifndef MODEST_TOOLKIT_HILDON2
1128 gboolean
1129 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
1130 {
1131         GtkWidget *folder_view = NULL;
1132         ModestDimmingRule *rule = NULL;
1133         const DimmedState *state = NULL;
1134         gboolean dimmed = FALSE;
1135
1136         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1137         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1138         rule = MODEST_DIMMING_RULE (user_data);
1139         state = modest_window_get_dimming_state (win);
1140
1141         /* Get the folder view */
1142         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1143                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1144
1145         if (folder_view) {
1146                 TnyFolderStore *selected = modest_folder_view_get_selected ((ModestFolderView *)folder_view);
1147                 if (selected) {
1148                         TnyAccount *account = NULL;
1149
1150                         if (TNY_IS_ACCOUNT (selected)) {
1151                                 account = g_object_ref (selected);
1152                         } else if (!TNY_IS_MERGE_FOLDER (selected)){
1153                                 account = tny_folder_get_account (TNY_FOLDER (selected));
1154                         }
1155                         if (account) {
1156                                 ModestProtocolType protocol_type;
1157
1158                                 protocol_type = modest_tny_account_get_protocol_type (account);
1159                                 dimmed  = modest_protocol_registry_protocol_type_has_tag
1160                                         (modest_runtime_get_protocol_registry (),
1161                                          protocol_type,
1162                                          MODEST_PROTOCOL_REGISTRY_STORE_FORBID_OUTGOING_XFERS);
1163
1164                                 g_object_unref (account);
1165                         }
1166                         g_object_unref (selected);
1167                 }
1168         }
1169
1170         /* Check diming rules for folders transfer  */
1171         if (!dimmed && folder_view && gtk_widget_is_focus (folder_view)) {
1172                 TnyFolderType types[5];
1173
1174                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1175                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1176                 types[2] = TNY_FOLDER_TYPE_SENT;
1177                 types[3] = TNY_FOLDER_TYPE_ROOT; 
1178                 types[4] = TNY_FOLDER_TYPE_INBOX; 
1179                 
1180                 /* Apply folder rules */        
1181                 dimmed = _selected_folder_not_moveable (MODEST_MAIN_WINDOW(win));
1182                 if (dimmed)
1183                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));           
1184                 if (!dimmed) {
1185                         dimmed = _selected_folder_is_any_of_type (win, types, 5);
1186                         if (dimmed)
1187                                 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1188                 }
1189         }
1190         
1191         /* Check diming rules for messages transfer  */
1192         if (!dimmed) {
1193                 if (state) {
1194                         dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1195                         if (dimmed) {
1196                                 gchar *message = g_strdup_printf(_("emev_nc_unabletomove_items"),
1197                                                                  state->already_opened_msg);
1198                                 modest_dimming_rule_set_notification (rule, message);
1199                                 g_free(message);
1200                         }
1201                 }
1202         }
1203         if (!dimmed) {
1204                 if (!(folder_view && gtk_widget_is_focus (folder_view)))
1205                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1206
1207         }
1208         if (!dimmed) {
1209                 dimmed = _selected_msg_sent_in_progress (win);
1210                 if (dimmed)
1211                         modest_dimming_rule_set_notification (rule, _("sfil_ib_unable_to_move_selected_items"));
1212         }
1213
1214         return dimmed;
1215 }
1216 #endif
1217
1218 static gboolean
1219 _forbid_outgoing_xfers (ModestWindow *window)
1220 {
1221         const gchar *account_name;
1222         TnyAccount *account;
1223         gboolean dimmed = FALSE;
1224
1225         account_name = modest_window_get_active_account (window);
1226         account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
1227                                                                account_name,
1228                                                                TNY_ACCOUNT_TYPE_STORE);
1229
1230         if (account) {
1231                 ModestProtocolType protocol_type;
1232
1233                 protocol_type = modest_tny_account_get_protocol_type (account);
1234                 dimmed  = modest_protocol_registry_protocol_type_has_tag
1235                         (modest_runtime_get_protocol_registry (),
1236                          protocol_type,
1237                          MODEST_PROTOCOL_REGISTRY_STORE_FORBID_OUTGOING_XFERS);
1238
1239                 g_object_unref (account);
1240         }
1241         return dimmed;
1242 }
1243
1244 gboolean
1245 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
1246 {
1247         ModestDimmingRule *rule = NULL;
1248         gboolean dimmed = FALSE;
1249
1250         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1251         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1252         rule = MODEST_DIMMING_RULE (user_data);
1253
1254         /* This could happen if we load the msg view window with a
1255            preview before loading the full message */
1256         TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1257         if (!msg) {
1258                 return TRUE;
1259         } else {
1260                 g_object_unref (msg);
1261         }
1262
1263         /* Check dimmed rule */
1264         dimmed = _transfer_mode_enabled (win);
1265         if (dimmed)
1266                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1267
1268         if (!dimmed)
1269                 dimmed = _forbid_outgoing_xfers (win);
1270
1271         if (!dimmed) {
1272                 const DimmedState *state = modest_window_get_dimming_state (win);
1273                 if (state) {
1274                         dimmed = state->any_marked_as_deleted;
1275                         if (dimmed) {
1276                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
1277                                 modest_dimming_rule_set_notification (rule, msg);
1278                                 g_free (msg);
1279                         }
1280                 }
1281         }
1282
1283         if (!dimmed) {
1284                 dimmed = _selected_msg_sent_in_progress (win);
1285                 if (dimmed)
1286                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1287         }
1288
1289         /* This could happen if we're viewing a message of the outbox
1290            that has been already sent */
1291         if (!dimmed)
1292                 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
1293
1294         if (!dimmed) {
1295                 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1296                         /* The move_to button should be dimmed when viewing an attachment,
1297                          * but should be enabled when viewing a message from the list, 
1298                          * or when viewing a search result.
1299                          */
1300                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
1301                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1302                         }
1303                 }
1304                 if (dimmed) 
1305                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1306         }
1307
1308         return dimmed;
1309 }
1310
1311 gboolean 
1312 modest_ui_dimming_rules_on_find_in_msg (ModestWindow *win, gpointer user_data)
1313 {
1314         ModestDimmingRule *rule = NULL;
1315         gboolean dimmed = FALSE;
1316
1317         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1318         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1319         rule = MODEST_DIMMING_RULE (user_data);
1320
1321         /* This could happen if we load the msg view window with a
1322            preview before loading the full message */
1323         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1324                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1325                 if (!msg) {
1326                         return TRUE;
1327                 } else {
1328                         g_object_unref (msg);
1329                 }
1330         }
1331
1332         /* Check dimmed rule */ 
1333         dimmed = _transfer_mode_enabled (win);
1334         if (dimmed)
1335                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
1336
1337         return dimmed;
1338 }
1339
1340 #ifndef MODEST_TOOLKIT_HILDON2
1341 gboolean
1342 modest_ui_dimming_rules_on_paste (ModestWindow *win, gpointer user_data)
1343 {
1344         ModestDimmingRule *rule = NULL;
1345         TnyFolderType types[3];
1346         gboolean dimmed = FALSE;
1347
1348         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1349         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1350         rule = MODEST_DIMMING_RULE (user_data);
1351
1352         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1353         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1354         types[2] = TNY_FOLDER_TYPE_SENT;
1355
1356         /* Check dimmed rule */ 
1357         dimmed = _clipboard_is_empty (win);
1358         if (dimmed)
1359                 modest_dimming_rule_set_notification (rule, 
1360                                                       _CS("ecoc_ib_edwin_nothing_to_paste"));
1361         if (!dimmed) {
1362                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1363                 if (dimmed)
1364                         modest_dimming_rule_set_notification (rule, 
1365                                                               _CS("ckct_ib_unable_to_paste_here"));
1366         }
1367         if (!dimmed) {
1368                 dimmed = !_folder_view_has_focus (win);
1369                 if (dimmed)
1370                         modest_dimming_rule_set_notification (rule,
1371                                         _CS("ckct_ib_unable_to_paste_here"));
1372         }
1373         if (!dimmed) {
1374                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), TRUE);
1375                 if (dimmed)
1376                         modest_dimming_rule_set_notification (rule,
1377                                                               _CS("ckct_ib_unable_to_paste_here"));
1378         }
1379         if (!dimmed) {
1380                 dimmed = _selected_folder_is_same_as_source (win);
1381                 if (dimmed)
1382                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1383         }
1384         if (!dimmed) {
1385                 dimmed = _selected_folder_has_subfolder_with_same_name (win);
1386                 if (dimmed)
1387                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1388         }
1389
1390         return dimmed;
1391 }
1392 #endif
1393
1394 gboolean 
1395 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1396 {
1397         ModestDimmingRule *rule = NULL;
1398         gboolean dimmed = FALSE;
1399         GtkWidget *focused = NULL;
1400
1401         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1402         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1403         rule = MODEST_DIMMING_RULE (user_data);
1404
1405         focused = gtk_window_get_focus (GTK_WINDOW (win));
1406
1407 #ifndef MODEST_TOOLKIT_HILDON2
1408         /* Main window dimming rules */ 
1409         if (MODEST_IS_MAIN_WINDOW (win))
1410                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1411
1412         if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
1413                 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1414 #endif
1415
1416         if (!dimmed && GTK_IS_ENTRY (focused)) {
1417                 const gchar *current_text;
1418                 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
1419                 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
1420         }
1421
1422         if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
1423                 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1424                 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
1425         }
1426
1427         if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
1428                 dimmed = FALSE;
1429         return dimmed;
1430 }
1431
1432 gboolean 
1433 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1434 {
1435         ModestDimmingRule *rule = NULL;
1436         gboolean dimmed = FALSE;
1437
1438         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1439         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1440         rule = MODEST_DIMMING_RULE (user_data);
1441
1442         /* Check dimmed rule */ 
1443         dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);                       
1444
1445         if (!dimmed) {
1446                 dimmed = _purged_attach_selected (win, FALSE, NULL);
1447                 if (dimmed) {
1448                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1449                 }
1450         }
1451                 
1452         return dimmed;
1453 }
1454
1455 #ifdef MODEST_TOOLKIT_HILDON2
1456 static gboolean
1457 _not_valid_attachments (ModestWindow *win, gboolean save_not_remove)
1458 {
1459         gint n_attachments;
1460         TnyList *attachments;
1461         gboolean result = FALSE;
1462
1463         /* Get atachments */
1464         attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1465         n_attachments = tny_list_get_length (attachments);
1466
1467         /* Check unique */              
1468         if (!result) {
1469                 result = n_attachments < 1;
1470         }
1471                 
1472         /* Check attached type (view operation not required) */
1473         if (!result)  {
1474                 gint n_valid = 0;
1475
1476                 TnyIterator *iter;
1477                 iter = tny_list_create_iterator (attachments);
1478                 while (!tny_iterator_is_done (iter)) {
1479                         gboolean is_valid = TRUE;
1480                         TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1481                         TnyList *nested_list = tny_simple_list_new ();
1482                         tny_mime_part_get_parts (mime_part, nested_list);
1483
1484                         if (tny_mime_part_is_purged (mime_part)) {
1485                                 is_valid = FALSE;
1486                         }
1487                         
1488                         if (is_valid && modest_tny_mime_part_is_msg (mime_part)) {
1489                                 TnyMsg *window_msg;
1490                                 window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1491                                 if (window_msg) {
1492                                         if (save_not_remove && (TnyMimePart *) window_msg != mime_part) {
1493                                                 is_valid = FALSE;
1494                                         }
1495                                         g_object_unref (window_msg);
1496                                 }
1497                                 if (is_valid && save_not_remove && tny_list_get_length (nested_list) > 0) {
1498                                         is_valid = FALSE;
1499                                 }
1500                         }
1501                         g_object_unref (nested_list);
1502                         g_object_unref (mime_part);
1503                         tny_iterator_next (iter);
1504
1505                         if (is_valid) 
1506                                 n_valid++;
1507                 }
1508                 g_object_unref (iter);
1509                 result = (n_valid == 0);
1510         }
1511         g_object_unref (attachments);
1512         return result;
1513
1514 }
1515 #endif
1516
1517 gboolean 
1518 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1519 {
1520         ModestDimmingRule *rule = NULL;
1521         gboolean dimmed = FALSE;
1522
1523         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1524         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1525         rule = MODEST_DIMMING_RULE (user_data);
1526
1527         /* Check dimmed rule */ 
1528
1529 #ifdef MODEST_TOOLKIT_HILDON2
1530         dimmed = _not_valid_attachments (win, TRUE);
1531 #else
1532         dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1533
1534         if (!dimmed) {
1535                 dimmed = _purged_attach_selected (win, TRUE, NULL);
1536                 if (dimmed) {
1537                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1538                 }
1539         }
1540 #endif
1541         return dimmed;
1542 }
1543
1544 gboolean 
1545 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1546 {
1547         ModestDimmingRule *rule = NULL;
1548         const DimmedState *state = NULL;
1549         gboolean dimmed = FALSE;
1550
1551         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1552         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1553         rule = MODEST_DIMMING_RULE (user_data);
1554         state = modest_window_get_dimming_state (win);
1555
1556 #ifndef MODEST_TOOLKIT_HILDON2
1557         /* Check in main window if there's only one message selected */
1558         if (MODEST_IS_MAIN_WINDOW (win)) {
1559                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1560         }
1561 #endif
1562
1563         /* Check in view window if there's any attachment selected */
1564         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1565                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1566                 if (dimmed)
1567                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1568         }
1569
1570         if (!dimmed) {
1571
1572                 dimmed = _selected_msg_sent_in_progress (win);
1573                 if (dimmed) {
1574                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1575                 }
1576         }
1577
1578         /* cannot purge in editable drafts nor pop folders */
1579         if (!dimmed) {
1580                 dimmed = _invalid_folder_for_purge (win, rule);
1581                 if (dimmed)
1582                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1583         }
1584
1585 #ifndef MODEST_TOOLKIT_HILDON2
1586         /* Check if the selected message in main window has attachments */
1587         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1588                 if (state)
1589                         dimmed = !(state->any_has_attachments);
1590                 if (dimmed)
1591                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1592         }
1593
1594         /* Check if the message is already downloaded */
1595         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1596                 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1597                 if (dimmed)
1598                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1599         }
1600 #endif
1601         /* Check if all attachments are already purged */
1602         if (!dimmed) {
1603                 dimmed = _purged_attach_selected (win, TRUE, rule);
1604         }
1605
1606         return dimmed;
1607 }
1608
1609 gboolean
1610 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1611 {
1612         ModestDimmingRule *rule = NULL;
1613         gboolean dimmed = FALSE;
1614
1615         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1616         rule = MODEST_DIMMING_RULE (user_data);
1617
1618         /* Check dimmed rule */
1619 #ifndef MODEST_TOOLKIT_HILDON2
1620         if (MODEST_IS_MAIN_WINDOW (win)) {
1621                 dimmed = _clipboard_is_empty (win);
1622                 if (dimmed)
1623                         modest_dimming_rule_set_notification (rule, "");
1624         }
1625 #endif
1626
1627         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1628                 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
1629         }
1630
1631         return dimmed;
1632 }
1633
1634 gboolean
1635 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
1636 {
1637         ModestDimmingRule *rule = NULL;
1638         gboolean dimmed = FALSE;
1639
1640         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1641         rule = MODEST_DIMMING_RULE (user_data);
1642
1643         /* Check dimmed rule */
1644         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1645                 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
1646         }
1647
1648         return dimmed;
1649 }
1650
1651 gboolean
1652 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1653 {
1654         ModestDimmingRule *rule = NULL;
1655         const DimmedState *state = NULL;
1656         gboolean dimmed = FALSE;
1657
1658         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1659         rule = MODEST_DIMMING_RULE (user_data);
1660         state = modest_window_get_dimming_state (win);
1661
1662         /* Check common dimming rules */
1663         dimmed = _invalid_clipboard_selected (win, rule);
1664
1665 #ifndef MODEST_TOOLKIT_HILDON2
1666         /* Check window specific dimming rules */
1667         if (MODEST_IS_MAIN_WINDOW (win)) {
1668                 /* Get focused widget */
1669                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1670
1671                 if (MODEST_IS_HEADER_VIEW (focused)) {
1672                         if (!dimmed) {
1673                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1674                                 if (dimmed)
1675                                         modest_dimming_rule_set_notification (rule, "");
1676                         }
1677                         if (!dimmed) {
1678                                 dimmed = _selected_msg_sent_in_progress (win);
1679                                 if (dimmed)
1680                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1681                         }
1682                         if (!dimmed) {
1683                                 if (state)
1684                                         dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1685                                 if(dimmed)
1686                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1687                         }
1688                 }
1689                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1690                         TnyFolderType types[3];
1691
1692                         types[0] = TNY_FOLDER_TYPE_DRAFTS;
1693                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1694                         types[2] = TNY_FOLDER_TYPE_SENT;
1695
1696                         /* Apply folder rules */
1697                         if (!dimmed) {
1698                                 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
1699                                 if (dimmed)
1700                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1701                         }
1702                         if (!dimmed) {
1703                                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1704                                 if (dimmed)
1705                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1706                         }
1707                         if (!dimmed) {
1708                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1709                                 if (dimmed)
1710                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1711                         }
1712                 }
1713         }
1714 #endif
1715
1716         return dimmed;
1717 }
1718
1719 gboolean 
1720 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1721 {
1722         ModestDimmingRule *rule = NULL;
1723         const DimmedState *state = NULL;
1724         gboolean dimmed = FALSE;
1725
1726         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1727         rule = MODEST_DIMMING_RULE (user_data);
1728         state = modest_window_get_dimming_state (win);
1729
1730         /* Check common dimming rules */
1731         dimmed = _invalid_clipboard_selected (win, rule);
1732
1733 #ifndef MODEST_TOOLKIT_HILDON2
1734         /* Check window specific dimming rules */
1735         if (MODEST_IS_MAIN_WINDOW (win)) {
1736                 /* Get focused widget */
1737                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1738
1739                 if (MODEST_IS_HEADER_VIEW (focused)) {
1740                         if (!dimmed) {
1741                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1742                                 if (dimmed)
1743                                         modest_dimming_rule_set_notification (rule, "");
1744                         }
1745                         if (!dimmed) {
1746                                 dimmed = _selected_msg_sent_in_progress (win);
1747                                 if (dimmed)
1748                                         modest_dimming_rule_set_notification (rule, _(""));
1749                         }
1750                         if (!dimmed) {
1751                                 if (state)
1752                                         dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1753                                 if(dimmed)
1754                                         modest_dimming_rule_set_notification (rule, _(""));
1755                         }
1756                 }
1757                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1758                         TnyFolderType types[3];
1759
1760                         types[0] = TNY_FOLDER_TYPE_DRAFTS;
1761                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1762                         types[2] = TNY_FOLDER_TYPE_SENT;
1763
1764                         if (!dimmed) {
1765                                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1766                                 if (dimmed)
1767                                         modest_dimming_rule_set_notification (rule, _(""));
1768                         }
1769                         if (!dimmed) {
1770                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1771                                 if (dimmed)
1772                                         modest_dimming_rule_set_notification (rule, _(""));
1773                         }
1774                 }
1775         }
1776 #endif
1777
1778         return dimmed;
1779 }
1780
1781 gboolean
1782 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
1783 {
1784         ModestDimmingRule *rule = NULL;
1785         gboolean dimmed = FALSE;
1786         
1787         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1788         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1789         rule = MODEST_DIMMING_RULE (user_data);
1790
1791         /* Check common dimming rules */
1792         ModestMsgEditFormat format;
1793         format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1794
1795         dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
1796         if (dimmed)
1797                 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
1798
1799         if (!dimmed) {
1800                 GtkWidget *body;
1801                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1802                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1803                 
1804                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1805                 if (dimmed)
1806                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1807         }
1808                
1809         
1810         return dimmed;
1811 }
1812
1813 gboolean 
1814 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
1815 {
1816         ModestDimmingRule *rule = NULL;
1817         gboolean dimmed = FALSE;
1818         
1819         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1820         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1821         rule = MODEST_DIMMING_RULE (user_data);
1822
1823         GtkWidget *body;
1824         body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1825                                                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1826         
1827         dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1828         if (dimmed)
1829                 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1830         
1831         return dimmed;
1832 }
1833
1834 gboolean 
1835 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1836 {
1837         ModestDimmingRule *rule = NULL;
1838         gboolean dimmed = FALSE;
1839         GtkWidget *focused = NULL;
1840         
1841         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1842         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1843         rule = MODEST_DIMMING_RULE (user_data);
1844
1845         focused = gtk_window_get_focus (GTK_WINDOW (win));
1846
1847         dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1848         
1849         if (!dimmed) {
1850                 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1851         }
1852
1853         if (!dimmed) {
1854                 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1855                 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1856
1857                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1858                   ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1859         }
1860         
1861         return dimmed;
1862 }
1863
1864 gboolean 
1865 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1866 {
1867         ModestDimmingRule *rule = NULL;
1868         gboolean dimmed = FALSE;
1869         TnyList *selected_attachments = NULL;
1870         gint n_att_selected = 0;
1871         GtkWidget *attachments_view;
1872         
1873         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1874         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1875         rule = MODEST_DIMMING_RULE (user_data);
1876
1877         attachments_view = modest_msg_edit_window_get_child_widget (
1878                                                                     MODEST_MSG_EDIT_WINDOW (win),
1879                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1880         
1881 #ifdef MODEST_TOOLKIT_HILDON2
1882         selected_attachments = modest_attachments_view_get_attachments (
1883                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1884 #else
1885         selected_attachments = modest_attachments_view_get_selection (
1886                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1887 #endif
1888         n_att_selected = tny_list_get_length (selected_attachments);
1889         g_object_unref (selected_attachments);
1890         
1891         dimmed = (n_att_selected < 1);  
1892         
1893         return dimmed;
1894 }
1895
1896 gboolean 
1897 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1898 {
1899         ModestDimmingRule *rule = NULL;
1900         gboolean dimmed = FALSE;
1901         GtkWidget *body_field;
1902
1903         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1904         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1905         rule = MODEST_DIMMING_RULE (user_data);
1906
1907         body_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1908                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1909
1910         if (!dimmed) {
1911                 GtkWidget *to_field, *cc_field, *bcc_field;
1912                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1913                 cc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1914                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1915                 to_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1916                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1917                 bcc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1918                                                                      MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1919                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1920                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1921                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1922
1923                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1924                            gtk_text_buffer_get_char_count (cc_buffer) +
1925                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1926                 if (dimmed)
1927                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1928         }
1929         
1930         return dimmed;
1931 }
1932
1933 gboolean 
1934 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1935 {
1936         ModestDimmingRule *rule = NULL;
1937         gboolean dimmed = FALSE;
1938         
1939         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1940         rule = MODEST_DIMMING_RULE (user_data);
1941
1942         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1943
1944         /* Check dimmed rule */
1945         dimmed = _transfer_mode_enabled (win);
1946         if (dimmed)
1947                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1948         
1949         if (!dimmed) {
1950                 dimmed = modest_msg_view_window_first_message_selected (
1951                                 MODEST_MSG_VIEW_WINDOW(win));
1952                 modest_dimming_rule_set_notification (rule, NULL);
1953         }
1954
1955         return dimmed;
1956 }
1957
1958 gboolean 
1959 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1960 {
1961         ModestDimmingRule *rule = NULL;
1962         gboolean dimmed = FALSE;
1963
1964         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1965         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1966         rule = MODEST_DIMMING_RULE (user_data);
1967
1968         /* Check dimmed rule */ 
1969         dimmed = _transfer_mode_enabled (win);                  
1970         if (dimmed)
1971                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1972         
1973         if (!dimmed) {
1974                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1975                 modest_dimming_rule_set_notification (rule, NULL);
1976         }
1977
1978         return dimmed;
1979 }
1980
1981
1982 gboolean
1983 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1984 {
1985         gboolean dimmed;
1986         ModestAccountMgr *mgr;
1987
1988         mgr = modest_runtime_get_account_mgr();
1989         dimmed = !modest_account_mgr_has_accounts(mgr, TRUE);
1990
1991         /* Dimm it if we only have metaaccounts */
1992         if (!dimmed) {
1993                 ModestProtocolRegistry *reg = modest_runtime_get_protocol_registry ();
1994                 GSList *account_names = modest_account_mgr_account_names (mgr, TRUE);
1995
1996                 if (account_names) {
1997                         ModestProtocolType store_protocol;
1998                         gboolean found = FALSE;
1999                         GSList *iter = account_names;
2000                         const gchar *tag = MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS;
2001
2002                         while (iter && !found) {
2003                                 gchar* account_name;
2004
2005                                 account_name = (gchar *) iter->data;
2006                                 store_protocol = modest_account_mgr_get_store_protocol (mgr, account_name);
2007
2008                                 if (!modest_protocol_registry_protocol_type_has_tag (reg, store_protocol, tag))
2009                                         found = TRUE;
2010                                 else
2011                                         iter = g_slist_next (iter);
2012                         }
2013                         modest_account_mgr_free_account_names (account_names);
2014                         dimmed = !found;
2015                 }
2016         }
2017
2018         return dimmed;
2019 }
2020
2021 #ifndef MODEST_TOOLKIT_HILDON2
2022 gboolean
2023 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
2024 {
2025         ModestDimmingRule *rule = NULL;
2026         TnyFolderType types[1];
2027         const DimmedState *state = NULL;
2028         gboolean dimmed = FALSE;
2029
2030         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2031         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2032         rule = MODEST_DIMMING_RULE (user_data);
2033         state = modest_window_get_dimming_state (win);
2034
2035         types[0] = TNY_FOLDER_TYPE_OUTBOX;
2036
2037         /* Check dimmed rules */
2038         dimmed = !_selected_folder_is_any_of_type (win, types, 1);
2039         if (dimmed)
2040                 modest_dimming_rule_set_notification (rule, "");
2041         if (!dimmed) {
2042                 if (state)
2043                         dimmed = !state->sent_in_progress;
2044                 if (dimmed)
2045                         modest_dimming_rule_set_notification (rule, "");
2046         }
2047         return dimmed;
2048 }
2049 #endif
2050
2051 gboolean
2052 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
2053 {
2054         /* We dim if no msg send is in progress (and then cancelling send all has no
2055          * effect */
2056         return !_msgs_send_in_progress ();
2057 }
2058
2059 gboolean 
2060 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
2061 {
2062         ModestDimmingRule *rule = NULL;
2063         gboolean dimmed = FALSE;
2064         ModestAccountMgr *mgr;
2065         const gchar* account_name;
2066
2067         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2068         rule = MODEST_DIMMING_RULE (user_data);
2069         mgr = modest_runtime_get_account_mgr();
2070
2071         /* Check dimmed rule */
2072         account_name = modest_window_get_active_account (win);
2073
2074         if (account_name)
2075                 dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
2076         else
2077                 dimmed = TRUE;
2078
2079         if (dimmed)
2080                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
2081
2082         return dimmed;
2083 }
2084
2085 gboolean 
2086 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
2087 {
2088         ModestDimmingRule *rule = NULL;
2089         gboolean dimmed = FALSE;
2090
2091         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2092         rule = MODEST_DIMMING_RULE (user_data);
2093  
2094         /* Check dimmed rule */ 
2095         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
2096         if (g_slist_length (account_names) < 1)
2097                 dimmed = TRUE;
2098         if (dimmed)
2099                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
2100
2101         modest_account_mgr_free_account_names (account_names);
2102
2103         if (!dimmed) {
2104                 dimmed = _send_receive_in_progress (win);
2105         }
2106
2107         return dimmed;
2108 }
2109
2110 #ifdef MODEST_TOOLKIT_HILDON2
2111 gboolean
2112 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
2113 {
2114         GSList *recipients;
2115         gboolean has_recipients_to_add;
2116
2117         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2118
2119         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2120                 TnyMsg *msg;
2121
2122                 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2123
2124                 /* Message is loaded asynchronously, so this could happen */
2125                 if (!msg) {
2126                         TnyHeader *header;
2127
2128                         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
2129                         if (!header)
2130                                 return TRUE;
2131
2132                         recipients = modest_tny_msg_header_get_all_recipients_list (header);
2133                         g_object_unref (header);
2134                 } else {
2135                         recipients = modest_tny_msg_get_all_recipients_list (msg);
2136                         g_object_unref (msg);
2137                 }
2138         } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2139                 /* Get recipients */
2140                 gchar *joined, *after_remove;
2141                 MsgData *data = modest_msg_edit_window_get_msg_data ((ModestMsgEditWindow *) win);
2142
2143                 /* We don't check the from */
2144                 joined = modest_text_utils_join_addresses (NULL, data->to, data->cc, data->bcc);
2145                 after_remove = modest_text_utils_remove_duplicate_addresses (joined);
2146                 g_free (joined);
2147
2148                 recipients = modest_text_utils_split_addresses_list (after_remove);
2149                 g_free (after_remove);
2150
2151                 modest_msg_edit_window_free_msg_data ((ModestMsgEditWindow *) win, data);
2152         }
2153
2154         has_recipients_to_add = FALSE;
2155
2156         if (recipients) {
2157                 GSList *node;
2158                 for (node = recipients; node != NULL; node = g_slist_next (node)) {
2159                         if (!modest_address_book_has_address ((const gchar *) node->data)) {
2160                                 has_recipients_to_add = TRUE;
2161                                 break;
2162                         }
2163                 }
2164                 g_slist_foreach (recipients, (GFunc) g_free, NULL);
2165                 g_slist_free (recipients);
2166         }
2167
2168         return !has_recipients_to_add;
2169 }
2170 #else
2171 gboolean
2172 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
2173 {
2174         ModestDimmingRule *rule = NULL;
2175         gboolean dimmed = FALSE;
2176         GtkWidget *focused = NULL;
2177
2178         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2179         rule = MODEST_DIMMING_RULE (user_data);
2180         focused = gtk_window_get_focus (GTK_WINDOW (win));
2181
2182         dimmed = !focused;
2183
2184         if (!dimmed) {
2185                 gchar *selection = NULL;
2186                 if (GTK_IS_TEXT_VIEW (focused)) {
2187                         GtkTextIter start, end;
2188                         GtkTextBuffer *buffer = NULL;
2189                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2190                         if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
2191                                 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
2192                         }
2193                 } else if (GTK_IS_LABEL (focused)) {
2194                         selection = modest_text_utils_label_get_selection (GTK_LABEL (focused));
2195                 } else {
2196                         gboolean do_check = TRUE;
2197                         GtkClipboard *clipboard;
2198                         if (GTK_IS_HTML (focused)) {
2199                                 const gchar *sel;
2200                                 int len = -1;
2201                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2202                                 do_check = !((sel == NULL) || (sel[0] == '\0'));
2203                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2204                                 do_check = FALSE;
2205                         }
2206                         if (do_check) {
2207                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2208                                 selection = gtk_clipboard_wait_for_text (clipboard);
2209                         } else {
2210                                 selection = NULL;
2211                         }
2212                 }
2213                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
2214         }
2215
2216         return dimmed;
2217 }
2218 #endif
2219
2220 /* *********************** static utility functions ******************** */
2221
2222 #ifndef MODEST_TOOLKIT_HILDON2
2223 static gboolean
2224 _selected_folder_not_writeable (ModestMainWindow *win,
2225                                 gboolean for_paste)
2226 {
2227         GtkWidget *folder_view = NULL;
2228         TnyFolderStore *parent_folder = NULL;
2229         ModestEmailClipboard *clipboard = NULL;
2230         ModestTnyFolderRules rules;
2231         gboolean is_local_acc = FALSE;
2232         gboolean xfer_folders = FALSE;
2233         gboolean result = FALSE;
2234
2235         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2236
2237         /* Get folder view */
2238         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2239                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2240         /* If no folder view, always dimmed */
2241         if (!folder_view)
2242                 return TRUE;
2243         
2244         /* Get selected folder as parent of new folder to create */
2245         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2246         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2247                 /* If it's the local account and its transfering folders, then do not dim */            
2248                 if (TNY_IS_ACCOUNT (parent_folder)) {
2249                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
2250                         if (for_paste) {
2251                                 clipboard = modest_runtime_get_email_clipboard ();
2252                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
2253                         }
2254                 }
2255
2256                 if (for_paste) 
2257                         result = !(is_local_acc && xfer_folders); 
2258                 else
2259                         result = !is_local_acc;
2260                 goto frees;             
2261         }
2262         
2263         /* Check dimmed rule */ 
2264         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2265         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
2266
2267         /* free */
2268  frees:
2269         if (parent_folder != NULL)
2270                 g_object_unref (parent_folder);
2271
2272         return result;
2273 }
2274 #endif
2275
2276 #ifndef MODEST_TOOLKIT_HILDON2
2277 static gboolean
2278 _selected_folder_not_deletable (ModestMainWindow *win)
2279 {
2280         GtkWidget *folder_view = NULL;
2281         TnyFolderStore *parent_folder = NULL;
2282         ModestTnyFolderRules rules;
2283         gboolean result = FALSE;
2284
2285         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2286
2287         /* Get folder view */
2288         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2289                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2290         /* If no folder view, always dimmed */
2291         if (!folder_view)
2292                 return TRUE;
2293
2294         /* Get selected folder as parent of new folder to create */
2295         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2296         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2297                 result = TRUE;
2298                 goto frees;
2299         }
2300
2301         /* Check dimmed rule */
2302         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2303         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
2304
2305         /* free */
2306  frees:
2307         if (parent_folder != NULL)
2308                 g_object_unref (parent_folder);
2309
2310         return result;
2311 }
2312
2313 static gboolean
2314 _selected_folder_not_moveable (ModestMainWindow *win)
2315 {
2316         GtkWidget *folder_view = NULL;
2317         TnyFolderStore *parent_folder = NULL;
2318         ModestTnyFolderRules rules;
2319         gboolean result = FALSE;
2320
2321         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2322
2323         /* Get folder view */
2324         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2325                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2326         /* If no folder view, always dimmed */
2327         if (!folder_view)
2328                 return TRUE;
2329         
2330         /* Get selected folder as parent of new folder to create */
2331         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2332         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2333                 result = TRUE;
2334                 goto frees;             
2335         }
2336         
2337         /* Check dimmed rule */ 
2338         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2339         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
2340
2341         /* free */
2342  frees:
2343         if (parent_folder != NULL)
2344                 g_object_unref (parent_folder);
2345
2346         return result;
2347 }
2348
2349 static gboolean
2350 _selected_folder_not_renameable (ModestMainWindow *win)
2351 {
2352         GtkWidget *folder_view = NULL;
2353         TnyFolderStore *parent_folder = NULL;
2354         ModestTnyFolderRules rules;
2355         gboolean result = FALSE;
2356
2357         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2358
2359         /* Get folder view */
2360         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2361                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2362         /* If no folder view, always dimmed */
2363         if (!folder_view)
2364                 return TRUE;
2365         
2366         /* Get selected folder as parent of new folder to create */
2367         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2368         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2369                 result = TRUE;
2370                 goto frees;             
2371         }
2372         
2373         /* Check dimmed rule */ 
2374         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2375         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
2376
2377         /* free */
2378  frees:
2379         if (parent_folder != NULL)
2380                 g_object_unref (parent_folder);
2381
2382         return result;
2383 }
2384
2385 static gboolean
2386 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
2387 {
2388         TnyFolderType types[2];
2389         gboolean result = FALSE;
2390
2391         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2392
2393         types[0] = TNY_FOLDER_TYPE_ROOT; 
2394         types[1] = TNY_FOLDER_TYPE_INBOX; 
2395
2396         /* Check folder type */
2397         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2398
2399         /* Check pop and MMC accounts */
2400         if (!result) {
2401                 result = _selected_folder_is_root (win);
2402         }
2403                 
2404         return result;
2405 }
2406
2407
2408 static gboolean
2409 _selected_folder_is_root (ModestMainWindow *win)
2410 {
2411         TnyFolderType types[1];
2412         gboolean result = FALSE;
2413
2414         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2415
2416         /* All accounts are root items: */
2417         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2418                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2419         if (folder_view) {                                      
2420                 gboolean is_account = FALSE;
2421                 TnyFolderStore *folder_store = 
2422                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2423                 if (folder_store) {
2424                         is_account = TNY_IS_ACCOUNT (folder_store);
2425
2426                         g_object_unref (folder_store);
2427                         folder_store = NULL;
2428                 }
2429                 
2430                 if (is_account)
2431                         return TRUE;
2432         }
2433                 
2434         /* Try something more precise: */
2435         types[0] = TNY_FOLDER_TYPE_ROOT; 
2436
2437         /* Check folder type */
2438         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2439                 
2440         return result;
2441 }
2442
2443 static gboolean
2444 _header_view_is_all_selected (ModestMainWindow *win)
2445 {
2446         const DimmedState *state = NULL;
2447
2448         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2449
2450         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2451
2452         return (state) ? state->all_selected : TRUE;
2453 }
2454
2455 static gboolean
2456 _selected_folder_is_empty (ModestMainWindow *win)
2457 {
2458         GtkWidget *folder_view = NULL, *header_view = NULL;
2459         TnyFolderStore *folder = NULL;
2460         gboolean result = FALSE;
2461
2462         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2463
2464         /* Get folder view */
2465         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2466                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2467
2468         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2469                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2470
2471         /* If no folder view, always dimmed */
2472         if (!folder_view || !header_view)
2473                 return TRUE;
2474
2475         /* Get selected folder as parent of new folder to create */
2476         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2477         if (!(folder && TNY_IS_FOLDER(folder))) {
2478                 if (folder)
2479                         g_object_unref (folder);
2480                 return TRUE;
2481         }
2482
2483         /* Check folder type */
2484         if (modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)) ||
2485             tny_folder_get_all_count (TNY_FOLDER (folder)) == 0)
2486                 result = TRUE;
2487
2488         /* free */
2489         g_object_unref (folder);
2490
2491         return result;
2492 }
2493
2494 static gboolean
2495 _folder_view_has_focus (ModestWindow *win)
2496 {
2497         GtkWidget *folder_view = NULL;
2498
2499         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2500
2501         /* Get folder view */
2502         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2503                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2504         if (!folder_view)
2505                 return FALSE;
2506
2507         if (gtk_widget_is_focus(folder_view))
2508                 return TRUE;
2509
2510         return FALSE;
2511 }
2512
2513 static gboolean
2514 _selected_folder_is_same_as_source (ModestWindow *win)
2515 {
2516         ModestEmailClipboard *clipboard = NULL;
2517         GtkWidget *folder_view = NULL;
2518         TnyFolderStore *folder = NULL;
2519         gboolean result = FALSE;
2520
2521         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2522
2523         /* Get folder view */
2524         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2525                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2526         if (!folder_view)
2527                 return FALSE;
2528
2529         /* Get selected folder as destination folder */
2530         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2531         if (!(folder && TNY_IS_FOLDER(folder))) {
2532                 result = FALSE;
2533                 goto frees;
2534         }
2535
2536         /* Check clipboard is cleared */
2537         clipboard = modest_runtime_get_email_clipboard ();
2538         if (modest_email_clipboard_cleared (clipboard)) {
2539                 result = FALSE;
2540                 goto frees;
2541         }
2542
2543         /* Check source folder */
2544         result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2545
2546         /* Free */
2547  frees:
2548         g_object_unref (folder);
2549
2550         return result;
2551 }
2552 #endif
2553
2554 static gboolean
2555 _selected_folder_is_any_of_type (ModestWindow *win,
2556                                  TnyFolderType types[], 
2557                                  guint ntypes)
2558 {
2559         TnyFolderStore *folder = NULL;
2560         TnyFolderType folder_type;
2561         guint i=0;
2562         gboolean result = FALSE;
2563
2564         /*Get current folder */
2565         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2566                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2567                 for (i=0; i < ntypes; i++) {
2568                         result = result || folder_type == types[i];
2569                 }
2570 #ifndef MODEST_TOOLKIT_HILDON2
2571         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2572                 GtkWidget *folder_view = NULL;
2573
2574                 /* Get folder view */
2575                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2576                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2577                 /* If no folder view, always dimmed */
2578                 if (!folder_view)
2579                         return FALSE;
2580
2581                 /* Get selected folder as parent of new folder to create */
2582                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2583
2584                 if (!(folder && TNY_IS_FOLDER(folder))) {
2585                         if (folder)
2586                                 g_object_unref (folder);
2587                         return FALSE;
2588                 }
2589
2590                 /* Check folder type */
2591                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2592 #endif
2593         }
2594
2595         /* free */
2596         if (folder)
2597                 g_object_unref (folder);
2598
2599         return result;
2600 }
2601
2602 #ifndef MODEST_TOOLKIT_HILDON2
2603 static gboolean
2604 _folder_is_any_of_type (TnyFolder *folder,
2605                         TnyFolderType types[], 
2606                         guint ntypes)
2607 {
2608         TnyFolderType folder_type;
2609         gboolean result = FALSE;
2610         guint i;
2611
2612         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2613
2614         /* Get folder type */
2615         folder_type = modest_tny_folder_guess_folder_type (folder);
2616         if (folder_type == TNY_FOLDER_TYPE_INVALID)
2617                 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2618
2619         /* Check foler type */
2620         for (i=0; i < ntypes; i++) {
2621                 result = result || folder_type == types[i];
2622         }
2623
2624         return result;
2625 }
2626
2627 static gboolean
2628 _clipboard_is_empty (ModestWindow *win)
2629 {
2630         gboolean result = FALSE;
2631
2632         if (MODEST_IS_MAIN_WINDOW (win)) {
2633                 ModestEmailClipboard *clipboard = NULL;
2634                 clipboard = modest_runtime_get_email_clipboard ();
2635                 if (modest_email_clipboard_cleared (clipboard))
2636                  result = TRUE;
2637         }
2638
2639         return result;
2640 }
2641 #endif
2642
2643 static gboolean
2644 _invalid_clipboard_selected (ModestWindow *win,
2645                              ModestDimmingRule *rule) 
2646 {
2647         gboolean result = FALSE;
2648         GtkWidget *focused = NULL;
2649
2650         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2651
2652         /* Get focuesed widget */
2653         focused = gtk_window_get_focus (GTK_WINDOW (win));
2654
2655         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2656                 gboolean has_selection = FALSE;
2657                 if (GTK_IS_TEXT_VIEW (focused)) {
2658                         GtkTextBuffer *buffer = NULL;
2659                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2660                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
2661                 } else if (GTK_IS_EDITABLE (focused)) {
2662                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2663                 }
2664                 result = !has_selection;
2665         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2666                 if (focused) {
2667                         MODEST_DEBUG_BLOCK (g_debug ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2668                         if (GTK_IS_LABEL (focused) && 
2669                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2670                                 result = TRUE;
2671                         } else if (GTK_IS_TEXT_VIEW (focused)) {
2672                                 GtkTextBuffer *buffer;
2673                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2674                                 result = !gtk_text_buffer_get_has_selection (buffer);
2675                         } else if (GTK_IS_HTML (focused)) {
2676                                 const gchar *sel;
2677                                 int len = -1;
2678                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2679                                 result = ((sel == NULL) || (sel[0] == '\0'));
2680                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2681                                 result = TRUE;
2682                         } else {
2683                                 GtkClipboard *clipboard;
2684                                 gchar *selection;
2685
2686                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2687                                 /* Get clipboard selection*/
2688                                 selection = gtk_clipboard_wait_for_text (clipboard);
2689                                 /* Check dimming */
2690                                 result = (selection == NULL);
2691                                 g_free (selection);
2692                         }
2693                 } else {
2694                         result = TRUE;
2695                 }
2696                 if (result)
2697                         modest_dimming_rule_set_notification (rule, "");
2698 #ifndef MODEST_TOOLKIT_HILDON2
2699         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2700                 const DimmedState *state = NULL;
2701
2702                 /* Check dimming */
2703                 state = modest_window_get_dimming_state (win);
2704                 if (state)
2705                         result = state->n_selected == 0;
2706                 if (result)
2707                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2708 #endif
2709         }
2710
2711         return result;
2712 }
2713
2714
2715 static gboolean
2716 _invalid_attach_selected (ModestWindow *win,
2717                           gboolean unique,
2718                           gboolean for_view,
2719                           gboolean for_remove,
2720                           ModestDimmingRule *rule) 
2721 {
2722         TnyList *attachments;
2723         gint n_selected;
2724         gboolean nested_attachments = FALSE;
2725         gboolean selected_messages = FALSE;
2726         gboolean result = FALSE;
2727
2728         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2729
2730         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2731
2732                 /* Get selected atachments */
2733                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2734                 n_selected = tny_list_get_length (attachments);
2735
2736                 /* Check unique */
2737                 if (!result) {
2738                         if (unique)
2739                                 result = n_selected != 1;
2740                         else
2741
2742                                 result = n_selected < 1;
2743                 }
2744
2745                 /* Check attached type (view operation not required) */
2746                 if (!result && !for_view)  {
2747                         TnyIterator *iter;
2748                         iter = tny_list_create_iterator (attachments);
2749                         while (!tny_iterator_is_done (iter) && !result) {
2750 #ifdef MODEST_TOOLKIT_HILDON2
2751                                 gboolean not_selectable = FALSE;
2752 #endif
2753                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2754                                 TnyList *nested_list = tny_simple_list_new ();
2755                                 tny_mime_part_get_parts (mime_part, nested_list);
2756
2757                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
2758                                         TnyMsg *window_msg;
2759                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2760                                         if ((TnyMimePart *) window_msg != mime_part) {
2761                                                 selected_messages = TRUE;
2762 #ifdef MODEST_TOOLKIT_HILDON2
2763                                                 not_selectable = TRUE;
2764 #else
2765                                                 result = TRUE;
2766 #endif
2767                                         }
2768                                         g_object_unref (window_msg);
2769                                 }
2770                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2771                                         nested_attachments = TRUE;
2772 #ifdef MODEST_TOOLKIT_HILDON2
2773                                         not_selectable = TRUE;
2774 #else
2775                                         result = TRUE;
2776 #endif
2777                                 }
2778 #ifdef MODEST_TOOLKIT_HILDON2
2779                                 if (not_selectable)
2780                                         n_selected --;
2781 #endif
2782                                 g_object_unref (nested_list);
2783                                 g_object_unref (mime_part);
2784                                 tny_iterator_next (iter);
2785                         }
2786                         g_object_unref (iter);
2787                 }
2788
2789                 /* No valid attachment available */
2790                 if (n_selected == 0)
2791                         result = TRUE;
2792
2793                 /* Set notifications */
2794                 if (result && rule != NULL) {
2795                         if (selected_messages) {
2796                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2797                         } else if (nested_attachments) {
2798                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2799                         } else if (n_selected == 0) {
2800                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2801                         } else if (unique) {
2802                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2803                         }
2804                 }
2805
2806                 /* Free */
2807                 g_object_unref (attachments);
2808 #ifndef MODEST_TOOLKIT_HILDON2
2809         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2810                 if (!result) {
2811                         const DimmedState *state = NULL;
2812                         state = modest_window_get_dimming_state (win);
2813                         result = !state->any_has_attachments;
2814                 }
2815 #endif
2816         }
2817
2818         return result;
2819 }
2820
2821 static gboolean
2822 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2823 {
2824         TnyList *attachments = NULL;
2825         TnyIterator *iter;
2826         gint purged = 0;
2827         gint n_attachments = 0;
2828         gboolean result = FALSE;
2829
2830         /* This should check if _all_ the attachments are already purged. If only some
2831          * of them are purged, then it does not cause dim as there's a confirmation dialog
2832          * for removing only local attachments */
2833
2834         /* Get selected atachments */
2835         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2836                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2837 #ifndef MODEST_TOOLKIT_HILDON2
2838         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2839                 /* If we're in main window, we won't know if there are already purged attachments */
2840                 return FALSE;
2841 #endif
2842         }
2843
2844         if (attachments == NULL)
2845                 return FALSE;
2846
2847         if (tny_list_get_length (attachments) == 0) {
2848                 g_object_unref (attachments);
2849                 return FALSE;
2850         }
2851
2852         iter = tny_list_create_iterator (attachments);
2853         while (!tny_iterator_is_done (iter)) {
2854                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2855                 if (tny_mime_part_is_purged (mime_part)) {
2856                         purged++;
2857                 }
2858                 n_attachments++;
2859                 g_object_unref (mime_part);
2860                 tny_iterator_next (iter);
2861         }
2862         g_object_unref (iter);
2863
2864         /* Free */
2865         g_object_unref (attachments);
2866
2867         if (all)
2868                 result = (purged == n_attachments);
2869         else
2870                 result = (purged > 0);
2871
2872         /* This string no longer exists, refer to NB#75415 for more info
2873         if (result && (rule != NULL))
2874                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2875         */
2876
2877         return result;
2878 }
2879
2880 #ifndef MODEST_TOOLKIT_HILDON2
2881 static gboolean
2882 _invalid_msg_selected (ModestMainWindow *win,
2883                        gboolean unique,
2884                        ModestDimmingRule *rule) 
2885 {
2886         GtkWidget *folder_view = NULL;
2887         const DimmedState *state = NULL;
2888         gboolean result = FALSE;
2889         gint n_selected = 0;
2890
2891         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2892         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2893
2894         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2895         if (state)
2896                 n_selected = state->n_selected;
2897
2898         /* Get folder view to check focus */
2899         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2900                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2901
2902         /* Check dimmed rule (TODO: check focus on widgets */   
2903         if (!result) {
2904                 result = ((n_selected == 0 ) ||
2905                           (gtk_widget_is_focus (folder_view)));
2906                 if (result)
2907                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2908         }
2909         if (!result && unique) {
2910                 result = n_selected > 1;
2911                 if (result)
2912                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2913         }
2914
2915         return result;
2916 }
2917 #endif
2918
2919 static gboolean
2920 _msg_download_in_progress (ModestWindow *win)
2921 {
2922         gboolean result = FALSE;
2923
2924         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2925
2926         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2927                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2928 #ifndef MODEST_TOOLKIT_HILDON2
2929         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2930                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2931 #endif
2932         }
2933
2934         return result;
2935 }
2936
2937 #ifndef MODEST_TOOLKIT_HILDON2
2938 static gboolean
2939 _msg_download_completed (ModestMainWindow *win)
2940 {
2941         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2942         return (state) ? state->any_marked_as_cached : TRUE;
2943 }
2944 #endif
2945
2946 static void
2947 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2948 {
2949         GSList **send_queues = (GSList **) userdata;
2950         *send_queues = g_slist_prepend (*send_queues, value);
2951 }
2952
2953 static gboolean
2954 _selected_msg_sent_in_progress (ModestWindow *win)
2955 {
2956         const DimmedState *state = modest_window_get_dimming_state (win);
2957         return (state) ? state->sent_in_progress : TRUE;
2958 }
2959
2960
2961 static gboolean
2962 _invalid_folder_for_purge (ModestWindow *win, 
2963                            ModestDimmingRule *rule)
2964 {
2965         TnyFolder *folder = NULL;
2966         TnyAccount *account = NULL;
2967         gboolean result = FALSE;
2968
2969         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2970
2971                 /* Get folder and account of message */
2972                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2973                 g_return_val_if_fail(msg != NULL, TRUE);
2974                 folder = tny_msg_get_folder (msg);
2975                 g_object_unref (msg);
2976                 if (folder == NULL) {
2977                         result = TRUE;
2978                         goto frees;
2979                 }
2980 #ifndef MODEST_TOOLKIT_HILDON2
2981         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2982                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2983                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2984                 if (!folder_view)
2985                         return FALSE;
2986                 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2987                 /* Could be a folder store */
2988                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2989                         goto frees;
2990 #endif
2991         } else {
2992                 g_return_val_if_reached (FALSE);
2993         }
2994         account = modest_tny_folder_get_account (folder);
2995         if (account == NULL) goto frees;
2996
2997         /* Check account */
2998         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2999                 TnyFolderType types[2];
3000                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
3001                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
3002
3003                 if (_selected_folder_is_any_of_type (win, types, 2)) {
3004                         result = TRUE;
3005                 }
3006         } else {
3007                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
3008                 /* If it's a remote folder then dim */
3009                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
3010                                                                     protocol_type,
3011                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
3012                         result = TRUE;
3013                 }
3014         }
3015         
3016 frees:
3017         if (folder != NULL)
3018                 g_object_unref (folder);
3019         if (account != NULL)
3020                 g_object_unref (account);
3021         
3022         return result;
3023 }
3024
3025 static gboolean
3026 _transfer_mode_enabled (ModestWindow *win)
3027 {
3028         gboolean result = FALSE;
3029
3030         /* Check dimming */
3031         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
3032                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
3033 #ifndef MODEST_TOOLKIT_HILDON2
3034         } else if (MODEST_IS_MAIN_WINDOW(win)) {
3035                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
3036 #else
3037         } else if (MODEST_IS_FOLDER_WINDOW (win)) {
3038                 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
3039         } else if (MODEST_IS_HEADER_WINDOW (win)) {
3040                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
3041 #endif
3042         } else {
3043                 g_warning("_transfer_mode_enabled called with wrong window type");
3044         }
3045
3046         return result;
3047 }
3048
3049 #ifndef MODEST_TOOLKIT_HILDON2
3050 static gboolean
3051 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
3052 {
3053         GtkWidget *folder_view = NULL;
3054         TnyFolderStore *folder = NULL;
3055         ModestEmailClipboard *clipboard = NULL;
3056         const gchar *folder_name = NULL;
3057         gboolean result = FALSE;
3058
3059         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
3060
3061         /*Get current parent folder */
3062         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
3063                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3064         /* If no folder view, always dimmed */
3065         if (!folder_view) return FALSE;
3066
3067         /* Get selected folder as parent of new folder to create */
3068         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
3069         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
3070
3071         /* get modest clipboard and source folder */
3072         clipboard = modest_runtime_get_email_clipboard ();
3073         folder_name = modest_email_clipboard_get_folder_name (clipboard);
3074         if (folder_name == NULL) goto frees;
3075
3076         /* Check source subfolders names */
3077         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
3078                                                             TRUE);
3079
3080         /* Free */
3081  frees:
3082         if (folder != NULL) 
3083                 g_object_unref (folder);
3084
3085
3086         return result;
3087 }
3088 #endif
3089
3090 static gboolean
3091 _all_msgs_in_sending_status (ModestHeaderView *header_view)
3092 {
3093         GtkTreeModel *model;
3094         GtkTreeIter iter;
3095         gboolean all_sending = TRUE;
3096
3097         model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
3098         if (gtk_tree_model_get_iter_first (model, &iter)) {
3099                 do {
3100                         TnyHeader *header;
3101
3102                         gtk_tree_model_get (model, &iter,
3103                                             TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
3104                                             &header,
3105                                             -1);
3106
3107                         if (header) {
3108                                 if (modest_tny_all_send_queues_get_msg_status (header) !=
3109                                     MODEST_TNY_SEND_QUEUE_SENDING)
3110                                         all_sending = FALSE;
3111                                 g_object_unref (header);
3112                         }
3113
3114                 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
3115         }
3116         return all_sending;
3117 }
3118
3119 gboolean 
3120 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
3121                                            gpointer user_data)
3122 {
3123         ModestDimmingRule *rule = NULL;
3124
3125         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3126         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3127         rule = MODEST_DIMMING_RULE (user_data);
3128
3129         /* Check dimmed rule */ 
3130         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
3131 }
3132
3133 gboolean
3134 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
3135                                          gpointer user_data)
3136 {
3137         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3138
3139         ModestMsgEditFormat format =
3140           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
3141
3142         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
3143 }
3144
3145 static gboolean 
3146 _send_receive_in_progress (ModestWindow *win)
3147 {
3148         ModestMailOperationQueue *queue;
3149         GSList *op_list, *node;
3150         gboolean found_send_receive;
3151
3152         queue = modest_runtime_get_mail_operation_queue ();
3153         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
3154
3155         found_send_receive = FALSE;
3156         for (node = op_list; node != NULL; node = g_slist_next (node)) {
3157                 ModestMailOperation *op;
3158
3159                 op = (ModestMailOperation *) node->data;
3160                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
3161                         found_send_receive = TRUE;
3162                         break;
3163                 }
3164         }
3165
3166         if (op_list) {
3167                 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
3168                 g_slist_free (op_list);
3169         }
3170
3171         return found_send_receive;
3172 }
3173
3174 static gboolean
3175 _msgs_send_in_progress (void)
3176 {
3177         ModestCacheMgr *cache_mgr;
3178         GHashTable *send_queue_cache;
3179         ModestTnySendQueue *send_queue;
3180         GSList *send_queues = NULL, *node = NULL;
3181         gboolean found = FALSE;
3182
3183         cache_mgr = modest_runtime_get_cache_mgr ();
3184         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
3185                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
3186
3187         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
3188
3189         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
3190                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
3191
3192                 /* Check if msg uid is being processed inside send queue */
3193                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
3194                         found = TRUE;
3195                         break;
3196                 }
3197         }
3198
3199         g_slist_free (send_queues);
3200
3201         return found;
3202 }
3203
3204 /*****************************************************************************/
3205 /********************** HILDON2 only dimming rules ***************************/
3206 /*****************************************************************************/
3207
3208 #ifdef MODEST_TOOLKIT_HILDON2
3209 gboolean 
3210 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
3211 {
3212         ModestDimmingRule *rule = NULL;
3213         gboolean dimmed = FALSE;
3214
3215         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
3216         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3217         rule = MODEST_DIMMING_RULE (user_data);
3218
3219         /* Check dimmed rule */ 
3220         dimmed = _transfer_mode_enabled (win);
3221         if (dimmed)
3222                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3223
3224         if (!dimmed)
3225                 dimmed = _forbid_outgoing_xfers (win);
3226
3227         if (!dimmed) {
3228                 GtkWidget *header_view;
3229                 TnyFolder *folder;
3230
3231                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
3232                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
3233                 if (folder) {
3234                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
3235                                 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
3236
3237                         if (!dimmed &&
3238                             (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
3239                                 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
3240                         }
3241                         g_object_unref (folder);
3242                 }
3243         }
3244
3245         return dimmed;
3246 }
3247
3248 gboolean 
3249 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
3250 {
3251         ModestDimmingRule *rule = NULL;
3252         gboolean dimmed = FALSE;
3253
3254         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3255         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3256         rule = MODEST_DIMMING_RULE (user_data);
3257
3258         /* Check dimmed rule */ 
3259         dimmed = _transfer_mode_enabled (win);
3260         if (dimmed)
3261                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3262
3263         if (!dimmed)
3264                 dimmed = _forbid_outgoing_xfers (win);
3265
3266         if (!dimmed && MODEST_IS_FOLDER_WINDOW (win)) {
3267                 ModestFolderView *folder_view;
3268                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3269                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3270                                                                        MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
3271         }
3272
3273         if (!dimmed) {
3274                 dimmed = _transfer_mode_enabled (win);
3275                 if (dimmed)
3276                         modest_dimming_rule_set_notification (rule, "");
3277         }
3278
3279         return dimmed;
3280 }
3281
3282 gboolean 
3283 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
3284 {
3285         ModestDimmingRule *rule = NULL;
3286         gboolean dimmed = FALSE;
3287
3288         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3289         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3290         rule = MODEST_DIMMING_RULE (user_data);
3291
3292         /* Check dimmed rule */ 
3293         dimmed = _transfer_mode_enabled (win);
3294         if (dimmed)
3295                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3296
3297         if (MODEST_IS_FOLDER_WINDOW (win)) {
3298                 ModestFolderView *folder_view;
3299                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3300                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3301                                                                        MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
3302         }
3303
3304         if (!dimmed) {
3305                 dimmed = _transfer_mode_enabled (win);
3306                 if (dimmed)
3307                         modest_dimming_rule_set_notification (rule, "");
3308         }
3309
3310         return dimmed;
3311 }
3312
3313 gboolean
3314 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
3315 {
3316         return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);
3317 }
3318 #endif