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