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