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