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