* Add a error_handler for send_receive operation.
[modest] / src / modest-ui-dimming-rules.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29  
30 #ifdef HAVE_CONFIG_H
31 #include <config.h>
32 #endif /*HAVE_CONFIG_H*/
33
34 #include <string.h>
35 #include "modest-ui-dimming-rules.h"
36 #include "modest-dimming-rule.h"
37 #include "modest-tny-folder.h"
38 #include "modest-text-utils.h"
39 #include <widgets/modest-attachments-view.h>
40 #include <modest-runtime.h>
41 #include <tny-simple-list.h>
42
43
44 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
45 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
46 static gboolean _invalid_attach_selected (ModestWindow *win, gboolean unique, gboolean for_view, ModestDimmingRule *rule);
47 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
48 static gboolean _clipboard_is_empty (ModestWindow *win);
49 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
50 static gboolean _already_opened_msg (ModestWindow *win, guint *n_messages);
51 static gboolean _selected_msg_marked_as (ModestWindow *win, TnyHeaderFlags mask, gboolean opposite);
52 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
53 static gboolean _selected_folder_is_snd_level (ModestMainWindow *win);
54 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
55 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
56 static gboolean _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win);
57 static gboolean _selected_folder_is_root (ModestMainWindow *win);
58 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
59 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
60 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
61 static gboolean _msg_download_completed (ModestMainWindow *win);
62 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
63 static gboolean _sending_in_progress (ModestWindow *win);
64 static gboolean _marked_as_deleted (ModestWindow *win);
65 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
66 static gboolean _transfer_mode_enabled (ModestWindow *win);
67
68
69 gboolean 
70 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
71 {
72         ModestDimmingRule *rule = NULL;
73         gboolean dimmed = FALSE;
74
75         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
76         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
77         rule = MODEST_DIMMING_RULE (user_data);
78                 
79         /* Check dimmed rule */ 
80         if (!dimmed) {
81                 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
82                 if (dimmed)
83                         modest_dimming_rule_set_notification (rule, "");
84         }
85
86         return dimmed;
87 }
88
89 gboolean 
90 modest_ui_dimming_rules_on_csm_new_folder (ModestWindow *win, gpointer user_data)
91 {
92         ModestDimmingRule *rule = NULL;
93         gboolean dimmed = FALSE;
94
95         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
96         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
97         rule = MODEST_DIMMING_RULE (user_data);
98
99         /* Check common new folder menu item dimming rules */   
100         dimmed = modest_ui_dimming_rules_on_new_folder (win, user_data);
101         
102         /* Check CSM specific dimming rules */
103         if (!dimmed) {
104                 dimmed = _selected_folder_is_snd_level (MODEST_MAIN_WINDOW(win));
105                 if (dimmed)
106                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
107         }
108         
109         return dimmed;
110 }
111
112 gboolean 
113 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
114 {
115         ModestDimmingRule *rule = NULL;
116         GtkWidget *folder_view = NULL;
117         TnyFolderStore *parent_folder = NULL;
118         gboolean dimmed = FALSE;
119
120         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
121         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
122         rule = MODEST_DIMMING_RULE (user_data);
123
124         /* Get selected folder as parent of new folder to create */
125         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
126                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
127         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
128         if (!parent_folder)
129                 return TRUE;
130         
131         if (TNY_IS_ACCOUNT (parent_folder)) {
132                 /* If it's the local account then do not dim */
133                 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
134                         dimmed = FALSE;
135                 } else {
136                         const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
137                         /* If it's POP then dim */
138                         dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
139                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
140                         if (dimmed)
141                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
142                 }
143         } else {
144                 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
145                 
146                 TnyFolderType types[3];
147                                 
148                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
149                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
150                 types[2] = TNY_FOLDER_TYPE_SENT;
151
152                 /* Apply folder rules */        
153                 if (!dimmed) {
154                         dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
155                         if (dimmed)
156                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
157                 }
158                 if (!dimmed) {
159                         dimmed = _selected_folder_is_any_of_type (win, types, 3);
160                         if (dimmed)
161                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
162                 }
163         }
164         g_object_unref (parent_folder);
165
166         return dimmed;
167 }
168
169 gboolean 
170 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
171 {
172         ModestDimmingRule *rule = NULL;
173         GtkWidget *folder_view = NULL;
174         GtkWidget *header_view = NULL;  
175         gboolean dimmed = FALSE;
176
177         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
178         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
179         rule = MODEST_DIMMING_RULE (user_data);
180         
181         /* Get the folder view */
182         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
183                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
184
185         /* Get header view */
186         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
187                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
188
189         if (header_view && gtk_widget_is_focus (header_view)) 
190                 dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
191
192         if (folder_view && gtk_widget_is_focus (folder_view)) 
193                 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
194
195         return dimmed;
196 }
197
198
199
200 gboolean 
201 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
202 {
203         ModestDimmingRule *rule = NULL;
204         TnyFolderType types[5];
205         gboolean dimmed = FALSE;
206
207         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
208         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
209         rule = MODEST_DIMMING_RULE (user_data);
210
211         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
212         types[1] = TNY_FOLDER_TYPE_OUTBOX;
213         types[2] = TNY_FOLDER_TYPE_SENT;
214         types[3] = TNY_FOLDER_TYPE_INBOX;
215         types[4] = TNY_FOLDER_TYPE_ROOT;
216
217                 
218         /* Check dimmed rule */ 
219         if (!dimmed) {
220                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
221                 if (dimmed)
222                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
223         }
224         if (!dimmed) {
225                 dimmed = _selected_folder_is_any_of_type (win, types, 5);
226                 if (dimmed)
227                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
228         }
229         if (!dimmed) {
230                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
231                 if (dimmed)
232                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
233         }
234         if (!dimmed) {
235                 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
236                 if (dimmed)
237                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
238         }
239
240         return dimmed;
241 }
242
243 gboolean
244 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
245 {
246         ModestDimmingRule *rule = NULL;
247         gboolean dimmed = FALSE;
248
249         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
250         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
251         rule = MODEST_DIMMING_RULE (user_data);
252                 
253         /* Check dimmed rule */ 
254         if (!dimmed) {
255                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
256                 if (dimmed)
257                         modest_dimming_rule_set_notification (rule, "");
258         }
259
260         return dimmed;
261         
262 }
263
264 gboolean 
265 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
266 {
267         ModestDimmingRule *rule = NULL;
268         TnyFolderType types[3];
269         gboolean dimmed = FALSE;
270
271         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
272         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
273         rule = MODEST_DIMMING_RULE (user_data);
274
275         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
276         types[1] = TNY_FOLDER_TYPE_OUTBOX;
277         types[2] = TNY_FOLDER_TYPE_SENT;
278         
279         /* Check dimmed rule */ 
280         if (!dimmed) {
281                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
282                 if (dimmed)
283                         modest_dimming_rule_set_notification (rule, "");
284         }
285         if (!dimmed) {
286                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
287                 if (dimmed)
288                         modest_dimming_rule_set_notification (rule, "");
289         }
290         if (!dimmed) {
291                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
292                 if (dimmed)
293                         modest_dimming_rule_set_notification (rule, "");
294         }
295
296         return dimmed;
297 }
298
299 gboolean 
300 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
301 {
302         ModestDimmingRule *rule = NULL;
303         gboolean dimmed = FALSE;
304
305         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
306         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
307         rule = MODEST_DIMMING_RULE (user_data);
308                 
309         /* Check dimmed rule */ 
310         if (!dimmed) {
311                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
312         }
313         if (!dimmed) {
314                 dimmed = _marked_as_deleted (win);
315                 if (dimmed)
316                         modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
317         }
318         if (!dimmed) {
319                 dimmed = _selected_msg_sent_in_progress (win);
320                 if (dimmed)
321                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
322         }
323
324         return dimmed;
325 }
326
327 gboolean 
328 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
329 {
330         ModestDimmingRule *rule = NULL;
331         gboolean dimmed = FALSE;
332         TnyFolderType types[3];
333
334         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
335         rule = MODEST_DIMMING_RULE (user_data);
336
337         /* main window dimming rules */
338         if (MODEST_IS_MAIN_WINDOW(win)) {
339                 
340                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
341                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
342                 types[2] = TNY_FOLDER_TYPE_ROOT;
343                 
344                 /* Check dimmed rule */ 
345                 if (!dimmed) {
346                         dimmed = _selected_folder_is_any_of_type (win, types, 3);                       
347                         if (dimmed)
348                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
349                 }
350                 if (!dimmed) {
351                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
352                         if (dimmed)
353                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
354                 }
355                 if (!dimmed) {
356                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
357                 }
358         /* msg view window dimming rules */
359         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
360                 
361                 /* Check dimmed rule */ 
362                 if (!dimmed) {
363                         dimmed = _transfer_mode_enabled (win);                  
364                         if (dimmed)
365                                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
366                 }
367                 if (!dimmed) {
368                         dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
369                         if (dimmed)
370                                 modest_dimming_rule_set_notification (rule, "");
371                 }
372         }
373         
374         return dimmed;
375 }
376
377
378 gboolean 
379 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
380 {
381         ModestDimmingRule *rule = NULL;
382         gboolean dimmed = FALSE;
383
384         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
385         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
386         rule = MODEST_DIMMING_RULE (user_data);
387                 
388         /* Check dimmed rule */ 
389         if (!dimmed) {
390                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
391         }
392         if (!dimmed) {
393                 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
394                 if (dimmed)
395                         modest_dimming_rule_set_notification (rule, "");
396         }
397
398         return dimmed;
399 }
400
401 gboolean 
402 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
403 {
404         gboolean dimmed = FALSE;
405
406         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
407                 
408         /* Check dimmed rule */ 
409         if (!dimmed)
410                 dimmed = TRUE;
411
412         return dimmed;
413 }
414
415 gboolean 
416 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
417 {
418         ModestDimmingRule *rule = NULL;
419         guint n_messages = 0;
420         gboolean dimmed = FALSE;
421
422         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
423         rule = MODEST_DIMMING_RULE (user_data);
424         
425         /* Check dimmed rule */         
426         if (MODEST_IS_MAIN_WINDOW (win)) {
427                 if (!dimmed) {
428                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
429                         if (dimmed)
430                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
431                 }
432                 if (!dimmed) {
433                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
434                 }
435                 if (!dimmed) {
436                         dimmed = _already_opened_msg (win, &n_messages);
437                         if (dimmed) {
438                                 gchar *num = g_strdup_printf ("%d", n_messages);
439                                 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
440 /*                              modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); */
441                                 modest_dimming_rule_set_notification (rule, message);
442                                 g_free(message);
443                                 g_free(num);
444                         }
445                 }
446                 if (!dimmed) {
447                         dimmed = _marked_as_deleted (win);
448                         if (dimmed)
449                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
450                 }
451                 if (!dimmed) {
452                         dimmed = _selected_msg_sent_in_progress (win);
453                         if (dimmed)
454                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
455                 }
456         } 
457         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
458                 if (!dimmed) {
459                         dimmed = _transfer_mode_enabled (win);                  
460                         if (dimmed)
461                                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
462                 }
463                 if (!dimmed) {
464                         dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
465                         if (dimmed) {
466                                 gchar *num = g_strdup("1");
467                                 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
468 /*                              modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); */
469                                 modest_dimming_rule_set_notification (rule, message);
470                                 g_free(message);
471                                 g_free(num);
472                         }
473                 }
474         }
475
476         return dimmed;
477 }
478
479 gboolean 
480 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
481 {
482         ModestDimmingRule *rule = NULL;
483         GtkWidget *header_view = NULL;
484         gboolean dimmed = FALSE;
485
486         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
487         rule = MODEST_DIMMING_RULE (user_data);
488         
489         /* main window dimming rules */
490         if (MODEST_IS_MAIN_WINDOW(win)) {
491                                 
492                 /* Check dimmed rule */
493                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
494                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
495                 
496                 /* If the header view has the focus: */
497                 if (header_view && gtk_widget_is_focus (header_view)) {
498                         /* Check dimmed rule */ 
499                         if (!dimmed)
500                                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
501                 }
502                 else {
503                         /* If the folder view has the focus: */
504                         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
505                                 MODEST_WIDGET_TYPE_FOLDER_VIEW);
506                         if (folder_view && gtk_widget_is_focus (folder_view)) {
507                                 TnyFolderStore *folder_store
508                                         = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
509                                 if (folder_store) {
510                                         /* Only enable for folders, not accounts,
511                                          * though the UI spec is not clear about that.
512                                          * If we enable this for accounts then we must 
513                                          * add code to handle them in modest_ui_actions_on_details(). */
514                                         if (!TNY_IS_FOLDER(folder_store)) {
515                                                 dimmed = TRUE;
516                                                 modest_dimming_rule_set_notification (rule, "");
517                                         }
518
519                                         g_object_unref (folder_store);
520                                 }
521                         }
522
523                 }
524
525         /* msg view window dimming rules */
526         } else {
527
528                 /* Check dimmed rule */ 
529                 if (!dimmed) {
530                         dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
531                         if (dimmed)
532                                 modest_dimming_rule_set_notification (rule, "");
533                 }
534         }
535
536         return dimmed;
537 }
538
539
540 gboolean 
541 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
542 {
543         ModestDimmingRule *rule = NULL;
544         TnyHeaderFlags flags;
545         gboolean dimmed = FALSE;
546
547         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
548         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
549         rule = MODEST_DIMMING_RULE (user_data);
550         
551         flags = TNY_HEADER_FLAG_SEEN; 
552
553         /* Check dimmed rule */ 
554         if (!dimmed) {
555                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
556         }
557         if (!dimmed) {
558                 dimmed = _selected_msg_marked_as (win, flags, FALSE);
559                 if (dimmed)
560                         modest_dimming_rule_set_notification (rule, "");
561         }       
562
563         return dimmed;
564 }
565
566 gboolean 
567 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
568 {
569         ModestDimmingRule *rule = NULL;
570         TnyHeaderFlags flags;
571         gboolean dimmed = FALSE;
572
573         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
574         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
575         rule = MODEST_DIMMING_RULE (user_data);
576         
577         flags = TNY_HEADER_FLAG_SEEN; 
578
579         /* Check dimmed rule */ 
580         if (!dimmed)
581                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
582         if (!dimmed) {
583                 dimmed = _selected_msg_marked_as (win, flags, TRUE);
584                 if (dimmed)
585                         modest_dimming_rule_set_notification (rule, "");
586         }
587
588         return dimmed;
589 }
590
591 gboolean 
592 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
593 {
594         ModestDimmingRule *rule = NULL;
595         gboolean dimmed = FALSE;
596
597         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
598         rule = MODEST_DIMMING_RULE (user_data);
599
600         if (MODEST_IS_MAIN_WINDOW (win)) 
601                 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
602         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
603                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
604
605         return dimmed;
606 }
607
608
609 gboolean 
610 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
611 {
612         GtkWidget *folder_view = NULL;
613         GtkWidget *header_view = NULL;
614         ModestDimmingRule *rule = NULL;
615         gboolean dimmed = FALSE;
616         
617         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
618         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
619         rule = MODEST_DIMMING_RULE (user_data);
620         
621         /* Get the folder view */
622         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
623                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
624
625         /* Get header view */
626         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
627                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
628         
629         /* Check diming rules for folders and messages transfer  */
630         if (!dimmed) {
631                 if (!gtk_widget_is_focus (folder_view))
632                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
633                 
634         }
635         
636         return dimmed;
637 }
638
639 gboolean 
640 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
641 {
642         ModestDimmingRule *rule = NULL;
643         gboolean dimmed = FALSE;
644
645         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
646         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
647         rule = MODEST_DIMMING_RULE (user_data);
648
649         /* Check dimmed rule */ 
650         if (!dimmed) {
651                 dimmed = _transfer_mode_enabled (win);                  
652                 if (dimmed)
653                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
654         }
655         if (!dimmed) {
656                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
657                 if (dimmed) 
658                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
659         }
660
661         return dimmed;
662 }
663
664 gboolean 
665 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
666 {
667         ModestDimmingRule *rule = NULL;
668         gboolean dimmed = FALSE;
669
670         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
671         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
672         rule = MODEST_DIMMING_RULE (user_data);
673
674         /* Check dimmed rule */ 
675         if (!dimmed) {
676                 dimmed = _transfer_mode_enabled (win);                  
677                 if (dimmed)
678                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
679         }
680
681         return dimmed;
682 }
683
684 gboolean 
685 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
686 {
687         ModestDimmingRule *rule = NULL;
688         TnyFolderType types[3];
689         gboolean dimmed = FALSE;
690
691         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
692         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
693         rule = MODEST_DIMMING_RULE (user_data);
694
695         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
696         types[1] = TNY_FOLDER_TYPE_OUTBOX;
697         types[2] = TNY_FOLDER_TYPE_SENT;
698         
699         /* Check dimmed rule */ 
700         if (!dimmed) {
701                 dimmed = _clipboard_is_empty (win);
702                 if (dimmed)
703                         modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ecoc_ib_edwin_nothing_to_paste"));
704         }
705         if (!dimmed) {
706                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
707                 if (dimmed)
708                         modest_dimming_rule_set_notification (rule, _("ckct_ib_unable_to_paste_here"));
709         }
710         if (!dimmed) {
711                 dimmed = _selected_folder_is_same_as_source (win);
712                 if (dimmed)
713                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
714         }
715
716         return dimmed;
717 }
718
719
720 gboolean 
721 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
722 {
723         ModestDimmingRule *rule = NULL;
724         gboolean dimmed = FALSE;
725
726         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
727         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
728         rule = MODEST_DIMMING_RULE (user_data);
729
730         /* Check dimmed rule */ 
731         if (!dimmed) {
732                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
733                 if (dimmed)
734                         modest_dimming_rule_set_notification (rule, "");
735         }
736                 
737         return dimmed;
738 }
739
740 gboolean 
741 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
742 {
743         ModestDimmingRule *rule = NULL;
744         gboolean dimmed = FALSE;
745
746         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
747         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
748         rule = MODEST_DIMMING_RULE (user_data);
749
750         /* Check dimmed rule */ 
751         if (!dimmed) 
752                 dimmed = _invalid_attach_selected (win, TRUE, TRUE, rule);                      
753
754         if (!dimmed) {
755                 dimmed = _purged_attach_selected (win, FALSE, NULL);
756                 if (dimmed) {
757                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
758                 }
759         }
760                 
761         return dimmed;
762 }
763
764 gboolean 
765 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
766 {
767         ModestDimmingRule *rule = NULL;
768         gboolean dimmed = FALSE;
769
770         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
771         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
772         rule = MODEST_DIMMING_RULE (user_data);
773
774         /* Check dimmed rule */ 
775         if (!dimmed) 
776                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, rule);
777
778         if (!dimmed) {
779                 dimmed = _purged_attach_selected (win, FALSE, NULL);
780                 if (dimmed) {
781                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
782                 }
783         }
784                 
785         return dimmed;
786 }
787
788 gboolean 
789 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
790 {
791         ModestDimmingRule *rule = NULL;
792         gboolean dimmed = FALSE;
793
794         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
795         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
796         rule = MODEST_DIMMING_RULE (user_data);
797
798         /* Check in main window if there's only one message selected */
799         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
800                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
801         }
802
803         /* Check in view window if there's any attachment selected */
804         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
805                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, NULL);
806                 if (dimmed)
807                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
808         }
809
810         /* cannot purge in editable drafts nor pop folders */
811         if (!dimmed) {
812                 dimmed = _invalid_folder_for_purge (win, rule);
813         }
814
815         /* Check if the selected message in main window has attachments */
816         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
817                 dimmed = _selected_msg_marked_as (win, TNY_HEADER_FLAG_ATTACHMENTS, TRUE);
818                 if (dimmed)
819                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
820         }
821
822         /* Check if all attachments are already purged */
823         if (!dimmed) {
824                 dimmed = _purged_attach_selected (win, TRUE, rule);
825         }
826
827         /* Check if the message is already downloaded */
828         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
829                 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
830                 if (dimmed)
831                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
832         }
833
834
835         return dimmed;
836 }
837
838 gboolean 
839 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
840 {
841         ModestDimmingRule *rule = NULL;
842         gboolean dimmed = FALSE;
843         
844         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
845         rule = MODEST_DIMMING_RULE (user_data);
846
847         /* Check dimmed rule */ 
848         if (!dimmed) {
849                 dimmed = _clipboard_is_empty (win); 
850                 if (dimmed)
851                         modest_dimming_rule_set_notification (rule, "");
852         }
853                                 
854         return dimmed;  
855 }
856
857 gboolean 
858 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
859 {
860         ModestDimmingRule *rule = NULL;
861         gboolean dimmed = FALSE;
862         
863         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
864         rule = MODEST_DIMMING_RULE (user_data);
865
866         /* Check common dimming rules */
867         if (!dimmed) {
868                 dimmed = _invalid_clipboard_selected (win, rule);
869         }
870
871         /* Check window specific dimming rules */
872         if (MODEST_IS_MAIN_WINDOW (win)) {
873                 if (!dimmed) {
874                         dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
875                         if (dimmed)
876                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
877                 }
878                 if (!dimmed) { 
879                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
880                         if (dimmed)
881                                 modest_dimming_rule_set_notification (rule, "");
882                 }
883                 if (!dimmed) {
884                         dimmed = _selected_msg_sent_in_progress (win);
885                         if (dimmed)
886                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
887                 }
888         }
889         
890         return dimmed;
891 }
892
893 gboolean 
894 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
895 {
896         ModestDimmingRule *rule = NULL;
897         gboolean dimmed = FALSE;
898         
899         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
900         rule = MODEST_DIMMING_RULE (user_data);
901
902         /* Check common dimming rules */
903         if (!dimmed) {
904                 dimmed = _invalid_clipboard_selected (win, rule);
905         }
906         
907         /* Check window specific dimming rules */
908         if (MODEST_IS_MAIN_WINDOW (win)) {
909                 if (!dimmed) {
910                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
911                         if (dimmed)
912                                 modest_dimming_rule_set_notification (rule, "");
913                 }               
914                 if (!dimmed) {
915                         dimmed = _selected_msg_sent_in_progress (win);
916                         if (dimmed)
917                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
918                 }
919         }
920                 
921         return dimmed;
922 }
923
924 gboolean 
925 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
926 {
927         ModestDimmingRule *rule = NULL;
928         gboolean dimmed = FALSE;
929         
930         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
931         rule = MODEST_DIMMING_RULE (user_data);
932
933         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
934
935         /* Check dimmed rule */ 
936         if (!dimmed) {
937                 dimmed = _transfer_mode_enabled (win);                  
938                 if (dimmed)
939                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
940         }
941         if (!dimmed) {
942                 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
943                 if (dimmed)
944                         modest_dimming_rule_set_notification (rule, "");
945         }               
946
947         return dimmed;
948 }
949
950 gboolean 
951 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
952 {
953         ModestDimmingRule *rule = NULL;
954         gboolean dimmed = FALSE;
955
956         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
957         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
958         rule = MODEST_DIMMING_RULE (user_data);
959
960         /* Check dimmed rule */ 
961         if (!dimmed) {
962                 dimmed = _transfer_mode_enabled (win);                  
963                 if (dimmed)
964                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
965         }
966         if (!dimmed) {
967                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
968                 if (dimmed)
969                         modest_dimming_rule_set_notification (rule, "");
970         }               
971
972         return dimmed;
973 }
974
975
976 gboolean 
977 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
978 {
979         const gboolean dimmed = 
980                 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
981                         TRUE);  
982                 
983         return dimmed;
984 }
985
986 gboolean 
987 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
988 {
989         ModestDimmingRule *rule = NULL;
990         TnyFolderType types[1];
991         guint n_messages = 0;
992         gboolean dimmed = FALSE;
993
994         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
995         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
996         rule = MODEST_DIMMING_RULE (user_data);
997
998         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
999
1000         /* Check dimmed rules */        
1001         if (!dimmed) {
1002                 dimmed = _already_opened_msg (win, &n_messages);
1003                 if (dimmed) 
1004                         modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_cancel_send"));
1005         }
1006         if (!dimmed) {
1007                 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1008                 if (dimmed) 
1009                         modest_dimming_rule_set_notification (rule, "");
1010         }
1011         if (!dimmed) {
1012                 dimmed = !_sending_in_progress (win);
1013                 if (dimmed) 
1014                         modest_dimming_rule_set_notification (rule, "");
1015         }
1016
1017         return dimmed;
1018 }
1019
1020 gboolean 
1021 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1022 {
1023         ModestDimmingRule *rule = NULL;
1024         gboolean dimmed = FALSE;
1025         
1026         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1027         rule = MODEST_DIMMING_RULE (user_data);
1028  
1029         /* Check dimmed rule */ 
1030         if (!dimmed) {
1031                 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1032                                                           TRUE);        
1033                 if (dimmed)
1034                         modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1035         }
1036
1037         return dimmed;
1038 }
1039
1040 gboolean
1041 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1042 {
1043         ModestDimmingRule *rule = NULL;
1044         gboolean dimmed = FALSE;
1045
1046         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1047         rule = MODEST_DIMMING_RULE (user_data);
1048
1049         /* Check dimmed rule */
1050         if (!dimmed) {
1051                 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1052                 gchar *selection = NULL;
1053                 selection = gtk_clipboard_wait_for_text (clipboard);
1054
1055                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection)));
1056         }
1057
1058         return dimmed;
1059 }
1060
1061 /* *********************** static utility functions ******************** */
1062
1063 static gboolean 
1064 _marked_as_deleted (ModestWindow *win)
1065 {
1066         gboolean result = FALSE;
1067         TnyHeaderFlags flags;
1068
1069         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1070         
1071         flags = TNY_HEADER_FLAG_DELETED; 
1072
1073         /* Check dimmed rule */ 
1074         result = _selected_msg_marked_as (win, flags, FALSE);
1075         
1076         return result;
1077 }
1078
1079 static gboolean
1080 _selected_folder_not_writeable (ModestMainWindow *win)
1081 {
1082         GtkWidget *folder_view = NULL;
1083         TnyFolderStore *parent_folder = NULL;
1084         ModestTnyFolderRules rules;
1085         gboolean result = FALSE;
1086
1087         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1088
1089         /* Get folder view */
1090         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1091                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1092         /* If no folder view, always dimmed */
1093         if (!folder_view)
1094                 return TRUE;
1095         
1096         /* Get selected folder as parent of new folder to create */
1097         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1098         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1099                 if (parent_folder)
1100                         g_object_unref (parent_folder);
1101                 return TRUE;
1102         }
1103         
1104         /* Check dimmed rule */ 
1105         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1106         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1107
1108         /* free */
1109         g_object_unref (parent_folder);
1110
1111         return result;
1112 }
1113
1114 static gboolean
1115 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1116 {
1117         TnyFolderType types[2];
1118         gboolean result = FALSE;
1119
1120         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1121
1122         types[0] = TNY_FOLDER_TYPE_ROOT; 
1123         types[1] = TNY_FOLDER_TYPE_INBOX; 
1124
1125         /* Check folder type */
1126         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
1127
1128         /* Check pop and MMC accounts */
1129         if (!result) {
1130                 result = _selected_folder_is_MMC_or_POP_root (win);
1131         }
1132                 
1133         return result;
1134 }
1135
1136
1137 static gboolean
1138 _selected_folder_is_root (ModestMainWindow *win)
1139 {
1140         TnyFolderType types[1];
1141         gboolean result = FALSE;
1142
1143         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1144
1145         types[0] = TNY_FOLDER_TYPE_ROOT; 
1146
1147         /* Check folder type */
1148         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1149                 
1150         /* Check pop and MMC accounts */
1151         if (!result) {
1152                 result = _selected_folder_is_MMC_or_POP_root (win);
1153         }
1154
1155         return result;
1156 }
1157
1158 static gboolean
1159 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1160 {
1161         GtkWidget *folder_view = NULL;
1162         TnyFolderStore *parent_folder = NULL;
1163         gboolean result = FALSE;
1164
1165         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1166                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1167         /* Get selected folder as parent of new folder to create */
1168         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1169         if (!parent_folder)
1170                 return TRUE;
1171         
1172         if (TNY_IS_ACCOUNT (parent_folder)) {
1173                 /* If it's the local account then do not dim */
1174                 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1175                         result = FALSE;
1176                 } else {
1177                                 /* If it's the MMC root folder then dim it */
1178                         if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1179                                         result = TRUE;
1180                         } else {
1181                                 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1182                                 /* If it's POP then dim */
1183                                 result = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
1184                                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1185                         }
1186                 }
1187         }
1188         g_object_unref (parent_folder);
1189
1190         return result;
1191 }
1192
1193
1194
1195
1196 static gboolean
1197 _selected_folder_is_empty (ModestMainWindow *win)
1198 {
1199         GtkWidget *folder_view = NULL;
1200         TnyFolderStore *folder = NULL;
1201         gboolean result = FALSE;
1202
1203         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1204
1205         /* Get folder view */
1206         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1207                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1208         /* If no folder view, always dimmed */
1209         if (!folder_view)
1210                 return TRUE;
1211         
1212         /* Get selected folder as parent of new folder to create */
1213         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1214         if (!(folder && TNY_IS_FOLDER(folder))) {
1215                 if (folder)
1216                         g_object_unref (folder);
1217                 return TRUE;
1218         }
1219         
1220         /* Check folder type */
1221         result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
1222
1223         /* free */
1224         g_object_unref (folder);
1225
1226         return result;
1227 }
1228
1229 static gboolean
1230 _selected_folder_is_same_as_source (ModestWindow *win)
1231 {
1232         ModestEmailClipboard *clipboard = NULL;
1233         GtkWidget *folder_view = NULL;
1234         TnyFolderStore *folder = NULL;
1235         gboolean result = FALSE;
1236
1237         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1238
1239         /* Get folder view */
1240         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1241                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1242         if (!folder_view)
1243                 return FALSE;
1244         
1245         /* Get selected folder as destination folder */
1246         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1247         if (!(folder && TNY_IS_FOLDER(folder))) {
1248                 result = FALSE;
1249                 goto frees;
1250         }
1251         
1252         /* Check clipboard is cleared */
1253         clipboard = modest_runtime_get_email_clipboard ();
1254         if (modest_email_clipboard_cleared (clipboard)) {
1255                 result = FALSE;
1256                 goto frees;
1257         }
1258                 
1259         /* Check source folder */
1260         result = modest_email_clipboard_check_source_folder (clipboard, 
1261                                                              (const TnyFolder *) folder);
1262         
1263         /* Free */
1264  frees:
1265         g_object_unref (folder);
1266         
1267         return result;
1268 }
1269
1270 static gboolean
1271 _selected_folder_is_any_of_type (ModestWindow *win,
1272                                  TnyFolderType types[], 
1273                                  guint ntypes)
1274 {
1275         GtkWidget *folder_view = NULL;
1276         TnyFolderStore *folder = NULL;
1277         TnyFolderType folder_type;
1278         guint i=0;
1279         gboolean result = FALSE;
1280
1281         /*Get curent folder */
1282         if (MODEST_IS_MAIN_WINDOW(win)) {
1283
1284                 /* Get folder view */
1285                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1286                                                                    MODEST_WIDGET_TYPE_FOLDER_VIEW);
1287                 /* If no folder view, always dimmed */
1288                 if (!folder_view)
1289                         return TRUE;
1290         
1291                 /* Get selected folder as parent of new folder to create */
1292                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1293
1294                 if (!(folder && TNY_IS_FOLDER(folder))) {
1295                         if (folder)
1296                                 g_object_unref (folder);
1297                         return TRUE;
1298                 }
1299                 
1300                 /* Check folder type */
1301                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
1302         }
1303         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1304                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1305                 for (i=0; i < ntypes; i++) {
1306                         result = result || folder_type == types[i];
1307                 }
1308         }
1309
1310
1311         /* free */
1312         g_object_unref (folder);
1313
1314         return result;  
1315 }
1316
1317 static gboolean
1318 _folder_is_any_of_type (TnyFolder *folder,
1319                         TnyFolderType types[], 
1320                         guint ntypes)
1321 {
1322         TnyFolderType folder_type;
1323         gboolean result = FALSE;
1324         guint i;
1325
1326         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
1327
1328         /* Get folder type */
1329         if (modest_tny_folder_is_local_folder (folder))
1330                 folder_type = modest_tny_folder_get_local_folder_type (folder);         
1331         else 
1332                 folder_type = modest_tny_folder_guess_folder_type (folder);             
1333         
1334         /* Check foler type */
1335         for (i=0; i < ntypes; i++) {
1336                 result = result || folder_type == types[i];
1337         }
1338
1339         return result;
1340 }
1341
1342 static gboolean
1343 _selected_folder_is_snd_level (ModestMainWindow *win)
1344 {
1345         GtkWidget *folder_view = NULL;
1346         GtkTreeSelection *sel = NULL;
1347         GtkTreeModel *model = NULL;
1348         GtkTreePath *path = NULL;
1349         GtkTreeIter iter;
1350         TnyFolderStore *folder = NULL;
1351         gboolean result = FALSE;
1352
1353         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1354
1355         /*Get curent folder */
1356         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1357                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1358         /* If no folder view, always dimmed */
1359         if (!folder_view) 
1360                 goto frees;
1361
1362         /* Get selected folder as parent of new folder to create */
1363         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));     
1364         if (!(folder && TNY_IS_FOLDER(folder))) {
1365                 goto frees;
1366         }
1367         
1368         /* Check folder level */
1369         sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(folder_view));
1370         if (!gtk_tree_selection_get_selected (sel, &model, &iter))
1371                 goto frees;
1372         path = gtk_tree_model_get_path (model, &iter);
1373         result = gtk_tree_path_get_depth (path) > 2;
1374         
1375  frees:
1376         if (folder != NULL)
1377                 g_object_unref (folder);
1378         if (path != NULL) 
1379                 gtk_tree_path_free (path);
1380         
1381         return result;
1382
1383 }
1384
1385 static gboolean
1386 _clipboard_is_empty (ModestWindow *win)
1387 {
1388         gboolean result = FALSE;
1389         
1390         if (MODEST_IS_MAIN_WINDOW (win)) {
1391                 ModestEmailClipboard *clipboard = NULL;
1392                 clipboard = modest_runtime_get_email_clipboard ();
1393                 if (modest_email_clipboard_cleared (clipboard)) 
1394                  result = TRUE;  
1395         }
1396
1397         return result;
1398 }
1399
1400 static gboolean
1401 _invalid_clipboard_selected (ModestWindow *win,
1402                        ModestDimmingRule *rule) 
1403 {
1404         gboolean result = FALSE;
1405
1406         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1407                 GtkClipboard *clipboard = NULL;
1408                 gchar *selection = NULL;
1409                 GtkWidget *focused = NULL;
1410
1411                 /* Get clipboard selection*/
1412                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1413                 selection = gtk_clipboard_wait_for_text (clipboard);
1414
1415                 /* Get focuesed widget */
1416                 focused = gtk_window_get_focus (GTK_WINDOW (win));
1417
1418                 /* Check dimming */
1419                 result = ((selection == NULL) || 
1420                           (MODEST_IS_ATTACHMENTS_VIEW (focused)));
1421                 
1422                 if (result)
1423                         modest_dimming_rule_set_notification (rule, _(""));                     
1424         }               
1425         else if (MODEST_IS_MAIN_WINDOW (win)) {
1426                 GtkWidget *header_view = NULL;
1427
1428                 /* Get header view to check selected messages */
1429                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1430                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
1431         
1432                 /* Check dimming */
1433                 result = !modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view));            
1434                 if (result)
1435                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));                  
1436         }
1437         
1438         return result;
1439 }
1440
1441
1442 static gboolean
1443 _invalid_attach_selected (ModestWindow *win,
1444                           gboolean unique,
1445                           gboolean for_view,
1446                           ModestDimmingRule *rule) 
1447 {
1448         GList *attachments, *node;
1449         gint n_selected;
1450         TnyHeaderFlags flags;
1451         gboolean nested_attachments = FALSE;
1452         gboolean selected_messages = FALSE;
1453         gboolean result = FALSE;
1454
1455         if (MODEST_IS_MAIN_WINDOW (win)) {
1456                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
1457                 if (!result)
1458                         result = _selected_msg_marked_as (win, flags, TRUE);            
1459         }
1460         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1461                 
1462                 /* Get selected atachments */
1463                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1464                 n_selected = g_list_length (attachments);
1465
1466                 /* Check unique */              
1467                 if (!result) {
1468                         if (unique) 
1469                                 result = n_selected != 1;
1470                         else
1471                                 
1472                                 result = n_selected < 1;
1473                 }
1474                 
1475                 /* Check attached type (view operation not required) */
1476                 if (!result && !for_view)  {
1477                         for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
1478                                 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1479                                 TnyList *nested_list = tny_simple_list_new ();
1480                                 if (TNY_IS_MSG (mime_part)) {
1481                                         selected_messages = TRUE;
1482                                         result = TRUE;
1483                                 }
1484                                 tny_mime_part_get_parts (mime_part, nested_list);
1485                                 if (tny_list_get_length (nested_list) > 0) {
1486                                 nested_attachments = TRUE;
1487                                 result = TRUE;
1488                                 }
1489                                 g_object_unref (nested_list);
1490                         }
1491                 }
1492                 
1493                 /* Set notifications */
1494                 if (result && rule != NULL) {
1495                         if (selected_messages) {
1496                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1497                         } else if (nested_attachments) {
1498                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1499                         } else if (n_selected == 0) {
1500                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1501                         } else if (unique) {
1502                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1503                         }
1504                 }
1505                 
1506                 /* Free */
1507                 g_list_free (attachments);
1508         }
1509
1510         return result;
1511 }
1512
1513 static gboolean
1514 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
1515 {
1516         GList *attachments = NULL, *node;
1517         gint purged = 0;
1518         gint n_attachments = 0;
1519         gboolean result = FALSE;
1520
1521         /* This should check if _all_ the attachments are already purged. If only some
1522          * of them are purged, then it does not cause dim as there's a confirmation dialog
1523          * for removing only local attachments */
1524
1525         /* Get selected atachments */
1526         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1527                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1528         } else if (MODEST_IS_MAIN_WINDOW (win)) {
1529                 /* If we're in main window, we won't know if there are already purged attachments */
1530                 return FALSE;
1531         }
1532
1533         if (attachments == NULL)
1534                 return FALSE;
1535
1536         for (node = attachments; node != NULL; node = g_list_next (node)) {
1537                 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1538                 if (tny_mime_part_is_purged (mime_part)) {
1539                         purged++;
1540                 }
1541                 n_attachments++;
1542         }
1543                 
1544         /* Free */
1545         g_list_free (attachments);
1546
1547         if (all)
1548                 result = (purged == n_attachments);
1549         else
1550                 result = (purged > 0);
1551
1552         if (result && (rule != NULL))
1553                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1554
1555         return result;
1556 }
1557
1558 static gboolean
1559 _invalid_msg_selected (ModestMainWindow *win,
1560                        gboolean unique,
1561                        ModestDimmingRule *rule) 
1562 {
1563         GtkWidget *header_view = NULL;          
1564         GtkWidget *folder_view = NULL;
1565         gboolean selected_headers = FALSE;
1566         gboolean result = FALSE;
1567
1568         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1569         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
1570                 
1571         /* Get header view to check selected messages */
1572         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1573                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1574         
1575         /* Get folder view to check focus */
1576         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1577                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
1578
1579         /* Get selected headers */
1580         selected_headers = modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view));
1581
1582         /* Check dimmed rule (TODO: check focus on widgets */   
1583         if (!result) {
1584                 result = ((!selected_headers) ||
1585                           (gtk_widget_is_focus (folder_view)));
1586                 if (result)
1587                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1588         }
1589         if (!result && unique) {
1590                 result = modest_header_view_count_selected_headers (MODEST_HEADER_VIEW(header_view)) > 1;
1591                 if (result)
1592                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1593         }
1594
1595         return result;
1596 }
1597
1598 static gboolean
1599 _already_opened_msg (ModestWindow *win,
1600                      guint *n_messages)
1601 {
1602         //ModestWindow *window = NULL;
1603         ModestWindowMgr *mgr = NULL;
1604         GtkWidget *header_view = NULL;          
1605         TnyList *selected_headers = NULL;
1606         TnyIterator *iter = NULL;
1607         TnyHeader *header = NULL;
1608         gboolean found;
1609
1610         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1611                 
1612         /* Get header view to check selected messages */
1613         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1614                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1615
1616
1617         /* Check no selection */
1618         if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1619             return FALSE;
1620             
1621         /* Get selected headers */
1622         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1623         if (selected_headers == NULL) 
1624                 return FALSE;
1625
1626         *n_messages = tny_list_get_length (selected_headers);
1627
1628         /* Check dimmed rule (TODO: check focus on widgets */   
1629         mgr = modest_runtime_get_window_mgr ();
1630         iter = tny_list_create_iterator (selected_headers);
1631         found = FALSE;
1632         while (!tny_iterator_is_done (iter)) {
1633                 header = TNY_HEADER (tny_iterator_get_current (iter));
1634                 found = modest_window_mgr_find_registered_header (mgr,header, NULL);
1635                 
1636                 g_object_unref (header);
1637                 tny_iterator_next (iter);
1638
1639                 if (found)
1640                         break;
1641         }
1642                 
1643         /* free */
1644         if (selected_headers != NULL) 
1645                 g_object_unref (selected_headers);
1646         if (iter != NULL)
1647                 g_object_unref (iter);
1648                 
1649         return found;
1650 }
1651
1652 static gboolean
1653 _selected_msg_marked_as (ModestWindow *win, 
1654                          TnyHeaderFlags mask, 
1655                          gboolean opposite)
1656 {
1657         GtkWidget *header_view = NULL;
1658         TnyList *selected_headers = NULL;
1659         TnyIterator *iter = NULL;
1660         TnyHeader *header = NULL;
1661         TnyHeaderFlags flags;
1662         gboolean result = FALSE;
1663
1664         /* Get header view to check selected messages */
1665         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1666                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1667
1668         /* Check no selection */
1669         if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1670             return TRUE;
1671
1672         /* Get selected headers */
1673         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1674         if (selected_headers == NULL) 
1675                 return TRUE;
1676         
1677         /* Call the function for each header */
1678         iter = tny_list_create_iterator (selected_headers);
1679         while (!tny_iterator_is_done (iter) && !result) {
1680                 header = TNY_HEADER (tny_iterator_get_current (iter));
1681
1682                 flags = tny_header_get_flags (header);
1683                 if (opposite)
1684                         result = (flags & mask) == 0; 
1685                 else
1686                         result = (flags & mask) != 0; 
1687
1688                 g_object_unref (header);
1689                 tny_iterator_next (iter);
1690         }
1691
1692         /* free */
1693         if (selected_headers != NULL) 
1694                 g_object_unref (selected_headers);
1695         if (iter != NULL)
1696                 g_object_unref (iter);
1697
1698         return result;
1699 }
1700
1701 static gboolean
1702 _msg_download_in_progress (ModestMsgViewWindow *win)
1703 {
1704         gboolean result = FALSE;
1705
1706         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1707
1708         result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1709
1710         return result;
1711 }
1712
1713 static gboolean
1714 _msg_download_completed (ModestMainWindow *win)
1715 {
1716         GtkWidget *header_view = NULL;
1717         TnyList *selected_headers = NULL;
1718         TnyIterator *iter = NULL;
1719         TnyHeader *header = NULL;
1720         TnyHeaderFlags flags;
1721         gboolean result = FALSE;
1722
1723         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1724
1725
1726         /* Get header view to check selected messages */
1727         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1728                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
1729
1730         /* Check no selection */
1731         if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1732             return TRUE;
1733
1734         /* Get selected headers */
1735         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1736         if (selected_headers == NULL) 
1737                 return TRUE;
1738
1739         /* Check dimmed rule  */        
1740         result = TRUE;
1741         iter = tny_list_create_iterator (selected_headers);
1742         while (!tny_iterator_is_done (iter) && result) {
1743                 header = TNY_HEADER (tny_iterator_get_current (iter));
1744                         
1745                 flags = tny_header_get_flags (header);
1746                 /* TODO: is this the right flag?, it seems that some
1747                    headers that have been previously downloaded do not
1748                    come with it */
1749                 result = (flags & TNY_HEADER_FLAG_CACHED);
1750
1751                 g_object_unref (header);
1752                 tny_iterator_next (iter);
1753         }
1754
1755         g_object_unref (iter);
1756
1757         return result;
1758 }
1759
1760 static gboolean
1761 _selected_msg_sent_in_progress (ModestWindow *win)
1762 {
1763         ModestTnySendQueue *send_queue = NULL;
1764         GtkWidget *header_view = NULL;
1765         ModestTnyAccountStore *acc_store = NULL;
1766         TnyAccount *account = NULL;
1767         TnyList *header_list = NULL;
1768         TnyIterator *iter = NULL;
1769         TnyHeader *header = NULL;
1770         const gchar *account_name = NULL;
1771         gboolean result = FALSE;
1772         gchar *id = NULL;
1773         
1774         /* Get transport account */
1775         acc_store = modest_runtime_get_account_store();
1776         account_name = modest_window_get_active_account (win);
1777         
1778         /* If no account defined, this action must be always dimmed  */
1779         if (account_name == NULL) return FALSE;
1780         account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1781         if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1782
1783         /* Get send queue for current ransport account */
1784         send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1785         g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1786
1787         if (MODEST_IS_MAIN_WINDOW(win)) {
1788                 
1789                 /* Get header view to check selected messages */
1790                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1791                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
1792                 
1793                 /* Check no selection */
1794                 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1795                     return FALSE;
1796
1797                 /* Get selected headers */
1798                 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1799
1800                 /* Get message header */
1801                 if (!header_list) return FALSE;
1802                 iter = tny_list_create_iterator (header_list);
1803                 header = TNY_HEADER (tny_iterator_get_current (iter));
1804
1805                 /* Get message id */
1806                 id = g_strdup(tny_header_get_message_id (header));
1807                 
1808         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1809                 
1810                 /* Get message header */
1811                 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
1812
1813                 /* Get message id */
1814                 id = g_strdup(tny_header_get_message_id (header));
1815         }
1816
1817         /* Check if msg id is being processed inside send queue */
1818         result = modest_tny_send_queue_msg_is_being_sent (send_queue, id);
1819
1820         /* Free */
1821         g_free(id);
1822         g_object_unref (header);
1823         g_object_unref(header_list);
1824         g_object_unref(iter);
1825
1826         return result;
1827 }
1828
1829
1830 static gboolean
1831 _sending_in_progress (ModestWindow *win)
1832 {
1833         gboolean result = FALSE;
1834         
1835         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1836
1837         /* Check if send operation is in progress */
1838         result = modest_main_window_send_receive_in_progress (MODEST_MAIN_WINDOW (win));
1839
1840         return result;
1841 }
1842
1843 static gboolean
1844 _invalid_folder_for_purge (ModestWindow *win, 
1845                            ModestDimmingRule *rule)
1846 {
1847         TnyMsg *msg = NULL;
1848         TnyFolder *folder = NULL;
1849         TnyAccount *account = NULL;
1850         gboolean result = FALSE;
1851
1852         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1853
1854                 /* Get folder and account of message */
1855                 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1856                 g_return_val_if_fail(msg != NULL, TRUE);                        
1857                 folder = tny_msg_get_folder (msg);              
1858                 if (folder == NULL) {
1859                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1860                         goto frees;                     
1861                 }
1862                 g_object_unref (msg);
1863         } else if (MODEST_IS_MAIN_WINDOW (win)) {
1864                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1865                                                                               MODEST_WIDGET_TYPE_FOLDER_VIEW);
1866                 if (!folder_view)
1867                         return FALSE;
1868                 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
1869                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
1870                         return FALSE;
1871                 g_object_ref (folder);
1872                 
1873         } else {
1874                 g_return_val_if_reached (FALSE);
1875         }
1876         account = modest_tny_folder_get_account (folder);
1877         if (account == NULL) goto frees;                        
1878                 
1879         /* Check account */
1880         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
1881                 TnyFolderType types[2];
1882                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1883                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1884                 
1885                 if (_selected_folder_is_any_of_type (win, types, 2)) {
1886                         result = TRUE;
1887                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
1888                 } else {
1889                         /* We're currently disabling purge in any local store */
1890                         result = TRUE;
1891                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1892                 }
1893         } else {
1894                 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
1895                 /* If it's POP then dim */
1896                 if (modest_protocol_info_get_transport_store_protocol (proto_str) == 
1897                     MODEST_PROTOCOL_STORE_POP) {
1898                         GList *attachments;
1899                         gint n_selected;
1900                         result = TRUE;
1901                         attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1902                         n_selected = g_list_length (attachments);
1903                         g_list_free (attachments);
1904                         
1905                         modest_dimming_rule_set_notification (rule, 
1906                                                               ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
1907                                                                         "mail_ib_unable_to_pure_attach_pop_mail_plural", 
1908                                                                         n_selected));
1909                 }
1910         }
1911         
1912 frees:
1913         if (folder != NULL)
1914                 g_object_unref (folder);
1915         if (account != NULL)
1916                 g_object_unref (account);
1917         
1918         return result;
1919 }
1920
1921 static gboolean
1922 _transfer_mode_enabled (ModestWindow *win)
1923 {
1924         gboolean result = FALSE;
1925
1926         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1927         
1928         /* Check dimming */
1929         result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
1930
1931         return result;
1932 }