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