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