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