d81658ad237250a4f868b4413752384f11a1fde1
[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-runtime.h>
39
40
41 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
42 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
43 static gboolean _already_opened_msg (ModestWindow *win);
44 static gboolean _selected_msg_marked_as (ModestWindow *win, TnyHeaderFlags mask, gboolean opposite);
45 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
46 static gboolean _selected_folder_is_any_of_type (ModestMainWindow *win, TnyFolderType types[], guint ntypes);
47 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
48 static gboolean _selected_folder_is_root (ModestMainWindow *win);
49 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
50 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
51 static gboolean _msg_download_completed (ModestMainWindow *win);
52 static gboolean _msg_sent_in_progress (ModestWindow *win);
53 static gboolean _marked_as_deleted (ModestWindow *win);
54
55
56 gboolean 
57 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
58 {
59         gboolean dimmed = FALSE;
60
61         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
62                 
63         /* Check dimmed rule */ 
64         if (!dimmed)
65                 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
66
67         return dimmed;
68 }
69
70 gboolean 
71 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
72 {
73         gboolean dimmed = FALSE;
74         GtkWidget *folder_view = NULL;
75         TnyFolderStore *parent_folder = NULL;
76
77         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
78
79
80         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
81                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
82         /* Get selected folder as parent of new folder to create */
83         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
84         if (!parent_folder)
85                 return TRUE;
86         
87         if (TNY_IS_ACCOUNT (parent_folder)) {
88                 /* If it's the local account then do not dim */
89                 if (modest_tny_account_is_virtual_local_folders (
90                         TNY_ACCOUNT (parent_folder)))
91                         return FALSE;
92                 else {
93                         const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
94                         /* If it's POP then dim */
95                         dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
96                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
97                 }
98         } else {
99                 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
100
101                 /* Apply folder rules */        
102                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
103         }
104
105         return dimmed;
106 }
107
108 gboolean 
109 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
110 {
111         gboolean dimmed = FALSE;
112
113         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
114                 
115         /* Check dimmed rule */ 
116         if (!dimmed)
117                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
118         if (!dimmed)
119                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
120
121         return dimmed;
122 }
123
124 gboolean
125 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
126 {
127         gboolean dimmed = FALSE;
128
129         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
130                 
131         /* Check dimmed rule */ 
132         if (!dimmed)
133                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
134
135         return dimmed;
136         
137 }
138
139 gboolean 
140 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
141 {
142         gboolean dimmed = FALSE;
143
144         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
145                 
146         /* Check dimmed rule */ 
147         if (!dimmed)
148                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
149         if (!dimmed)
150                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
151
152         return dimmed;
153 }
154
155 gboolean 
156 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
157 {
158         ModestDimmingRule *rule = NULL;
159         gboolean dimmed = FALSE;
160
161         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
162         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
163         rule = MODEST_DIMMING_RULE (user_data);
164                 
165         /* Check dimmed rule */ 
166         if (!dimmed)
167                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
168         if (!dimmed) {
169                 dimmed = _msg_sent_in_progress (win);
170                 if (dimmed)
171                         modest_dimming_rule_set_notification (rule, _("TEST"));
172         }
173
174         return dimmed;
175 }
176
177 gboolean 
178 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
179 {
180         ModestDimmingRule *rule = NULL;
181         gboolean dimmed = FALSE;
182         TnyFolderType types[3];
183
184         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
185         rule = MODEST_DIMMING_RULE (user_data);
186
187         /* main window dimming rules */
188         if (MODEST_IS_MAIN_WINDOW(win)) {
189                 
190                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
191                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
192                 types[2] = TNY_FOLDER_TYPE_ROOT;
193                 
194                 /* Check dimmed rule */ 
195                 if (!dimmed) {
196                         dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 3);                   
197                         if (dimmed)
198                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
199                 }
200                 if (!dimmed) {
201                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
202                         if (dimmed)
203                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
204                 }
205                 if (!dimmed)
206                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
207
208         /* msg view window dimming rules */
209         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
210                 
211                 /* Check dimmed rule */ 
212                 if (!dimmed)
213                         dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
214         }
215         
216         return dimmed;
217 }
218
219
220 gboolean 
221 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
222 {
223         gboolean dimmed = FALSE;
224
225         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
226                 
227         /* Check dimmed rule */ 
228         if (!dimmed)
229                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
230         if (!dimmed)
231                 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
232
233         return dimmed;
234 }
235
236 gboolean 
237 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
238 {
239         gboolean dimmed = FALSE;
240
241         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
242                 
243         /* Check dimmed rule */ 
244         if (!dimmed)
245                 dimmed = TRUE;
246
247         return dimmed;
248 }
249
250 gboolean 
251 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
252 {
253         ModestDimmingRule *rule = NULL;
254         gboolean dimmed = FALSE;
255         
256         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
257         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
258         rule = MODEST_DIMMING_RULE (user_data);
259         
260         /* Check dimmed rule */ 
261         if (!dimmed) {
262                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
263                 if (dimmed)
264                         modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_del"));
265         }
266         if (!dimmed) {
267                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
268                 if (dimmed)
269                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
270         }
271         if (!dimmed) {
272                 dimmed = _already_opened_msg (win);
273                 if (dimmed)
274                         modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages"));
275         }
276         if (!dimmed) {
277                 dimmed = _marked_as_deleted (win);
278                 if (dimmed)
279                         modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
280         }
281         if (!dimmed) {
282                 dimmed = _msg_sent_in_progress (win);
283                 if (dimmed)
284                         modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
285         }
286
287         return dimmed;
288 }
289
290 gboolean 
291 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
292 {
293         gboolean dimmed = FALSE;
294         GtkWidget *header_view = NULL;
295         
296         /* main window dimming rules */
297         if (MODEST_IS_MAIN_WINDOW(win)) {
298                                 
299                 /* Check dimmed rule */
300                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
301                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
302                 
303                 /* If the header view does not have the focus then do
304                    not apply msg dimming rules because the action will
305                    show the folder details that have no dimming
306                    rule */
307                 if (gtk_widget_is_focus (header_view)) {
308                         /* Check dimmed rule */ 
309                         if (!dimmed)
310                                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
311                 }
312
313         /* msg view window dimming rules */
314         } else {
315
316                 /* Check dimmed rule */ 
317                 if (!dimmed)
318                         dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
319         }
320
321         return dimmed;
322 }
323
324
325 gboolean 
326 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
327 {
328         gboolean dimmed = FALSE;
329         TnyHeaderFlags flags;
330
331         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
332         
333         flags = TNY_HEADER_FLAG_SEEN; 
334
335         /* Check dimmed rule */ 
336         if (!dimmed)
337                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
338         if (!dimmed) 
339                 dimmed = _selected_msg_marked_as (win, flags, FALSE);
340         
341         return dimmed;
342 }
343
344 gboolean 
345 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
346 {
347         gboolean dimmed = FALSE;
348         TnyHeaderFlags flags;
349
350         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
351         
352         flags = TNY_HEADER_FLAG_SEEN; 
353
354         /* Check dimmed rule */ 
355         if (!dimmed)
356                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
357         if (!dimmed) 
358                 dimmed = _selected_msg_marked_as (win, flags, TRUE);
359
360         return dimmed;
361 }
362
363 gboolean 
364 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
365 {
366         gboolean dimmed = FALSE;
367
368         if (MODEST_IS_MAIN_WINDOW (win)) 
369                 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
370         else 
371                 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
372
373         return dimmed;
374 }
375
376
377 gboolean 
378 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
379 {
380         GtkWidget *folder_view = NULL;
381         GtkWidget *header_view = NULL;
382         gboolean dimmed = FALSE;
383         
384         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
385         
386         /* Get the folder view */
387         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
388                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
389
390         /* Get header view */
391         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
392                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
393
394         /* Check common diming rules */
395
396         /* Check diming rules for folder transfer  */
397         if (gtk_widget_is_focus (folder_view)) {
398                 if (!dimmed) 
399                         dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win));
400         }
401         /* Check diming rules for msg transfer  */
402         else if (gtk_widget_is_focus (header_view)) {
403                 if (!dimmed)
404                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
405                 
406         }
407
408         return dimmed;
409 }
410
411 gboolean 
412 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
413 {
414         gboolean dimmed = FALSE;
415
416         return dimmed;
417 }
418
419 gboolean 
420 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
421 {
422         TnyFolderType types[3];
423         gboolean dimmed = FALSE;
424
425         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
426
427         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
428         types[1] = TNY_FOLDER_TYPE_OUTBOX;
429         types[2] = TNY_FOLDER_TYPE_SENT;
430         
431         /* Check dimmed rule */ 
432         if (!dimmed)
433                 dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 3);
434
435         return dimmed;
436 }
437
438 gboolean 
439 modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data)
440 {
441         TnyFolderType types[5];
442         gboolean dimmed = FALSE;
443
444         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
445
446         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
447         types[1] = TNY_FOLDER_TYPE_OUTBOX;
448         types[2] = TNY_FOLDER_TYPE_SENT;
449         types[3] = TNY_FOLDER_TYPE_INBOX;
450         types[4] = TNY_FOLDER_TYPE_ROOT;
451         
452         /* Check dimmed rule */ 
453         if (!dimmed)
454                 dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 5);
455
456         return dimmed;
457 }
458
459 gboolean 
460 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
461 {
462         gboolean dimmed = FALSE;
463
464         /* Check dimmed rule */ 
465         if (!dimmed) 
466                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
467                 
468         return dimmed;
469 }
470
471
472 gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
473 {
474         const gboolean dimmed = 
475                 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
476                         TRUE);  
477                 
478         return dimmed;
479 }
480
481
482 /* *********************** static utility functions ******************** */
483
484 static gboolean 
485 _marked_as_deleted (ModestWindow *win)
486 {
487         gboolean result = FALSE;
488         TnyHeaderFlags flags;
489
490         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
491         
492         flags = TNY_HEADER_FLAG_DELETED; 
493
494         /* Check dimmed rule */ 
495         result = _selected_msg_marked_as (win, flags, FALSE);
496         
497         return result;
498 }
499
500 static gboolean
501 _selected_folder_not_writeable (ModestMainWindow *win)
502 {
503         GtkWidget *folder_view = NULL;
504         TnyFolderStore *parent_folder = NULL;
505         ModestTnyFolderRules rules;
506         gboolean result = FALSE;
507
508         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
509
510         /* Get folder view */
511         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
512                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
513         /* If no folder view, always dimmed */
514         if (!folder_view)
515                 return TRUE;
516         
517         /* Get selected folder as parent of new folder to create */
518         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
519         if (!(parent_folder && TNY_IS_FOLDER(parent_folder)))
520                 return TRUE;
521         
522         /* Check dimmed rule */ 
523         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
524         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
525
526         /* free */
527         g_object_unref (parent_folder);
528
529         return result;
530 }
531
532 static gboolean
533 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
534 {
535         TnyFolderType types[2];
536         gboolean result = FALSE;
537
538         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
539
540         types[0] = TNY_FOLDER_TYPE_ROOT; 
541         types[1] = TNY_FOLDER_TYPE_INBOX; 
542
543         /* Check folder type */
544         result = _selected_folder_is_any_of_type (win, types, 2);
545
546         if (!result) {
547                 GtkWidget *folder_view = NULL;
548                 TnyFolderStore *parent_folder = NULL;
549                 
550                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
551                                                                    MODEST_WIDGET_TYPE_FOLDER_VIEW);
552                 /* Get selected folder as parent of new folder to create */
553                 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
554                 if (!parent_folder)
555                         return TRUE;
556
557                 if (TNY_IS_ACCOUNT (parent_folder)) {
558                         /* If it's the local account then do not dim */
559                         if (modest_tny_account_is_virtual_local_folders (
560                                                                          TNY_ACCOUNT (parent_folder)))
561                                 return FALSE;
562                         else {
563                                 /* If it's the MMC root folder then dim it */
564                                 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
565                                         result = TRUE;
566                                 } else {
567                                         const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
568                                         /* If it's POP then dim */
569                                         result = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
570                                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
571                                 }
572                         }
573                 }
574         }
575                 
576         return result;
577 }
578
579 static gboolean
580 _selected_folder_is_root (ModestMainWindow *win)
581 {
582         TnyFolderType types[1];
583         gboolean result = FALSE;
584
585         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
586
587         types[0] = TNY_FOLDER_TYPE_ROOT; 
588
589         /* Check folder type */
590         result = _selected_folder_is_any_of_type (win, types, 1);
591                 
592         return result;
593 }
594
595
596 static gboolean
597 _selected_folder_is_empty (ModestMainWindow *win)
598 {
599         GtkWidget *folder_view = NULL;
600         TnyFolderStore *folder = NULL;
601         gboolean result = FALSE;
602
603         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
604
605         /* Get folder view */
606         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
607                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
608         /* If no folder view, always dimmed */
609         if (!folder_view)
610                 return TRUE;
611         
612         /* Get selected folder as parent of new folder to create */
613         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
614         if (!(folder && TNY_IS_FOLDER(folder)))
615                 return TRUE;
616         
617         /* Check folder type */
618         result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
619
620         /* free */
621         g_object_unref (folder);
622
623         return result;
624 }
625
626 static gboolean
627 _selected_folder_is_any_of_type (ModestMainWindow *win,
628                                  TnyFolderType types[], 
629                                  guint ntypes)
630 {
631         GtkWidget *folder_view = NULL;
632         TnyFolderStore *folder = NULL;
633         gboolean result = FALSE;
634
635         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
636
637         /* Get folder view */
638         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
639                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
640         /* If no folder view, always dimmed */
641         if (!folder_view)
642                 return TRUE;
643         
644         /* Get selected folder as parent of new folder to create */
645         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
646         if (!(folder && TNY_IS_FOLDER(folder)))
647                 return TRUE;
648         
649         /* Check folder type */
650         result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
651
652         /* free */
653         g_object_unref (folder);
654
655         return result;  
656 }
657
658 static gboolean
659 _folder_is_any_of_type (TnyFolder *folder,
660                         TnyFolderType types[], 
661                         guint ntypes)
662 {
663         TnyFolderType folder_type;
664         gboolean result = FALSE;
665         guint i;
666
667         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
668
669         /* Get folder type */
670         if (modest_tny_folder_is_local_folder (folder))
671                 folder_type = modest_tny_folder_get_local_folder_type (folder);         
672         else 
673                 folder_type = modest_tny_folder_guess_folder_type (folder);             
674         
675         /* Check foler type */
676         for (i=0; i < ntypes; i++) {
677                 result = result || folder_type == types[i];
678         }
679
680         return result;
681 }
682
683
684
685 static gboolean
686 _invalid_msg_selected (ModestMainWindow *win,
687                        gboolean unique,
688                        ModestDimmingRule *rule) 
689 {
690         GtkWidget *header_view = NULL;          
691         GtkWidget *folder_view = NULL;
692         TnyList *selected_headers = NULL;
693         gboolean result = FALSE;
694
695         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
696         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
697                 
698         /* Get header view to check selected messages */
699         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
700                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
701         
702         /* Get folder view to check focus */
703         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
704                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
705
706         /* Get selected headers */
707         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
708
709         /* Check dimmed rule (TODO: check focus on widgets */   
710         if (!result) {
711                 result = ((selected_headers == NULL) || 
712                           (GTK_WIDGET_HAS_FOCUS (folder_view)));
713                 if (result)
714                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
715         }
716         if (!result && unique) {
717                 result = tny_list_get_length (selected_headers) > 1;
718                 if (result)
719                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
720         }
721
722         /* free */
723         if (selected_headers != NULL) 
724                 g_object_unref (selected_headers);
725
726         return result;
727 }
728
729 static gboolean
730 _already_opened_msg (ModestWindow *win)
731 {
732         ModestWindow *window = NULL;
733         ModestWindowMgr *mgr = NULL;
734         GtkWidget *header_view = NULL;          
735         TnyList *selected_headers = NULL;
736         TnyIterator *iter = NULL;
737         TnyHeader *header = NULL;
738         gboolean result = TRUE;
739
740         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
741                 
742         /* Get header view to check selected messages */
743         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
744                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
745
746         /* Get selected headers */
747         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
748         if (selected_headers == NULL) 
749                 return FALSE;
750
751         /* Check dimmed rule (TODO: check focus on widgets */   
752         mgr = modest_runtime_get_window_mgr ();
753         iter = tny_list_create_iterator (selected_headers);
754         while (!tny_iterator_is_done (iter) && result) {
755                 header = TNY_HEADER (tny_iterator_get_current (iter));
756                 window = modest_window_mgr_find_window_by_header (mgr, header);
757                 result = result && (window != NULL);
758                         
759                 g_object_unref (header);
760                 tny_iterator_next (iter);
761         }
762         
763         /* free */
764         if (selected_headers != NULL) 
765                 g_object_unref (selected_headers);
766         if (iter != NULL)
767                 g_object_unref (iter);
768                 
769         return result;
770 }
771
772 static gboolean
773 _selected_msg_marked_as (ModestWindow *win, 
774                          TnyHeaderFlags mask, 
775                          gboolean opposite)
776 {
777         GtkWidget *header_view = NULL;
778         TnyList *selected_headers = NULL;
779         TnyIterator *iter = NULL;
780         TnyHeader *header = NULL;
781         TnyHeaderFlags flags;
782         gboolean result = FALSE;
783
784         /* Get header view to check selected messages */
785         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
786                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
787
788         /* Get selected headers */
789         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
790         if (selected_headers == NULL) 
791                 return TRUE;
792         
793         /* Call the function for each header */
794         iter = tny_list_create_iterator (selected_headers);
795         while (!tny_iterator_is_done (iter) && !result) {
796                 header = TNY_HEADER (tny_iterator_get_current (iter));
797
798                 flags = tny_header_get_flags (header);
799                 if (opposite)
800                         result = (flags & mask) == 0; 
801                 else
802                         result = (flags & mask) != 0; 
803
804                 g_object_unref (header);
805                 tny_iterator_next (iter);
806         }
807
808         /* free */
809         if (selected_headers != NULL) 
810                 g_object_unref (selected_headers);
811         if (iter != NULL)
812                 g_object_unref (iter);
813
814         return result;
815 }
816
817 static gboolean
818 _msg_download_in_progress (ModestMsgViewWindow *win)
819 {
820         gboolean result = FALSE;
821
822         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
823
824         result = modest_msg_view_window_toolbar_on_transfer_mode (win);
825
826         return result;
827 }
828
829 static gboolean
830 _msg_download_completed (ModestMainWindow *win)
831 {
832         GtkWidget *header_view = NULL;
833         TnyList *selected_headers = NULL;
834         TnyIterator *iter = NULL;
835         TnyHeader *header = NULL;
836         TnyHeaderFlags flags;
837         gboolean result = FALSE;
838
839         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
840
841
842         /* Get header view to check selected messages */
843         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
844                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
845
846         /* Get selected headers */
847         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
848         if (selected_headers == NULL) 
849                 return TRUE;
850
851         /* Check dimmed rule  */        
852         result = TRUE;
853         iter = tny_list_create_iterator (selected_headers);
854         while (!tny_iterator_is_done (iter) && result) {
855                 header = TNY_HEADER (tny_iterator_get_current (iter));
856                         
857                 flags = tny_header_get_flags (header);
858                 /* TODO: is this the right flag?, it seems that some
859                    headers that have been previously downloaded do not
860                    come with it */
861                 result = (flags & TNY_HEADER_FLAG_CACHED);
862
863                 g_object_unref (header);
864                 tny_iterator_next (iter);
865         }
866
867         g_object_unref (iter);
868
869         return result;
870 }
871
872 static gboolean
873 _msg_sent_in_progress (ModestWindow *win)
874 {
875 /*      ModestTnySendQueue *send_queue = NULL; */
876 /*      GtkWidget *header_view = NULL;  */
877 /*      ModestTnyAccountStore *acc_store = NULL; */
878 /*      TnyAccount *account = NULL;      */
879 /*      TnyList *header_list = NULL; */
880 /*      TnyIterator *iter = NULL; */
881 /*      TnyHeader *header = NULL; */
882 /*      const gchar *account_name = NULL; */
883         gboolean result = FALSE;
884 /*      gchar *id = NULL; */
885         
886 /*      g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE); */
887         
888 /*      /\* Get transport account *\/   */
889 /*      acc_store = modest_runtime_get_account_store(); */
890 /*      account_name = modest_window_get_active_account (win);   */
891 /*      account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); */
892
893 /*      /\* Get send queue for current ransport account *\/  */
894 /*      send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); */
895 /*      g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); */
896
897 /*      if (MODEST_IS_MAIN_WINDOW(win)) { */
898                 
899 /*              /\* Get header view to check selected messages *\/ */
900 /*              header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), */
901 /*                                                                 MODEST_WIDGET_TYPE_HEADER_VIEW); */
902                 
903 /*              /\* Get selected headers *\/ */
904 /*              header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view)); */
905
906 /*              /\* Get message header *\/ */
907 /*              if (!header_list) return FALSE; */
908 /*              iter = tny_list_create_iterator (header_list); */
909 /*              header = TNY_HEADER (tny_iterator_get_current (iter)); */
910
911 /*              /\* Get message id *\/ */
912 /*              id = g_strdup(tny_header_get_message_id (header));               */
913                 
914 /*         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { */
915                 
916 /*              /\* Get message header *\/ */
917 /*              header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));                */
918
919 /*              /\* Get message id *\/ */
920 /*              id = g_strdup(tny_header_get_message_id (header));               */
921 /*      } */
922
923 /*      /\* Check if msg id is being processed inside send queue *\/ */
924 /*      result = modest_tny_send_queue_msg_is_being_sent (send_queue, id); */
925
926 /*      /\* Free *\/ */
927 /*      g_free(id); */
928 /*      g_object_unref (header); */
929 /*      g_free(header_list); */
930 /*      g_free(iter); */
931
932         return result;
933 }
934