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