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