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