Fix for NB#59458 (should dim sort button when the selected folder
[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 /* *********************** static utility functions ******************** */
473
474 static gboolean 
475 _marked_as_deleted (ModestWindow *win)
476 {
477         gboolean result = FALSE;
478         TnyHeaderFlags flags;
479
480         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
481         
482         flags = TNY_HEADER_FLAG_DELETED; 
483
484         /* Check dimmed rule */ 
485         result = _selected_msg_marked_as (win, flags, FALSE);
486         
487         return result;
488 }
489
490 static gboolean
491 _selected_folder_not_writeable (ModestMainWindow *win)
492 {
493         GtkWidget *folder_view = NULL;
494         TnyFolderStore *parent_folder = NULL;
495         ModestTnyFolderRules rules;
496         gboolean result = FALSE;
497
498         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
499
500         /* Get folder view */
501         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
502                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
503         /* If no folder view, always dimmed */
504         if (!folder_view)
505                 return TRUE;
506         
507         /* Get selected folder as parent of new folder to create */
508         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
509         if (!(parent_folder && TNY_IS_FOLDER(parent_folder)))
510                 return TRUE;
511         
512         /* Check dimmed rule */ 
513         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
514         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
515
516         /* free */
517         g_object_unref (parent_folder);
518
519         return result;
520 }
521
522 static gboolean
523 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
524 {
525         TnyFolderType types[2];
526         gboolean result = FALSE;
527
528         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
529
530         types[0] = TNY_FOLDER_TYPE_ROOT; 
531         types[1] = TNY_FOLDER_TYPE_INBOX; 
532
533         /* Check folder type */
534         result = _selected_folder_is_any_of_type (win, types, 2);
535
536         if (!result) {
537                 GtkWidget *folder_view = NULL;
538                 TnyFolderStore *parent_folder = NULL;
539                 
540                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
541                                                                    MODEST_WIDGET_TYPE_FOLDER_VIEW);
542                 /* Get selected folder as parent of new folder to create */
543                 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
544                 if (!parent_folder)
545                         return TRUE;
546
547                 if (TNY_IS_ACCOUNT (parent_folder)) {
548                         /* If it's the local account then do not dim */
549                         if (modest_tny_account_is_virtual_local_folders (
550                                                                          TNY_ACCOUNT (parent_folder)))
551                                 return FALSE;
552                         else {
553                                 /* If it's the MMC root folder then dim it */
554                                 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
555                                         result = TRUE;
556                                 } else {
557                                         const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
558                                         /* If it's POP then dim */
559                                         result = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
560                                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
561                                 }
562                         }
563                 }
564         }
565                 
566         return result;
567 }
568
569 static gboolean
570 _selected_folder_is_root (ModestMainWindow *win)
571 {
572         TnyFolderType types[1];
573         gboolean result = FALSE;
574
575         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
576
577         types[0] = TNY_FOLDER_TYPE_ROOT; 
578
579         /* Check folder type */
580         result = _selected_folder_is_any_of_type (win, types, 1);
581                 
582         return result;
583 }
584
585
586 static gboolean
587 _selected_folder_is_empty (ModestMainWindow *win)
588 {
589         GtkWidget *folder_view = NULL;
590         TnyFolderStore *folder = NULL;
591         gboolean result = FALSE;
592
593         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
594
595         /* Get folder view */
596         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
597                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
598         /* If no folder view, always dimmed */
599         if (!folder_view)
600                 return TRUE;
601         
602         /* Get selected folder as parent of new folder to create */
603         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
604         if (!(folder && TNY_IS_FOLDER(folder)))
605                 return TRUE;
606         
607         /* Check folder type */
608         result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
609
610         /* free */
611         g_object_unref (folder);
612
613         return result;
614 }
615
616 static gboolean
617 _selected_folder_is_any_of_type (ModestMainWindow *win,
618                                  TnyFolderType types[], 
619                                  guint ntypes)
620 {
621         GtkWidget *folder_view = NULL;
622         TnyFolderStore *folder = NULL;
623         gboolean result = FALSE;
624
625         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
626
627         /* Get folder view */
628         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
629                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
630         /* If no folder view, always dimmed */
631         if (!folder_view)
632                 return TRUE;
633         
634         /* Get selected folder as parent of new folder to create */
635         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
636         if (!(folder && TNY_IS_FOLDER(folder)))
637                 return TRUE;
638         
639         /* Check folder type */
640         result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
641
642         /* free */
643         g_object_unref (folder);
644
645         return result;  
646 }
647
648 static gboolean
649 _folder_is_any_of_type (TnyFolder *folder,
650                         TnyFolderType types[], 
651                         guint ntypes)
652 {
653         TnyFolderType folder_type;
654         gboolean result = FALSE;
655         guint i;
656
657         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
658
659         /* Get folder type */
660         if (modest_tny_folder_is_local_folder (folder))
661                 folder_type = modest_tny_folder_get_local_folder_type (folder);         
662         else 
663                 folder_type = modest_tny_folder_guess_folder_type (folder);             
664         
665         /* Check foler type */
666         for (i=0; i < ntypes; i++) {
667                 result = result || folder_type == types[i];
668         }
669
670         return result;
671 }
672
673
674
675 static gboolean
676 _invalid_msg_selected (ModestMainWindow *win,
677                        gboolean unique,
678                        ModestDimmingRule *rule) 
679 {
680         GtkWidget *header_view = NULL;          
681         GtkWidget *folder_view = NULL;
682         TnyList *selected_headers = NULL;
683         gboolean result = FALSE;
684
685         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
686         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
687                 
688         /* Get header view to check selected messages */
689         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
690                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
691         
692         /* Get folder view to check focus */
693         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
694                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
695
696         /* Get selected headers */
697         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
698
699         /* Check dimmed rule (TODO: check focus on widgets */   
700         if (!result) {
701                 result = ((selected_headers == NULL) || 
702                           (GTK_WIDGET_HAS_FOCUS (folder_view)));
703                 if (result)
704                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
705         }
706         if (!result && unique) {
707                 result = tny_list_get_length (selected_headers) > 1;
708                 if (result)
709                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
710         }
711
712         /* free */
713         if (selected_headers != NULL) 
714                 g_object_unref (selected_headers);
715
716         return result;
717 }
718
719 static gboolean
720 _already_opened_msg (ModestWindow *win)
721 {
722         ModestWindow *window = NULL;
723         ModestWindowMgr *mgr = NULL;
724         GtkWidget *header_view = NULL;          
725         TnyList *selected_headers = NULL;
726         TnyIterator *iter = NULL;
727         TnyHeader *header = NULL;
728         gboolean result = TRUE;
729
730         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
731                 
732         /* Get header view to check selected messages */
733         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
734                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
735
736         /* Get selected headers */
737         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
738         if (selected_headers == NULL) 
739                 return FALSE;
740
741         /* Check dimmed rule (TODO: check focus on widgets */   
742         mgr = modest_runtime_get_window_mgr ();
743         iter = tny_list_create_iterator (selected_headers);
744         while (!tny_iterator_is_done (iter) && result) {
745                 header = TNY_HEADER (tny_iterator_get_current (iter));
746                 window = modest_window_mgr_find_window_by_header (mgr, header);
747                 result = result && (window != NULL);
748                         
749                 g_object_unref (header);
750                 tny_iterator_next (iter);
751         }
752         
753         /* free */
754         if (selected_headers != NULL) 
755                 g_object_unref (selected_headers);
756         if (iter != NULL)
757                 g_object_unref (iter);
758                 
759         return result;
760 }
761
762 static gboolean
763 _selected_msg_marked_as (ModestWindow *win, 
764                          TnyHeaderFlags mask, 
765                          gboolean opposite)
766 {
767         GtkWidget *header_view = NULL;
768         TnyList *selected_headers = NULL;
769         TnyIterator *iter = NULL;
770         TnyHeader *header = NULL;
771         TnyHeaderFlags flags;
772         gboolean result = FALSE;
773
774         /* Get header view to check selected messages */
775         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
776                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
777
778         /* Get selected headers */
779         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
780         if (selected_headers == NULL) 
781                 return TRUE;
782         
783         /* Call the function for each header */
784         iter = tny_list_create_iterator (selected_headers);
785         while (!tny_iterator_is_done (iter) && !result) {
786                 header = TNY_HEADER (tny_iterator_get_current (iter));
787
788                 flags = tny_header_get_flags (header);
789                 if (opposite)
790                         result = (flags & mask) == 0; 
791                 else
792                         result = (flags & mask) != 0; 
793
794                 g_object_unref (header);
795                 tny_iterator_next (iter);
796         }
797
798         /* free */
799         if (selected_headers != NULL) 
800                 g_object_unref (selected_headers);
801         if (iter != NULL)
802                 g_object_unref (iter);
803
804         return result;
805 }
806
807 static gboolean
808 _msg_download_in_progress (ModestMsgViewWindow *win)
809 {
810         gboolean result = FALSE;
811
812         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
813
814         result = modest_msg_view_window_toolbar_on_transfer_mode (win);
815
816         return result;
817 }
818
819 static gboolean
820 _msg_download_completed (ModestMainWindow *win)
821 {
822         GtkWidget *header_view = NULL;
823         TnyList *selected_headers = NULL;
824         TnyIterator *iter = NULL;
825         TnyHeader *header = NULL;
826         TnyHeaderFlags flags;
827         gboolean result = FALSE;
828
829         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
830
831
832         /* Get header view to check selected messages */
833         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
834                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
835
836         /* Get selected headers */
837         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
838         if (selected_headers == NULL) 
839                 return TRUE;
840
841         /* Check dimmed rule  */        
842         result = TRUE;
843         iter = tny_list_create_iterator (selected_headers);
844         while (!tny_iterator_is_done (iter) && result) {
845                 header = TNY_HEADER (tny_iterator_get_current (iter));
846                         
847                 flags = tny_header_get_flags (header);
848                 /* TODO: is this the right flag?, it seems that some
849                    headers that have been previously downloaded do not
850                    come with it */
851                 result = (flags & TNY_HEADER_FLAG_CACHED);
852
853                 g_object_unref (header);
854                 tny_iterator_next (iter);
855         }
856
857         g_object_unref (iter);
858
859         return result;
860 }
861
862 static gboolean
863 _msg_sent_in_progress (ModestWindow *win)
864 {
865 /*      ModestTnySendQueue *send_queue = NULL; */
866 /*      GtkWidget *header_view = NULL;  */
867 /*      ModestTnyAccountStore *acc_store = NULL; */
868 /*      TnyAccount *account = NULL;      */
869 /*      TnyList *header_list = NULL; */
870 /*      TnyIterator *iter = NULL; */
871 /*      TnyHeader *header = NULL; */
872 /*      const gchar *account_name = NULL; */
873         gboolean result = FALSE;
874 /*      gchar *id = NULL; */
875         
876 /*      g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE); */
877         
878 /*      /\* Get transport account *\/   */
879 /*      acc_store = modest_runtime_get_account_store(); */
880 /*      account_name = modest_window_get_active_account (win);   */
881 /*      account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); */
882
883 /*      /\* Get send queue for current ransport account *\/  */
884 /*      send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); */
885 /*      g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); */
886
887 /*      if (MODEST_IS_MAIN_WINDOW(win)) { */
888                 
889 /*              /\* Get header view to check selected messages *\/ */
890 /*              header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), */
891 /*                                                                 MODEST_WIDGET_TYPE_HEADER_VIEW); */
892                 
893 /*              /\* Get selected headers *\/ */
894 /*              header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view)); */
895
896 /*              /\* Get message header *\/ */
897 /*              if (!header_list) return FALSE; */
898 /*              iter = tny_list_create_iterator (header_list); */
899 /*              header = TNY_HEADER (tny_iterator_get_current (iter)); */
900
901 /*              /\* Get message id *\/ */
902 /*              id = g_strdup(tny_header_get_message_id (header));               */
903                 
904 /*         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { */
905                 
906 /*              /\* Get message header *\/ */
907 /*              header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));                */
908
909 /*              /\* Get message id *\/ */
910 /*              id = g_strdup(tny_header_get_message_id (header));               */
911 /*      } */
912
913 /*      /\* Check if msg id is being processed inside send queue *\/ */
914 /*      result = modest_tny_send_queue_msg_is_being_sent (send_queue, id); */
915
916 /*      /\* Free *\/ */
917 /*      g_free(id); */
918 /*      g_object_unref (header); */
919 /*      g_free(header_list); */
920 /*      g_free(iter); */
921
922         return result;
923 }
924