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