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