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