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