* 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-text-utils.h"
39 #include <widgets/modest-attachments-view.h>
40 #include <modest-runtime.h>
41 #include <tny-simple-list.h>
42
43
44 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
45 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
46 static gboolean _invalid_attach_selected (ModestWindow *win, gboolean unique, gboolean for_view, ModestDimmingRule *rule);
47 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
48 static gboolean _clipboard_is_empty (ModestWindow *win);
49 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
50 static gboolean _already_opened_msg (ModestWindow *win, guint *n_messages);
51 static gboolean _selected_msg_marked_as (ModestWindow *win, TnyHeaderFlags mask, gboolean opposite);
52 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
53 static gboolean _selected_folder_is_snd_level (ModestMainWindow *win);
54 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
55 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
56 static gboolean _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win);
57 static gboolean _selected_folder_is_root (ModestMainWindow *win);
58 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
59 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
60 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
61 static gboolean _msg_download_completed (ModestMainWindow *win);
62 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
63 static gboolean _sending_in_progress (ModestWindow *win);
64 static gboolean _marked_as_deleted (ModestWindow *win);
65 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
66 static gboolean _transfer_mode_enabled (ModestWindow *win);
67
68
69 gboolean 
70 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
71 {
72         ModestDimmingRule *rule = NULL;
73         gboolean dimmed = FALSE;
74
75         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
76         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
77         rule = MODEST_DIMMING_RULE (user_data);
78                 
79         /* Check dimmed rule */ 
80         if (!dimmed) {
81                 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
82                 if (dimmed)
83                         modest_dimming_rule_set_notification (rule, "");
84         }
85
86         return dimmed;
87 }
88
89 gboolean 
90 modest_ui_dimming_rules_on_csm_new_folder (ModestWindow *win, gpointer user_data)
91 {
92         ModestDimmingRule *rule = NULL;
93         gboolean dimmed = FALSE;
94
95         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
96         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
97         rule = MODEST_DIMMING_RULE (user_data);
98
99         /* Check common new folder menu item dimming rules */   
100         dimmed = modest_ui_dimming_rules_on_new_folder (win, user_data);
101         
102         /* Check CSM specific dimming rules */
103         if (!dimmed) {
104                 dimmed = _selected_folder_is_snd_level (MODEST_MAIN_WINDOW(win));
105                 if (dimmed)
106                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
107         }
108         
109         return dimmed;
110 }
111
112 gboolean 
113 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
114 {
115         ModestDimmingRule *rule = NULL;
116         GtkWidget *folder_view = NULL;
117         TnyFolderStore *parent_folder = NULL;
118         gboolean dimmed = FALSE;
119
120         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
121         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
122         rule = MODEST_DIMMING_RULE (user_data);
123
124         /* Get selected folder as parent of new folder to create */
125         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
126                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
127         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
128         if (!parent_folder)
129                 return TRUE;
130         
131         if (TNY_IS_ACCOUNT (parent_folder)) {
132                 /* If it's the local account then do not dim */
133                 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
134                         dimmed = FALSE;
135                 } else {
136                         const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
137                         /* If it's POP then dim */
138                         dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
139                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
140                         if (dimmed)
141                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
142                 }
143         } else {
144                 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
145                 
146                 TnyFolderType types[3];
147                                 
148                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
149                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
150                 types[2] = TNY_FOLDER_TYPE_SENT;
151
152                 /* Apply folder rules */        
153                 if (!dimmed) {
154                         dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
155                         if (dimmed)
156                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
157                 }
158                 if (!dimmed) {
159                         dimmed = _selected_folder_is_any_of_type (win, types, 3);
160                         if (dimmed)
161                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
162                 }
163         }
164         g_object_unref (parent_folder);
165
166         return dimmed;
167 }
168
169 gboolean 
170 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
171 {
172         ModestDimmingRule *rule = NULL;
173         GtkWidget *folder_view = NULL;
174         GtkWidget *header_view = NULL;  
175         gboolean dimmed = FALSE;
176
177         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
178         rule = MODEST_DIMMING_RULE (user_data);
179         
180         if (MODEST_IS_MAIN_WINDOW (win)) {
181                 /* Get the folder view */
182                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
183                                                                    MODEST_WIDGET_TYPE_FOLDER_VIEW);
184                 
185                 /* Get header view */
186                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
187                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
188
189                 if (header_view && gtk_widget_is_focus (header_view)) 
190                         dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
191
192                 if (folder_view && gtk_widget_is_focus (folder_view)) 
193                         dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
194
195                 if (header_view && folder_view &&
196                     !gtk_widget_is_focus (header_view) &&
197                     !gtk_widget_is_focus (folder_view)) {
198                         dimmed = TRUE;
199                         modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));                    
200                 }
201         } else {
202                 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
203         }
204
205         return dimmed;
206 }
207
208
209
210 gboolean 
211 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
212 {
213         ModestDimmingRule *rule = NULL;
214         TnyFolderType types[6];
215         gboolean dimmed = FALSE;
216
217         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
218         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
219         rule = MODEST_DIMMING_RULE (user_data);
220
221         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
222         types[1] = TNY_FOLDER_TYPE_OUTBOX;
223         types[2] = TNY_FOLDER_TYPE_SENT;
224         types[3] = TNY_FOLDER_TYPE_INBOX;
225         types[4] = TNY_FOLDER_TYPE_ROOT;
226         types[5] = TNY_FOLDER_TYPE_ARCHIVE;
227
228                 
229         /* Check dimmed rule */ 
230         if (!dimmed) {
231                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
232                 if (dimmed)
233                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
234         }
235         if (!dimmed) {
236                 dimmed = _selected_folder_is_any_of_type (win, types, 6);
237                 if (dimmed)
238                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
239         }
240         if (!dimmed) {
241                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
242                 if (dimmed)
243                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
244         }
245         if (!dimmed) {
246                 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
247                 if (dimmed)
248                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
249         }
250
251         return dimmed;
252 }
253
254 gboolean
255 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
256 {
257         ModestDimmingRule *rule = NULL;
258         gboolean dimmed = FALSE;
259
260         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
261         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
262         rule = MODEST_DIMMING_RULE (user_data);
263                 
264         /* Check dimmed rule */ 
265         if (!dimmed) {
266                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
267                 if (dimmed)
268                         modest_dimming_rule_set_notification (rule, "");
269         }
270
271         return dimmed;
272         
273 }
274
275 gboolean 
276 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
277 {
278         ModestDimmingRule *rule = NULL;
279         TnyFolderType types[3];
280         gboolean dimmed = FALSE;
281
282         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
283         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
284         rule = MODEST_DIMMING_RULE (user_data);
285
286         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
287         types[1] = TNY_FOLDER_TYPE_OUTBOX;
288         types[2] = TNY_FOLDER_TYPE_SENT;
289         
290         /* Check dimmed rule */ 
291         if (!dimmed) {
292                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
293                 if (dimmed)
294                         modest_dimming_rule_set_notification (rule, "");
295         }
296         if (!dimmed) {
297                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
298                 if (dimmed)
299                         modest_dimming_rule_set_notification (rule, "");
300         }
301         if (!dimmed) {
302                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
303                 if (dimmed)
304                         modest_dimming_rule_set_notification (rule, "");
305         }
306
307         return dimmed;
308 }
309
310 gboolean 
311 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
312 {
313         ModestDimmingRule *rule = NULL;
314         gboolean dimmed = FALSE;
315
316         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
317         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
318         rule = MODEST_DIMMING_RULE (user_data);
319                 
320         /* Check dimmed rule */ 
321         if (!dimmed) {
322                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
323         }
324         if (!dimmed) {
325                 dimmed = _marked_as_deleted (win);
326                 if (dimmed)
327                         modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
328         }
329         if (!dimmed) {
330                 dimmed = _selected_msg_sent_in_progress (win);
331                 if (dimmed)
332                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
333         }
334
335         return dimmed;
336 }
337
338 gboolean 
339 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
340 {
341         ModestDimmingRule *rule = NULL;
342         gboolean dimmed = FALSE;
343         TnyFolderType types[3];
344
345         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
346         rule = MODEST_DIMMING_RULE (user_data);
347
348         /* main window dimming rules */
349         if (MODEST_IS_MAIN_WINDOW(win)) {
350                 
351                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
352                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
353                 types[2] = TNY_FOLDER_TYPE_ROOT;
354                 
355                 /* Check dimmed rule */ 
356                 if (!dimmed) {
357                         dimmed = _selected_folder_is_any_of_type (win, types, 3);                       
358                         if (dimmed)
359                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
360                 }
361                 if (!dimmed) {
362                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
363                         if (dimmed)
364                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
365                 }
366                 if (!dimmed) {
367                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
368                 }
369         /* msg view window dimming rules */
370         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
371                 
372                 /* Check dimmed rule */ 
373                 if (!dimmed) {
374                         dimmed = _transfer_mode_enabled (win);                  
375                         if (dimmed)
376                                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
377                 }
378                 if (!dimmed) {
379                         dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
380                         if (dimmed)
381                                 modest_dimming_rule_set_notification (rule, "");
382                 }
383         }
384         
385         return dimmed;
386 }
387
388
389 gboolean 
390 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
391 {
392         ModestDimmingRule *rule = NULL;
393         gboolean dimmed = FALSE;
394
395         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
396         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
397         rule = MODEST_DIMMING_RULE (user_data);
398                 
399         /* Check dimmed rule */ 
400         if (!dimmed) {
401                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
402         }
403         if (!dimmed) {
404                 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
405                 if (dimmed)
406                         modest_dimming_rule_set_notification (rule, "");
407         }
408
409         return dimmed;
410 }
411
412 gboolean 
413 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
414 {
415         gboolean dimmed = FALSE;
416
417         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
418                 
419         /* Check dimmed rule */ 
420         if (!dimmed)
421                 dimmed = TRUE;
422
423         return dimmed;
424 }
425
426 gboolean 
427 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
428 {
429         ModestDimmingRule *rule = NULL;
430         guint n_messages = 0;
431         gboolean dimmed = FALSE;
432
433         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
434         rule = MODEST_DIMMING_RULE (user_data);
435         
436         /* Check dimmed rule */         
437         if (MODEST_IS_MAIN_WINDOW (win)) {
438                 if (!dimmed) {
439                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
440                         if (dimmed)
441                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
442                 }
443                 if (!dimmed) {
444                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
445                 }
446                 if (!dimmed) {
447                         dimmed = _already_opened_msg (win, &n_messages);
448                         if (dimmed) {
449                                 gchar *num = g_strdup_printf ("%d", n_messages);
450                                 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
451 /*                              modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); */
452                                 modest_dimming_rule_set_notification (rule, message);
453                                 g_free(message);
454                                 g_free(num);
455                         }
456                 }
457                 if (!dimmed) {
458                         dimmed = _marked_as_deleted (win);
459                         if (dimmed)
460                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
461                 }
462                 if (!dimmed) {
463                         dimmed = _selected_msg_sent_in_progress (win);
464                         if (dimmed)
465                                 modest_dimming_rule_set_notification (rule, _("ckct_ib_unable_to_delete]"));
466                 }
467         } 
468         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
469                 if (!dimmed) {
470                         dimmed = _transfer_mode_enabled (win);                  
471                         if (dimmed)
472                                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
473                 }
474                 if (!dimmed) {
475                         dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
476                         if (dimmed) {
477                                 gchar *num = g_strdup("1");
478                                 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
479 /*                              modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); */
480                                 modest_dimming_rule_set_notification (rule, message);
481                                 g_free(message);
482                                 g_free(num);
483                         }
484                 }
485         }
486
487         return dimmed;
488 }
489
490 gboolean 
491 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
492 {
493         ModestDimmingRule *rule = NULL;
494         GtkWidget *header_view = NULL;
495         gboolean dimmed = FALSE;
496
497         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
498         rule = MODEST_DIMMING_RULE (user_data);
499         
500         /* main window dimming rules */
501         if (MODEST_IS_MAIN_WINDOW(win)) {
502                                 
503                 /* Check dimmed rule */
504                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
505                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
506                 
507                 /* If the header view has the focus: */
508                 if (header_view && gtk_widget_is_focus (header_view)) {
509                         /* Check dimmed rule */ 
510                         if (!dimmed)
511                                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
512                 }
513                 else {
514                         /* If the folder view has the focus: */
515                         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
516                                 MODEST_WIDGET_TYPE_FOLDER_VIEW);
517                         if (folder_view && gtk_widget_is_focus (folder_view)) {
518                                 TnyFolderStore *folder_store
519                                         = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
520                                 if (folder_store) {
521                                         /* Only enable for folders, not accounts,
522                                          * though the UI spec is not clear about that.
523                                          * If we enable this for accounts then we must 
524                                          * add code to handle them in modest_ui_actions_on_details(). */
525                                         if (!TNY_IS_FOLDER(folder_store)) {
526                                                 dimmed = TRUE;
527                                                 modest_dimming_rule_set_notification (rule, "");
528                                         }
529
530                                         g_object_unref (folder_store);
531                                 }
532                         }
533
534                 }
535
536         /* msg view window dimming rules */
537         } else {
538
539                 /* Check dimmed rule */ 
540                 if (!dimmed) {
541                         dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
542                         if (dimmed)
543                                 modest_dimming_rule_set_notification (rule, "");
544                 }
545         }
546
547         return dimmed;
548 }
549
550
551 gboolean 
552 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
553 {
554         ModestDimmingRule *rule = NULL;
555         TnyHeaderFlags flags;
556         gboolean dimmed = FALSE;
557
558         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
559         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
560         rule = MODEST_DIMMING_RULE (user_data);
561         
562         flags = TNY_HEADER_FLAG_SEEN; 
563
564         /* Check dimmed rule */ 
565         if (!dimmed) {
566                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
567         }
568         if (!dimmed) {
569                 dimmed = _selected_msg_marked_as (win, flags, FALSE);
570                 if (dimmed)
571                         modest_dimming_rule_set_notification (rule, "");
572         }       
573
574         return dimmed;
575 }
576
577 gboolean 
578 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
579 {
580         ModestDimmingRule *rule = NULL;
581         TnyHeaderFlags flags;
582         gboolean dimmed = FALSE;
583
584         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
585         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
586         rule = MODEST_DIMMING_RULE (user_data);
587         
588         flags = TNY_HEADER_FLAG_SEEN; 
589
590         /* Check dimmed rule */ 
591         if (!dimmed)
592                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
593         if (!dimmed) {
594                 dimmed = _selected_msg_marked_as (win, flags, TRUE);
595                 if (dimmed)
596                         modest_dimming_rule_set_notification (rule, "");
597         }
598
599         return dimmed;
600 }
601
602 gboolean 
603 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
604 {
605         ModestDimmingRule *rule = NULL;
606         gboolean dimmed = FALSE;
607
608         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
609         rule = MODEST_DIMMING_RULE (user_data);
610
611         if (MODEST_IS_MAIN_WINDOW (win)) 
612                 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
613         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
614                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
615
616         return dimmed;
617 }
618
619
620 gboolean 
621 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
622 {
623         GtkWidget *folder_view = NULL;
624         GtkWidget *header_view = NULL;
625         ModestDimmingRule *rule = NULL;
626         guint n_messages = 0;
627         gboolean dimmed = FALSE;
628         
629         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
630         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
631         rule = MODEST_DIMMING_RULE (user_data);
632         
633         /* Get the folder view */
634         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
635                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
636
637         /* Get header view */
638         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
639                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
640         
641         /* Check diming rules for folders and messages transfer  */
642         if (!dimmed) {
643                 dimmed = _already_opened_msg (win, &n_messages);
644                 if (dimmed) {
645                         gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"), n_messages);
646                         modest_dimming_rule_set_notification (rule, message);
647                         g_free(message);
648                 }
649         }
650         if (!dimmed) {
651                 if (!gtk_widget_is_focus (folder_view))
652                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
653                 
654         }
655         
656         return dimmed;
657 }
658
659 gboolean 
660 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
661 {
662         ModestDimmingRule *rule = NULL;
663         gboolean dimmed = FALSE;
664
665         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
666         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
667         rule = MODEST_DIMMING_RULE (user_data);
668
669         /* Check dimmed rule */ 
670         if (!dimmed) {
671                 dimmed = _transfer_mode_enabled (win);                  
672                 if (dimmed)
673                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
674         }
675         if (!dimmed) {
676                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
677                 if (dimmed) 
678                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
679         }
680
681         return dimmed;
682 }
683
684 gboolean 
685 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
686 {
687         ModestDimmingRule *rule = NULL;
688         gboolean dimmed = FALSE;
689
690         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
691         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
692         rule = MODEST_DIMMING_RULE (user_data);
693
694         /* Check dimmed rule */ 
695         if (!dimmed) {
696                 dimmed = _transfer_mode_enabled (win);                  
697                 if (dimmed)
698                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
699         }
700
701         return dimmed;
702 }
703
704 gboolean 
705 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
706 {
707         ModestDimmingRule *rule = NULL;
708         TnyFolderType types[3];
709         gboolean dimmed = FALSE;
710         
711         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
712         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
713         rule = MODEST_DIMMING_RULE (user_data);
714
715         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
716         types[1] = TNY_FOLDER_TYPE_OUTBOX;
717         types[2] = TNY_FOLDER_TYPE_SENT;
718         
719         /* Check dimmed rule */ 
720         if (!dimmed) {
721                 dimmed = _clipboard_is_empty (win);
722                 if (dimmed)
723                         modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ecoc_ib_edwin_nothing_to_paste"));
724         }
725         if (!dimmed) {
726                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
727                 if (dimmed)
728                         modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
729         }
730         if (!dimmed) {
731                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
732                 if (dimmed) {
733                         modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
734                 }
735         }
736         if (!dimmed) {
737                 dimmed = _selected_folder_is_same_as_source (win);
738                 if (dimmed)
739                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
740         }
741
742         return dimmed;
743 }
744
745
746 gboolean 
747 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
748 {
749         ModestDimmingRule *rule = NULL;
750         gboolean dimmed = FALSE;
751
752         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
753         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
754         rule = MODEST_DIMMING_RULE (user_data);
755
756         /* Check dimmed rule */ 
757         if (!dimmed) {
758                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
759                 if (dimmed)
760                         modest_dimming_rule_set_notification (rule, "");
761         }
762                 
763         return dimmed;
764 }
765
766 gboolean 
767 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
768 {
769         ModestDimmingRule *rule = NULL;
770         gboolean dimmed = FALSE;
771
772         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
773         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
774         rule = MODEST_DIMMING_RULE (user_data);
775
776         /* Check dimmed rule */ 
777         if (!dimmed) 
778                 dimmed = _invalid_attach_selected (win, TRUE, TRUE, rule);                      
779
780         if (!dimmed) {
781                 dimmed = _purged_attach_selected (win, FALSE, NULL);
782                 if (dimmed) {
783                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
784                 }
785         }
786                 
787         return dimmed;
788 }
789
790 gboolean 
791 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
792 {
793         ModestDimmingRule *rule = NULL;
794         gboolean dimmed = FALSE;
795
796         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
797         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
798         rule = MODEST_DIMMING_RULE (user_data);
799
800         /* Check dimmed rule */ 
801         if (!dimmed) 
802                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, rule);
803
804         if (!dimmed) {
805                 dimmed = _purged_attach_selected (win, FALSE, NULL);
806                 if (dimmed) {
807                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
808                 }
809         }
810                 
811         return dimmed;
812 }
813
814 gboolean 
815 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
816 {
817         ModestDimmingRule *rule = NULL;
818         gboolean dimmed = FALSE;
819
820         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
821         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
822         rule = MODEST_DIMMING_RULE (user_data);
823
824         /* Check in main window if there's only one message selected */
825         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
826                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
827         }
828
829         /* Check in view window if there's any attachment selected */
830         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
831                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, NULL);
832                 if (dimmed)
833                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
834         }
835
836         /* cannot purge in editable drafts nor pop folders */
837         if (!dimmed) {
838                 dimmed = _invalid_folder_for_purge (win, rule);
839         }
840
841         /* Check if the selected message in main window has attachments */
842         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
843                 dimmed = _selected_msg_marked_as (win, TNY_HEADER_FLAG_ATTACHMENTS, TRUE);
844                 if (dimmed)
845                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
846         }
847
848         /* Check if all attachments are already purged */
849         if (!dimmed) {
850                 dimmed = _purged_attach_selected (win, TRUE, rule);
851         }
852
853         /* Check if the message is already downloaded */
854         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
855                 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
856                 if (dimmed)
857                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
858         }
859
860
861         return dimmed;
862 }
863
864 gboolean 
865 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
866 {
867         ModestDimmingRule *rule = NULL;
868         gboolean dimmed = FALSE;
869         
870         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
871         rule = MODEST_DIMMING_RULE (user_data);
872
873         /* Check dimmed rule */ 
874         if (!dimmed) {
875                 dimmed = _clipboard_is_empty (win); 
876                 if (dimmed)
877                         modest_dimming_rule_set_notification (rule, "");
878         }
879                                 
880         return dimmed;  
881 }
882
883 gboolean 
884 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
885 {
886         ModestDimmingRule *rule = NULL;
887         gboolean dimmed = FALSE;
888         
889         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
890         rule = MODEST_DIMMING_RULE (user_data);
891
892         /* Check common dimming rules */
893         if (!dimmed) {
894                 dimmed = _invalid_clipboard_selected (win, rule);
895         }
896
897         /* Check window specific dimming rules */
898         if (MODEST_IS_MAIN_WINDOW (win)) {
899                 if (!dimmed) { 
900                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
901                         if (dimmed)
902                                 modest_dimming_rule_set_notification (rule, "");
903                 }
904                 if (!dimmed) {
905                         dimmed = _selected_msg_sent_in_progress (win);
906                         if (dimmed)
907                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
908                 }
909         }
910         
911         return dimmed;
912 }
913
914 gboolean 
915 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
916 {
917         ModestDimmingRule *rule = NULL;
918         gboolean dimmed = FALSE;
919         
920         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
921         rule = MODEST_DIMMING_RULE (user_data);
922
923         /* Check common dimming rules */
924         if (!dimmed) {
925                 dimmed = _invalid_clipboard_selected (win, rule);
926         }
927         
928         /* Check window specific dimming rules */
929         if (MODEST_IS_MAIN_WINDOW (win)) {
930                 if (!dimmed) {
931                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
932                         if (dimmed)
933                                 modest_dimming_rule_set_notification (rule, "");
934                 }               
935                 if (!dimmed) {
936                         dimmed = _selected_msg_sent_in_progress (win);
937                         if (dimmed)
938                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
939                 }
940         }
941                 
942         return dimmed;
943 }
944
945 gboolean 
946 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
947 {
948         ModestDimmingRule *rule = NULL;
949         gboolean dimmed = FALSE;
950         
951         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
952         rule = MODEST_DIMMING_RULE (user_data);
953
954         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
955
956         /* Check dimmed rule */ 
957         if (!dimmed) {
958                 dimmed = _transfer_mode_enabled (win);                  
959                 if (dimmed)
960                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
961         }
962         if (!dimmed) {
963                 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
964 /*              if (dimmed) */
965 /*                      modest_dimming_rule_set_notification (rule, ""); */
966         }               
967
968         return dimmed;
969 }
970
971 gboolean 
972 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
973 {
974         ModestDimmingRule *rule = NULL;
975         gboolean dimmed = FALSE;
976
977         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
978         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
979         rule = MODEST_DIMMING_RULE (user_data);
980
981         /* Check dimmed rule */ 
982         if (!dimmed) {
983                 dimmed = _transfer_mode_enabled (win);                  
984                 if (dimmed)
985                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
986         }
987         if (!dimmed) {
988                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
989 /*              if (dimmed) */
990 /*                      modest_dimming_rule_set_notification (rule, ""); */
991         }               
992
993         return dimmed;
994 }
995
996
997 gboolean 
998 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
999 {
1000         const gboolean dimmed = 
1001                 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1002                         TRUE);  
1003                 
1004         return dimmed;
1005 }
1006
1007 gboolean 
1008 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1009 {
1010         ModestDimmingRule *rule = NULL;
1011         TnyFolderType types[1];
1012         guint n_messages = 0;
1013         gboolean dimmed = FALSE;
1014
1015         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1016         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1017         rule = MODEST_DIMMING_RULE (user_data);
1018
1019         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
1020
1021         /* Check dimmed rules */        
1022         if (!dimmed) {
1023                 dimmed = _already_opened_msg (win, &n_messages);
1024                 if (dimmed) 
1025                         modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_cancel_send"));
1026         }
1027         if (!dimmed) {
1028                 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1029                 if (dimmed) 
1030                         modest_dimming_rule_set_notification (rule, "");
1031         }
1032         if (!dimmed) {
1033                 dimmed = !_sending_in_progress (win);
1034                 if (dimmed)
1035                         modest_dimming_rule_set_notification (rule, "");
1036         }
1037
1038         return dimmed;
1039 }
1040
1041 gboolean 
1042 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1043 {
1044         ModestDimmingRule *rule = NULL;
1045         gboolean dimmed = FALSE;
1046         
1047         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1048         rule = MODEST_DIMMING_RULE (user_data);
1049  
1050         /* Check dimmed rule */ 
1051         if (!dimmed) {
1052                 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1053                                                           TRUE);        
1054                 if (dimmed)
1055                         modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1056         }
1057
1058         return dimmed;
1059 }
1060
1061 gboolean
1062 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1063 {
1064         ModestDimmingRule *rule = NULL;
1065         gboolean dimmed = FALSE;
1066
1067         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1068         rule = MODEST_DIMMING_RULE (user_data);
1069
1070         /* Check dimmed rule */
1071         if (!dimmed) {
1072                 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1073                 gchar *selection = NULL;
1074                 selection = gtk_clipboard_wait_for_text (clipboard);
1075
1076                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1077         }
1078
1079         return dimmed;
1080 }
1081
1082 /* *********************** static utility functions ******************** */
1083
1084 static gboolean 
1085 _marked_as_deleted (ModestWindow *win)
1086 {
1087         gboolean result = FALSE;
1088         TnyHeaderFlags flags;
1089
1090         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1091         
1092         flags = TNY_HEADER_FLAG_DELETED; 
1093
1094         /* Check dimmed rule */ 
1095         result = _selected_msg_marked_as (win, flags, FALSE);
1096         
1097         return result;
1098 }
1099
1100 static gboolean
1101 _selected_folder_not_writeable (ModestMainWindow *win)
1102 {
1103         GtkWidget *folder_view = NULL;
1104         TnyFolderStore *parent_folder = NULL;
1105         ModestTnyFolderRules rules;
1106         gboolean result = FALSE;
1107
1108         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1109
1110         /* Get folder view */
1111         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1112                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1113         /* If no folder view, always dimmed */
1114         if (!folder_view)
1115                 return TRUE;
1116         
1117         /* Get selected folder as parent of new folder to create */
1118         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1119         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1120                 if (parent_folder)
1121                         g_object_unref (parent_folder);
1122                 return TRUE;
1123         }
1124         
1125         /* Check dimmed rule */ 
1126         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1127         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1128
1129         /* free */
1130         g_object_unref (parent_folder);
1131
1132         return result;
1133 }
1134
1135 static gboolean
1136 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1137 {
1138         TnyFolderType types[2];
1139         gboolean result = FALSE;
1140
1141         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1142
1143         types[0] = TNY_FOLDER_TYPE_ROOT; 
1144         types[1] = TNY_FOLDER_TYPE_INBOX; 
1145
1146         /* Check folder type */
1147         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
1148
1149         /* Check pop and MMC accounts */
1150         if (!result) {
1151                 result = _selected_folder_is_MMC_or_POP_root (win);
1152         }
1153                 
1154         return result;
1155 }
1156
1157
1158 static gboolean
1159 _selected_folder_is_root (ModestMainWindow *win)
1160 {
1161         TnyFolderType types[1];
1162         gboolean result = FALSE;
1163
1164         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1165
1166         types[0] = TNY_FOLDER_TYPE_ROOT; 
1167
1168         /* Check folder type */
1169         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1170                 
1171         /* Check pop and MMC accounts */
1172         if (!result) {
1173                 result = _selected_folder_is_MMC_or_POP_root (win);
1174         }
1175
1176         return result;
1177 }
1178
1179 static gboolean
1180 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1181 {
1182         GtkWidget *folder_view = NULL;
1183         TnyFolderStore *parent_folder = NULL;
1184         gboolean result = FALSE;
1185
1186         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1187                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1188         /* Get selected folder as parent of new folder to create */
1189         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1190         if (!parent_folder)
1191                 return TRUE;
1192         
1193         if (TNY_IS_ACCOUNT (parent_folder)) {
1194                 /* If it's the local account then do not dim */
1195                 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1196                         result = FALSE;
1197                 } else {
1198                                 /* If it's the MMC root folder then dim it */
1199                         if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1200                                         result = TRUE;
1201                         } else {
1202                                 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1203                                 /* If it's POP then dim */
1204                                 result = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
1205                                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1206                         }
1207                 }
1208         }
1209         g_object_unref (parent_folder);
1210
1211         return result;
1212 }
1213
1214
1215 static gboolean
1216 _selected_folder_is_empty (ModestMainWindow *win)
1217 {
1218         GtkWidget *folder_view = NULL;
1219         TnyFolderStore *folder = NULL;
1220         gboolean result = FALSE;
1221
1222         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1223
1224         /* Get folder view */
1225         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1226                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1227         /* If no folder view, always dimmed */
1228         if (!folder_view)
1229                 return TRUE;
1230         
1231         /* Get selected folder as parent of new folder to create */
1232         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1233         if (!(folder && TNY_IS_FOLDER(folder))) {
1234                 if (folder)
1235                         g_object_unref (folder);
1236                 return TRUE;
1237         }
1238         
1239         /* Check folder type */
1240         result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
1241
1242         /* free */
1243         g_object_unref (folder);
1244
1245         return result;
1246 }
1247
1248 static gboolean
1249 _selected_folder_is_same_as_source (ModestWindow *win)
1250 {
1251         ModestEmailClipboard *clipboard = NULL;
1252         GtkWidget *folder_view = NULL;
1253         TnyFolderStore *folder = NULL;
1254         gboolean result = FALSE;
1255
1256         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1257
1258         /* Get folder view */
1259         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1260                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1261         if (!folder_view)
1262                 return FALSE;
1263         
1264         /* Get selected folder as destination folder */
1265         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1266         if (!(folder && TNY_IS_FOLDER(folder))) {
1267                 result = FALSE;
1268                 goto frees;
1269         }
1270         
1271         /* Check clipboard is cleared */
1272         clipboard = modest_runtime_get_email_clipboard ();
1273         if (modest_email_clipboard_cleared (clipboard)) {
1274                 result = FALSE;
1275                 goto frees;
1276         }
1277                 
1278         /* Check source folder */
1279         result = modest_email_clipboard_check_source_folder (clipboard, 
1280                                                              (const TnyFolder *) folder);
1281         
1282         /* Free */
1283  frees:
1284         g_object_unref (folder);
1285         
1286         return result;
1287 }
1288
1289 static gboolean
1290 _selected_folder_is_any_of_type (ModestWindow *win,
1291                                  TnyFolderType types[], 
1292                                  guint ntypes)
1293 {
1294         GtkWidget *folder_view = NULL;
1295         TnyFolderStore *folder = NULL;
1296         TnyFolderType folder_type;
1297         guint i=0;
1298         gboolean result = FALSE;
1299
1300         /*Get curent folder */
1301         if (MODEST_IS_MAIN_WINDOW(win)) {
1302
1303                 /* Get folder view */
1304                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1305                                                                    MODEST_WIDGET_TYPE_FOLDER_VIEW);
1306                 /* If no folder view, always dimmed */
1307                 if (!folder_view)
1308                         return FALSE;
1309         
1310                 /* Get selected folder as parent of new folder to create */
1311                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1312
1313                 if (!(folder && TNY_IS_FOLDER(folder))) {
1314                         if (folder)
1315                                 g_object_unref (folder);
1316                         return FALSE;
1317                 }
1318                 
1319                 /* Check folder type */
1320                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
1321         }
1322         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1323                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1324                 for (i=0; i < ntypes; i++) {
1325                         result = result || folder_type == types[i];
1326                 }
1327         }
1328
1329
1330         /* free */
1331         g_object_unref (folder);
1332
1333         return result;  
1334 }
1335
1336 static gboolean
1337 _folder_is_any_of_type (TnyFolder *folder,
1338                         TnyFolderType types[], 
1339                         guint ntypes)
1340 {
1341         TnyFolderType folder_type;
1342         gboolean result = FALSE;
1343         guint i;
1344
1345         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
1346
1347         /* Get folder type */
1348         if (modest_tny_folder_is_local_folder (folder))
1349                 folder_type = modest_tny_folder_get_local_folder_type (folder);         
1350         else 
1351                 folder_type = modest_tny_folder_guess_folder_type (folder);             
1352         
1353         /* Check foler type */
1354         for (i=0; i < ntypes; i++) {
1355                 result = result || folder_type == types[i];
1356         }
1357
1358         return result;
1359 }
1360
1361 static gboolean
1362 _selected_folder_is_snd_level (ModestMainWindow *win)
1363 {
1364         GtkWidget *folder_view = NULL;
1365         GtkTreeSelection *sel = NULL;
1366         GtkTreeModel *model = NULL;
1367         GtkTreePath *path = NULL;
1368         GtkTreeIter iter;
1369         TnyFolderStore *folder = NULL;
1370         gboolean result = FALSE;
1371
1372         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1373
1374         /*Get curent folder */
1375         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1376                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1377         /* If no folder view, always dimmed */
1378         if (!folder_view) 
1379                 goto frees;
1380
1381         /* Get selected folder as parent of new folder to create */
1382         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));     
1383         if (!(folder && TNY_IS_FOLDER(folder))) {
1384                 goto frees;
1385         }
1386         
1387         /* Check folder level */
1388         sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(folder_view));
1389         if (!gtk_tree_selection_get_selected (sel, &model, &iter))
1390                 goto frees;
1391         path = gtk_tree_model_get_path (model, &iter);
1392         result = gtk_tree_path_get_depth (path) > 2;
1393         
1394  frees:
1395         if (folder != NULL)
1396                 g_object_unref (folder);
1397         if (path != NULL)
1398                 gtk_tree_path_free (path);
1399         
1400         return result;
1401
1402 }
1403
1404 static gboolean
1405 _clipboard_is_empty (ModestWindow *win)
1406 {
1407         gboolean result = FALSE;
1408         
1409         if (MODEST_IS_MAIN_WINDOW (win)) {
1410                 ModestEmailClipboard *clipboard = NULL;
1411                 clipboard = modest_runtime_get_email_clipboard ();
1412                 if (modest_email_clipboard_cleared (clipboard)) 
1413                  result = TRUE;  
1414         }
1415
1416         return result;
1417 }
1418
1419 static gboolean
1420 _invalid_clipboard_selected (ModestWindow *win,
1421                        ModestDimmingRule *rule) 
1422 {
1423         gboolean result = FALSE;
1424
1425         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1426                 GtkClipboard *clipboard = NULL;
1427                 gchar *selection = NULL;
1428                 GtkWidget *focused = NULL;
1429
1430                 /* Get clipboard selection*/
1431                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1432                 selection = gtk_clipboard_wait_for_text (clipboard);
1433
1434                 /* Get focuesed widget */
1435                 focused = gtk_window_get_focus (GTK_WINDOW (win));
1436
1437                 /* Check dimming */
1438                 result = ((selection == NULL) || 
1439                           (MODEST_IS_ATTACHMENTS_VIEW (focused)));
1440                 
1441                 if (result)
1442                         modest_dimming_rule_set_notification (rule, "");
1443         }               
1444         else if (MODEST_IS_MAIN_WINDOW (win)) {
1445                 GtkWidget *header_view = NULL;
1446
1447                 /* Get header view to check selected messages */
1448                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1449                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
1450         
1451                 /* Check dimming */
1452                 result = !modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view));            
1453                 if (result)
1454                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));                  
1455         }
1456         
1457         return result;
1458 }
1459
1460
1461 static gboolean
1462 _invalid_attach_selected (ModestWindow *win,
1463                           gboolean unique,
1464                           gboolean for_view,
1465                           ModestDimmingRule *rule) 
1466 {
1467         GList *attachments, *node;
1468         gint n_selected;
1469         TnyHeaderFlags flags;
1470         gboolean nested_attachments = FALSE;
1471         gboolean selected_messages = FALSE;
1472         gboolean result = FALSE;
1473
1474         if (MODEST_IS_MAIN_WINDOW (win)) {
1475                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
1476                 if (!result)
1477                         result = _selected_msg_marked_as (win, flags, TRUE);            
1478         }
1479         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1480                 
1481                 /* Get selected atachments */
1482                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1483                 n_selected = g_list_length (attachments);
1484
1485                 /* Check unique */              
1486                 if (!result) {
1487                         if (unique) 
1488                                 result = n_selected != 1;
1489                         else
1490                                 
1491                                 result = n_selected < 1;
1492                 }
1493                 
1494                 /* Check attached type (view operation not required) */
1495                 if (!result && !for_view)  {
1496                         for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
1497                                 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1498                                 TnyList *nested_list = tny_simple_list_new ();
1499                                 if (TNY_IS_MSG (mime_part)) {
1500                                         selected_messages = TRUE;
1501                                         result = TRUE;
1502                                 }
1503                                 tny_mime_part_get_parts (mime_part, nested_list);
1504                                 if (tny_list_get_length (nested_list) > 0) {
1505                                 nested_attachments = TRUE;
1506                                 result = TRUE;
1507                                 }
1508                                 g_object_unref (nested_list);
1509                         }
1510                 }
1511                 
1512                 /* Set notifications */
1513                 if (result && rule != NULL) {
1514                         if (selected_messages) {
1515                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1516                         } else if (nested_attachments) {
1517                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1518                         } else if (n_selected == 0) {
1519                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1520                         } else if (unique) {
1521                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1522                         }
1523                 }
1524                 
1525                 /* Free */
1526                 g_list_free (attachments);
1527         }
1528
1529         return result;
1530 }
1531
1532 static gboolean
1533 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
1534 {
1535         GList *attachments = NULL, *node;
1536         gint purged = 0;
1537         gint n_attachments = 0;
1538         gboolean result = FALSE;
1539
1540         /* This should check if _all_ the attachments are already purged. If only some
1541          * of them are purged, then it does not cause dim as there's a confirmation dialog
1542          * for removing only local attachments */
1543
1544         /* Get selected atachments */
1545         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1546                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1547         } else if (MODEST_IS_MAIN_WINDOW (win)) {
1548                 /* If we're in main window, we won't know if there are already purged attachments */
1549                 return FALSE;
1550         }
1551
1552         if (attachments == NULL)
1553                 return FALSE;
1554
1555         for (node = attachments; node != NULL; node = g_list_next (node)) {
1556                 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1557                 if (tny_mime_part_is_purged (mime_part)) {
1558                         purged++;
1559                 }
1560                 n_attachments++;
1561         }
1562                 
1563         /* Free */
1564         g_list_free (attachments);
1565
1566         if (all)
1567                 result = (purged == n_attachments);
1568         else
1569                 result = (purged > 0);
1570
1571         if (result && (rule != NULL))
1572                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1573
1574         return result;
1575 }
1576
1577 static gboolean
1578 _invalid_msg_selected (ModestMainWindow *win,
1579                        gboolean unique,
1580                        ModestDimmingRule *rule) 
1581 {
1582         GtkWidget *header_view = NULL;          
1583         GtkWidget *folder_view = NULL;
1584         gboolean selected_headers = FALSE;
1585         gboolean result = FALSE;
1586
1587         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1588         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
1589                 
1590         /* Get header view to check selected messages */
1591         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1592                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1593         
1594         /* Get folder view to check focus */
1595         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1596                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1597
1598         /* Get selected headers */
1599         selected_headers = modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view));
1600
1601         /* Check dimmed rule (TODO: check focus on widgets */   
1602         if (!result) {
1603                 result = ((!selected_headers) ||
1604                           (gtk_widget_is_focus (folder_view)));
1605                 if (result)
1606                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1607         }
1608         if (!result && unique) {
1609                 result = modest_header_view_count_selected_headers (MODEST_HEADER_VIEW(header_view)) > 1;
1610                 if (result)
1611                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1612         }
1613
1614         return result;
1615 }
1616
1617 static gboolean
1618 _already_opened_msg (ModestWindow *win,
1619                      guint *n_messages)
1620 {
1621         //ModestWindow *window = NULL;
1622         ModestWindowMgr *mgr = NULL;
1623         GtkWidget *header_view = NULL;          
1624         TnyList *selected_headers = NULL;
1625         TnyIterator *iter = NULL;
1626         TnyHeader *header = NULL;
1627         gboolean found;
1628
1629         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1630                 
1631         /* Get header view to check selected messages */
1632         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1633                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1634
1635
1636         /* Check no selection */
1637         if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1638             return FALSE;
1639             
1640         /* Get selected headers */
1641         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1642         if (selected_headers == NULL) 
1643                 return FALSE;
1644
1645         *n_messages = tny_list_get_length (selected_headers);
1646
1647         /* Check dimmed rule (TODO: check focus on widgets */   
1648         mgr = modest_runtime_get_window_mgr ();
1649         iter = tny_list_create_iterator (selected_headers);
1650         found = FALSE;
1651         while (!tny_iterator_is_done (iter)) {
1652                 header = TNY_HEADER (tny_iterator_get_current (iter));
1653                 found = modest_window_mgr_find_registered_header (mgr,header, NULL);
1654                 
1655                 g_object_unref (header);
1656                 tny_iterator_next (iter);
1657
1658                 if (found)
1659                         break;
1660         }
1661                 
1662         /* free */
1663         if (selected_headers != NULL) 
1664                 g_object_unref (selected_headers);
1665         if (iter != NULL)
1666                 g_object_unref (iter);
1667                 
1668         return found;
1669 }
1670
1671 static gboolean
1672 _selected_msg_marked_as (ModestWindow *win, 
1673                          TnyHeaderFlags mask, 
1674                          gboolean opposite)
1675 {
1676         GtkWidget *header_view = NULL;
1677         TnyList *selected_headers = NULL;
1678         TnyIterator *iter = NULL;
1679         TnyHeader *header = NULL;
1680         TnyHeaderFlags flags;
1681         gboolean result = FALSE;
1682
1683         /* Get header view to check selected messages */
1684         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1685                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1686
1687         /* Check no selection */
1688         if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1689             return TRUE;
1690
1691         /* Get selected headers */
1692         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1693         if (selected_headers == NULL) 
1694                 return TRUE;
1695         
1696         /* Call the function for each header */
1697         iter = tny_list_create_iterator (selected_headers);
1698         while (!tny_iterator_is_done (iter) && !result) {
1699                 header = TNY_HEADER (tny_iterator_get_current (iter));
1700
1701                 flags = tny_header_get_flags (header);
1702                 if (opposite)
1703                         result = (flags & mask) == 0; 
1704                 else
1705                         result = (flags & mask) != 0; 
1706
1707                 g_object_unref (header);
1708                 tny_iterator_next (iter);
1709         }
1710
1711         /* free */
1712         if (selected_headers != NULL) 
1713                 g_object_unref (selected_headers);
1714         if (iter != NULL)
1715                 g_object_unref (iter);
1716
1717         return result;
1718 }
1719
1720 static gboolean
1721 _msg_download_in_progress (ModestMsgViewWindow *win)
1722 {
1723         gboolean result = FALSE;
1724
1725         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1726
1727         result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1728
1729         return result;
1730 }
1731
1732 static gboolean
1733 _msg_download_completed (ModestMainWindow *win)
1734 {
1735         GtkWidget *header_view = NULL;
1736         TnyList *selected_headers = NULL;
1737         TnyIterator *iter = NULL;
1738         TnyHeader *header = NULL;
1739         TnyHeaderFlags flags;
1740         gboolean result = FALSE;
1741
1742         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1743
1744
1745         /* Get header view to check selected messages */
1746         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1747                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1748
1749         /* Check no selection */
1750         if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1751             return TRUE;
1752
1753         /* Get selected headers */
1754         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1755         if (selected_headers == NULL) 
1756                 return TRUE;
1757
1758         /* Check dimmed rule  */        
1759         result = TRUE;
1760         iter = tny_list_create_iterator (selected_headers);
1761         while (!tny_iterator_is_done (iter) && result) {
1762                 header = TNY_HEADER (tny_iterator_get_current (iter));
1763                         
1764                 flags = tny_header_get_flags (header);
1765                 /* TODO: is this the right flag?, it seems that some
1766                    headers that have been previously downloaded do not
1767                    come with it */
1768                 result = (flags & TNY_HEADER_FLAG_CACHED);
1769
1770                 g_object_unref (header);
1771                 tny_iterator_next (iter);
1772         }
1773
1774         g_object_unref (iter);
1775
1776         return result;
1777 }
1778
1779 static gboolean
1780 _selected_msg_sent_in_progress (ModestWindow *win)
1781 {
1782         ModestTnySendQueue *send_queue = NULL;
1783         GtkWidget *header_view = NULL;
1784         ModestTnyAccountStore *acc_store = NULL;
1785         TnyAccount *account = NULL;
1786         TnyList *header_list = NULL;
1787         TnyIterator *iter = NULL;
1788         TnyHeader *header = NULL;
1789         const gchar *account_name = NULL;
1790         gboolean result = FALSE;
1791         gchar *id = NULL;
1792         
1793         /* Get transport account */
1794         acc_store = modest_runtime_get_account_store();
1795         account_name = modest_window_get_active_account (win);
1796         
1797         /* If no account defined, this action must be always dimmed  */
1798         if (account_name == NULL) return FALSE;
1799         account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1800         if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1801
1802         /* Get send queue for current ransport account */
1803         send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1804         g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1805
1806         if (MODEST_IS_MAIN_WINDOW(win)) {
1807                 
1808                 /* Get header view to check selected messages */
1809                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1810                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
1811                 
1812                 /* Check no selection */
1813                 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1814                     return FALSE;
1815
1816                 /* Get selected headers */
1817                 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1818
1819                 /* Get message header */
1820                 if (!header_list) return FALSE;
1821                 iter = tny_list_create_iterator (header_list);
1822                 header = TNY_HEADER (tny_iterator_get_current (iter));
1823
1824                 /* Get message id */
1825                 id = g_strdup(tny_header_get_message_id (header));
1826                 
1827         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1828                 
1829                 /* Get message header */
1830                 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
1831
1832                 /* Get message id */
1833                 id = g_strdup(tny_header_get_message_id (header));
1834         }
1835
1836         /* Check if msg id is being processed inside send queue */
1837         result = modest_tny_send_queue_msg_is_being_sent (send_queue, id);
1838
1839         /* Free */
1840         g_free(id);
1841         g_object_unref (header);
1842         g_object_unref(header_list);
1843         g_object_unref(iter);
1844
1845         return result;
1846 }
1847
1848
1849 static gboolean
1850 _sending_in_progress (ModestWindow *win)
1851 {
1852         gboolean result = FALSE;
1853         
1854         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1855
1856         /* Check if send operation is in progress */
1857         result = modest_main_window_send_receive_in_progress (MODEST_MAIN_WINDOW (win));
1858
1859         return result;
1860 }
1861
1862 static gboolean
1863 _invalid_folder_for_purge (ModestWindow *win, 
1864                            ModestDimmingRule *rule)
1865 {
1866         TnyMsg *msg = NULL;
1867         TnyFolder *folder = NULL;
1868         TnyAccount *account = NULL;
1869         gboolean result = FALSE;
1870
1871         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1872
1873                 /* Get folder and account of message */
1874                 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1875                 g_return_val_if_fail(msg != NULL, TRUE);                        
1876                 folder = tny_msg_get_folder (msg);              
1877                 if (folder == NULL) {
1878                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1879                         goto frees;                     
1880                 }
1881                 g_object_unref (msg);
1882         } else if (MODEST_IS_MAIN_WINDOW (win)) {
1883                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1884                                                                               MODEST_WIDGET_TYPE_FOLDER_VIEW);
1885                 if (!folder_view)
1886                         return FALSE;
1887                 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
1888                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
1889                         return FALSE;
1890                 g_object_ref (folder);
1891                 
1892         } else {
1893                 g_return_val_if_reached (FALSE);
1894         }
1895         account = modest_tny_folder_get_account (folder);
1896         if (account == NULL) goto frees;                        
1897                 
1898         /* Check account */
1899         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
1900                 TnyFolderType types[2];
1901                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1902                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1903                 
1904                 if (_selected_folder_is_any_of_type (win, types, 2)) {
1905                         result = TRUE;
1906                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
1907                 } else {
1908                         /* We're currently disabling purge in any local store */
1909                         result = TRUE;
1910                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1911                 }
1912         } else {
1913                 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
1914                 /* If it's POP then dim */
1915                 if (modest_protocol_info_get_transport_store_protocol (proto_str) == 
1916                     MODEST_PROTOCOL_STORE_POP) {
1917                         GList *attachments;
1918                         gint n_selected;
1919                         result = TRUE;
1920                         attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1921                         n_selected = g_list_length (attachments);
1922                         g_list_free (attachments);
1923                         
1924                         modest_dimming_rule_set_notification (rule, 
1925                                                               ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
1926                                                                         "mail_ib_unable_to_pure_attach_pop_mail_plural", 
1927                                                                         n_selected));
1928                 }
1929         }
1930         
1931 frees:
1932         if (folder != NULL)
1933                 g_object_unref (folder);
1934         if (account != NULL)
1935                 g_object_unref (account);
1936         
1937         return result;
1938 }
1939
1940 static gboolean
1941 _transfer_mode_enabled (ModestWindow *win)
1942 {
1943         gboolean result = FALSE;
1944
1945         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1946         
1947         /* Check dimming */
1948         result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
1949
1950         return result;
1951 }