406ca5c2c26e6443612c63df3601d28557c2f453
[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                 /* Check if there are pending addresses to add */
2140                 return !modest_msg_edit_window_has_pending_addresses ((ModestMsgEditWindow *) win);
2141         }
2142
2143         has_recipients_to_add = FALSE;
2144
2145         if (recipients) {
2146                 GSList *node;
2147                 for (node = recipients; node != NULL; node = g_slist_next (node)) {
2148                         const gchar *recipient = (const gchar *) node->data;
2149                         if (modest_text_utils_validate_recipient (recipient, NULL)) {
2150                                 if (!modest_address_book_has_address (recipient)) {
2151                                         has_recipients_to_add = TRUE;
2152                                         break;
2153                                 }
2154                         }
2155                 }
2156                 g_slist_foreach (recipients, (GFunc) g_free, NULL);
2157                 g_slist_free (recipients);
2158         }
2159
2160         return !has_recipients_to_add;
2161 }
2162 #else
2163 gboolean
2164 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
2165 {
2166         ModestDimmingRule *rule = NULL;
2167         gboolean dimmed = FALSE;
2168         GtkWidget *focused = NULL;
2169
2170         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2171         rule = MODEST_DIMMING_RULE (user_data);
2172         focused = gtk_window_get_focus (GTK_WINDOW (win));
2173
2174         dimmed = !focused;
2175
2176         if (!dimmed) {
2177                 gchar *selection = NULL;
2178                 if (GTK_IS_TEXT_VIEW (focused)) {
2179                         GtkTextIter start, end;
2180                         GtkTextBuffer *buffer = NULL;
2181                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2182                         if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
2183                                 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
2184                         }
2185                 } else if (GTK_IS_LABEL (focused)) {
2186                         selection = modest_text_utils_label_get_selection (GTK_LABEL (focused));
2187                 } else {
2188                         gboolean do_check = TRUE;
2189                         GtkClipboard *clipboard;
2190                         if (GTK_IS_HTML (focused)) {
2191                                 const gchar *sel;
2192                                 int len = -1;
2193                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2194                                 do_check = !((sel == NULL) || (sel[0] == '\0'));
2195                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2196                                 do_check = FALSE;
2197                         }
2198                         if (do_check) {
2199                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2200                                 selection = gtk_clipboard_wait_for_text (clipboard);
2201                         } else {
2202                                 selection = NULL;
2203                         }
2204                 }
2205                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
2206         }
2207
2208         return dimmed;
2209 }
2210 #endif
2211
2212 /* *********************** static utility functions ******************** */
2213
2214 #ifndef MODEST_TOOLKIT_HILDON2
2215 static gboolean
2216 _selected_folder_not_writeable (ModestMainWindow *win,
2217                                 gboolean for_paste)
2218 {
2219         GtkWidget *folder_view = NULL;
2220         TnyFolderStore *parent_folder = NULL;
2221         ModestEmailClipboard *clipboard = NULL;
2222         ModestTnyFolderRules rules;
2223         gboolean is_local_acc = FALSE;
2224         gboolean xfer_folders = FALSE;
2225         gboolean result = FALSE;
2226
2227         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2228
2229         /* Get folder view */
2230         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2231                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2232         /* If no folder view, always dimmed */
2233         if (!folder_view)
2234                 return TRUE;
2235         
2236         /* Get selected folder as parent of new folder to create */
2237         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2238         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2239                 /* If it's the local account and its transfering folders, then do not dim */            
2240                 if (TNY_IS_ACCOUNT (parent_folder)) {
2241                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
2242                         if (for_paste) {
2243                                 clipboard = modest_runtime_get_email_clipboard ();
2244                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
2245                         }
2246                 }
2247
2248                 if (for_paste) 
2249                         result = !(is_local_acc && xfer_folders); 
2250                 else
2251                         result = !is_local_acc;
2252                 goto frees;             
2253         }
2254         
2255         /* Check dimmed rule */ 
2256         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2257         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
2258
2259         /* free */
2260  frees:
2261         if (parent_folder != NULL)
2262                 g_object_unref (parent_folder);
2263
2264         return result;
2265 }
2266 #endif
2267
2268 #ifndef MODEST_TOOLKIT_HILDON2
2269 static gboolean
2270 _selected_folder_not_deletable (ModestMainWindow *win)
2271 {
2272         GtkWidget *folder_view = NULL;
2273         TnyFolderStore *parent_folder = NULL;
2274         ModestTnyFolderRules rules;
2275         gboolean result = FALSE;
2276
2277         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2278
2279         /* Get folder view */
2280         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2281                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2282         /* If no folder view, always dimmed */
2283         if (!folder_view)
2284                 return TRUE;
2285
2286         /* Get selected folder as parent of new folder to create */
2287         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2288         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2289                 result = TRUE;
2290                 goto frees;
2291         }
2292
2293         /* Check dimmed rule */
2294         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2295         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
2296
2297         /* free */
2298  frees:
2299         if (parent_folder != NULL)
2300                 g_object_unref (parent_folder);
2301
2302         return result;
2303 }
2304
2305 static gboolean
2306 _selected_folder_not_moveable (ModestMainWindow *win)
2307 {
2308         GtkWidget *folder_view = NULL;
2309         TnyFolderStore *parent_folder = NULL;
2310         ModestTnyFolderRules rules;
2311         gboolean result = FALSE;
2312
2313         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2314
2315         /* Get folder view */
2316         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2317                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2318         /* If no folder view, always dimmed */
2319         if (!folder_view)
2320                 return TRUE;
2321         
2322         /* Get selected folder as parent of new folder to create */
2323         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2324         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2325                 result = TRUE;
2326                 goto frees;             
2327         }
2328         
2329         /* Check dimmed rule */ 
2330         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2331         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
2332
2333         /* free */
2334  frees:
2335         if (parent_folder != NULL)
2336                 g_object_unref (parent_folder);
2337
2338         return result;
2339 }
2340
2341 static gboolean
2342 _selected_folder_not_renameable (ModestMainWindow *win)
2343 {
2344         GtkWidget *folder_view = NULL;
2345         TnyFolderStore *parent_folder = NULL;
2346         ModestTnyFolderRules rules;
2347         gboolean result = FALSE;
2348
2349         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2350
2351         /* Get folder view */
2352         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2353                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2354         /* If no folder view, always dimmed */
2355         if (!folder_view)
2356                 return TRUE;
2357         
2358         /* Get selected folder as parent of new folder to create */
2359         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2360         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2361                 result = TRUE;
2362                 goto frees;             
2363         }
2364         
2365         /* Check dimmed rule */ 
2366         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2367         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
2368
2369         /* free */
2370  frees:
2371         if (parent_folder != NULL)
2372                 g_object_unref (parent_folder);
2373
2374         return result;
2375 }
2376
2377 static gboolean
2378 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
2379 {
2380         TnyFolderType types[2];
2381         gboolean result = FALSE;
2382
2383         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2384
2385         types[0] = TNY_FOLDER_TYPE_ROOT; 
2386         types[1] = TNY_FOLDER_TYPE_INBOX; 
2387
2388         /* Check folder type */
2389         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2390
2391         /* Check pop and MMC accounts */
2392         if (!result) {
2393                 result = _selected_folder_is_root (win);
2394         }
2395                 
2396         return result;
2397 }
2398
2399
2400 static gboolean
2401 _selected_folder_is_root (ModestMainWindow *win)
2402 {
2403         TnyFolderType types[1];
2404         gboolean result = FALSE;
2405
2406         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2407
2408         /* All accounts are root items: */
2409         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2410                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2411         if (folder_view) {                                      
2412                 gboolean is_account = FALSE;
2413                 TnyFolderStore *folder_store = 
2414                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2415                 if (folder_store) {
2416                         is_account = TNY_IS_ACCOUNT (folder_store);
2417
2418                         g_object_unref (folder_store);
2419                         folder_store = NULL;
2420                 }
2421                 
2422                 if (is_account)
2423                         return TRUE;
2424         }
2425                 
2426         /* Try something more precise: */
2427         types[0] = TNY_FOLDER_TYPE_ROOT; 
2428
2429         /* Check folder type */
2430         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2431                 
2432         return result;
2433 }
2434
2435 static gboolean
2436 _header_view_is_all_selected (ModestMainWindow *win)
2437 {
2438         const DimmedState *state = NULL;
2439
2440         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2441
2442         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2443
2444         return (state) ? state->all_selected : TRUE;
2445 }
2446
2447 static gboolean
2448 _selected_folder_is_empty (ModestMainWindow *win)
2449 {
2450         GtkWidget *folder_view = NULL, *header_view = NULL;
2451         TnyFolderStore *folder = NULL;
2452         gboolean result = FALSE;
2453
2454         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2455
2456         /* Get folder view */
2457         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2458                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2459
2460         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2461                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2462
2463         /* If no folder view, always dimmed */
2464         if (!folder_view || !header_view)
2465                 return TRUE;
2466
2467         /* Get selected folder as parent of new folder to create */
2468         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2469         if (!(folder && TNY_IS_FOLDER(folder))) {
2470                 if (folder)
2471                         g_object_unref (folder);
2472                 return TRUE;
2473         }
2474
2475         /* Check folder type */
2476         if (modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)) ||
2477             tny_folder_get_all_count (TNY_FOLDER (folder)) == 0)
2478                 result = TRUE;
2479
2480         /* free */
2481         g_object_unref (folder);
2482
2483         return result;
2484 }
2485
2486 static gboolean
2487 _folder_view_has_focus (ModestWindow *win)
2488 {
2489         GtkWidget *folder_view = NULL;
2490
2491         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2492
2493         /* Get folder view */
2494         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2495                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2496         if (!folder_view)
2497                 return FALSE;
2498
2499         if (gtk_widget_is_focus(folder_view))
2500                 return TRUE;
2501
2502         return FALSE;
2503 }
2504
2505 static gboolean
2506 _selected_folder_is_same_as_source (ModestWindow *win)
2507 {
2508         ModestEmailClipboard *clipboard = NULL;
2509         GtkWidget *folder_view = NULL;
2510         TnyFolderStore *folder = NULL;
2511         gboolean result = FALSE;
2512
2513         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2514
2515         /* Get folder view */
2516         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2517                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2518         if (!folder_view)
2519                 return FALSE;
2520
2521         /* Get selected folder as destination folder */
2522         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2523         if (!(folder && TNY_IS_FOLDER(folder))) {
2524                 result = FALSE;
2525                 goto frees;
2526         }
2527
2528         /* Check clipboard is cleared */
2529         clipboard = modest_runtime_get_email_clipboard ();
2530         if (modest_email_clipboard_cleared (clipboard)) {
2531                 result = FALSE;
2532                 goto frees;
2533         }
2534
2535         /* Check source folder */
2536         result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2537
2538         /* Free */
2539  frees:
2540         g_object_unref (folder);
2541
2542         return result;
2543 }
2544 #endif
2545
2546 static gboolean
2547 _selected_folder_is_any_of_type (ModestWindow *win,
2548                                  TnyFolderType types[], 
2549                                  guint ntypes)
2550 {
2551         TnyFolderStore *folder = NULL;
2552         TnyFolderType folder_type;
2553         guint i=0;
2554         gboolean result = FALSE;
2555
2556         /*Get current folder */
2557         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2558                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2559                 for (i=0; i < ntypes; i++) {
2560                         result = result || folder_type == types[i];
2561                 }
2562 #ifndef MODEST_TOOLKIT_HILDON2
2563         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2564                 GtkWidget *folder_view = NULL;
2565
2566                 /* Get folder view */
2567                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2568                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2569                 /* If no folder view, always dimmed */
2570                 if (!folder_view)
2571                         return FALSE;
2572
2573                 /* Get selected folder as parent of new folder to create */
2574                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2575
2576                 if (!(folder && TNY_IS_FOLDER(folder))) {
2577                         if (folder)
2578                                 g_object_unref (folder);
2579                         return FALSE;
2580                 }
2581
2582                 /* Check folder type */
2583                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2584 #endif
2585         }
2586
2587         /* free */
2588         if (folder)
2589                 g_object_unref (folder);
2590
2591         return result;
2592 }
2593
2594 #ifndef MODEST_TOOLKIT_HILDON2
2595 static gboolean
2596 _folder_is_any_of_type (TnyFolder *folder,
2597                         TnyFolderType types[], 
2598                         guint ntypes)
2599 {
2600         TnyFolderType folder_type;
2601         gboolean result = FALSE;
2602         guint i;
2603
2604         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2605
2606         /* Get folder type */
2607         folder_type = modest_tny_folder_guess_folder_type (folder);
2608         if (folder_type == TNY_FOLDER_TYPE_INVALID)
2609                 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2610
2611         /* Check foler type */
2612         for (i=0; i < ntypes; i++) {
2613                 result = result || folder_type == types[i];
2614         }
2615
2616         return result;
2617 }
2618
2619 static gboolean
2620 _clipboard_is_empty (ModestWindow *win)
2621 {
2622         gboolean result = FALSE;
2623
2624         if (MODEST_IS_MAIN_WINDOW (win)) {
2625                 ModestEmailClipboard *clipboard = NULL;
2626                 clipboard = modest_runtime_get_email_clipboard ();
2627                 if (modest_email_clipboard_cleared (clipboard))
2628                  result = TRUE;
2629         }
2630
2631         return result;
2632 }
2633 #endif
2634
2635 static gboolean
2636 _invalid_clipboard_selected (ModestWindow *win,
2637                              ModestDimmingRule *rule) 
2638 {
2639         gboolean result = FALSE;
2640         GtkWidget *focused = NULL;
2641
2642         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2643
2644         /* Get focuesed widget */
2645         focused = gtk_window_get_focus (GTK_WINDOW (win));
2646
2647         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2648                 gboolean has_selection = FALSE;
2649                 if (GTK_IS_TEXT_VIEW (focused)) {
2650                         GtkTextBuffer *buffer = NULL;
2651                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2652                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
2653                 } else if (GTK_IS_EDITABLE (focused)) {
2654                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2655                 }
2656                 result = !has_selection;
2657         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2658                 if (focused) {
2659                         MODEST_DEBUG_BLOCK (g_debug ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2660                         if (GTK_IS_LABEL (focused) && 
2661                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2662                                 result = TRUE;
2663                         } else if (GTK_IS_TEXT_VIEW (focused)) {
2664                                 GtkTextBuffer *buffer;
2665                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2666                                 result = !gtk_text_buffer_get_has_selection (buffer);
2667                         } else if (GTK_IS_HTML (focused)) {
2668                                 const gchar *sel;
2669                                 int len = -1;
2670                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2671                                 result = ((sel == NULL) || (sel[0] == '\0'));
2672                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2673                                 result = TRUE;
2674                         } else {
2675                                 GtkClipboard *clipboard;
2676                                 gchar *selection;
2677
2678                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2679                                 /* Get clipboard selection*/
2680                                 selection = gtk_clipboard_wait_for_text (clipboard);
2681                                 /* Check dimming */
2682                                 result = (selection == NULL);
2683                                 g_free (selection);
2684                         }
2685                 } else {
2686                         result = TRUE;
2687                 }
2688                 if (result)
2689                         modest_dimming_rule_set_notification (rule, "");
2690 #ifndef MODEST_TOOLKIT_HILDON2
2691         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2692                 const DimmedState *state = NULL;
2693
2694                 /* Check dimming */
2695                 state = modest_window_get_dimming_state (win);
2696                 if (state)
2697                         result = state->n_selected == 0;
2698                 if (result)
2699                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2700 #endif
2701         }
2702
2703         return result;
2704 }
2705
2706
2707 static gboolean
2708 _invalid_attach_selected (ModestWindow *win,
2709                           gboolean unique,
2710                           gboolean for_view,
2711                           gboolean for_remove,
2712                           ModestDimmingRule *rule) 
2713 {
2714         TnyList *attachments;
2715         gint n_selected;
2716         gboolean nested_attachments = FALSE;
2717         gboolean selected_messages = FALSE;
2718         gboolean result = FALSE;
2719
2720         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2721
2722         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2723
2724                 /* Get selected atachments */
2725                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2726                 n_selected = tny_list_get_length (attachments);
2727
2728                 /* Check unique */
2729                 if (!result) {
2730                         if (unique)
2731                                 result = n_selected != 1;
2732                         else
2733
2734                                 result = n_selected < 1;
2735                 }
2736
2737                 /* Check attached type (view operation not required) */
2738                 if (!result && !for_view)  {
2739                         TnyIterator *iter;
2740                         iter = tny_list_create_iterator (attachments);
2741                         while (!tny_iterator_is_done (iter) && !result) {
2742 #ifdef MODEST_TOOLKIT_HILDON2
2743                                 gboolean not_selectable = FALSE;
2744 #endif
2745                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2746                                 TnyList *nested_list = tny_simple_list_new ();
2747                                 tny_mime_part_get_parts (mime_part, nested_list);
2748
2749                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
2750                                         TnyMsg *window_msg;
2751                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2752                                         if ((TnyMimePart *) window_msg != mime_part) {
2753                                                 selected_messages = TRUE;
2754 #ifdef MODEST_TOOLKIT_HILDON2
2755                                                 not_selectable = TRUE;
2756 #else
2757                                                 result = TRUE;
2758 #endif
2759                                         }
2760                                         g_object_unref (window_msg);
2761                                 }
2762                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2763                                         nested_attachments = TRUE;
2764 #ifdef MODEST_TOOLKIT_HILDON2
2765                                         not_selectable = TRUE;
2766 #else
2767                                         result = TRUE;
2768 #endif
2769                                 }
2770 #ifdef MODEST_TOOLKIT_HILDON2
2771                                 if (not_selectable)
2772                                         n_selected --;
2773 #endif
2774                                 g_object_unref (nested_list);
2775                                 g_object_unref (mime_part);
2776                                 tny_iterator_next (iter);
2777                         }
2778                         g_object_unref (iter);
2779                 }
2780
2781                 /* No valid attachment available */
2782                 if (n_selected == 0)
2783                         result = TRUE;
2784
2785                 /* Set notifications */
2786                 if (result && rule != NULL) {
2787                         if (selected_messages) {
2788                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2789                         } else if (nested_attachments) {
2790                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2791                         } else if (n_selected == 0) {
2792                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2793                         } else if (unique) {
2794                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2795                         }
2796                 }
2797
2798                 /* Free */
2799                 g_object_unref (attachments);
2800 #ifndef MODEST_TOOLKIT_HILDON2
2801         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2802                 if (!result) {
2803                         const DimmedState *state = NULL;
2804                         state = modest_window_get_dimming_state (win);
2805                         result = !state->any_has_attachments;
2806                 }
2807 #endif
2808         }
2809
2810         return result;
2811 }
2812
2813 static gboolean
2814 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2815 {
2816         TnyList *attachments = NULL;
2817         TnyIterator *iter;
2818         gint purged = 0;
2819         gint n_attachments = 0;
2820         gboolean result = FALSE;
2821
2822         /* This should check if _all_ the attachments are already purged. If only some
2823          * of them are purged, then it does not cause dim as there's a confirmation dialog
2824          * for removing only local attachments */
2825
2826         /* Get selected atachments */
2827         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2828                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2829 #ifndef MODEST_TOOLKIT_HILDON2
2830         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2831                 /* If we're in main window, we won't know if there are already purged attachments */
2832                 return FALSE;
2833 #endif
2834         }
2835
2836         if (attachments == NULL)
2837                 return FALSE;
2838
2839         if (tny_list_get_length (attachments) == 0) {
2840                 g_object_unref (attachments);
2841                 return FALSE;
2842         }
2843
2844         iter = tny_list_create_iterator (attachments);
2845         while (!tny_iterator_is_done (iter)) {
2846                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2847                 if (tny_mime_part_is_purged (mime_part)) {
2848                         purged++;
2849                 }
2850                 n_attachments++;
2851                 g_object_unref (mime_part);
2852                 tny_iterator_next (iter);
2853         }
2854         g_object_unref (iter);
2855
2856         /* Free */
2857         g_object_unref (attachments);
2858
2859         if (all)
2860                 result = (purged == n_attachments);
2861         else
2862                 result = (purged > 0);
2863
2864         /* This string no longer exists, refer to NB#75415 for more info
2865         if (result && (rule != NULL))
2866                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2867         */
2868
2869         return result;
2870 }
2871
2872 #ifndef MODEST_TOOLKIT_HILDON2
2873 static gboolean
2874 _invalid_msg_selected (ModestMainWindow *win,
2875                        gboolean unique,
2876                        ModestDimmingRule *rule) 
2877 {
2878         GtkWidget *folder_view = NULL;
2879         const DimmedState *state = NULL;
2880         gboolean result = FALSE;
2881         gint n_selected = 0;
2882
2883         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2884         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2885
2886         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2887         if (state)
2888                 n_selected = state->n_selected;
2889
2890         /* Get folder view to check focus */
2891         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2892                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2893
2894         /* Check dimmed rule (TODO: check focus on widgets */   
2895         if (!result) {
2896                 result = ((n_selected == 0 ) ||
2897                           (gtk_widget_is_focus (folder_view)));
2898                 if (result)
2899                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2900         }
2901         if (!result && unique) {
2902                 result = n_selected > 1;
2903                 if (result)
2904                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2905         }
2906
2907         return result;
2908 }
2909 #endif
2910
2911 static gboolean
2912 _msg_download_in_progress (ModestWindow *win)
2913 {
2914         gboolean result = FALSE;
2915
2916         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2917
2918         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2919                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2920 #ifndef MODEST_TOOLKIT_HILDON2
2921         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2922                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2923 #endif
2924         }
2925
2926         return result;
2927 }
2928
2929 #ifndef MODEST_TOOLKIT_HILDON2
2930 static gboolean
2931 _msg_download_completed (ModestMainWindow *win)
2932 {
2933         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2934         return (state) ? state->any_marked_as_cached : TRUE;
2935 }
2936 #endif
2937
2938 static void
2939 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2940 {
2941         GSList **send_queues = (GSList **) userdata;
2942         *send_queues = g_slist_prepend (*send_queues, value);
2943 }
2944
2945 static gboolean
2946 _selected_msg_sent_in_progress (ModestWindow *win)
2947 {
2948         const DimmedState *state = modest_window_get_dimming_state (win);
2949         return (state) ? state->sent_in_progress : TRUE;
2950 }
2951
2952
2953 static gboolean
2954 _invalid_folder_for_purge (ModestWindow *win, 
2955                            ModestDimmingRule *rule)
2956 {
2957         TnyFolder *folder = NULL;
2958         TnyAccount *account = NULL;
2959         gboolean result = FALSE;
2960
2961         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2962
2963                 /* Get folder and account of message */
2964                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2965                 g_return_val_if_fail(msg != NULL, TRUE);
2966                 folder = tny_msg_get_folder (msg);
2967                 g_object_unref (msg);
2968                 if (folder == NULL) {
2969                         result = TRUE;
2970                         goto frees;
2971                 }
2972 #ifndef MODEST_TOOLKIT_HILDON2
2973         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2974                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2975                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2976                 if (!folder_view)
2977                         return FALSE;
2978                 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2979                 /* Could be a folder store */
2980                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2981                         goto frees;
2982 #endif
2983         } else {
2984                 g_return_val_if_reached (FALSE);
2985         }
2986         account = modest_tny_folder_get_account (folder);
2987         if (account == NULL) goto frees;
2988
2989         /* Check account */
2990         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2991                 TnyFolderType types[2];
2992                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2993                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2994
2995                 if (_selected_folder_is_any_of_type (win, types, 2)) {
2996                         result = TRUE;
2997                 }
2998         } else {
2999                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
3000                 /* If it's a remote folder then dim */
3001                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
3002                                                                     protocol_type,
3003                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
3004                         result = TRUE;
3005                 }
3006         }
3007         
3008 frees:
3009         if (folder != NULL)
3010                 g_object_unref (folder);
3011         if (account != NULL)
3012                 g_object_unref (account);
3013         
3014         return result;
3015 }
3016
3017 static gboolean
3018 _transfer_mode_enabled (ModestWindow *win)
3019 {
3020         gboolean result = FALSE;
3021
3022         /* Check dimming */
3023         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
3024                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
3025 #ifndef MODEST_TOOLKIT_HILDON2
3026         } else if (MODEST_IS_MAIN_WINDOW(win)) {
3027                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
3028 #else
3029         } else if (MODEST_IS_FOLDER_WINDOW (win)) {
3030                 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
3031         } else if (MODEST_IS_HEADER_WINDOW (win)) {
3032                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
3033 #endif
3034         } else {
3035                 g_warning("_transfer_mode_enabled called with wrong window type");
3036         }
3037
3038         return result;
3039 }
3040
3041 #ifndef MODEST_TOOLKIT_HILDON2
3042 static gboolean
3043 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
3044 {
3045         GtkWidget *folder_view = NULL;
3046         TnyFolderStore *folder = NULL;
3047         ModestEmailClipboard *clipboard = NULL;
3048         const gchar *folder_name = NULL;
3049         gboolean result = FALSE;
3050
3051         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
3052
3053         /*Get current parent folder */
3054         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
3055                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3056         /* If no folder view, always dimmed */
3057         if (!folder_view) return FALSE;
3058
3059         /* Get selected folder as parent of new folder to create */
3060         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
3061         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
3062
3063         /* get modest clipboard and source folder */
3064         clipboard = modest_runtime_get_email_clipboard ();
3065         folder_name = modest_email_clipboard_get_folder_name (clipboard);
3066         if (folder_name == NULL) goto frees;
3067
3068         /* Check source subfolders names */
3069         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
3070                                                             TRUE);
3071
3072         /* Free */
3073  frees:
3074         if (folder != NULL) 
3075                 g_object_unref (folder);
3076
3077
3078         return result;
3079 }
3080 #endif
3081
3082 static gboolean
3083 _all_msgs_in_sending_status (ModestHeaderView *header_view)
3084 {
3085         GtkTreeModel *model;
3086         GtkTreeIter iter;
3087         gboolean all_sending = TRUE;
3088
3089         model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
3090         if (gtk_tree_model_get_iter_first (model, &iter)) {
3091                 do {
3092                         TnyHeader *header;
3093
3094                         gtk_tree_model_get (model, &iter,
3095                                             TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
3096                                             &header,
3097                                             -1);
3098
3099                         if (header) {
3100                                 if (modest_tny_all_send_queues_get_msg_status (header) !=
3101                                     MODEST_TNY_SEND_QUEUE_SENDING)
3102                                         all_sending = FALSE;
3103                                 g_object_unref (header);
3104                         }
3105
3106                 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
3107         }
3108         return all_sending;
3109 }
3110
3111 gboolean 
3112 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
3113                                            gpointer user_data)
3114 {
3115         ModestDimmingRule *rule = NULL;
3116
3117         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3118         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3119         rule = MODEST_DIMMING_RULE (user_data);
3120
3121         /* Check dimmed rule */ 
3122         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
3123 }
3124
3125 gboolean
3126 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
3127                                          gpointer user_data)
3128 {
3129         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3130
3131         ModestMsgEditFormat format =
3132           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
3133
3134         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
3135 }
3136
3137 static gboolean 
3138 _send_receive_in_progress (ModestWindow *win)
3139 {
3140         ModestMailOperationQueue *queue;
3141         GSList *op_list, *node;
3142         gboolean found_send_receive;
3143
3144         queue = modest_runtime_get_mail_operation_queue ();
3145         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
3146
3147         found_send_receive = FALSE;
3148         for (node = op_list; node != NULL; node = g_slist_next (node)) {
3149                 ModestMailOperation *op;
3150
3151                 op = (ModestMailOperation *) node->data;
3152                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
3153                         found_send_receive = TRUE;
3154                         break;
3155                 }
3156         }
3157
3158         if (op_list) {
3159                 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
3160                 g_slist_free (op_list);
3161         }
3162
3163         return found_send_receive;
3164 }
3165
3166 static gboolean
3167 _msgs_send_in_progress (void)
3168 {
3169         ModestCacheMgr *cache_mgr;
3170         GHashTable *send_queue_cache;
3171         ModestTnySendQueue *send_queue;
3172         GSList *send_queues = NULL, *node = NULL;
3173         gboolean found = FALSE;
3174
3175         cache_mgr = modest_runtime_get_cache_mgr ();
3176         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
3177                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
3178
3179         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
3180
3181         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
3182                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
3183
3184                 /* Check if msg uid is being processed inside send queue */
3185                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
3186                         found = TRUE;
3187                         break;
3188                 }
3189         }
3190
3191         g_slist_free (send_queues);
3192
3193         return found;
3194 }
3195
3196 /*****************************************************************************/
3197 /********************** HILDON2 only dimming rules ***************************/
3198 /*****************************************************************************/
3199
3200 #ifdef MODEST_TOOLKIT_HILDON2
3201 gboolean 
3202 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
3203 {
3204         ModestDimmingRule *rule = NULL;
3205         gboolean dimmed = FALSE;
3206
3207         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
3208         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3209         rule = MODEST_DIMMING_RULE (user_data);
3210
3211         /* Check dimmed rule */ 
3212         dimmed = _transfer_mode_enabled (win);
3213         if (dimmed)
3214                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3215
3216         if (!dimmed)
3217                 dimmed = _forbid_outgoing_xfers (win);
3218
3219         if (!dimmed) {
3220                 GtkWidget *header_view;
3221                 TnyFolder *folder;
3222
3223                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
3224                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
3225                 if (folder) {
3226                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
3227                                 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
3228
3229                         if (!dimmed &&
3230                             (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
3231                                 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
3232                         }
3233                         g_object_unref (folder);
3234                 }
3235         }
3236
3237         return dimmed;
3238 }
3239
3240 gboolean 
3241 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
3242 {
3243         ModestDimmingRule *rule = NULL;
3244         gboolean dimmed = FALSE;
3245
3246         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3247         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3248         rule = MODEST_DIMMING_RULE (user_data);
3249
3250         /* Check dimmed rule */ 
3251         dimmed = _transfer_mode_enabled (win);
3252         if (dimmed)
3253                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3254
3255         if (!dimmed)
3256                 dimmed = _forbid_outgoing_xfers (win);
3257
3258         if (!dimmed && MODEST_IS_FOLDER_WINDOW (win)) {
3259                 ModestFolderView *folder_view;
3260                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3261                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3262                                                                        MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
3263         }
3264
3265         if (!dimmed) {
3266                 dimmed = _transfer_mode_enabled (win);
3267                 if (dimmed)
3268                         modest_dimming_rule_set_notification (rule, "");
3269         }
3270
3271         return dimmed;
3272 }
3273
3274 gboolean 
3275 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
3276 {
3277         ModestDimmingRule *rule = NULL;
3278         gboolean dimmed = FALSE;
3279
3280         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3281         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3282         rule = MODEST_DIMMING_RULE (user_data);
3283
3284         /* Check dimmed rule */ 
3285         dimmed = _transfer_mode_enabled (win);
3286         if (dimmed)
3287                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3288
3289         if (MODEST_IS_FOLDER_WINDOW (win)) {
3290                 ModestFolderView *folder_view;
3291                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3292                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3293                                                                        MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
3294         }
3295
3296         if (!dimmed) {
3297                 dimmed = _transfer_mode_enabled (win);
3298                 if (dimmed)
3299                         modest_dimming_rule_set_notification (rule, "");
3300         }
3301
3302         return dimmed;
3303 }
3304
3305 gboolean
3306 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
3307 {
3308         return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);
3309 }
3310 #endif