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