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