03c302f26fdea3bf02e02116141b5223921c9b12
[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 <widgets/modest-attachments-view.h>
39 #include <modest-runtime.h>
40 #include <tny-simple-list.h>
41
42
43 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
44 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
45 static gboolean _invalid_attach_selected (ModestWindow *win, gboolean unique, ModestDimmingRule *rule);
46 static gboolean _invalid_clipboard_selected (ModestMsgViewWindow *win);
47 static gboolean _already_opened_msg (ModestWindow *win);
48 static gboolean _selected_msg_marked_as (ModestWindow *win, TnyHeaderFlags mask, gboolean opposite);
49 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
50 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
51 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
52 static gboolean _selected_folder_is_root (ModestMainWindow *win);
53 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
54 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
55 static gboolean _msg_download_completed (ModestMainWindow *win);
56 static gboolean _msg_sent_in_progress (ModestWindow *win);
57 static gboolean _marked_as_deleted (ModestWindow *win);
58
59
60 gboolean 
61 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
62 {
63         gboolean dimmed = FALSE;
64
65         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
66                 
67         /* Check dimmed rule */ 
68         if (!dimmed)
69                 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
70
71         return dimmed;
72 }
73
74 gboolean 
75 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
76 {
77         gboolean dimmed = FALSE;
78         GtkWidget *folder_view = NULL;
79         TnyFolderStore *parent_folder = NULL;
80
81         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
82
83
84         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
85                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
86         /* Get selected folder as parent of new folder to create */
87         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
88         if (!parent_folder)
89                 return TRUE;
90         
91         if (TNY_IS_ACCOUNT (parent_folder)) {
92                 /* If it's the local account then do not dim */
93                 if (modest_tny_account_is_virtual_local_folders (
94                         TNY_ACCOUNT (parent_folder)))
95                         return FALSE;
96                 else {
97                         const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
98                         /* If it's POP then dim */
99                         dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
100                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
101                 }
102         } else {
103                 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
104                 
105                 TnyFolderType types[3];
106                                 
107                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
108                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
109                 types[2] = TNY_FOLDER_TYPE_SENT;
110
111                 /* Apply folder rules */        
112                 if (!dimmed)
113                         dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
114                 if (!dimmed)
115                         dimmed = _selected_folder_is_any_of_type (win, types, 3);
116         }
117
118         return dimmed;
119 }
120
121 gboolean 
122 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
123 {
124         gboolean dimmed = FALSE;
125         TnyFolderType types[3];
126
127         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
128
129         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
130         types[1] = TNY_FOLDER_TYPE_OUTBOX;
131         types[2] = TNY_FOLDER_TYPE_SENT;
132
133         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
134                 
135         /* Check dimmed rule */ 
136         if (!dimmed)
137                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
138         if (!dimmed)
139                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
140         if (!dimmed)
141                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
142
143         return dimmed;
144 }
145
146 gboolean
147 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
148 {
149         gboolean dimmed = FALSE;
150
151         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
152                 
153         /* Check dimmed rule */ 
154         if (!dimmed)
155                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
156
157         return dimmed;
158         
159 }
160
161 gboolean 
162 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
163 {
164         gboolean dimmed = FALSE;
165         TnyFolderType types[3];
166
167         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
168
169         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
170         types[1] = TNY_FOLDER_TYPE_OUTBOX;
171         types[2] = TNY_FOLDER_TYPE_SENT;
172         
173         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
174                 
175         /* Check dimmed rule */ 
176         if (!dimmed)
177                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
178         if (!dimmed)
179                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
180         if (!dimmed)
181                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
182
183         return dimmed;
184 }
185
186 gboolean 
187 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
188 {
189         ModestDimmingRule *rule = NULL;
190         gboolean dimmed = FALSE;
191
192         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
193         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
194         rule = MODEST_DIMMING_RULE (user_data);
195                 
196         /* Check dimmed rule */ 
197         if (!dimmed)
198                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
199         if (!dimmed) {
200                 dimmed = _msg_sent_in_progress (win);
201                 if (dimmed)
202                         modest_dimming_rule_set_notification (rule, _("TEST"));
203         }
204
205         return dimmed;
206 }
207
208 gboolean 
209 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
210 {
211         ModestDimmingRule *rule = NULL;
212         gboolean dimmed = FALSE;
213         TnyFolderType types[3];
214
215         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
216         rule = MODEST_DIMMING_RULE (user_data);
217
218         /* main window dimming rules */
219         if (MODEST_IS_MAIN_WINDOW(win)) {
220                 
221                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
222                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
223                 types[2] = TNY_FOLDER_TYPE_ROOT;
224                 
225                 /* Check dimmed rule */ 
226                 if (!dimmed) {
227                         dimmed = _selected_folder_is_any_of_type (win, types, 3);                       
228                         if (dimmed)
229                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
230                 }
231                 if (!dimmed) {
232                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
233                         if (dimmed)
234                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
235                 }
236                 if (!dimmed)
237                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
238
239         /* msg view window dimming rules */
240         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
241                 
242                 /* Check dimmed rule */ 
243                 if (!dimmed)
244                         dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
245         }
246         
247         return dimmed;
248 }
249
250
251 gboolean 
252 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
253 {
254         gboolean dimmed = FALSE;
255
256         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
257                 
258         /* Check dimmed rule */ 
259         if (!dimmed)
260                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
261         if (!dimmed)
262                 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
263
264         return dimmed;
265 }
266
267 gboolean 
268 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
269 {
270         gboolean dimmed = FALSE;
271
272         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
273                 
274         /* Check dimmed rule */ 
275         if (!dimmed)
276                 dimmed = TRUE;
277
278         return dimmed;
279 }
280
281 gboolean 
282 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
283 {
284         ModestDimmingRule *rule = NULL;
285         gboolean dimmed = FALSE;
286         
287         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
288         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
289         rule = MODEST_DIMMING_RULE (user_data);
290         
291         /* Check dimmed rule */         
292         if (MODEST_IS_MAIN_WINDOW (win)) {
293                 if (!dimmed) {
294                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
295                         if (dimmed)
296                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_del"));
297                 }
298                 if (!dimmed) {
299                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
300                         if (dimmed)
301                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
302                 }
303                 if (!dimmed) {
304                         dimmed = _already_opened_msg (win);
305                         if (dimmed)
306                                 modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages"));
307                 }
308                 if (!dimmed) {
309                         dimmed = _marked_as_deleted (win);
310                         if (dimmed)
311                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
312                 }
313                 if (!dimmed) {
314                         dimmed = _msg_sent_in_progress (win);
315                         if (dimmed)
316                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
317                 }
318         } 
319         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
320                 if (!dimmed) {
321                         dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
322                 }
323         }
324
325         return dimmed;
326 }
327
328 gboolean 
329 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
330 {
331         gboolean dimmed = FALSE;
332         GtkWidget *header_view = NULL;
333         
334         /* main window dimming rules */
335         if (MODEST_IS_MAIN_WINDOW(win)) {
336                                 
337                 /* Check dimmed rule */
338                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
339                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
340                 
341                 /* If the header view does not have the focus then do
342                    not apply msg dimming rules because the action will
343                    show the folder details that have no dimming
344                    rule */
345                 if (gtk_widget_is_focus (header_view)) {
346                         /* Check dimmed rule */ 
347                         if (!dimmed)
348                                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
349                 }
350
351         /* msg view window dimming rules */
352         } else {
353
354                 /* Check dimmed rule */ 
355                 if (!dimmed)
356                         dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
357         }
358
359         return dimmed;
360 }
361
362
363 gboolean 
364 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
365 {
366         gboolean dimmed = FALSE;
367         TnyHeaderFlags flags;
368
369         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
370         
371         flags = TNY_HEADER_FLAG_SEEN; 
372
373         /* Check dimmed rule */ 
374         if (!dimmed)
375                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
376         if (!dimmed) 
377                 dimmed = _selected_msg_marked_as (win, flags, FALSE);
378         
379         return dimmed;
380 }
381
382 gboolean 
383 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
384 {
385         gboolean dimmed = FALSE;
386         TnyHeaderFlags flags;
387
388         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
389         
390         flags = TNY_HEADER_FLAG_SEEN; 
391
392         /* Check dimmed rule */ 
393         if (!dimmed)
394                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
395         if (!dimmed) 
396                 dimmed = _selected_msg_marked_as (win, flags, TRUE);
397
398         return dimmed;
399 }
400
401 gboolean 
402 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
403 {
404         gboolean dimmed = FALSE;
405
406         if (MODEST_IS_MAIN_WINDOW (win)) 
407                 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
408         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
409                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
410
411         return dimmed;
412 }
413
414
415 gboolean 
416 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
417 {
418         GtkWidget *folder_view = NULL;
419         GtkWidget *header_view = NULL;
420         gboolean dimmed = FALSE;
421         
422         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
423         
424         /* Get the folder view */
425         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
426                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
427
428         /* Get header view */
429         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
430                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
431
432         /* Check common diming rules */
433
434         /* Check diming rules for folder transfer  */
435         if (gtk_widget_is_focus (folder_view)) {
436                 if (!dimmed) 
437                         dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win));
438         }
439         /* Check diming rules for msg transfer  */
440         else if (gtk_widget_is_focus (header_view)) {
441                 if (!dimmed)
442                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
443                 
444         }
445
446         return dimmed;
447 }
448
449 gboolean 
450 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
451 {
452         gboolean dimmed = FALSE;
453
454         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
455
456         /* Check dimmed rule */ 
457         if (!dimmed)
458                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
459         
460         return dimmed;
461 }
462
463 gboolean 
464 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
465 {
466         TnyFolderType types[3];
467         gboolean dimmed = FALSE;
468
469         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
470
471         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
472         types[1] = TNY_FOLDER_TYPE_OUTBOX;
473         types[2] = TNY_FOLDER_TYPE_SENT;
474         
475         /* Check dimmed rule */ 
476         if (!dimmed)
477                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
478
479         return dimmed;
480 }
481
482 gboolean 
483 modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data)
484 {
485         TnyFolderType types[5];
486         gboolean dimmed = FALSE;
487
488         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
489
490         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
491         types[1] = TNY_FOLDER_TYPE_OUTBOX;
492         types[2] = TNY_FOLDER_TYPE_SENT;
493         types[3] = TNY_FOLDER_TYPE_INBOX;
494         types[4] = TNY_FOLDER_TYPE_ROOT;
495         
496         /* Check dimmed rule */ 
497         if (!dimmed)
498                 dimmed = _selected_folder_is_any_of_type (win, types, 5);
499
500         return dimmed;
501 }
502
503 gboolean 
504 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
505 {
506         gboolean dimmed = FALSE;
507
508         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
509
510         /* Check dimmed rule */ 
511         if (!dimmed) 
512                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
513                 
514         return dimmed;
515 }
516
517 gboolean 
518 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
519 {
520         ModestDimmingRule *rule = NULL;
521         gboolean dimmed = FALSE;
522
523         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
524         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
525         rule = MODEST_DIMMING_RULE (user_data);
526
527         /* Check dimmed rule */ 
528         if (!dimmed) 
529                 dimmed = _invalid_attach_selected (win, TRUE, rule);                    
530                 
531         return dimmed;
532 }
533
534 gboolean 
535 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
536 {
537         ModestDimmingRule *rule = NULL;
538         gboolean dimmed = FALSE;
539
540         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
541         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
542         rule = MODEST_DIMMING_RULE (user_data);
543
544         /* Check dimmed rule */ 
545         if (!dimmed) 
546                 dimmed = _invalid_attach_selected (win, FALSE, rule);                   
547                 
548         return dimmed;
549 }
550
551 gboolean 
552 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
553 {
554         ModestDimmingRule *rule = NULL;
555         gboolean dimmed = FALSE;
556
557         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
558         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
559         rule = MODEST_DIMMING_RULE (user_data);
560
561         /* Check dimmed rule */ 
562         if (!dimmed) {
563                 dimmed = _invalid_attach_selected (win, FALSE, NULL);                   
564                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
565         }
566
567         return dimmed;
568 }
569
570 gboolean 
571 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
572 {
573         gboolean dimmed = FALSE;
574
575         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
576
577         /* Check dimmed rule */ 
578         if (!dimmed) 
579                 dimmed = _invalid_clipboard_selected (MODEST_MSG_VIEW_WINDOW(win));                     
580                 
581         return dimmed;
582 }
583
584 gboolean 
585 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
586 {
587         gboolean dimmed = FALSE;
588
589         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
590
591         /* Check dimmed rule */ 
592         if (!dimmed) 
593                 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
594                 
595         return dimmed;
596 }
597
598 gboolean 
599 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
600 {
601         gboolean dimmed = FALSE;
602
603         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
604
605         /* Check dimmed rule */ 
606         if (!dimmed) 
607                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
608                 
609         return dimmed;
610 }
611
612
613 gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
614 {
615         const gboolean dimmed = 
616                 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
617                         TRUE);  
618                 
619         return dimmed;
620 }
621
622
623 /* *********************** static utility functions ******************** */
624
625 static gboolean 
626 _marked_as_deleted (ModestWindow *win)
627 {
628         gboolean result = FALSE;
629         TnyHeaderFlags flags;
630
631         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
632         
633         flags = TNY_HEADER_FLAG_DELETED; 
634
635         /* Check dimmed rule */ 
636         result = _selected_msg_marked_as (win, flags, FALSE);
637         
638         return result;
639 }
640
641 static gboolean
642 _selected_folder_not_writeable (ModestMainWindow *win)
643 {
644         GtkWidget *folder_view = NULL;
645         TnyFolderStore *parent_folder = NULL;
646         ModestTnyFolderRules rules;
647         gboolean result = FALSE;
648
649         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
650
651         /* Get folder view */
652         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
653                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
654         /* If no folder view, always dimmed */
655         if (!folder_view)
656                 return TRUE;
657         
658         /* Get selected folder as parent of new folder to create */
659         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
660         if (!(parent_folder && TNY_IS_FOLDER(parent_folder)))
661                 return TRUE;
662         
663         /* Check dimmed rule */ 
664         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
665         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
666
667         /* free */
668         g_object_unref (parent_folder);
669
670         return result;
671 }
672
673 static gboolean
674 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
675 {
676         TnyFolderType types[2];
677         gboolean result = FALSE;
678
679         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
680
681         types[0] = TNY_FOLDER_TYPE_ROOT; 
682         types[1] = TNY_FOLDER_TYPE_INBOX; 
683
684         /* Check folder type */
685         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
686
687         if (!result) {
688                 GtkWidget *folder_view = NULL;
689                 TnyFolderStore *parent_folder = NULL;
690                 
691                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
692                                                                    MODEST_WIDGET_TYPE_FOLDER_VIEW);
693                 /* Get selected folder as parent of new folder to create */
694                 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
695                 if (!parent_folder)
696                         return TRUE;
697
698                 if (TNY_IS_ACCOUNT (parent_folder)) {
699                         /* If it's the local account then do not dim */
700                         if (modest_tny_account_is_virtual_local_folders (
701                                                                          TNY_ACCOUNT (parent_folder)))
702                                 return FALSE;
703                         else {
704                                 /* If it's the MMC root folder then dim it */
705                                 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
706                                         result = TRUE;
707                                 } else {
708                                         const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
709                                         /* If it's POP then dim */
710                                         result = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
711                                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
712                                 }
713                         }
714                 }
715         }
716                 
717         return result;
718 }
719
720 static gboolean
721 _selected_folder_is_root (ModestMainWindow *win)
722 {
723         TnyFolderType types[1];
724         gboolean result = FALSE;
725
726         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
727
728         types[0] = TNY_FOLDER_TYPE_ROOT; 
729
730         /* Check folder type */
731         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
732                 
733         return result;
734 }
735
736
737 static gboolean
738 _selected_folder_is_empty (ModestMainWindow *win)
739 {
740         GtkWidget *folder_view = NULL;
741         TnyFolderStore *folder = NULL;
742         gboolean result = FALSE;
743
744         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
745
746         /* Get folder view */
747         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
748                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
749         /* If no folder view, always dimmed */
750         if (!folder_view)
751                 return TRUE;
752         
753         /* Get selected folder as parent of new folder to create */
754         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
755         if (!(folder && TNY_IS_FOLDER(folder)))
756                 return TRUE;
757         
758         /* Check folder type */
759         result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
760
761         /* free */
762         g_object_unref (folder);
763
764         return result;
765 }
766
767 static gboolean
768 _selected_folder_is_any_of_type (ModestWindow *win,
769                                  TnyFolderType types[], 
770                                  guint ntypes)
771 {
772         GtkWidget *folder_view = NULL;
773         TnyFolderStore *folder = NULL;
774         TnyFolderType folder_type;
775         guint i=0;
776         gboolean result = FALSE;
777
778         /*Get curent folder */
779         if (MODEST_IS_MAIN_WINDOW(win)) {
780
781                 /* Get folder view */
782                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
783                                                                    MODEST_WIDGET_TYPE_FOLDER_VIEW);
784                 /* If no folder view, always dimmed */
785                 if (!folder_view)
786                         return TRUE;
787         
788                 /* Get selected folder as parent of new folder to create */
789                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
790
791                 if (!(folder && TNY_IS_FOLDER(folder)))
792                         return TRUE;
793                 
794                 /* Check folder type */
795                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
796         }
797         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
798                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
799                 for (i=0; i < ntypes; i++) {
800                         result = result || folder_type == types[i];
801                 }
802         }
803
804
805         /* free */
806         g_object_unref (folder);
807
808         return result;  
809 }
810
811 static gboolean
812 _folder_is_any_of_type (TnyFolder *folder,
813                         TnyFolderType types[], 
814                         guint ntypes)
815 {
816         TnyFolderType folder_type;
817         gboolean result = FALSE;
818         guint i;
819
820         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
821
822         /* Get folder type */
823         if (modest_tny_folder_is_local_folder (folder))
824                 folder_type = modest_tny_folder_get_local_folder_type (folder);         
825         else 
826                 folder_type = modest_tny_folder_guess_folder_type (folder);             
827         
828         /* Check foler type */
829         for (i=0; i < ntypes; i++) {
830                 result = result || folder_type == types[i];
831         }
832
833         return result;
834 }
835
836
837
838 static gboolean
839 _invalid_clipboard_selected (ModestMsgViewWindow *win)
840 {
841         GtkClipboard *clipboard = NULL;
842         gchar *selection = NULL;
843         GtkWidget *focused = NULL;
844         gboolean result = FALSE;
845
846         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE);
847
848         /* Get clipboard selection*/
849         clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
850         selection = gtk_clipboard_wait_for_text (clipboard);
851
852         /* Get focuesed widget */
853         focused = gtk_window_get_focus (GTK_WINDOW (win));
854
855         /* Check dimming */
856         result = ((selection == NULL) || 
857                   (MODEST_IS_ATTACHMENTS_VIEW (focused)));
858                   
859         return result;
860 }
861
862 static gboolean
863 _invalid_attach_selected (ModestWindow *win,
864                           gboolean unique,
865                           ModestDimmingRule *rule) 
866 {
867         GList *attachments, *node;
868         gint n_selected;
869         TnyHeaderFlags flags;
870         gboolean nested_attachments = FALSE;
871         gboolean selected_messages = FALSE;
872         gboolean result = FALSE;
873
874         if (MODEST_IS_MAIN_WINDOW (win)) {
875                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
876                 if (!result)
877                         result = _selected_msg_marked_as (win, flags, TRUE);
878                 
879         }
880         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
881                 
882                 /* Get selected atachments */
883                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
884                 n_selected = g_list_length (attachments);
885                 for (node = attachments; node != NULL; node = g_list_next (node)) {
886                         TnyMimePart *mime_part = TNY_MIME_PART (node->data);
887                         TnyList *nested_list = tny_simple_list_new ();
888                         if (!tny_mime_part_is_attachment (mime_part)) {
889                                 selected_messages = TRUE;
890                                 break;
891                         }
892                         tny_mime_part_get_parts (mime_part, nested_list);
893                         if (tny_list_get_length (nested_list) > 0)
894                                 nested_attachments = TRUE;
895                         g_object_unref (nested_list);
896                 }
897                 
898                 /* Check unique */
899                 if (unique) 
900                         result = n_selected != 1;
901                 else
902                         
903                         result = n_selected == 1;
904                 
905                 /* Set notifications */
906                 if (!result && rule != NULL) {
907                         if (selected_messages) {
908                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
909                         } else if (nested_attachments) {
910                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
911                         } else if (n_selected == 0) {
912                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
913                         }
914                 }
915                 
916                 /* Free */
917                 g_list_free (attachments);
918         }
919
920         return result;
921 }
922
923 static gboolean
924 _invalid_msg_selected (ModestMainWindow *win,
925                        gboolean unique,
926                        ModestDimmingRule *rule) 
927 {
928         GtkWidget *header_view = NULL;          
929         GtkWidget *folder_view = NULL;
930         TnyList *selected_headers = NULL;
931         gboolean result = FALSE;
932
933         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
934         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
935                 
936         /* Get header view to check selected messages */
937         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
938                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
939         
940         /* Get folder view to check focus */
941         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
942                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
943
944         /* Get selected headers */
945         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
946
947         /* Check dimmed rule (TODO: check focus on widgets */   
948         if (!result) {
949                 result = (selected_headers == NULL);
950 /*              result = ((selected_headers == NULL) ||  */
951 /*                        (GTK_WIDGET_HAS_FOCUS (folder_view))); */
952                 if (result)
953                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
954         }
955         if (!result && unique) {
956                 result = tny_list_get_length (selected_headers) > 1;
957                 if (result)
958                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
959         }
960
961         /* free */
962         if (selected_headers != NULL) 
963                 g_object_unref (selected_headers);
964
965         return result;
966 }
967
968 static gboolean
969 _already_opened_msg (ModestWindow *win)
970 {
971         ModestWindow *window = NULL;
972         ModestWindowMgr *mgr = NULL;
973         GtkWidget *header_view = NULL;          
974         TnyList *selected_headers = NULL;
975         TnyIterator *iter = NULL;
976         TnyHeader *header = NULL;
977         gboolean result = TRUE;
978
979         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
980                 
981         /* Get header view to check selected messages */
982         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
983                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
984
985         /* Get selected headers */
986         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
987         if (selected_headers == NULL) 
988                 return FALSE;
989
990         /* Check dimmed rule (TODO: check focus on widgets */   
991         mgr = modest_runtime_get_window_mgr ();
992         iter = tny_list_create_iterator (selected_headers);
993         while (!tny_iterator_is_done (iter) && result) {
994                 header = TNY_HEADER (tny_iterator_get_current (iter));
995                 window = modest_window_mgr_find_window_by_header (mgr, header);
996                 result = result && (window != NULL);
997                         
998                 g_object_unref (header);
999                 tny_iterator_next (iter);
1000         }
1001         
1002         /* free */
1003         if (selected_headers != NULL) 
1004                 g_object_unref (selected_headers);
1005         if (iter != NULL)
1006                 g_object_unref (iter);
1007                 
1008         return result;
1009 }
1010
1011 static gboolean
1012 _selected_msg_marked_as (ModestWindow *win, 
1013                          TnyHeaderFlags mask, 
1014                          gboolean opposite)
1015 {
1016         GtkWidget *header_view = NULL;
1017         TnyList *selected_headers = NULL;
1018         TnyIterator *iter = NULL;
1019         TnyHeader *header = NULL;
1020         TnyHeaderFlags flags;
1021         gboolean result = FALSE;
1022
1023         /* Get header view to check selected messages */
1024         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1025                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1026
1027         /* Get selected headers */
1028         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1029         if (selected_headers == NULL) 
1030                 return TRUE;
1031         
1032         /* Call the function for each header */
1033         iter = tny_list_create_iterator (selected_headers);
1034         while (!tny_iterator_is_done (iter) && !result) {
1035                 header = TNY_HEADER (tny_iterator_get_current (iter));
1036
1037                 flags = tny_header_get_flags (header);
1038                 if (opposite)
1039                         result = (flags & mask) == 0; 
1040                 else
1041                         result = (flags & mask) != 0; 
1042
1043                 g_object_unref (header);
1044                 tny_iterator_next (iter);
1045         }
1046
1047         /* free */
1048         if (selected_headers != NULL) 
1049                 g_object_unref (selected_headers);
1050         if (iter != NULL)
1051                 g_object_unref (iter);
1052
1053         return result;
1054 }
1055
1056 static gboolean
1057 _msg_download_in_progress (ModestMsgViewWindow *win)
1058 {
1059         gboolean result = FALSE;
1060
1061         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1062
1063         result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1064
1065         return result;
1066 }
1067
1068 static gboolean
1069 _msg_download_completed (ModestMainWindow *win)
1070 {
1071         GtkWidget *header_view = NULL;
1072         TnyList *selected_headers = NULL;
1073         TnyIterator *iter = NULL;
1074         TnyHeader *header = NULL;
1075         TnyHeaderFlags flags;
1076         gboolean result = FALSE;
1077
1078         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1079
1080
1081         /* Get header view to check selected messages */
1082         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1083                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1084
1085         /* Get selected headers */
1086         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1087         if (selected_headers == NULL) 
1088                 return TRUE;
1089
1090         /* Check dimmed rule  */        
1091         result = TRUE;
1092         iter = tny_list_create_iterator (selected_headers);
1093         while (!tny_iterator_is_done (iter) && result) {
1094                 header = TNY_HEADER (tny_iterator_get_current (iter));
1095                         
1096                 flags = tny_header_get_flags (header);
1097                 /* TODO: is this the right flag?, it seems that some
1098                    headers that have been previously downloaded do not
1099                    come with it */
1100                 result = (flags & TNY_HEADER_FLAG_CACHED);
1101
1102                 g_object_unref (header);
1103                 tny_iterator_next (iter);
1104         }
1105
1106         g_object_unref (iter);
1107
1108         return result;
1109 }
1110
1111 static gboolean
1112 _msg_sent_in_progress (ModestWindow *win)
1113 {
1114 /*      ModestTnySendQueue *send_queue = NULL; */
1115 /*      GtkWidget *header_view = NULL;  */
1116 /*      ModestTnyAccountStore *acc_store = NULL; */
1117 /*      TnyAccount *account = NULL;      */
1118 /*      TnyList *header_list = NULL; */
1119 /*      TnyIterator *iter = NULL; */
1120 /*      TnyHeader *header = NULL; */
1121 /*      const gchar *account_name = NULL; */
1122         gboolean result = FALSE;
1123 /*      gchar *id = NULL; */
1124         
1125 /*      g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE); */
1126         
1127 /*      /\* Get transport account *\/   */
1128 /*      acc_store = modest_runtime_get_account_store(); */
1129 /*      account_name = modest_window_get_active_account (win);   */
1130 /*      account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); */
1131
1132 /*      /\* Get send queue for current ransport account *\/  */
1133 /*      send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); */
1134 /*      g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); */
1135
1136 /*      if (MODEST_IS_MAIN_WINDOW(win)) { */
1137                 
1138 /*              /\* Get header view to check selected messages *\/ */
1139 /*              header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), */
1140 /*                                                                 MODEST_WIDGET_TYPE_HEADER_VIEW); */
1141                 
1142 /*              /\* Get selected headers *\/ */
1143 /*              header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view)); */
1144
1145 /*              /\* Get message header *\/ */
1146 /*              if (!header_list) return FALSE; */
1147 /*              iter = tny_list_create_iterator (header_list); */
1148 /*              header = TNY_HEADER (tny_iterator_get_current (iter)); */
1149
1150 /*              /\* Get message id *\/ */
1151 /*              id = g_strdup(tny_header_get_message_id (header));               */
1152                 
1153 /*         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { */
1154                 
1155 /*              /\* Get message header *\/ */
1156 /*              header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));                */
1157
1158 /*              /\* Get message id *\/ */
1159 /*              id = g_strdup(tny_header_get_message_id (header));               */
1160 /*      } */
1161
1162 /*      /\* Check if msg id is being processed inside send queue *\/ */
1163 /*      result = modest_tny_send_queue_msg_is_being_sent (send_queue, id); */
1164
1165 /*      /\* Free *\/ */
1166 /*      g_free(id); */
1167 /*      g_object_unref (header); */
1168 /*      g_free(header_list); */
1169 /*      g_free(iter); */
1170
1171         return result;
1172 }
1173
1174