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