f990644bda67163f7b95ab1962113fb72cddb17a
[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)
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                                 } else {
803                                         dimmed = TRUE;
804                                         modest_dimming_rule_set_notification (rule, "");
805                                 }
806                                 if (!dimmed) {
807                                         dimmed = _msg_download_in_progress (win);
808                                         if (dimmed)
809                                                 modest_dimming_rule_set_notification (rule, "");
810                                 }
811
812                         }
813
814                 }
815
816         /* msg view window dimming rules */
817         } else {
818
819                 /* Check dimmed rule */ 
820                 if (!dimmed) {
821                         if (MODEST_IS_MSG_VIEW_WINDOW (win))
822                                 dimmed = _msg_download_in_progress (win);
823                         if (dimmed)
824                                 modest_dimming_rule_set_notification (rule, "");
825                 }
826         }
827
828         return dimmed;
829 }
830
831
832 gboolean 
833 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
834 {
835         ModestDimmingRule *rule = NULL;
836         TnyHeaderFlags flags;
837         const DimmedState *state = NULL;
838         gboolean dimmed = FALSE;
839
840         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
841         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
842         rule = MODEST_DIMMING_RULE (user_data);
843         state = modest_window_get_dimming_state (win);          
844         
845         flags = TNY_HEADER_FLAG_SEEN; 
846
847         /* Check dimmed rule */ 
848         if (!dimmed) {
849                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
850         }
851         if (!dimmed) {
852                 dimmed = state->all_marked_as_seen;
853                 if (dimmed)
854                         modest_dimming_rule_set_notification (rule, "");
855         }       
856
857         return dimmed;
858 }
859
860 gboolean 
861 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
862 {
863         ModestDimmingRule *rule = NULL;
864         TnyHeaderFlags flags;
865         const DimmedState *state = NULL;
866         gboolean dimmed = FALSE;
867
868         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
869         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
870         rule = MODEST_DIMMING_RULE (user_data);
871         state = modest_window_get_dimming_state (win);          
872         
873         flags = TNY_HEADER_FLAG_SEEN; 
874
875         /* Check dimmed rule */ 
876         if (!dimmed)
877                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
878         if (!dimmed) {
879                 dimmed = !state->any_marked_as_seen;
880                 if (dimmed)
881                         modest_dimming_rule_set_notification (rule, "");
882         }
883
884         return dimmed;
885 }
886
887 gboolean 
888 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
889 {
890         ModestDimmingRule *rule = NULL;
891         gboolean dimmed = FALSE;
892
893         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
894         rule = MODEST_DIMMING_RULE (user_data);
895
896         if (MODEST_IS_MAIN_WINDOW (win)) 
897                 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
898         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
899                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
900
901         return dimmed;
902 }
903
904
905 gboolean 
906 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
907 {
908         GtkWidget *folder_view = NULL;
909         ModestDimmingRule *rule = NULL;
910         const DimmedState *state = NULL;
911         gboolean dimmed = FALSE;
912         
913         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
914         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
915         rule = MODEST_DIMMING_RULE (user_data);
916         state = modest_window_get_dimming_state (win);          
917         
918         /* Get the folder view */
919         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
920                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
921
922         
923         /* Check diming rules for folders transfer  */
924         if (gtk_widget_is_focus (folder_view)) {
925                 TnyFolderType types[5];
926                 
927                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
928                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
929                 types[2] = TNY_FOLDER_TYPE_SENT;
930                 types[3] = TNY_FOLDER_TYPE_ROOT; 
931                 types[4] = TNY_FOLDER_TYPE_INBOX; 
932                 
933                 /* Apply folder rules */        
934                 if (!dimmed) {
935                         dimmed = _selected_folder_not_moveable (MODEST_MAIN_WINDOW(win));
936                         if (dimmed)
937                                 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
938                 }
939                 if (!dimmed) {
940                         dimmed = _selected_folder_is_any_of_type (win, types, 5);
941                         if (dimmed)
942                                 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
943                 }
944         }
945         
946         /* Check diming rules for messages transfer  */
947         if (!dimmed) {
948                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
949                 if (dimmed) {
950                         gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"), 
951                                                          state->already_opened_msg);
952                         modest_dimming_rule_set_notification (rule, message);
953                         g_free(message);
954                 }
955         }
956         if (!dimmed) {
957                 if (!gtk_widget_is_focus (folder_view))
958                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
959                 
960         }
961         if (!dimmed) {
962                 dimmed = _selected_msg_sent_in_progress (win);
963                 if (dimmed)
964                         modest_dimming_rule_set_notification (rule, _("sfil_ib_unable_to_move_selected_items"));
965         }
966         
967         return dimmed;
968 }
969
970 gboolean 
971 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
972 {
973         ModestDimmingRule *rule = NULL;
974         gboolean dimmed = FALSE;
975
976         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
977         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
978         rule = MODEST_DIMMING_RULE (user_data);
979
980         /* Check dimmed rule */ 
981         if (!dimmed) {
982                 dimmed = _transfer_mode_enabled (win);                  
983                 if (dimmed)
984                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
985         }
986         
987         if (!dimmed) {
988                 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
989                         /* The move_to button should be dimmed when viewing an attachment,
990                          * but should be enabled when viewing a message from the list, 
991                          * or when viewing a search result.
992                          */
993                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
994                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
995                         }
996                 }
997                 
998                 if (dimmed) 
999                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
1000         }
1001
1002         return dimmed;
1003 }
1004
1005 gboolean 
1006 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
1007 {
1008         ModestDimmingRule *rule = NULL;
1009         gboolean dimmed = FALSE;
1010
1011         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1012         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1013         rule = MODEST_DIMMING_RULE (user_data);
1014
1015         /* Check dimmed rule */ 
1016         if (!dimmed) {
1017                 dimmed = _transfer_mode_enabled (win);                  
1018                 if (dimmed)
1019                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1020         }
1021
1022         return dimmed;
1023 }
1024
1025 gboolean 
1026 modest_ui_dimming_rules_on_paste (ModestWindow *win, gpointer user_data)
1027 {
1028         ModestDimmingRule *rule = NULL;
1029         TnyFolderType types[3];
1030         gboolean dimmed = FALSE;
1031         
1032         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1033         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1034         rule = MODEST_DIMMING_RULE (user_data);
1035
1036         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1037         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1038         types[2] = TNY_FOLDER_TYPE_SENT;
1039         
1040         /* Check dimmed rule */ 
1041         if (!dimmed) {
1042                 dimmed = _clipboard_is_empty (win);
1043                 if (dimmed)
1044                         modest_dimming_rule_set_notification (rule, 
1045                                                               dgettext("hildon-common-strings", 
1046                                                                        "ecoc_ib_edwin_nothing_to_paste"));
1047         }
1048         if (!dimmed) {
1049                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1050                 if (dimmed)
1051                         modest_dimming_rule_set_notification (rule, 
1052                                                               dgettext("hildon-common-strings", 
1053                                                                        "ckct_ib_unable_to_paste_here"));
1054         }
1055         if (!dimmed) {
1056                 dimmed = !_folder_view_has_focus (win);
1057                 if (dimmed)
1058                         modest_dimming_rule_set_notification (rule,
1059                                         dgettext("hildon-common-strings",
1060                                         "ckct_ib_unable_to_paste_here"));
1061         }
1062         if (!dimmed) {
1063                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), TRUE);
1064                 if (dimmed) 
1065                         modest_dimming_rule_set_notification (rule, 
1066                                                               dgettext("hildon-common-strings", 
1067                                                                        "ckct_ib_unable_to_paste_here"));
1068         }
1069         if (!dimmed) {
1070                 dimmed = _selected_folder_is_same_as_source (win);
1071                 if (dimmed)
1072                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
1073         }
1074         if (!dimmed) {
1075                 dimmed = _selected_folder_has_subfolder_with_same_name (win);
1076                 if (dimmed)
1077                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
1078         }
1079         
1080         return dimmed;
1081 }
1082
1083
1084 gboolean 
1085 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1086 {
1087         ModestDimmingRule *rule = NULL;
1088         gboolean dimmed = FALSE;
1089         GtkWidget *focused = NULL;
1090
1091         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1092         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1093         rule = MODEST_DIMMING_RULE (user_data);
1094
1095         focused = gtk_window_get_focus (GTK_WINDOW (win));
1096
1097         /* Main window dimming rules */ 
1098         if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
1099                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1100
1101         if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
1102                 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1103
1104         if (!dimmed && GTK_IS_ENTRY (focused)) {
1105                 const gchar *current_text;
1106                 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
1107                 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
1108         }
1109
1110         if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
1111                 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1112                 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
1113         }
1114
1115         if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
1116                 dimmed = FALSE;
1117         return dimmed;
1118 }
1119
1120 gboolean 
1121 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1122 {
1123         ModestDimmingRule *rule = NULL;
1124         gboolean dimmed = FALSE;
1125
1126         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1127         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1128         rule = MODEST_DIMMING_RULE (user_data);
1129
1130         /* Check dimmed rule */ 
1131         if (!dimmed) 
1132                 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);                       
1133
1134         if (!dimmed) {
1135                 dimmed = _purged_attach_selected (win, FALSE, NULL);
1136                 if (dimmed) {
1137                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1138                 }
1139         }
1140                 
1141         return dimmed;
1142 }
1143
1144 gboolean 
1145 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1146 {
1147         ModestDimmingRule *rule = NULL;
1148         gboolean dimmed = FALSE;
1149
1150         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1151         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1152         rule = MODEST_DIMMING_RULE (user_data);
1153
1154         /* Check dimmed rule */ 
1155         if (!dimmed) 
1156                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1157
1158         if (!dimmed) {
1159                 dimmed = _purged_attach_selected (win, FALSE, NULL);
1160                 if (dimmed) {
1161                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1162                 }
1163         }
1164                 
1165         return dimmed;
1166 }
1167
1168 gboolean 
1169 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1170 {
1171         ModestDimmingRule *rule = NULL;
1172         const DimmedState *state = NULL;
1173         gboolean dimmed = FALSE;
1174
1175         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1176         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1177         rule = MODEST_DIMMING_RULE (user_data);
1178         state = modest_window_get_dimming_state (win);          
1179
1180         /* Check in main window if there's only one message selected */
1181         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1182                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1183         }
1184
1185         /* Check in view window if there's any attachment selected */
1186         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1187                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1188                 if (dimmed)
1189                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1190         }
1191
1192         /* cannot purge in editable drafts nor pop folders */
1193         if (!dimmed) {
1194                 dimmed = _invalid_folder_for_purge (win, rule);
1195         }
1196
1197         /* Check if the selected message in main window has attachments */
1198         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1199                 dimmed = !(state->any_has_attachments);
1200                 if (dimmed)
1201                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1202         }
1203
1204         /* Check if all attachments are already purged */
1205         if (!dimmed) {
1206                 dimmed = _purged_attach_selected (win, TRUE, rule);
1207         }
1208
1209         /* Check if the message is already downloaded */
1210         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1211                 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1212                 if (dimmed)
1213                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1214         }
1215
1216
1217         return dimmed;
1218 }
1219
1220 gboolean 
1221 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1222 {
1223         ModestDimmingRule *rule = NULL;
1224         gboolean dimmed = FALSE;
1225         
1226         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1227         rule = MODEST_DIMMING_RULE (user_data);
1228
1229         /* Check dimmed rule */ 
1230         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1231                 dimmed = _clipboard_is_empty (win); 
1232                 if (dimmed)
1233                         modest_dimming_rule_set_notification (rule, "");
1234         }
1235
1236         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1237                 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
1238         }
1239                                 
1240         return dimmed;  
1241 }
1242
1243 gboolean 
1244 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
1245 {
1246         ModestDimmingRule *rule = NULL;
1247         gboolean dimmed = FALSE;
1248         
1249         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1250         rule = MODEST_DIMMING_RULE (user_data);
1251
1252         /* Check dimmed rule */ 
1253         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1254                 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
1255         }
1256                                 
1257         return dimmed;  
1258 }
1259
1260 gboolean 
1261 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1262 {
1263         ModestDimmingRule *rule = NULL;
1264         const DimmedState *state = NULL;
1265         gboolean dimmed = FALSE;
1266         
1267         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1268         rule = MODEST_DIMMING_RULE (user_data);
1269         state = modest_window_get_dimming_state (win);
1270
1271         /* Check common dimming rules */
1272         if (!dimmed) {
1273                 dimmed = _invalid_clipboard_selected (win, rule);
1274         }
1275
1276         /* Check window specific dimming rules */
1277         if (MODEST_IS_MAIN_WINDOW (win)) {
1278                 /* Get focused widget */
1279                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1280                 
1281                 if (MODEST_IS_HEADER_VIEW (focused)) {
1282                         if (!dimmed) { 
1283                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1284                                 if (dimmed)
1285                                         modest_dimming_rule_set_notification (rule, "");
1286                         }
1287                         if (!dimmed) {
1288                                 dimmed = _selected_msg_sent_in_progress (win);
1289                                 if (dimmed)
1290                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1291                         }
1292                         if (!dimmed) {
1293                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1294                                 if(dimmed)
1295                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1296                         }
1297                 }
1298                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1299                         TnyFolderType types[3];
1300                         
1301                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1302                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1303                         types[2] = TNY_FOLDER_TYPE_SENT;
1304                         
1305                         /* Apply folder rules */        
1306                         if (!dimmed) {
1307                                 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
1308                                 if (dimmed)
1309                                         modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
1310                         }
1311                         if (!dimmed) {
1312                                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1313                                 if (dimmed)
1314                                         modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1315                         }
1316                         if (!dimmed) {
1317                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1318                                 if (dimmed)
1319                                         modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1320                         }
1321                 }
1322         }
1323
1324         return dimmed;
1325 }
1326
1327 gboolean 
1328 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1329 {
1330         ModestDimmingRule *rule = NULL;
1331         const DimmedState *state = NULL;
1332         gboolean dimmed = FALSE;
1333         
1334         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1335         rule = MODEST_DIMMING_RULE (user_data);
1336         state = modest_window_get_dimming_state (win);
1337
1338         /* Check common dimming rules */
1339         if (!dimmed) {
1340                 dimmed = _invalid_clipboard_selected (win, rule);
1341         }
1342         
1343         /* Check window specific dimming rules */
1344         if (MODEST_IS_MAIN_WINDOW (win)) {
1345                 /* Get focused widget */
1346                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1347                 
1348                 if (MODEST_IS_HEADER_VIEW (focused)) {
1349                         if (!dimmed) {
1350                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1351                                 if (dimmed)
1352                                         modest_dimming_rule_set_notification (rule, "");
1353                         }               
1354                         if (!dimmed) {
1355                                 dimmed = _selected_msg_sent_in_progress (win);
1356                                 if (dimmed)
1357                                         modest_dimming_rule_set_notification (rule, _(""));
1358                         }
1359                         if (!dimmed) {
1360                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1361                                 if(dimmed)
1362                                         modest_dimming_rule_set_notification (rule, _(""));
1363                         }
1364                 }
1365                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1366                         TnyFolderType types[3];
1367                         
1368                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1369                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1370                         types[2] = TNY_FOLDER_TYPE_SENT;
1371
1372                         if (!dimmed) {
1373                                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1374                                 if (dimmed)
1375                                         modest_dimming_rule_set_notification (rule, _(""));
1376                         }
1377                         if (!dimmed) {
1378                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1379                                 if (dimmed)
1380                                         modest_dimming_rule_set_notification (rule, _(""));
1381                         }
1382                 }
1383         }
1384                 
1385         return dimmed;
1386 }
1387
1388 gboolean 
1389 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
1390 {
1391         ModestDimmingRule *rule = NULL;
1392         const DimmedState *state = NULL;
1393         gboolean dimmed = FALSE;
1394         
1395         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1396         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1397         rule = MODEST_DIMMING_RULE (user_data);
1398         state = modest_window_get_dimming_state (win);
1399
1400
1401         /* Check common dimming rules */
1402         if (!dimmed) {
1403                 ModestMsgEditFormat format;
1404                 format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1405
1406                 dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
1407                 if (dimmed)
1408                         modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
1409         }
1410
1411         if (!dimmed) {
1412                 GtkWidget *body;
1413                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1414                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1415                 
1416                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1417                 if (dimmed)
1418                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1419         }
1420                
1421         
1422         return dimmed;
1423 }
1424
1425 gboolean 
1426 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
1427 {
1428         ModestDimmingRule *rule = NULL;
1429         const DimmedState *state = NULL;
1430         gboolean dimmed = FALSE;
1431         
1432         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1433         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1434         rule = MODEST_DIMMING_RULE (user_data);
1435         state = modest_window_get_dimming_state (win);
1436
1437         if (!dimmed) {
1438                 GtkWidget *body;
1439                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1440                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1441                 
1442                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1443                 if (dimmed)
1444                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1445         }
1446                
1447         
1448         return dimmed;
1449 }
1450
1451 gboolean 
1452 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1453 {
1454         ModestDimmingRule *rule = NULL;
1455         const DimmedState *state = NULL;
1456         gboolean dimmed = FALSE;
1457         GtkWidget *focused = NULL;
1458         
1459         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1460         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1461         rule = MODEST_DIMMING_RULE (user_data);
1462         state = modest_window_get_dimming_state (win);
1463
1464         focused = gtk_window_get_focus (GTK_WINDOW (win));
1465
1466         if (!dimmed) {
1467                 dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1468         }
1469
1470         if (!dimmed) {
1471                 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1472         }
1473
1474         if (!dimmed) {
1475                 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1476                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1477                         (modest_msg_edit_window_get_clipboard_text(MODEST_MSG_EDIT_WINDOW (win)) == NULL);
1478         }
1479         
1480         return dimmed;
1481 }
1482
1483 gboolean 
1484 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1485 {
1486         ModestDimmingRule *rule = NULL;
1487         const DimmedState *state = NULL;
1488         gboolean dimmed = FALSE;
1489         
1490         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1491         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1492         rule = MODEST_DIMMING_RULE (user_data);
1493         state = modest_window_get_dimming_state (win);
1494
1495         if (!dimmed) {
1496                 GList *selected_attachments = NULL;
1497                 gint n_att_selected = 0;
1498                 GtkWidget *attachments_view;
1499                 attachments_view = modest_msg_edit_window_get_child_widget (
1500                         MODEST_MSG_EDIT_WINDOW (win),
1501                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1502                 
1503                 selected_attachments = modest_attachments_view_get_selection (
1504                         MODEST_ATTACHMENTS_VIEW (attachments_view));
1505                 n_att_selected = g_list_length (selected_attachments);
1506                 g_list_free (selected_attachments);
1507
1508                 dimmed = (n_att_selected != 1);
1509         }
1510         
1511         return dimmed;
1512 }
1513
1514 gboolean 
1515 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1516 {
1517         ModestDimmingRule *rule = NULL;
1518         const DimmedState *state = NULL;
1519         gboolean dimmed = FALSE;
1520         
1521         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1522         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1523         rule = MODEST_DIMMING_RULE (user_data);
1524         state = modest_window_get_dimming_state (win);
1525
1526         if (!dimmed) {
1527                 GtkWidget *subject_field, *body_field;
1528                 GtkTextBuffer *body_buffer;
1529                 const gchar *subject = NULL;
1530                 body_field = modest_msg_edit_window_get_child_widget (
1531                         MODEST_MSG_EDIT_WINDOW (win),
1532                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1533                 subject_field = modest_msg_edit_window_get_child_widget (
1534                         MODEST_MSG_EDIT_WINDOW (win),
1535                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT);
1536                 body_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (body_field));
1537                 subject = gtk_entry_get_text (GTK_ENTRY (subject_field));
1538
1539                 dimmed = ((subject == NULL || subject[0] == '\0')
1540                           || (gtk_text_buffer_get_char_count(body_buffer) == 0));
1541                 if (dimmed)
1542                         modest_dimming_rule_set_notification (rule, _("mcen_ib_subject_or_body_not_modified"));
1543         }
1544                
1545         if (!dimmed) {
1546                 GtkWidget *to_field, *cc_field, *bcc_field;
1547                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1548                 cc_field = modest_msg_edit_window_get_child_widget (
1549                         MODEST_MSG_EDIT_WINDOW (win),
1550                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1551                 to_field = modest_msg_edit_window_get_child_widget (
1552                         MODEST_MSG_EDIT_WINDOW (win),
1553                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1554                 bcc_field = modest_msg_edit_window_get_child_widget (
1555                         MODEST_MSG_EDIT_WINDOW (win),
1556                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1557                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1558                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1559                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1560
1561                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1562                            gtk_text_buffer_get_char_count (cc_buffer) +
1563                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1564                 if (dimmed)
1565                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1566         }
1567         
1568         return dimmed;
1569 }
1570
1571 gboolean 
1572 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1573 {
1574         ModestDimmingRule *rule = NULL;
1575         gboolean dimmed = FALSE;
1576         
1577         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1578         rule = MODEST_DIMMING_RULE (user_data);
1579
1580         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1581
1582         /* Check dimmed rule */
1583         if (!dimmed) {
1584                 dimmed = _transfer_mode_enabled (win);
1585                 if (dimmed)
1586                         modest_dimming_rule_set_notification (
1587                                         rule, _("mail_ib_notavailable_downloading"));
1588         }
1589         if (!dimmed) {
1590                 dimmed = modest_msg_view_window_first_message_selected (
1591                                 MODEST_MSG_VIEW_WINDOW(win));
1592                 modest_dimming_rule_set_notification (rule, NULL);
1593         }
1594
1595         return dimmed;
1596 }
1597
1598 gboolean 
1599 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1600 {
1601         ModestDimmingRule *rule = NULL;
1602         gboolean dimmed = FALSE;
1603
1604         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1605         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1606         rule = MODEST_DIMMING_RULE (user_data);
1607
1608         /* Check dimmed rule */ 
1609         if (!dimmed) {
1610                 dimmed = _transfer_mode_enabled (win);                  
1611                 if (dimmed)
1612                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1613         }
1614         if (!dimmed) {
1615                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1616                 modest_dimming_rule_set_notification (rule, NULL);
1617         }               
1618
1619         return dimmed;
1620 }
1621
1622
1623 gboolean 
1624 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1625 {
1626         const gboolean dimmed = 
1627                 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1628                         TRUE);  
1629                 
1630         return dimmed;
1631 }
1632
1633 gboolean 
1634 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1635 {
1636         ModestDimmingRule *rule = NULL;
1637         TnyFolderType types[1];
1638         const DimmedState *state = NULL;
1639         gboolean dimmed = FALSE;
1640
1641         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1642         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1643         rule = MODEST_DIMMING_RULE (user_data);
1644         state = modest_window_get_dimming_state (win);
1645
1646         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
1647
1648         /* Check dimmed rules */        
1649         if (!dimmed) {
1650                 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1651                 if (dimmed) 
1652                         modest_dimming_rule_set_notification (rule, "");
1653         }
1654         if (!dimmed) {
1655                 dimmed = !_sending_in_progress (win);
1656                 if (dimmed)
1657                         modest_dimming_rule_set_notification (rule, "");
1658         }
1659
1660         return dimmed;
1661 }
1662
1663 gboolean 
1664 modest_ui_dimming_rules_on_csm_cancel_sending (ModestWindow *win, gpointer user_data)
1665 {
1666         ModestDimmingRule *rule = NULL;
1667         TnyFolderType types[1];
1668         const DimmedState *state = NULL;
1669         gboolean dimmed = FALSE;
1670
1671         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1672         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1673         rule = MODEST_DIMMING_RULE (user_data);
1674         state = modest_window_get_dimming_state (win);
1675
1676         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
1677
1678         /* Check dimmed rules */        
1679         if (!dimmed) {
1680                 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1681                 if (dimmed) 
1682                         modest_dimming_rule_set_notification (rule, "");
1683         }
1684         if (!dimmed) {
1685                 dimmed = !_send_receive_in_progress (win);
1686                 if (dimmed)
1687                         modest_dimming_rule_set_notification (rule, "");
1688         }
1689
1690         return dimmed;
1691 }
1692
1693 gboolean 
1694 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1695 {
1696         ModestDimmingRule *rule = NULL;
1697         gboolean dimmed = FALSE;
1698         
1699         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1700         rule = MODEST_DIMMING_RULE (user_data);
1701  
1702         /* Check dimmed rule */ 
1703         if (!dimmed) {
1704                 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1705                                                           TRUE);        
1706                 if (dimmed)
1707                         modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1708         }
1709
1710         return dimmed;
1711 }
1712
1713 gboolean
1714 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1715 {
1716         ModestDimmingRule *rule = NULL;
1717         gboolean dimmed = FALSE;
1718
1719         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1720         rule = MODEST_DIMMING_RULE (user_data);
1721
1722         /* Check dimmed rule */
1723         if (!dimmed) {
1724                 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1725                 gchar *selection = NULL;
1726                 selection = gtk_clipboard_wait_for_text (clipboard);
1727
1728                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1729         }
1730
1731         return dimmed;
1732 }
1733
1734 /* *********************** static utility functions ******************** */
1735
1736
1737 static gboolean
1738 _selected_folder_not_writeable (ModestMainWindow *win,
1739                                 gboolean for_paste)
1740 {
1741         GtkWidget *folder_view = NULL;
1742         TnyFolderStore *parent_folder = NULL;
1743         ModestEmailClipboard *clipboard = NULL;
1744         ModestTnyFolderRules rules;
1745         gboolean is_local_acc = FALSE;
1746         gboolean xfer_folders = FALSE;
1747         gboolean result = FALSE;
1748
1749         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1750
1751         /* Get folder view */
1752         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1753                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1754         /* If no folder view, always dimmed */
1755         if (!folder_view)
1756                 return TRUE;
1757         
1758         /* Get selected folder as parent of new folder to create */
1759         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1760         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1761                 /* If it's the local account and its transfering folders, then do not dim */            
1762                 if (TNY_IS_ACCOUNT (parent_folder)) {
1763                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
1764                         if (for_paste) {
1765                                 clipboard = modest_runtime_get_email_clipboard ();
1766                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
1767                         }
1768                 }
1769
1770                 if (for_paste) 
1771                         result = !(is_local_acc && xfer_folders); 
1772                 else
1773                         result = !is_local_acc;
1774                 goto frees;             
1775         }
1776         
1777         /* Check dimmed rule */ 
1778         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1779         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1780
1781         /* free */
1782  frees:
1783         if (parent_folder != NULL)
1784                 g_object_unref (parent_folder);
1785
1786         return result;
1787 }
1788
1789 static gboolean
1790 _selected_folder_not_deletable (ModestMainWindow *win)
1791 {
1792         GtkWidget *folder_view = NULL;
1793         TnyFolderStore *parent_folder = NULL;
1794         ModestTnyFolderRules rules;
1795         gboolean result = FALSE;
1796
1797         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1798
1799         /* Get folder view */
1800         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1801                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1802         /* If no folder view, always dimmed */
1803         if (!folder_view)
1804                 return TRUE;
1805         
1806         /* Get selected folder as parent of new folder to create */
1807         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1808         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1809                 result = TRUE;
1810                 goto frees;             
1811         }
1812         
1813         /* Check dimmed rule */ 
1814         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1815         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
1816
1817         /* free */
1818  frees:
1819         if (parent_folder != NULL)
1820                 g_object_unref (parent_folder);
1821
1822         return result;
1823 }
1824
1825 static gboolean
1826 _selected_folder_not_moveable (ModestMainWindow *win)
1827 {
1828         GtkWidget *folder_view = NULL;
1829         TnyFolderStore *parent_folder = NULL;
1830         ModestTnyFolderRules rules;
1831         gboolean result = FALSE;
1832
1833         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1834
1835         /* Get folder view */
1836         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1837                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1838         /* If no folder view, always dimmed */
1839         if (!folder_view)
1840                 return TRUE;
1841         
1842         /* Get selected folder as parent of new folder to create */
1843         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1844         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1845                 result = TRUE;
1846                 goto frees;             
1847         }
1848         
1849         /* Check dimmed rule */ 
1850         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1851         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
1852
1853         /* free */
1854  frees:
1855         if (parent_folder != NULL)
1856                 g_object_unref (parent_folder);
1857
1858         return result;
1859 }
1860
1861 static gboolean
1862 _selected_folder_not_renameable (ModestMainWindow *win)
1863 {
1864         GtkWidget *folder_view = NULL;
1865         TnyFolderStore *parent_folder = NULL;
1866         ModestTnyFolderRules rules;
1867         gboolean result = FALSE;
1868
1869         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1870
1871         /* Get folder view */
1872         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1873                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1874         /* If no folder view, always dimmed */
1875         if (!folder_view)
1876                 return TRUE;
1877         
1878         /* Get selected folder as parent of new folder to create */
1879         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1880         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1881                 result = TRUE;
1882                 goto frees;             
1883         }
1884         
1885         /* Check dimmed rule */ 
1886         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1887         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
1888
1889         /* free */
1890  frees:
1891         if (parent_folder != NULL)
1892                 g_object_unref (parent_folder);
1893
1894         return result;
1895 }
1896
1897 static gboolean
1898 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1899 {
1900         TnyFolderType types[2];
1901         gboolean result = FALSE;
1902
1903         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1904
1905         types[0] = TNY_FOLDER_TYPE_ROOT; 
1906         types[1] = TNY_FOLDER_TYPE_INBOX; 
1907
1908         /* Check folder type */
1909         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
1910
1911         /* Check pop and MMC accounts */
1912         if (!result) {
1913                 result = _selected_folder_is_MMC_or_POP_root (win);
1914         }
1915                 
1916         return result;
1917 }
1918
1919
1920 static gboolean
1921 _selected_folder_is_root (ModestMainWindow *win)
1922 {
1923         TnyFolderType types[1];
1924         gboolean result = FALSE;
1925
1926         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1927
1928         /* All accounts are root items: */
1929         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1930                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1931         if (folder_view) {                                      
1932                 gboolean is_account = FALSE;
1933                 TnyFolderStore *folder_store = 
1934                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1935                 if (folder_store) {
1936                         is_account = TNY_IS_ACCOUNT (folder_store);
1937                         g_object_unref (folder_store);
1938                         folder_store = NULL;
1939                 }
1940                 
1941                 if (is_account)
1942                         return TRUE;
1943         }
1944                 
1945         /* Try something more precise: */
1946         types[0] = TNY_FOLDER_TYPE_ROOT; 
1947
1948         /* Check folder type */
1949         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1950                 
1951         /* Check pop and MMC accounts */
1952         if (!result) {
1953                 result = _selected_folder_is_MMC_or_POP_root (win);
1954         }
1955
1956         return result;
1957 }
1958
1959 static gboolean
1960 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1961 {
1962         GtkWidget *folder_view = NULL;
1963         TnyFolderStore *parent_folder = NULL;
1964         gboolean result = FALSE;
1965
1966         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1967                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1968         if (!folder_view)
1969                 return FALSE;
1970
1971         /* Get selected folder as parent of new folder to create */
1972         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1973         if (!parent_folder)
1974                 return TRUE;
1975         
1976         if (TNY_IS_ACCOUNT (parent_folder)) {
1977                 /* If it's the local account then do not dim */
1978                 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1979                         result = FALSE;
1980                 } else {
1981                                 /* If it's the MMC root folder then dim it */
1982                         if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1983                                         result = TRUE;
1984                         } else {
1985                                 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1986                                 /* If it's POP then dim */
1987                                 result = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
1988                                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1989                         }
1990                 }
1991         }
1992         g_object_unref (parent_folder);
1993
1994         return result;
1995 }
1996
1997 static gboolean
1998 _header_view_is_all_selected (ModestMainWindow *win)
1999 {
2000         const DimmedState *state = NULL;
2001
2002         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2003
2004         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2005
2006         return state->all_selected;
2007 }
2008
2009 static gboolean
2010 _selected_folder_is_empty (ModestMainWindow *win)
2011 {
2012         GtkWidget *folder_view = NULL;
2013         TnyFolderStore *folder = NULL;
2014         gboolean result = FALSE;
2015
2016         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2017
2018         /* Get folder view */
2019         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2020                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2021         /* If no folder view, always dimmed */
2022         if (!folder_view)
2023                 return TRUE;
2024         
2025         /* Get selected folder as parent of new folder to create */
2026         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2027         if (!(folder && TNY_IS_FOLDER(folder))) {
2028                 if (folder)
2029                         g_object_unref (folder);
2030                 return TRUE;
2031         }
2032         
2033         /* Check folder type */
2034         result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
2035
2036         /* free */
2037         g_object_unref (folder);
2038
2039         return result;
2040 }
2041
2042 static gboolean
2043 _folder_view_has_focus (ModestWindow *win)
2044 {
2045         GtkWidget *folder_view = NULL;
2046
2047         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2048
2049         /* Get folder view */
2050         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2051                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2052         if (!folder_view)
2053                 return FALSE;
2054         
2055         if (gtk_widget_is_focus(folder_view))
2056                 return TRUE;
2057
2058         return FALSE;
2059 }
2060
2061 static gboolean
2062 _selected_folder_is_same_as_source (ModestWindow *win)
2063 {
2064         ModestEmailClipboard *clipboard = NULL;
2065         GtkWidget *folder_view = NULL;
2066         TnyFolderStore *folder = NULL;
2067         gboolean result = FALSE;
2068
2069         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2070
2071         /* Get folder view */
2072         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2073                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2074         if (!folder_view)
2075                 return FALSE;
2076         
2077         /* Get selected folder as destination folder */
2078         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2079         if (!(folder && TNY_IS_FOLDER(folder))) {
2080                 result = FALSE;
2081                 goto frees;
2082         }
2083         
2084         /* Check clipboard is cleared */
2085         clipboard = modest_runtime_get_email_clipboard ();
2086         if (modest_email_clipboard_cleared (clipboard)) {
2087                 result = FALSE;
2088                 goto frees;
2089         }
2090                 
2091         /* Check source folder */
2092         result = modest_email_clipboard_check_source_folder (clipboard, 
2093                                                              (const TnyFolder *) folder);
2094         
2095         /* Free */
2096  frees:
2097         g_object_unref (folder);
2098         
2099         return result;
2100 }
2101
2102 static gboolean
2103 _selected_folder_is_any_of_type (ModestWindow *win,
2104                                  TnyFolderType types[], 
2105                                  guint ntypes)
2106 {
2107         GtkWidget *folder_view = NULL;
2108         TnyFolderStore *folder = NULL;
2109         TnyFolderType folder_type;
2110         guint i=0;
2111         gboolean result = FALSE;
2112
2113         /*Get current folder */
2114         if (MODEST_IS_MAIN_WINDOW(win)) {
2115
2116                 /* Get folder view */
2117                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2118                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2119                 /* If no folder view, always dimmed */
2120                 if (!folder_view)
2121                         return FALSE;
2122         
2123                 /* Get selected folder as parent of new folder to create */
2124                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2125
2126                 if (!(folder && TNY_IS_FOLDER(folder))) {
2127                         if (folder)
2128                                 g_object_unref (folder);
2129                         return FALSE;
2130                 }
2131                 
2132                 /* Check folder type */
2133                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2134         }
2135         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2136                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2137                 for (i=0; i < ntypes; i++) {
2138                         result = result || folder_type == types[i];
2139                 }
2140         }
2141
2142
2143         /* free */
2144         g_object_unref (folder);
2145
2146         return result;  
2147 }
2148
2149 static gboolean
2150 _folder_is_any_of_type (TnyFolder *folder,
2151                         TnyFolderType types[], 
2152                         guint ntypes)
2153 {
2154         TnyFolderType folder_type;
2155         gboolean result = FALSE;
2156         guint i;
2157
2158         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2159
2160         /* Get folder type */
2161         folder_type = modest_tny_folder_guess_folder_type (folder);
2162                 
2163         /* Check foler type */
2164         for (i=0; i < ntypes; i++) {
2165                 result = result || folder_type == types[i];
2166         }
2167
2168         return result;
2169 }
2170
2171 static gboolean
2172 _clipboard_is_empty (ModestWindow *win)
2173 {
2174         gboolean result = FALSE;
2175         
2176         if (MODEST_IS_MAIN_WINDOW (win)) {
2177                 ModestEmailClipboard *clipboard = NULL;
2178                 clipboard = modest_runtime_get_email_clipboard ();
2179                 if (modest_email_clipboard_cleared (clipboard)) 
2180                  result = TRUE;  
2181         }
2182
2183         return result;
2184 }
2185
2186 static gboolean
2187 _invalid_clipboard_selected (ModestWindow *win,
2188                              ModestDimmingRule *rule) 
2189 {
2190         const DimmedState *state = NULL;
2191         gboolean result = FALSE;
2192         GtkWidget *focused = NULL;
2193
2194         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2195         state = modest_window_get_dimming_state (win);
2196         /* Get focuesed widget */
2197         focused = gtk_window_get_focus (GTK_WINDOW (win));
2198
2199         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2200                 gboolean has_selection = FALSE;
2201                 if (GTK_IS_TEXT_VIEW (focused)) {
2202                         GtkTextBuffer *buffer = NULL;
2203                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2204                         has_selection = gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (buffer));
2205                 } else if (GTK_IS_EDITABLE (focused)) {
2206                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2207                 }
2208                 result = !has_selection;
2209         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2210                 GtkClipboard *clipboard = NULL;
2211                 gchar *selection = NULL;
2212
2213                 /* Get clipboard selection*/
2214                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2215                 selection = gtk_clipboard_wait_for_text (clipboard);
2216
2217                 /* Check dimming */
2218                 result = ((selection == NULL) || 
2219                           (MODEST_IS_ATTACHMENTS_VIEW (focused)));
2220                 
2221                 if (result)
2222                         modest_dimming_rule_set_notification (rule, "");
2223                 
2224                 if (selection != NULL) 
2225                         g_free(selection);
2226         }               
2227         else if (MODEST_IS_MAIN_WINDOW (win)) {
2228                 /* Check dimming */
2229                 result = state->n_selected == 0;
2230                 if (result)
2231                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));                  
2232         }
2233         
2234         return result;
2235 }
2236
2237
2238 static gboolean
2239 _invalid_attach_selected (ModestWindow *win,
2240                           gboolean unique,
2241                           gboolean for_view,
2242                           gboolean for_remove,
2243                           ModestDimmingRule *rule) 
2244 {
2245         GList *attachments, *node;
2246         gint n_selected;
2247         TnyHeaderFlags flags;
2248         gboolean nested_attachments = FALSE;
2249         gboolean selected_messages = FALSE;
2250         const DimmedState *state = NULL;
2251         gboolean result = FALSE;
2252
2253         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2254         state = modest_window_get_dimming_state (win);
2255
2256         if (MODEST_IS_MAIN_WINDOW (win)) {
2257                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2258                 if (!result)
2259                         result = !state->any_has_attachments;
2260         }
2261         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2262                 
2263                 /* Get selected atachments */
2264                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2265                 n_selected = g_list_length (attachments);
2266
2267                 /* Check unique */              
2268                 if (!result) {
2269                         if (unique) 
2270                                 result = n_selected != 1;
2271                         else
2272                                 
2273                                 result = n_selected < 1;
2274                 }
2275                 
2276                 /* Check attached type (view operation not required) */
2277                 if (!result && !for_view)  {
2278                         for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
2279                                 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
2280                                 TnyList *nested_list = tny_simple_list_new ();
2281                                 if (!for_remove && TNY_IS_MSG (mime_part)) {
2282                                         selected_messages = TRUE;
2283                                         result = TRUE;
2284                                 }
2285                                 tny_mime_part_get_parts (mime_part, nested_list);
2286                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2287                                         nested_attachments = TRUE;
2288                                         result = TRUE;
2289                                 }
2290                                 g_object_unref (nested_list);
2291                         }
2292                 }
2293                 
2294                 /* Set notifications */
2295                 if (result && rule != NULL) {
2296                         if (selected_messages) {
2297                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2298                         } else if (nested_attachments) {
2299                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2300                         } else if (n_selected == 0) {
2301                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2302                         } else if (unique) {
2303                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2304                         }
2305                 }
2306                 
2307                 /* Free */
2308                 g_list_free (attachments);
2309         }
2310
2311         return result;
2312 }
2313
2314 static gboolean
2315 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2316 {
2317         GList *attachments = NULL, *node;
2318         gint purged = 0;
2319         gint n_attachments = 0;
2320         gboolean result = FALSE;
2321
2322         /* This should check if _all_ the attachments are already purged. If only some
2323          * of them are purged, then it does not cause dim as there's a confirmation dialog
2324          * for removing only local attachments */
2325
2326         /* Get selected atachments */
2327         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2328                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2329         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2330                 /* If we're in main window, we won't know if there are already purged attachments */
2331                 return FALSE;
2332         }
2333
2334         if (attachments == NULL)
2335                 return FALSE;
2336
2337         for (node = attachments; node != NULL; node = g_list_next (node)) {
2338                 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
2339                 if (tny_mime_part_is_purged (mime_part)) {
2340                         purged++;
2341                 }
2342                 n_attachments++;
2343         }
2344                 
2345         /* Free */
2346         g_list_free (attachments);
2347
2348         if (all)
2349                 result = (purged == n_attachments);
2350         else
2351                 result = (purged > 0);
2352
2353         if (result && (rule != NULL))
2354                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2355
2356         return result;
2357 }
2358
2359 static gboolean
2360 _invalid_msg_selected (ModestMainWindow *win,
2361                        gboolean unique,
2362                        ModestDimmingRule *rule) 
2363 {
2364         GtkWidget *folder_view = NULL;
2365         const DimmedState *state = NULL;
2366         gboolean result = FALSE;
2367
2368         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2369         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2370         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2371                 
2372         /* Get folder view to check focus */
2373         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2374                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2375
2376         /* Check dimmed rule (TODO: check focus on widgets */   
2377         if (!result) {
2378                 result = ((state->n_selected == 0 ) ||
2379                           (gtk_widget_is_focus (folder_view)));
2380                 if (result)
2381                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2382         }
2383         if (!result && unique) {
2384                 result = state->n_selected > 1;
2385                 if (result)
2386                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2387         }
2388
2389         return result;
2390 }
2391
2392
2393 static gboolean
2394 _msg_download_in_progress (ModestWindow *win)
2395 {
2396         gboolean result = FALSE;
2397
2398         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2399
2400         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2401                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2402         }
2403         else if (MODEST_IS_MAIN_WINDOW (win)) {
2404                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2405         }
2406
2407         return result;
2408 }
2409
2410 static gboolean
2411 _msg_download_completed (ModestMainWindow *win)
2412 {
2413         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2414         return state->any_marked_as_cached;
2415 }
2416
2417 static void 
2418 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2419 {
2420         GSList **send_queues = (GSList **) userdata;
2421         *send_queues = g_slist_prepend (*send_queues, value);
2422 }
2423
2424 static gboolean
2425 _selected_msg_sent_in_progress (ModestWindow *win)
2426 {
2427         const DimmedState *state = modest_window_get_dimming_state (win);
2428         return state->sent_in_progress;
2429 }
2430
2431
2432 static gboolean
2433 _sending_in_progress (ModestWindow *win)
2434 {
2435         GHashTable *send_queue_cache = NULL;
2436         ModestCacheMgr *cache_mgr = NULL;
2437         ModestTnySendQueue *send_queue = NULL;
2438         GSList *send_queues = NULL, *node = NULL;
2439         gboolean result = FALSE;
2440         
2441         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
2442         
2443         /* Get send queue */
2444         cache_mgr = modest_runtime_get_cache_mgr ();
2445         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
2446                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
2447         
2448         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
2449         
2450         for (node = send_queues; node != NULL && !result; node = g_slist_next (node)) {
2451                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
2452                 
2453                 /* Check if send operation is in progress */
2454                 result = modest_tny_send_queue_sending_in_progress (send_queue);
2455         }
2456        
2457         return result;
2458 }
2459
2460 static gboolean
2461 _send_receive_in_progress (ModestWindow *win)
2462 {
2463         gboolean result = FALSE;
2464         
2465         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
2466
2467         /* Check if send operation is in progress */
2468         result = modest_main_window_send_receive_in_progress (MODEST_MAIN_WINDOW (win));
2469
2470         return result;
2471 }
2472
2473 static gboolean
2474 _invalid_folder_for_purge (ModestWindow *win, 
2475                            ModestDimmingRule *rule)
2476 {
2477         TnyMsg *msg = NULL;
2478         TnyFolder *folder = NULL;
2479         TnyAccount *account = NULL;
2480         gboolean result = FALSE;
2481
2482         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2483
2484                 /* Get folder and account of message */
2485                 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2486                 g_return_val_if_fail(msg != NULL, TRUE);                        
2487                 folder = tny_msg_get_folder (msg);      
2488                 if (folder == NULL) {
2489                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2490                         goto frees;
2491                 }
2492                 g_object_unref (msg);
2493         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2494                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2495                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2496                 if (!folder_view)
2497                         return FALSE;
2498                 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
2499                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2500                         goto frees;             
2501         } else {
2502                 g_return_val_if_reached (FALSE);
2503         }
2504         account = modest_tny_folder_get_account (folder);
2505         if (account == NULL) goto frees;                        
2506                 
2507         /* Check account */
2508         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2509                 TnyFolderType types[2];
2510                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2511                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2512                 
2513                 if (_selected_folder_is_any_of_type (win, types, 2)) {
2514                         result = TRUE;
2515                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
2516                 } else {
2517                         result = FALSE;
2518                 }
2519         } else {
2520                 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2521                 /* If it's POP then dim */
2522                 if (modest_protocol_info_get_transport_store_protocol (proto_str) == 
2523                     MODEST_PROTOCOL_STORE_POP) {
2524                         GList *attachments = NULL;
2525                         gint n_selected = 0;
2526                         result = TRUE;
2527                         
2528                         /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
2529                          * murrayc */
2530                         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2531                                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2532                                 n_selected = g_list_length (attachments);
2533                                 g_list_free (attachments);
2534                         }
2535                         
2536                         modest_dimming_rule_set_notification (rule, 
2537                                                               ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
2538                                                                         "mail_ib_unable_to_pure_attach_pop_mail_plural", 
2539                                                                         n_selected));
2540                 }
2541         }
2542         
2543 frees:
2544         if (folder != NULL)
2545                 g_object_unref (folder);
2546         if (account != NULL)
2547                 g_object_unref (account);
2548         
2549         return result;
2550 }
2551
2552 static gboolean
2553 _transfer_mode_enabled (ModestWindow *win)
2554 {
2555         gboolean result = FALSE;
2556
2557         /* Check dimming */
2558         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2559                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2560         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2561                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2562         } else {
2563                 g_warning("_transfer_mode_enabled called with wrong window type");
2564         }
2565
2566         return result;
2567 }
2568
2569 static gboolean
2570 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2571 {
2572         GtkWidget *folder_view = NULL;
2573         TnyFolderStore *folder = NULL;
2574         ModestEmailClipboard *clipboard = NULL;
2575         const gchar *folder_name = NULL;
2576         gboolean result = FALSE;
2577
2578         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2579
2580         /*Get current parent folder */
2581         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2582                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2583         /* If no folder view, always dimmed */
2584         if (!folder_view) return FALSE;
2585         
2586         /* Get selected folder as parent of new folder to create */
2587         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));     
2588         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
2589         
2590         /* get modest clipboard and source folder */
2591         clipboard = modest_runtime_get_email_clipboard ();
2592         folder_name = modest_email_clipboard_get_folder_name (clipboard);
2593         if (folder_name == NULL) goto frees;
2594
2595         /* Check source subfolders names */
2596         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name);
2597         
2598         
2599         /* Free */
2600  frees:
2601         if (folder != NULL) 
2602                 g_object_unref (folder);
2603
2604
2605         return result;
2606 }       
2607
2608 gboolean 
2609 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
2610                                            gpointer user_data)
2611 {
2612         ModestDimmingRule *rule = NULL;
2613         gboolean dimmed = FALSE;
2614
2615         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2616         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2617         rule = MODEST_DIMMING_RULE (user_data);
2618
2619         /* Check dimmed rule */ 
2620         if (!dimmed) {
2621                 dimmed = !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
2622         }
2623
2624         return dimmed;  
2625 }
2626
2627 gboolean
2628 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
2629                                          gpointer user_data)
2630 {
2631         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2632
2633         ModestMsgEditFormat format =
2634           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
2635
2636         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
2637 }