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