on_selection_changed signal handler takes into account selection
[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 /* *********************** static utility functions ******************** */
428
429 static gboolean
430 _selected_folder_not_writeable (ModestMainWindow *win)
431 {
432         GtkWidget *folder_view = NULL;
433         TnyFolderStore *parent_folder = NULL;
434         ModestTnyFolderRules rules;
435         gboolean result = FALSE;
436
437         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
438
439         /* Get folder view */
440         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
441                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
442         /* If no folder view, always dimmed */
443         if (!folder_view)
444                 return TRUE;
445         
446         /* Get selected folder as parent of new folder to create */
447         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
448         if (!(parent_folder && TNY_IS_FOLDER(parent_folder)))
449                 return TRUE;
450         
451         /* Check dimmed rule */ 
452         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
453         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
454
455         /* free */
456         g_object_unref (parent_folder);
457
458         return result;
459 }
460
461 static gboolean
462 _selected_folder_is_root (ModestMainWindow *win)
463 {
464         TnyFolderType types[2];
465         gboolean result = FALSE;
466
467         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
468
469         types[0] = TNY_FOLDER_TYPE_ROOT; 
470         types[1] = TNY_FOLDER_TYPE_INBOX; 
471
472         /* Check folder type */
473         result = _selected_folder_is_any_of_type (win, types, 2);
474
475         return result;
476 }
477
478
479 static gboolean
480 _selected_folder_is_empty (ModestMainWindow *win)
481 {
482         GtkWidget *folder_view = NULL;
483         TnyFolderStore *folder = NULL;
484         gboolean result = FALSE;
485
486         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
487
488         /* Get folder view */
489         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
490                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
491         /* If no folder view, always dimmed */
492         if (!folder_view)
493                 return TRUE;
494         
495         /* Get selected folder as parent of new folder to create */
496         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
497         if (!(folder && TNY_IS_FOLDER(folder)))
498                 return TRUE;
499         
500         /* Check folder type */
501         result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
502
503         /* free */
504         g_object_unref (folder);
505
506         return result;
507 }
508
509 static gboolean
510 _selected_folder_is_any_of_type (ModestMainWindow *win,
511                                  TnyFolderType types[], 
512                                  guint ntypes)
513 {
514         GtkWidget *folder_view = NULL;
515         TnyFolderStore *folder = NULL;
516         gboolean result = FALSE;
517
518         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
519
520         /* Get folder view */
521         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
522                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
523         /* If no folder view, always dimmed */
524         if (!folder_view)
525                 return TRUE;
526         
527         /* Get selected folder as parent of new folder to create */
528         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
529         if (!(folder && TNY_IS_FOLDER(folder)))
530                 return TRUE;
531         
532         /* Check folder type */
533         result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
534
535         /* free */
536         g_object_unref (folder);
537
538         return result;  
539 }
540
541 static gboolean
542 _folder_is_any_of_type (TnyFolder *folder,
543                         TnyFolderType types[], 
544                         guint ntypes)
545 {
546         TnyFolderType folder_type;
547         gboolean result = FALSE;
548         guint i;
549
550         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
551
552         /* Get folder type */
553         if (modest_tny_folder_is_local_folder (folder))
554                 folder_type = modest_tny_folder_get_local_folder_type (folder);         
555         else 
556                 folder_type = modest_tny_folder_guess_folder_type (folder);             
557         
558         /* Check foler type */
559         for (i=0; i < ntypes; i++) {
560                 result = result || folder_type == types[i];
561         }
562
563         return result;
564 }
565
566
567
568 static gboolean
569 _invalid_msg_selected (ModestMainWindow *win,
570                        gboolean unique,
571                        ModestDimmingRule *rule) 
572 {
573         GtkWidget *header_view = NULL;          
574         GtkWidget *folder_view = NULL;
575         TnyList *selected_headers = NULL;
576         gboolean result = FALSE;
577
578         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
579         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
580                 
581         /* Get header view to check selected messages */
582         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
583                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
584         
585         /* Get folder view to check focus */
586         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
587                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
588
589         /* Get selected headers */
590         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
591
592         /* Check dimmed rule (TODO: check focus on widgets */   
593         if (!result) {
594                 result = ((selected_headers == NULL) || 
595                           (GTK_WIDGET_HAS_FOCUS (folder_view)));
596                 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
597         }
598         if (!result) {
599                 result = tny_list_get_length (selected_headers) > 1;
600                 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
601         }
602
603         /* free */
604         if (selected_headers != NULL) 
605                 g_object_unref (selected_headers);
606
607         return result;
608 }
609
610 static gboolean
611 _already_opened_msg (ModestWindow *win)
612 {
613         ModestWindow *window = NULL;
614         ModestWindowMgr *mgr = NULL;
615         GtkWidget *header_view = NULL;          
616         TnyList *selected_headers = NULL;
617         TnyIterator *iter = NULL;
618         TnyHeader *header = NULL;
619         gboolean result = TRUE;
620
621         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
622                 
623         /* Get header view to check selected messages */
624         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
625                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
626
627         /* Get selected headers */
628         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
629         if (selected_headers == NULL) 
630                 return FALSE;
631
632         /* Check dimmed rule (TODO: check focus on widgets */   
633         mgr = modest_runtime_get_window_mgr ();
634         iter = tny_list_create_iterator (selected_headers);
635         while (!tny_iterator_is_done (iter) && result) {
636                 header = TNY_HEADER (tny_iterator_get_current (iter));
637                 window = modest_window_mgr_find_window_by_header (mgr, header);
638                 result = result && (window != NULL);
639                         
640                 g_object_unref (header);
641                 tny_iterator_next (iter);
642         }
643         
644         /* free */
645         if (selected_headers != NULL) 
646                 g_object_unref (selected_headers);
647         if (iter != NULL)
648                 g_object_unref (iter);
649                 
650         return result;
651 }
652
653 static gboolean
654 _selected_msg_marked_as (ModestWindow *win, 
655                          TnyHeaderFlags mask, 
656                          gboolean opposite)
657 {
658         GtkWidget *header_view = NULL;
659         TnyList *selected_headers = NULL;
660         TnyIterator *iter = NULL;
661         TnyHeader *header = NULL;
662         TnyHeaderFlags flags;
663         gboolean result = FALSE;
664
665         /* Get header view to check selected messages */
666         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
667                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
668
669         /* Get selected headers */
670         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
671         if (selected_headers == NULL) 
672                 return TRUE;
673         
674         /* Call the function for each header */
675         iter = tny_list_create_iterator (selected_headers);
676         while (!tny_iterator_is_done (iter) && !result) {
677                 header = TNY_HEADER (tny_iterator_get_current (iter));
678
679                 flags = tny_header_get_flags (header);
680                 if (opposite)
681                         result = (flags & mask) == 0; 
682                 else
683                         result = (flags & mask) != 0; 
684
685                 g_object_unref (header);
686                 tny_iterator_next (iter);
687         }
688
689         /* free */
690         if (selected_headers != NULL) 
691                 g_object_unref (selected_headers);
692         if (iter != NULL)
693                 g_object_unref (iter);
694
695         return result;
696 }
697
698 static gboolean
699 _msg_download_in_progress (ModestMsgViewWindow *win)
700 {
701         gboolean result = FALSE;
702
703         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
704
705         return result;
706 }
707
708 static gboolean
709 _msg_sent_in_progress (ModestWindow *win)
710 {
711         ModestTnySendQueue *send_queue = NULL;
712         GtkWidget *header_view = NULL; 
713         ModestTnyAccountStore *acc_store = NULL;
714         TnyAccount *account = NULL;     
715         TnyList *header_list = NULL;
716         TnyIterator *iter = NULL;
717         TnyHeader *header = NULL;
718         const gchar *account_name = NULL;
719         gboolean result = FALSE;        
720         gchar *id = NULL;
721         
722         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
723         
724         /* Get transport account */  
725         acc_store = modest_runtime_get_account_store();
726         account_name = modest_window_get_active_account (win);  
727         account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
728
729         /* Get send queue for current ransport account */ 
730         send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
731         g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
732
733         if (MODEST_IS_MAIN_WINDOW(win)) {
734                 
735                 /* Get header view to check selected messages */
736                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
737                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
738                 
739                 /* Get selected headers */
740                 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
741
742                 /* Get message header */
743                 if (!header_list) return FALSE;
744                 iter = tny_list_create_iterator (header_list);
745                 header = TNY_HEADER (tny_iterator_get_current (iter));
746
747                 /* Get message id */
748                 id = g_strdup(tny_header_get_message_id (header));              
749                 
750         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
751                 
752                 /* Get message header */
753                 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));               
754
755                 /* Get message id */
756                 id = g_strdup(tny_header_get_message_id (header));              
757         }
758
759         /* Check if msg id is being processed inside send queue */
760         result = modest_tny_send_queue_msg_is_being_sent (send_queue, id);
761
762         /* Free */
763         g_free(id);
764         g_object_unref (header);
765         g_free(header_list);
766         g_free(iter);
767
768         return result;
769 }