Add access to account store in plugins.
[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-ui-actions.h"
37 #include "modest-account-mgr-helpers.h"
38 #include "modest-dimming-rule.h"
39 #include "modest-debug.h"
40 #include "modest-tny-folder.h"
41 #include "modest-tny-account.h"
42 #include "modest-tny-msg.h"
43 #include "modest-tny-mime-part.h"
44 #include "modest-text-utils.h"
45 #include "widgets/modest-folder-view.h"
46 #include "modest-address-book.h"
47 #include <widgets/modest-attachments-view.h>
48 #include <modest-runtime.h>
49 #include <tny-simple-list.h>
50 #include <tny-merge-folder.h>
51 #include <widgets/modest-recpt-editor.h>
52 #include <gtkhtml/gtkhtml.h>
53 #include <modest-runtime.h>
54 #ifdef MODEST_TOOLKIT_HILDON2
55 #include <modest-header-window.h>
56 #include <modest-folder-window.h>
57 #endif
58
59
60 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
61 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
62 static gboolean _invalid_attach_selected (ModestWindow *win, 
63                                           gboolean unique, gboolean for_view, gboolean for_remove,
64                                           ModestDimmingRule *rule);
65 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
66 static gboolean _clipboard_is_empty (ModestWindow *win);
67 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
68 static gboolean _selected_folder_not_writeable (ModestMainWindow *win, gboolean for_paste);
69 static gboolean _selected_folder_not_moveable (ModestMainWindow *win);
70 static gboolean _selected_folder_not_renameable (ModestMainWindow *win);
71 static gboolean _selected_folder_not_deletable (ModestMainWindow *win);
72 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
73 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
74 static gboolean _selected_folder_is_root (ModestMainWindow *win);
75 static gboolean _header_view_is_all_selected (ModestMainWindow *win);
76 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
77 static gboolean _folder_view_has_focus (ModestWindow *win);
78 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
79 static gboolean _msg_download_in_progress (ModestWindow *win);
80 static gboolean _msg_download_completed (ModestMainWindow *win);
81 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
82 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
83 static gboolean _transfer_mode_enabled (ModestWindow *win);
84 static gboolean _selected_folder_has_subfolder_with_same_name (ModestWindow *win);
85 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
86 static gboolean _send_receive_in_progress (ModestWindow *win);
87 static gboolean _msgs_send_in_progress (void);
88 static gboolean _all_msgs_in_sending_status (ModestHeaderView *header_view) G_GNUC_UNUSED;
89 static gboolean _forbid_outgoing_xfers (ModestWindow *window);
90
91 static DimmedState *
92 _define_main_window_dimming_state (ModestMainWindow *window)
93 {
94         DimmedState *state = NULL;
95         GtkWidget *focused_widget = NULL;
96         GtkWidget *header_view = NULL;
97         GtkTreeModel *model = NULL;
98         TnyList *selected_headers = NULL;
99         TnyIterator *iter = NULL;
100         TnyHeader *header = NULL;
101         ModestCacheMgr *cache_mgr = NULL;
102         GHashTable *send_queue_cache = NULL;
103         ModestTnySendQueue *send_queue = NULL;
104         GSList *send_queues = NULL, *node = NULL;
105         ModestWindowMgr *mgr = NULL;
106         gboolean found = FALSE;
107         gchar *msg_uid = NULL;
108         TnyHeaderFlags flags;
109         gboolean all_deleted = TRUE;
110         gboolean all_seen = TRUE;
111         gboolean all_cached = TRUE;
112         gboolean all_has_attach = TRUE;
113         TnyFolder *folder = NULL;
114
115         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
116
117         /* Init state */
118         state = g_slice_new0 (DimmedState);
119         state->n_selected = 0;
120         state->already_opened_msg = 0;
121         state->any_marked_as_deleted = FALSE;
122         state->all_marked_as_deleted = FALSE;
123         state->any_marked_as_seen = FALSE;
124         state->all_marked_as_seen = FALSE;
125         state->any_marked_as_cached = FALSE;
126         state->all_marked_as_cached = FALSE;
127         state->any_has_attachments = FALSE;
128         state->all_has_attachments = FALSE;
129         state->sent_in_progress = FALSE;
130         state->all_selected = FALSE;
131
132         /* Get focused widget */
133         focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
134         if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
135                 state->n_selected++;
136                 return state;
137         } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
138                 header_view = focused_widget;           
139         } else {
140                 header_view = modest_main_window_get_child_widget (window, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
141         }
142         
143         /* Get header view and selected headers */
144         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
145         if (!selected_headers) 
146                 return state;
147
148         /* Examine selected headers */
149         iter = tny_list_create_iterator (selected_headers);
150         while (!tny_iterator_is_done (iter)) {
151                 header = TNY_HEADER (tny_iterator_get_current (iter));
152                 flags = tny_header_get_flags (header);
153                 
154                 /* No selected */
155                 state->n_selected++;
156                 
157                 /* Already opened */
158                 mgr = modest_runtime_get_window_mgr ();
159                 if (modest_window_mgr_find_registered_header (mgr, header, NULL))
160                         state->already_opened_msg++;
161                 
162
163                 /* Mark as deleted */           
164                 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
165                 state->all_marked_as_deleted = all_deleted;
166                 if (!state->any_marked_as_deleted)
167                         state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
168                 
169                 /* Mark as seen */
170                 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
171                 state->all_marked_as_seen = all_seen;
172                 if (!state->any_marked_as_seen)
173                         state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
174                 
175                 /* Mark as cached */
176                 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
177                 state->all_marked_as_cached = all_cached;
178                 if (!state->any_marked_as_cached)
179                         state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
180                 
181                 /* Mark has_attachments */
182                 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
183                 state->all_has_attachments = all_has_attach;
184                 if (!state->any_has_attachments)
185                         state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
186         
187                 /* sent in progress */
188                 folder = tny_header_get_folder (header);
189                 if (folder) {
190                         if (modest_tny_folder_guess_folder_type (folder) == TNY_FOLDER_TYPE_OUTBOX) {
191                                 msg_uid = modest_tny_send_queue_get_msg_id (header);
192                                 if (!state->sent_in_progress) {
193                                         cache_mgr = modest_runtime_get_cache_mgr ();
194                                         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
195                                                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
196                         
197                                         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
198                                         
199                                         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
200                                                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
201                                                 
202                                                 /* Check if msg uid is being processed inside send queue */
203                                                 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);          
204                                         }
205                                         state->sent_in_progress = found;
206                                 }
207                         }
208                         g_object_unref (folder);
209                 }
210                 tny_iterator_next (iter);
211                 g_object_unref (header);
212         }
213
214         /* check if all the headers are selected or not */
215         model = gtk_tree_view_get_model(GTK_TREE_VIEW(header_view));
216         if (model != NULL){
217                 gint count;
218                 count = gtk_tree_model_iter_n_children(model, NULL);
219                 if(state->n_selected == count)
220                         state->all_selected = TRUE;
221         }
222
223         /* Free */
224         g_free(msg_uid);
225         g_object_unref(selected_headers);
226         g_object_unref(iter);
227         g_slist_free (send_queues);
228         
229         return state;
230 }
231
232 static DimmedState *
233 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
234 {
235         DimmedState *state = NULL;
236         TnyHeader *header = NULL;
237         ModestCacheMgr *cache_mgr = NULL;
238         GHashTable *send_queue_cache = NULL;
239         ModestTnySendQueue *send_queue = NULL;
240         GSList *send_queues = NULL, *node = NULL;
241         gboolean found = FALSE;
242         gchar *msg_uid = NULL;
243         TnyHeaderFlags flags;
244         gboolean all_deleted = TRUE;
245         gboolean all_seen = TRUE;
246         gboolean all_cached = TRUE;
247         gboolean all_has_attach = TRUE;
248                         
249         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
250
251         /* Init state */
252         state = g_slice_new0 (DimmedState);
253         state->n_selected = 0;
254         state->already_opened_msg = 0;
255         state->any_marked_as_deleted = FALSE;
256         state->all_marked_as_deleted = FALSE;
257         state->any_marked_as_seen = FALSE;
258         state->all_marked_as_seen = FALSE;
259         state->any_marked_as_cached = FALSE;
260         state->all_marked_as_cached = FALSE;
261         state->any_has_attachments = FALSE;
262         state->all_has_attachments = FALSE;
263         state->sent_in_progress = FALSE;
264
265         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
266         if (header == NULL)
267                 return state;
268         g_return_val_if_fail (TNY_IS_HEADER(header), state);
269         flags = tny_header_get_flags (header);
270
271         /* Selected */
272         state->n_selected++;
273
274         /* Mark as deleted */           
275         all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
276         state->all_marked_as_deleted = all_deleted;
277         if (!state->any_marked_as_deleted)
278                 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
279         
280         /* Mark as seen */
281         all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
282         state->all_marked_as_seen = all_seen;
283         if (!state->any_marked_as_seen)
284                 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
285         
286         /* Mark as cached */
287         all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
288         state->all_marked_as_cached = all_cached;
289         if (!state->any_marked_as_cached)
290                 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
291         
292         /* Mark has_attachments */
293         all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
294         state->all_has_attachments = all_has_attach;
295         if (!state->any_has_attachments)
296                 state->any_has_attachments = (flags & TNY_HEADER_FLAG_ATTACHMENTS)?1:0;
297         
298         /* sent in progress */
299         msg_uid = modest_tny_send_queue_get_msg_id (header);
300         if (!state->sent_in_progress) {
301                 cache_mgr = modest_runtime_get_cache_mgr ();
302                 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
303                                                                MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
304                 
305                 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
306                 
307                 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
308                         send_queue = MODEST_TNY_SEND_QUEUE (node->data);
309                         
310                         /* Check if msg uid is being processed inside send queue */
311                         found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);          
312                 }
313                 state->sent_in_progress = found;
314         }
315         
316         /* Free */
317         g_free(msg_uid);
318         g_object_unref (header);
319         g_slist_free (send_queues);
320
321         return state;
322 }
323
324    
325 DimmedState *
326 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
327 {
328         DimmedState *state = NULL;
329
330         g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
331         
332         if (MODEST_IS_MAIN_WINDOW (window)) 
333                 state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
334         else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
335                 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));         
336         }
337         
338         return state;
339 }
340
341 gboolean 
342 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
343 {
344         ModestDimmingRule *rule = NULL;
345         gboolean dimmed = FALSE;
346
347         g_return_val_if_fail (MODEST_IS_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         /* Check dimmed rule */ 
352         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
353 #ifndef MODEST_TOOLKIT_HILDON2
354                 dimmed = _msg_download_in_progress (win);
355                 if (dimmed)
356                         modest_dimming_rule_set_notification (rule, "");
357 #endif
358         } else if (MODEST_IS_MAIN_WINDOW(win)) {
359                 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
360                                                           TRUE);        
361                 if (dimmed)
362                         modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
363         }
364
365         return dimmed;
366 }
367
368 gboolean 
369 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
370 {
371         ModestDimmingRule *rule = NULL;
372         GtkWidget *folder_view = NULL;
373         TnyFolderStore *parent_folder = NULL;
374         gboolean dimmed = FALSE;
375
376         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
377         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
378         rule = MODEST_DIMMING_RULE (user_data);
379
380         dimmed = _transfer_mode_enabled (win);
381         if (dimmed) {
382                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
383                 return dimmed;
384         }
385
386         /* Get selected folder as parent of new folder to create */
387         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
388                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
389         if (!folder_view) /* folder view may not have been created yet */
390                 return TRUE;    
391
392         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
393         if (!parent_folder)
394                 return TRUE;
395         
396         if (TNY_IS_ACCOUNT (parent_folder)) {
397                 /* If it's the local account then do not dim */
398                 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
399                         dimmed = FALSE;
400                 } else {
401                         ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (parent_folder));
402                         if (protocol_type != MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
403                                 ModestProtocolRegistry *protocol_registry;
404
405                                 protocol_registry = modest_runtime_get_protocol_registry ();
406                                 /* If account does not support folders (pop) then dim */
407                                 dimmed = (!modest_protocol_registry_protocol_type_has_tag (protocol_registry, protocol_type,
408                                                                                            MODEST_PROTOCOL_REGISTRY_STORE_HAS_FOLDERS));
409                                 if (dimmed)
410                                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
411                         }
412                 }
413         } else {        
414                 TnyFolderType types[3];
415                                 
416                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
417                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
418                 types[2] = TNY_FOLDER_TYPE_SENT;
419
420                 /* Apply folder rules */        
421                 if (!dimmed) {
422                         dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), FALSE);
423                         if (dimmed)
424                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
425                 }
426                 if (!dimmed) {
427                         dimmed = _selected_folder_is_any_of_type (win, types, 3);
428                         if (dimmed)
429                                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
430                 }
431         }
432
433         /* if not the folder is selected then dim */
434         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
435                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
436         if (folder_view && !gtk_widget_is_focus (folder_view)) 
437                 dimmed = TRUE;
438
439         g_object_unref (parent_folder);
440
441         return dimmed;
442 }
443
444 gboolean 
445 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
446 {
447         ModestDimmingRule *rule = NULL;
448         GtkWidget *folder_view = NULL;
449         GtkWidget *header_view = NULL;  
450         gboolean dimmed = FALSE;
451
452         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
453         rule = MODEST_DIMMING_RULE (user_data);
454         
455         if (MODEST_IS_MAIN_WINDOW (win)) {
456                 /* Get the folder view */
457                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
458                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
459                 
460                 /* Get header view */
461                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
462                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
463
464                 if (header_view && gtk_widget_is_focus (header_view)) 
465                         dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
466
467                 if (folder_view && gtk_widget_is_focus (folder_view)) 
468                         dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
469
470                 if (header_view && folder_view &&
471                     !gtk_widget_is_focus (header_view) &&
472                     !gtk_widget_is_focus (folder_view)) {
473                         dimmed = TRUE;
474                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
475                 }
476
477 #ifdef MODEST_TOOLKIT_HILDON2
478         } else if (MODEST_IS_FOLDER_WINDOW (win)) {
479                 dimmed = modest_ui_dimming_rules_on_folder_window_delete (win, user_data);
480         } else if (MODEST_IS_HEADER_WINDOW (win)) {
481
482                 if (!dimmed)
483                         dimmed = _transfer_mode_enabled (win);
484
485                 if (dimmed)
486                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
487
488                 if (!dimmed) {
489                         GtkWidget *header_view;
490                         TnyFolder *folder;
491
492                         header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
493                         folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
494                         if (folder) {
495                                 dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
496                                         modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
497
498                                 if (!dimmed &&
499                                     (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
500                                         dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
501                                 }
502                                 g_object_unref (folder);
503                         }
504                 }
505
506 #endif
507         } else {
508                 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
509         }
510
511         return dimmed;
512 }
513
514
515
516 gboolean 
517 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
518 {
519         ModestDimmingRule *rule = NULL;
520         TnyFolderType types[6];
521         gboolean dimmed = FALSE;
522
523         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
524         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
525         rule = MODEST_DIMMING_RULE (user_data);
526
527         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
528         types[1] = TNY_FOLDER_TYPE_OUTBOX;
529         types[2] = TNY_FOLDER_TYPE_SENT;
530         types[3] = TNY_FOLDER_TYPE_INBOX;
531         types[4] = TNY_FOLDER_TYPE_ROOT;
532         types[5] = TNY_FOLDER_TYPE_ARCHIVE;
533
534                 
535         /* Check dimmed rule */ 
536         dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
537         if (dimmed)
538                 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
539         if (!dimmed) {
540                 dimmed = _selected_folder_is_any_of_type (win, types, 6);
541                 if (dimmed)
542                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
543         }
544         if (!dimmed) {
545                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
546                 if (dimmed)
547                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
548         }
549         if (!dimmed) {
550                 dimmed = _transfer_mode_enabled (win);
551                 if (dimmed)
552                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
553         }
554
555         return dimmed;
556 }
557
558 gboolean
559 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
560 {
561         ModestDimmingRule *rule = NULL;
562         gboolean dimmed = FALSE;
563
564 #ifdef MODEST_TOOLKIT_HILDON2
565         if (MODEST_IS_HEADER_WINDOW (win)) {
566                 return FALSE;
567         }
568 #endif          
569
570         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
571         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
572         rule = MODEST_DIMMING_RULE (user_data);
573
574         /* Check dimmed rule */ 
575         dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
576
577         if (!dimmed)
578                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
579
580         return dimmed;
581         
582 }
583
584 gboolean 
585 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
586 {
587         ModestDimmingRule *rule = NULL;
588         TnyFolderType types[4];
589         gboolean dimmed = FALSE;
590
591         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
592         rule = MODEST_DIMMING_RULE (user_data);
593
594         types[0] = TNY_FOLDER_TYPE_DRAFTS;
595         types[1] = TNY_FOLDER_TYPE_OUTBOX;
596         types[2] = TNY_FOLDER_TYPE_SENT;
597         types[3] = TNY_FOLDER_TYPE_ARCHIVE;
598
599         /* Check dimmed rule */
600         if (MODEST_IS_MAIN_WINDOW (win)) {
601                 dimmed = _selected_folder_not_renameable (MODEST_MAIN_WINDOW(win));
602                 if (dimmed)
603                         modest_dimming_rule_set_notification (rule, "");
604                 if (!dimmed) {
605                         dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
606                         if (dimmed)
607                                 modest_dimming_rule_set_notification (rule, "");
608                 }
609         }
610
611 #ifdef MODEST_TOOLKIT_HILDON2
612         if (MODEST_IS_FOLDER_WINDOW (win)) {
613                 ModestFolderView *folder_view;
614                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
615                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
616                                                                        MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE);
617         }
618 #endif
619
620         if (!dimmed) {
621                 dimmed = _selected_folder_is_any_of_type (win, types, 4);
622                 if (dimmed)
623                         modest_dimming_rule_set_notification (rule, "");
624         }
625
626         return dimmed;
627 }
628
629 gboolean 
630 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
631 {
632         ModestDimmingRule *rule = NULL;
633         gboolean dimmed = FALSE;
634         const DimmedState *state = NULL;
635
636         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
637         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
638         rule = MODEST_DIMMING_RULE (user_data);
639         state = modest_window_get_dimming_state (win);          
640
641         /* Check dimmed rule */ 
642         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);      
643         if (!dimmed) {
644                 dimmed = state->any_marked_as_deleted;
645                 if (dimmed) {
646                         gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
647                         modest_dimming_rule_set_notification (rule, msg);
648                         g_free (msg);
649                 }
650         }
651         if (!dimmed) {
652                 dimmed = _selected_msg_sent_in_progress (win);
653                 if (dimmed)
654                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
655         }
656
657         return dimmed;
658 }
659
660 gboolean 
661 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
662 {
663         ModestDimmingRule *rule = NULL;
664         gboolean dimmed = FALSE;
665         TnyFolderType types[3];
666
667         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
668         rule = MODEST_DIMMING_RULE (user_data);
669
670         types[0] = TNY_FOLDER_TYPE_DRAFTS;
671         types[1] = TNY_FOLDER_TYPE_OUTBOX;
672         types[2] = TNY_FOLDER_TYPE_ROOT;
673
674         /* Check dimmed rule */
675         dimmed = _selected_folder_is_any_of_type (win, types, 3);
676         if (dimmed)
677                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
678
679         /* main window dimming rules */
680         if (MODEST_IS_MAIN_WINDOW(win)) {
681
682                 if (!dimmed) {
683                         dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
684                         if (dimmed)
685                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
686                 }
687                 if (!dimmed) {
688                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
689                 }
690         /* msg view window dimming rules */
691         } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
692
693                 /* This could happen if we load the msg view window with a
694                    preview before loading the full message */
695                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
696                 if (!msg) {
697                         dimmed = TRUE;
698                 } else {
699                         g_object_unref (msg);
700                 }
701
702                 if (!dimmed) {
703                         dimmed = _transfer_mode_enabled (win);
704                         if (dimmed)
705                                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
706                 }
707                 if (!dimmed) {
708                         dimmed = _msg_download_in_progress (win);
709                         if (dimmed)
710                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
711                 }
712         }
713
714         return dimmed;
715 }
716
717
718 gboolean 
719 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
720 {
721         ModestDimmingRule *rule = NULL;
722         gboolean dimmed = FALSE;
723
724         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
725         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
726         rule = MODEST_DIMMING_RULE (user_data);
727                 
728         /* Check dimmed rule */ 
729         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);     
730         if (!dimmed) {
731                 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
732                 if (dimmed)
733                         modest_dimming_rule_set_notification (rule, "");
734         }
735
736         return dimmed;
737 }
738
739 gboolean 
740 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
741 {
742         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
743
744         return TRUE;
745 }
746
747 static gboolean
748 _message_already_sent (ModestMsgViewWindow *view_window)
749 {
750         TnyHeader *header;
751         TnyFolder *folder;
752         gboolean already_sent = FALSE;
753
754         header = modest_msg_view_window_get_header (view_window);
755         if (header) {
756                 folder = tny_header_get_folder (header);
757                 if (folder) {
758                         if (modest_tny_folder_guess_folder_type (folder) ==
759                             TNY_FOLDER_TYPE_OUTBOX) {
760                                 ModestTnySendQueueStatus status = 
761                                         modest_tny_all_send_queues_get_msg_status (header);
762                                 if (status == MODEST_TNY_SEND_QUEUE_UNKNOWN ||
763                                     status == MODEST_TNY_SEND_QUEUE_SENDING)
764                                         already_sent = TRUE;
765                         }
766                         g_object_unref (folder);
767                 }
768                 g_object_unref (header);
769         }
770         return already_sent;
771 }
772
773
774 gboolean 
775 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
776 {
777         ModestDimmingRule *rule = NULL;
778         const DimmedState *state = NULL;
779         gboolean dimmed = FALSE;
780
781         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
782         rule = MODEST_DIMMING_RULE (user_data);
783         state = modest_window_get_dimming_state (win);
784
785         /* If we're in transfer mode then do not allow to delete messages */
786         dimmed = _transfer_mode_enabled (win);
787         if (dimmed) {
788                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
789                 return dimmed;
790         }
791
792         /* Check dimmed rule */ 
793         if (MODEST_IS_MAIN_WINDOW (win)) {
794                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
795                 if (dimmed)
796                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
797                 if (!dimmed) {
798                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
799                 }
800                 if (!dimmed) {
801                         dimmed = state->sent_in_progress;
802                         if (dimmed)
803                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
804                 }
805                 if (!dimmed) {
806                         dimmed = state->any_marked_as_deleted;
807                         if (dimmed) {
808                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
809                                 modest_dimming_rule_set_notification (rule, msg);
810                                 g_free (msg);
811                         }
812                 }
813                 if (!dimmed) {
814                         dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
815                         if (dimmed) {
816                                 gchar *message = NULL;
817
818                                 message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"),
819                                                           state->already_opened_msg);
820                                 modest_dimming_rule_set_notification (rule, message);
821                                 g_free(message);
822                         }
823
824                 }
825         } 
826         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
827                 /* This could happen if we load the msg view window with a
828                    preview before loading the full message */
829                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
830                 if (!msg) {
831                         dimmed = TRUE;
832                 } else {
833                         g_object_unref (msg);
834                 }
835
836                 if (!dimmed) {
837                         dimmed = state->any_marked_as_deleted;
838                         if (dimmed) {
839                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
840                                 modest_dimming_rule_set_notification (rule, msg);
841                                 g_free (msg);
842                         }
843                 }
844                 if (!dimmed) {
845                         dimmed = state->sent_in_progress;
846                         if (dimmed)
847                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
848                 }
849
850                 /* This could happen if we're viewing a message of the
851                    outbox that has been already sent */
852                 if (!dimmed)
853                         dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
854
855                 /* The delete button should be dimmed when viewing an attachment,
856                  * but should be enabled when viewing a message from the list, 
857                  * or when viewing a search result.
858                  */
859                 if (!dimmed) {
860                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
861                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
862                                 if (dimmed) {
863                                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
864                                 }
865                         }
866                 }
867         }
868
869         return dimmed;
870 }
871
872 gboolean 
873 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
874 {
875         ModestDimmingRule *rule = NULL;
876         GtkWidget *header_view = NULL;
877         gboolean dimmed = FALSE;
878
879         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
880         rule = MODEST_DIMMING_RULE (user_data);
881         
882         /* main window dimming rules */
883         if (MODEST_IS_MAIN_WINDOW(win)) {
884                                 
885                 /* Check dimmed rule */
886                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
887                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
888                 
889                 /* If the header view has the focus: */
890                 if (header_view && gtk_widget_is_focus (header_view)) {
891                         /* Check dimmed rule */ 
892                         if (!dimmed)
893                                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
894                 }
895                 else {
896                         /* If the folder view has the focus: */
897                         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
898                                 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
899                         if (folder_view && gtk_widget_is_focus (folder_view)) {
900                                 TnyFolderStore *folder_store
901                                         = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
902                                 if (folder_store) {
903                                         /* Only enable for folders, not accounts,
904                                          * though the UI spec is not clear about that.
905                                          * If we enable this for accounts then we must 
906                                          * add code to handle them in modest_ui_actions_on_details(). */
907                                         if (!TNY_IS_FOLDER(folder_store)) {
908                                                 dimmed = TRUE;
909                                                 modest_dimming_rule_set_notification (rule, "");
910                                         }
911
912                                         g_object_unref (folder_store);
913                                 } else {
914                                         dimmed = TRUE;
915                                         modest_dimming_rule_set_notification (rule, "");
916                                 }
917                                 if (!dimmed) {
918                                         dimmed = _msg_download_in_progress (win);
919                                         if (dimmed)
920                                                 modest_dimming_rule_set_notification (rule, "");
921                                 }
922
923                         } else {
924                                 return TRUE;
925                         }
926                 }
927
928         /* msg view window dimming rules */
929         } else {
930                 /* Check dimmed rule */ 
931                 if (MODEST_IS_MSG_VIEW_WINDOW (win))
932                         dimmed = _msg_download_in_progress (win);
933                 if (dimmed)
934                         modest_dimming_rule_set_notification (rule, "");
935         }
936
937         return dimmed;
938 }
939
940 gboolean
941 modest_ui_dimming_rules_on_fetch_images (ModestWindow *win, gpointer user_data)
942 {
943         gboolean dimmed = FALSE;
944
945         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
946
947         dimmed = !modest_msg_view_window_has_blocked_external_images (MODEST_MSG_VIEW_WINDOW (win));
948
949         return dimmed;
950 }
951
952
953 gboolean 
954 modest_ui_dimming_rules_on_mark_as_read_msg_in_view (ModestWindow *win, gpointer user_data)
955 {
956         ModestDimmingRule *rule = NULL;
957         TnyHeader *header;
958         TnyHeaderFlags flags;
959         gboolean dimmed = FALSE;
960
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         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
967         if (!header) {
968                 dimmed = TRUE;
969         }
970
971         /* If the viewer is showing a message sent as attachment */
972         if (!dimmed)
973                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
974
975         if (!dimmed) {
976                 flags = tny_header_get_flags (header);
977                 if (flags & TNY_HEADER_FLAG_SEEN)
978                         dimmed = TRUE;
979         }
980
981         if (header)
982                 g_object_unref (header);
983         return dimmed;
984 }
985
986
987 gboolean 
988 modest_ui_dimming_rules_on_mark_as_unread_msg_in_view (ModestWindow *win, gpointer user_data)
989 {
990         ModestDimmingRule *rule = NULL;
991         TnyHeader *header;
992         TnyHeaderFlags flags;
993         gboolean dimmed = FALSE;
994         
995
996         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
997         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
998         rule = MODEST_DIMMING_RULE (user_data);
999         
1000         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
1001         if (!header) {
1002                 dimmed = TRUE;
1003         }
1004
1005         /* If the viewer is showing a message sent as attachment */
1006         if (!dimmed)
1007                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1008
1009         if (!dimmed) {
1010                 flags = tny_header_get_flags (header);
1011                 if (!(flags & TNY_HEADER_FLAG_SEEN))
1012                         dimmed = TRUE;
1013         }
1014
1015         if (header)
1016                 g_object_unref (header);
1017         return dimmed;
1018 }
1019
1020 gboolean 
1021 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
1022 {
1023         ModestDimmingRule *rule = NULL;
1024         TnyHeaderFlags flags;
1025         const DimmedState *state = NULL;
1026         gboolean dimmed = FALSE;
1027
1028         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1029         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1030         rule = MODEST_DIMMING_RULE (user_data);
1031         state = modest_window_get_dimming_state (win);          
1032         
1033         flags = TNY_HEADER_FLAG_SEEN; 
1034
1035         /* Check dimmed rule */ 
1036         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);     
1037         if (!dimmed) {
1038                 dimmed = state->all_marked_as_seen;
1039                 if (dimmed)
1040                         modest_dimming_rule_set_notification (rule, "");
1041         }       
1042
1043         return dimmed;
1044 }
1045
1046 gboolean 
1047 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
1048 {
1049         ModestDimmingRule *rule = NULL;
1050         TnyHeaderFlags flags;
1051         const DimmedState *state = NULL;
1052         gboolean dimmed = FALSE;
1053
1054         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1055         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1056         rule = MODEST_DIMMING_RULE (user_data);
1057         state = modest_window_get_dimming_state (win);          
1058         
1059         flags = TNY_HEADER_FLAG_SEEN; 
1060
1061         /* Check dimmed rule */ 
1062         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1063         if (!dimmed) {
1064                 dimmed = !state->any_marked_as_seen;
1065                 if (dimmed)
1066                         modest_dimming_rule_set_notification (rule, "");
1067         }
1068
1069         return dimmed;
1070 }
1071
1072 gboolean 
1073 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
1074 {
1075         ModestDimmingRule *rule = NULL;
1076         gboolean dimmed = FALSE;
1077
1078         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1079         rule = MODEST_DIMMING_RULE (user_data);
1080
1081         if (MODEST_IS_MAIN_WINDOW (win)) 
1082                 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
1083 #ifdef MODEST_TOOLKIT_HILDON2
1084         else if (MODEST_IS_HEADER_WINDOW (win))
1085                 dimmed = modest_ui_dimming_rules_on_header_window_move_to (win, user_data);
1086         else if (MODEST_IS_FOLDER_WINDOW (win))
1087                 dimmed = modest_ui_dimming_rules_on_folder_window_move_to (win, user_data);
1088 #endif
1089         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
1090                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
1091
1092         return dimmed;
1093 }
1094
1095
1096 gboolean 
1097 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
1098 {
1099         GtkWidget *folder_view = NULL;
1100         ModestDimmingRule *rule = NULL;
1101         const DimmedState *state = NULL;
1102         gboolean dimmed = FALSE;
1103         
1104         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1105         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1106         rule = MODEST_DIMMING_RULE (user_data);
1107         state = modest_window_get_dimming_state (win);          
1108         
1109         /* Get the folder view */
1110         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1111                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1112
1113         if (folder_view) {
1114                 TnyFolderStore *selected = modest_folder_view_get_selected ((ModestFolderView *)folder_view);
1115                 if (selected) {
1116                         TnyAccount *account = NULL;
1117
1118                         if (TNY_IS_ACCOUNT (selected)) {
1119                                 account = g_object_ref (selected);
1120                         } else if (!TNY_IS_MERGE_FOLDER (selected)){
1121                                 account = tny_folder_get_account (TNY_FOLDER (selected));
1122                         }
1123                         if (account) {
1124                                 ModestProtocolType protocol_type;
1125
1126                                 protocol_type = modest_tny_account_get_protocol_type (account);
1127                                 dimmed  = modest_protocol_registry_protocol_type_has_tag
1128                                         (modest_runtime_get_protocol_registry (),
1129                                          protocol_type,
1130                                          MODEST_PROTOCOL_REGISTRY_STORE_FORBID_OUTGOING_XFERS);
1131
1132                                 g_object_unref (account);
1133                         }
1134                         g_object_unref (selected);
1135                 }
1136         }
1137
1138         /* Check diming rules for folders transfer  */
1139         if (!dimmed && folder_view && gtk_widget_is_focus (folder_view)) {
1140                 TnyFolderType types[5];
1141
1142                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1143                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1144                 types[2] = TNY_FOLDER_TYPE_SENT;
1145                 types[3] = TNY_FOLDER_TYPE_ROOT; 
1146                 types[4] = TNY_FOLDER_TYPE_INBOX; 
1147                 
1148                 /* Apply folder rules */        
1149                 dimmed = _selected_folder_not_moveable (MODEST_MAIN_WINDOW(win));
1150                 if (dimmed)
1151                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));           
1152                 if (!dimmed) {
1153                         dimmed = _selected_folder_is_any_of_type (win, types, 5);
1154                         if (dimmed)
1155                                 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1156                 }
1157         }
1158         
1159         /* Check diming rules for messages transfer  */
1160         if (!dimmed) {
1161                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1162                 if (dimmed) {
1163                         gchar *message = g_strdup_printf(_("emev_nc_unabletomove_items"),
1164                                                          state->already_opened_msg);
1165                         modest_dimming_rule_set_notification (rule, message);
1166                         g_free(message);
1167                 }
1168         }
1169         if (!dimmed) {
1170                 if (!(folder_view && gtk_widget_is_focus (folder_view)))
1171                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1172
1173         }
1174         if (!dimmed) {
1175                 dimmed = _selected_msg_sent_in_progress (win);
1176                 if (dimmed)
1177                         modest_dimming_rule_set_notification (rule, _("sfil_ib_unable_to_move_selected_items"));
1178         }
1179
1180         return dimmed;
1181 }
1182
1183 static gboolean
1184 _forbid_outgoing_xfers (ModestWindow *window)
1185 {
1186         const gchar *account_name;
1187         TnyAccount *account;
1188         gboolean dimmed = FALSE;
1189
1190         account_name = modest_window_get_active_account (window);
1191         account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
1192                                                                account_name,
1193                                                                TNY_ACCOUNT_TYPE_STORE);
1194
1195         if (account) {
1196                 ModestProtocolType protocol_type;
1197
1198                 protocol_type = modest_tny_account_get_protocol_type (account);
1199                 dimmed  = modest_protocol_registry_protocol_type_has_tag
1200                         (modest_runtime_get_protocol_registry (),
1201                          protocol_type,
1202                          MODEST_PROTOCOL_REGISTRY_STORE_FORBID_OUTGOING_XFERS);
1203
1204                 g_object_unref (account);
1205         }
1206         return dimmed;
1207 }
1208
1209 gboolean
1210 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
1211 {
1212         ModestDimmingRule *rule = NULL;
1213         gboolean dimmed = FALSE;
1214
1215         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1216         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1217         rule = MODEST_DIMMING_RULE (user_data);
1218
1219         /* This could happen if we load the msg view window with a
1220            preview before loading the full message */
1221         TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1222         if (!msg) {
1223                 return TRUE;
1224         } else {
1225                 g_object_unref (msg);
1226         }
1227
1228         /* Check dimmed rule */
1229         dimmed = _transfer_mode_enabled (win);
1230         if (dimmed)
1231                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1232
1233         if (!dimmed)
1234                 dimmed = _forbid_outgoing_xfers (win);
1235
1236         if (!dimmed) {
1237                 const DimmedState *state = modest_window_get_dimming_state (win);
1238                 if (state) {
1239                         dimmed = state->any_marked_as_deleted;
1240                         if (dimmed) {
1241                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
1242                                 modest_dimming_rule_set_notification (rule, msg);
1243                                 g_free (msg);
1244                         }
1245                 }
1246         }
1247
1248         if (!dimmed) {
1249                 dimmed = _selected_msg_sent_in_progress (win);
1250                 if (dimmed)
1251                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1252         }
1253
1254         /* This could happen if we're viewing a message of the outbox
1255            that has been already sent */
1256         if (!dimmed)
1257                 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
1258
1259         if (!dimmed) {
1260                 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1261                         /* The move_to button should be dimmed when viewing an attachment,
1262                          * but should be enabled when viewing a message from the list, 
1263                          * or when viewing a search result.
1264                          */
1265                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
1266                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1267                         }
1268                 }
1269                 if (dimmed) 
1270                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1271         }
1272
1273         return dimmed;
1274 }
1275
1276 gboolean 
1277 modest_ui_dimming_rules_on_find_in_msg (ModestWindow *win, gpointer user_data)
1278 {
1279         ModestDimmingRule *rule = NULL;
1280         gboolean dimmed = FALSE;
1281
1282         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1283         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1284         rule = MODEST_DIMMING_RULE (user_data);
1285
1286         /* This could happen if we load the msg view window with a
1287            preview before loading the full message */
1288         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1289                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1290                 if (!msg) {
1291                         return TRUE;
1292                 } else {
1293                         g_object_unref (msg);
1294                 }
1295         }
1296
1297         /* Check dimmed rule */ 
1298         dimmed = _transfer_mode_enabled (win);
1299         if (dimmed)
1300                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
1301
1302         return dimmed;
1303 }
1304
1305 gboolean 
1306 modest_ui_dimming_rules_on_paste (ModestWindow *win, gpointer user_data)
1307 {
1308         ModestDimmingRule *rule = NULL;
1309         TnyFolderType types[3];
1310         gboolean dimmed = FALSE;
1311         
1312         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1313         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1314         rule = MODEST_DIMMING_RULE (user_data);
1315
1316         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1317         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1318         types[2] = TNY_FOLDER_TYPE_SENT;
1319         
1320         /* Check dimmed rule */ 
1321         dimmed = _clipboard_is_empty (win);
1322         if (dimmed)
1323                 modest_dimming_rule_set_notification (rule, 
1324                                                       _CS("ecoc_ib_edwin_nothing_to_paste"));
1325         if (!dimmed) {
1326                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1327                 if (dimmed)
1328                         modest_dimming_rule_set_notification (rule, 
1329                                                               _CS("ckct_ib_unable_to_paste_here"));
1330         }
1331         if (!dimmed) {
1332                 dimmed = !_folder_view_has_focus (win);
1333                 if (dimmed)
1334                         modest_dimming_rule_set_notification (rule,
1335                                         _CS("ckct_ib_unable_to_paste_here"));
1336         }
1337         if (!dimmed) {
1338                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), TRUE);
1339                 if (dimmed) 
1340                         modest_dimming_rule_set_notification (rule, 
1341                                                               _CS("ckct_ib_unable_to_paste_here"));
1342         }
1343         if (!dimmed) {
1344                 dimmed = _selected_folder_is_same_as_source (win);
1345                 if (dimmed)
1346                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1347         }
1348         if (!dimmed) {
1349                 dimmed = _selected_folder_has_subfolder_with_same_name (win);
1350                 if (dimmed)
1351                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1352         }
1353         
1354         return dimmed;
1355 }
1356
1357
1358 gboolean 
1359 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1360 {
1361         ModestDimmingRule *rule = NULL;
1362         gboolean dimmed = FALSE;
1363         GtkWidget *focused = NULL;
1364
1365         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1366         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1367         rule = MODEST_DIMMING_RULE (user_data);
1368
1369         focused = gtk_window_get_focus (GTK_WINDOW (win));
1370
1371         /* Main window dimming rules */ 
1372         if (MODEST_IS_MAIN_WINDOW (win))
1373                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1374
1375         if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
1376                 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1377
1378         if (!dimmed && GTK_IS_ENTRY (focused)) {
1379                 const gchar *current_text;
1380                 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
1381                 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
1382         }
1383
1384         if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
1385                 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1386                 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
1387         }
1388
1389         if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
1390                 dimmed = FALSE;
1391         return dimmed;
1392 }
1393
1394 gboolean 
1395 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1396 {
1397         ModestDimmingRule *rule = NULL;
1398         gboolean dimmed = FALSE;
1399
1400         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1401         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1402         rule = MODEST_DIMMING_RULE (user_data);
1403
1404         /* Check dimmed rule */ 
1405         dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);                       
1406
1407         if (!dimmed) {
1408                 dimmed = _purged_attach_selected (win, FALSE, NULL);
1409                 if (dimmed) {
1410                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1411                 }
1412         }
1413                 
1414         return dimmed;
1415 }
1416
1417 #ifdef MODEST_TOOLKIT_HILDON2
1418 static gboolean
1419 _not_valid_attachments (ModestWindow *win, gboolean save_not_remove)
1420 {
1421         gint n_attachments;
1422         TnyList *attachments;
1423         gboolean result = FALSE;
1424
1425         /* Get atachments */
1426         attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1427         n_attachments = tny_list_get_length (attachments);
1428
1429         /* Check unique */              
1430         if (!result) {
1431                 result = n_attachments < 1;
1432         }
1433                 
1434         /* Check attached type (view operation not required) */
1435         if (!result)  {
1436                 gint n_valid = 0;
1437
1438                 TnyIterator *iter;
1439                 iter = tny_list_create_iterator (attachments);
1440                 while (!tny_iterator_is_done (iter)) {
1441                         gboolean is_valid = TRUE;
1442                         TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1443                         TnyList *nested_list = tny_simple_list_new ();
1444                         tny_mime_part_get_parts (mime_part, nested_list);
1445
1446                         if (tny_mime_part_is_purged (mime_part)) {
1447                                 is_valid = FALSE;
1448                         }
1449                         
1450                         if (is_valid && modest_tny_mime_part_is_msg (mime_part)) {
1451                                 TnyMsg *window_msg;
1452                                 window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1453                                 if (window_msg) {
1454                                         if (save_not_remove && (TnyMimePart *) window_msg != mime_part) {
1455                                                 is_valid = FALSE;
1456                                         }
1457                                         g_object_unref (window_msg);
1458                                 }
1459                                 if (is_valid && save_not_remove && tny_list_get_length (nested_list) > 0) {
1460                                         is_valid = FALSE;
1461                                 }
1462                         }
1463                         g_object_unref (nested_list);
1464                         g_object_unref (mime_part);
1465                         tny_iterator_next (iter);
1466
1467                         if (is_valid) 
1468                                 n_valid++;
1469                 }
1470                 g_object_unref (iter);
1471                 result = (n_valid == 0);
1472         }
1473         g_object_unref (attachments);
1474         return result;
1475
1476 }
1477 #endif
1478
1479 gboolean 
1480 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1481 {
1482         ModestDimmingRule *rule = NULL;
1483         gboolean dimmed = FALSE;
1484
1485         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1486         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1487         rule = MODEST_DIMMING_RULE (user_data);
1488
1489         /* Check dimmed rule */ 
1490
1491 #ifdef MODEST_TOOLKIT_HILDON2
1492         dimmed = _not_valid_attachments (win, TRUE);
1493 #else
1494         dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1495
1496         if (!dimmed) {
1497                 dimmed = _purged_attach_selected (win, TRUE, NULL);
1498                 if (dimmed) {
1499                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1500                 }
1501         }
1502 #endif
1503         return dimmed;
1504 }
1505
1506 gboolean 
1507 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1508 {
1509         ModestDimmingRule *rule = NULL;
1510         const DimmedState *state = NULL;
1511         gboolean dimmed = FALSE;
1512
1513         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1514         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1515         rule = MODEST_DIMMING_RULE (user_data);
1516         state = modest_window_get_dimming_state (win);          
1517
1518         /* Check in main window if there's only one message selected */
1519         if (MODEST_IS_MAIN_WINDOW (win)) {
1520                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1521         }
1522
1523         /* Check in view window if there's any attachment selected */
1524         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1525                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1526                 if (dimmed)
1527                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1528         }
1529
1530         if (!dimmed) {
1531
1532                 dimmed = _selected_msg_sent_in_progress (win);
1533                 if (dimmed) {
1534                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1535                 }
1536         }
1537
1538         /* cannot purge in editable drafts nor pop folders */
1539         if (!dimmed) {
1540                 dimmed = _invalid_folder_for_purge (win, rule);
1541                 if (dimmed)
1542                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1543         }
1544
1545         /* Check if the selected message in main window has attachments */
1546         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1547                 dimmed = !(state->any_has_attachments);
1548                 if (dimmed)
1549                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1550         }
1551
1552         /* Check if all attachments are already purged */
1553         if (!dimmed) {
1554                 dimmed = _purged_attach_selected (win, TRUE, rule);
1555         }
1556
1557         /* Check if the message is already downloaded */
1558         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1559                 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1560                 if (dimmed)
1561                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1562         }
1563
1564         return dimmed;
1565 }
1566
1567 gboolean 
1568 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1569 {
1570         ModestDimmingRule *rule = NULL;
1571         gboolean dimmed = FALSE;
1572         
1573         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1574         rule = MODEST_DIMMING_RULE (user_data);
1575
1576         /* Check dimmed rule */ 
1577         if (MODEST_IS_MAIN_WINDOW (win)) {
1578                 dimmed = _clipboard_is_empty (win); 
1579                 if (dimmed)
1580                         modest_dimming_rule_set_notification (rule, "");
1581         }
1582
1583         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1584                 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
1585         }
1586
1587         return dimmed;
1588 }
1589
1590 gboolean 
1591 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
1592 {
1593         ModestDimmingRule *rule = NULL;
1594         gboolean dimmed = FALSE;
1595         
1596         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1597         rule = MODEST_DIMMING_RULE (user_data);
1598
1599         /* Check dimmed rule */ 
1600         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1601                 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
1602         }
1603                                 
1604         return dimmed;  
1605 }
1606
1607 gboolean 
1608 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1609 {
1610         ModestDimmingRule *rule = NULL;
1611         const DimmedState *state = NULL;
1612         gboolean dimmed = FALSE;
1613         
1614         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1615         rule = MODEST_DIMMING_RULE (user_data);
1616         state = modest_window_get_dimming_state (win);
1617
1618         /* Check common dimming rules */
1619         dimmed = _invalid_clipboard_selected (win, rule);
1620
1621         /* Check window specific dimming rules */
1622         if (MODEST_IS_MAIN_WINDOW (win)) {
1623                 /* Get focused widget */
1624                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1625                 
1626                 if (MODEST_IS_HEADER_VIEW (focused)) {
1627                         if (!dimmed) { 
1628                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1629                                 if (dimmed)
1630                                         modest_dimming_rule_set_notification (rule, "");
1631                         }
1632                         if (!dimmed) {
1633                                 dimmed = _selected_msg_sent_in_progress (win);
1634                                 if (dimmed)
1635                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1636                         }
1637                         if (!dimmed) {
1638                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1639                                 if(dimmed)
1640                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1641                         }
1642                 }
1643                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1644                         TnyFolderType types[3];
1645                         
1646                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1647                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1648                         types[2] = TNY_FOLDER_TYPE_SENT;
1649                         
1650                         /* Apply folder rules */        
1651                         if (!dimmed) {
1652                                 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
1653                                 if (dimmed)
1654                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1655                         }
1656                         if (!dimmed) {
1657                                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1658                                 if (dimmed)
1659                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1660                         }
1661                         if (!dimmed) {
1662                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1663                                 if (dimmed)
1664                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1665                         }
1666                 }
1667         }
1668
1669         return dimmed;
1670 }
1671
1672 gboolean 
1673 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1674 {
1675         ModestDimmingRule *rule = NULL;
1676         const DimmedState *state = NULL;
1677         gboolean dimmed = FALSE;
1678
1679         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1680         rule = MODEST_DIMMING_RULE (user_data);
1681         state = modest_window_get_dimming_state (win);
1682
1683         /* Check common dimming rules */
1684         dimmed = _invalid_clipboard_selected (win, rule);       
1685         
1686         /* Check window specific dimming rules */
1687         if (MODEST_IS_MAIN_WINDOW (win)) {
1688                 /* Get focused widget */
1689                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1690                 
1691                 if (MODEST_IS_HEADER_VIEW (focused)) {
1692                         if (!dimmed) {
1693                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1694                                 if (dimmed)
1695                                         modest_dimming_rule_set_notification (rule, "");
1696                         }               
1697                         if (!dimmed) {
1698                                 dimmed = _selected_msg_sent_in_progress (win);
1699                                 if (dimmed)
1700                                         modest_dimming_rule_set_notification (rule, _(""));
1701                         }
1702                         if (!dimmed) {
1703                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1704                                 if(dimmed)
1705                                         modest_dimming_rule_set_notification (rule, _(""));
1706                         }
1707                 }
1708                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1709                         TnyFolderType types[3];
1710                         
1711                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1712                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1713                         types[2] = TNY_FOLDER_TYPE_SENT;
1714
1715                         if (!dimmed) {
1716                                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1717                                 if (dimmed)
1718                                         modest_dimming_rule_set_notification (rule, _(""));
1719                         }
1720                         if (!dimmed) {
1721                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1722                                 if (dimmed)
1723                                         modest_dimming_rule_set_notification (rule, _(""));
1724                         }
1725                 }
1726         }
1727                 
1728         return dimmed;
1729 }
1730
1731 gboolean 
1732 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
1733 {
1734         ModestDimmingRule *rule = NULL;
1735         const DimmedState *state = NULL;
1736         gboolean dimmed = FALSE;
1737         
1738         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1739         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1740         rule = MODEST_DIMMING_RULE (user_data);
1741         state = modest_window_get_dimming_state (win);
1742
1743
1744         /* Check common dimming rules */
1745         ModestMsgEditFormat format;
1746         format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1747
1748         dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
1749         if (dimmed)
1750                 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
1751
1752         if (!dimmed) {
1753                 GtkWidget *body;
1754                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1755                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1756                 
1757                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1758                 if (dimmed)
1759                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1760         }
1761                
1762         
1763         return dimmed;
1764 }
1765
1766 gboolean 
1767 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
1768 {
1769         ModestDimmingRule *rule = NULL;
1770         const DimmedState *state = NULL;
1771         gboolean dimmed = FALSE;
1772         
1773         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1774         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1775         rule = MODEST_DIMMING_RULE (user_data);
1776         state = modest_window_get_dimming_state (win);
1777
1778         GtkWidget *body;
1779         body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1780                                                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1781         
1782         dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1783         if (dimmed)
1784                 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1785         
1786         return dimmed;
1787 }
1788
1789 gboolean 
1790 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1791 {
1792         ModestDimmingRule *rule = NULL;
1793         const DimmedState *state = NULL;
1794         gboolean dimmed = FALSE;
1795         GtkWidget *focused = NULL;
1796         
1797         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1798         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1799         rule = MODEST_DIMMING_RULE (user_data);
1800         state = modest_window_get_dimming_state (win);
1801
1802         focused = gtk_window_get_focus (GTK_WINDOW (win));
1803
1804         dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1805         
1806         if (!dimmed) {
1807                 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1808         }
1809
1810         if (!dimmed) {
1811                 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1812                 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1813
1814                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1815                   ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1816         }
1817         
1818         return dimmed;
1819 }
1820
1821 gboolean 
1822 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1823 {
1824         ModestDimmingRule *rule = NULL;
1825         const DimmedState *state = NULL;
1826         gboolean dimmed = FALSE;
1827         TnyList *selected_attachments = NULL;
1828         gint n_att_selected = 0;
1829         GtkWidget *attachments_view;
1830         
1831         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1832         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1833         rule = MODEST_DIMMING_RULE (user_data);
1834         state = modest_window_get_dimming_state (win);
1835
1836         attachments_view = modest_msg_edit_window_get_child_widget (
1837                                                                     MODEST_MSG_EDIT_WINDOW (win),
1838                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1839         
1840 #ifdef MODEST_TOOLKIT_HILDON2
1841         selected_attachments = modest_attachments_view_get_attachments (
1842                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1843 #else
1844         selected_attachments = modest_attachments_view_get_selection (
1845                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1846 #endif
1847         n_att_selected = tny_list_get_length (selected_attachments);
1848         g_object_unref (selected_attachments);
1849         
1850         dimmed = (n_att_selected < 1);  
1851         
1852         return dimmed;
1853 }
1854
1855 gboolean 
1856 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1857 {
1858         ModestDimmingRule *rule = NULL;
1859         const DimmedState *state = NULL;
1860         gboolean dimmed = FALSE;
1861         GtkWidget *subject_field, *body_field;
1862         const gchar *subject = NULL;
1863
1864         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1865         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1866         rule = MODEST_DIMMING_RULE (user_data);
1867         state = modest_window_get_dimming_state (win);
1868
1869         body_field = modest_msg_edit_window_get_child_widget (
1870                                                               MODEST_MSG_EDIT_WINDOW (win),
1871                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1872         subject_field = modest_msg_edit_window_get_child_widget (
1873                                                                  MODEST_MSG_EDIT_WINDOW (win),
1874                                                                  MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT);
1875         subject = gtk_entry_get_text (GTK_ENTRY (subject_field));
1876
1877         dimmed = (subject == NULL || subject[0] == '\0');
1878         if (dimmed)
1879                 modest_dimming_rule_set_notification (rule, _("mcen_ib_subject_not_modified"));
1880
1881         if (!dimmed) {
1882                 GtkWidget *to_field, *cc_field, *bcc_field;
1883                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1884                 cc_field = modest_msg_edit_window_get_child_widget (
1885                         MODEST_MSG_EDIT_WINDOW (win),
1886                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1887                 to_field = modest_msg_edit_window_get_child_widget (
1888                         MODEST_MSG_EDIT_WINDOW (win),
1889                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1890                 bcc_field = modest_msg_edit_window_get_child_widget (
1891                         MODEST_MSG_EDIT_WINDOW (win),
1892                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1893                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1894                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1895                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1896
1897                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1898                            gtk_text_buffer_get_char_count (cc_buffer) +
1899                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1900                 if (dimmed)
1901                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1902         }
1903         
1904         return dimmed;
1905 }
1906
1907 gboolean 
1908 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1909 {
1910         ModestDimmingRule *rule = NULL;
1911         gboolean dimmed = FALSE;
1912         
1913         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1914         rule = MODEST_DIMMING_RULE (user_data);
1915
1916         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1917
1918         /* Check dimmed rule */
1919         dimmed = _transfer_mode_enabled (win);
1920         if (dimmed)
1921                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1922         
1923         if (!dimmed) {
1924                 dimmed = modest_msg_view_window_first_message_selected (
1925                                 MODEST_MSG_VIEW_WINDOW(win));
1926                 modest_dimming_rule_set_notification (rule, NULL);
1927         }
1928
1929         return dimmed;
1930 }
1931
1932 gboolean 
1933 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1934 {
1935         ModestDimmingRule *rule = NULL;
1936         gboolean dimmed = FALSE;
1937
1938         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1939         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1940         rule = MODEST_DIMMING_RULE (user_data);
1941
1942         /* Check dimmed rule */ 
1943         dimmed = _transfer_mode_enabled (win);                  
1944         if (dimmed)
1945                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1946         
1947         if (!dimmed) {
1948                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1949                 modest_dimming_rule_set_notification (rule, NULL);
1950         }
1951
1952         return dimmed;
1953 }
1954
1955
1956 gboolean
1957 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1958 {
1959         gboolean dimmed;
1960         ModestAccountMgr *mgr;
1961
1962         mgr = modest_runtime_get_account_mgr();
1963         dimmed = !modest_account_mgr_has_accounts(mgr, TRUE);
1964
1965         /* Dimm it if we only have metaaccounts */
1966         if (!dimmed) {
1967                 ModestProtocolRegistry *reg = modest_runtime_get_protocol_registry ();
1968                 GSList *account_names = modest_account_mgr_account_names (mgr, TRUE);
1969
1970                 if (account_names) {
1971                         ModestProtocolType store_protocol;
1972                         gboolean found = FALSE;
1973                         GSList *iter = account_names;
1974                         const gchar *tag = MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS;
1975
1976                         while (iter && !found) {
1977                                 gchar* account_name;
1978
1979                                 account_name = (gchar *) iter->data;
1980                                 store_protocol = modest_account_mgr_get_store_protocol (mgr, account_name);
1981
1982                                 if (!modest_protocol_registry_protocol_type_has_tag (reg, store_protocol, tag))
1983                                         found = TRUE;
1984                                 else
1985                                         iter = g_slist_next (iter);
1986                         }
1987                         modest_account_mgr_free_account_names (account_names);
1988                         dimmed = !found;
1989                 }
1990         }
1991
1992         return dimmed;
1993 }
1994
1995 gboolean
1996 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1997 {
1998         ModestDimmingRule *rule = NULL;
1999         TnyFolderType types[1];
2000         const DimmedState *state = NULL;
2001         gboolean dimmed = FALSE;
2002
2003         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2004         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2005         rule = MODEST_DIMMING_RULE (user_data);
2006         state = modest_window_get_dimming_state (win);
2007
2008         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
2009
2010         /* Check dimmed rules */        
2011         dimmed = !_selected_folder_is_any_of_type (win, types, 1);
2012         if (dimmed) 
2013                 modest_dimming_rule_set_notification (rule, "");        
2014         if (!dimmed) {
2015                 dimmed = !state->sent_in_progress;
2016                 if (dimmed)
2017                         modest_dimming_rule_set_notification (rule, "");
2018         }
2019
2020         return dimmed;
2021 }
2022
2023 gboolean 
2024 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
2025 {
2026         /* We dim if no msg send is in progress (and then cancelling send all has no
2027          * effect */
2028         return !_msgs_send_in_progress ();
2029 }
2030
2031 gboolean 
2032 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
2033 {
2034         ModestDimmingRule *rule = NULL;
2035         gboolean dimmed = FALSE;
2036         ModestAccountMgr *mgr;
2037         const gchar* account_name;
2038
2039         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2040         rule = MODEST_DIMMING_RULE (user_data);
2041         mgr = modest_runtime_get_account_mgr();
2042
2043         /* Check dimmed rule */
2044         account_name = modest_window_get_active_account (win);
2045
2046         if (account_name)
2047                 dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
2048         else
2049                 dimmed = TRUE;
2050
2051         if (dimmed)
2052                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
2053
2054         return dimmed;
2055 }
2056
2057 gboolean 
2058 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
2059 {
2060         ModestDimmingRule *rule = NULL;
2061         gboolean dimmed = FALSE;
2062
2063         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2064         rule = MODEST_DIMMING_RULE (user_data);
2065  
2066         /* Check dimmed rule */ 
2067         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
2068         if (g_slist_length (account_names) < 1)
2069                 dimmed = TRUE;
2070         if (dimmed)
2071                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
2072
2073         modest_account_mgr_free_account_names (account_names);
2074
2075         if (!dimmed) {
2076                 dimmed = _send_receive_in_progress (win);
2077         }
2078
2079         return dimmed;
2080 }
2081
2082 #ifdef MODEST_TOOLKIT_HILDON2
2083 gboolean
2084 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
2085 {
2086         TnyMsg *msg;
2087         GSList *recipients, *node;
2088         gboolean has_recipients_to_add;
2089
2090         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2091         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
2092
2093         msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2094
2095         /* Message is loaded asynchronously, so this could happen */
2096         if (!msg) {
2097 #ifdef MODEST_TOOLKIT_HILDON2
2098                 TnyHeader *header;
2099
2100                 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
2101                 if (!header)
2102                         return TRUE;
2103
2104                 recipients = modest_tny_msg_header_get_all_recipients_list (header);
2105                 g_object_unref (header);
2106 #else
2107                 return TRUE;
2108 #endif
2109         } else {
2110                 recipients = modest_tny_msg_get_all_recipients_list (msg);
2111                 g_object_unref (msg);
2112         }
2113
2114         has_recipients_to_add = FALSE;
2115         for (node = recipients; node != NULL; node = g_slist_next (node)) {
2116                 if (!modest_address_book_has_address ((const gchar *) node->data)) {
2117                         has_recipients_to_add = TRUE;
2118                         break;
2119                 }
2120         }
2121
2122         g_slist_foreach (recipients, (GFunc) g_free, NULL);
2123         g_slist_free (recipients);
2124   
2125         return !has_recipients_to_add;
2126 }
2127 #else
2128 gboolean
2129 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
2130 {
2131         ModestDimmingRule *rule = NULL;
2132         gboolean dimmed = FALSE;
2133         GtkWidget *focused = NULL;
2134
2135         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2136         rule = MODEST_DIMMING_RULE (user_data);
2137         focused = gtk_window_get_focus (GTK_WINDOW (win));
2138
2139         dimmed = !focused;
2140
2141         if (!dimmed) {
2142                 gchar *selection = NULL;
2143                 if (GTK_IS_TEXT_VIEW (focused)) {
2144                         GtkTextIter start, end;
2145                         GtkTextBuffer *buffer = NULL;
2146                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2147                         if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
2148                                 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
2149                         }
2150                 } else if (GTK_IS_LABEL (focused)) {
2151                         selection = modest_text_utils_label_get_selection (GTK_LABEL (focused));
2152                 } else {
2153                         gboolean do_check = TRUE;
2154                         GtkClipboard *clipboard;
2155                         if (GTK_IS_HTML (focused)) {
2156                                 const gchar *sel;
2157                                 int len = -1;
2158                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2159                                 do_check = !((sel == NULL) || (sel[0] == '\0'));
2160                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2161                                 do_check = FALSE;
2162                         }
2163                         if (do_check) {
2164                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2165                                 selection = gtk_clipboard_wait_for_text (clipboard);
2166                         } else {
2167                                 selection = NULL;
2168                         }
2169                 }
2170                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
2171         }
2172
2173         return dimmed;
2174 }
2175 #endif
2176
2177 /* *********************** static utility functions ******************** */
2178
2179
2180 static gboolean
2181 _selected_folder_not_writeable (ModestMainWindow *win,
2182                                 gboolean for_paste)
2183 {
2184         GtkWidget *folder_view = NULL;
2185         TnyFolderStore *parent_folder = NULL;
2186         ModestEmailClipboard *clipboard = NULL;
2187         ModestTnyFolderRules rules;
2188         gboolean is_local_acc = FALSE;
2189         gboolean xfer_folders = FALSE;
2190         gboolean result = FALSE;
2191
2192         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2193
2194         /* Get folder view */
2195         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2196                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2197         /* If no folder view, always dimmed */
2198         if (!folder_view)
2199                 return TRUE;
2200         
2201         /* Get selected folder as parent of new folder to create */
2202         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2203         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2204                 /* If it's the local account and its transfering folders, then do not dim */            
2205                 if (TNY_IS_ACCOUNT (parent_folder)) {
2206                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
2207                         if (for_paste) {
2208                                 clipboard = modest_runtime_get_email_clipboard ();
2209                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
2210                         }
2211                 }
2212
2213                 if (for_paste) 
2214                         result = !(is_local_acc && xfer_folders); 
2215                 else
2216                         result = !is_local_acc;
2217                 goto frees;             
2218         }
2219         
2220         /* Check dimmed rule */ 
2221         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2222         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
2223
2224         /* free */
2225  frees:
2226         if (parent_folder != NULL)
2227                 g_object_unref (parent_folder);
2228
2229         return result;
2230 }
2231
2232 static gboolean
2233 _selected_folder_not_deletable (ModestMainWindow *win)
2234 {
2235         GtkWidget *folder_view = NULL;
2236         TnyFolderStore *parent_folder = NULL;
2237         ModestTnyFolderRules rules;
2238         gboolean result = FALSE;
2239
2240         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2241
2242         /* Get folder view */
2243         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2244                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2245         /* If no folder view, always dimmed */
2246         if (!folder_view)
2247                 return TRUE;
2248         
2249         /* Get selected folder as parent of new folder to create */
2250         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2251         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2252                 result = TRUE;
2253                 goto frees;             
2254         }
2255         
2256         /* Check dimmed rule */ 
2257         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2258         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
2259
2260         /* free */
2261  frees:
2262         if (parent_folder != NULL)
2263                 g_object_unref (parent_folder);
2264
2265         return result;
2266 }
2267
2268 static gboolean
2269 _selected_folder_not_moveable (ModestMainWindow *win)
2270 {
2271         GtkWidget *folder_view = NULL;
2272         TnyFolderStore *parent_folder = NULL;
2273         ModestTnyFolderRules rules;
2274         gboolean result = FALSE;
2275
2276         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2277
2278         /* Get folder view */
2279         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2280                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2281         /* If no folder view, always dimmed */
2282         if (!folder_view)
2283                 return TRUE;
2284         
2285         /* Get selected folder as parent of new folder to create */
2286         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2287         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2288                 result = TRUE;
2289                 goto frees;             
2290         }
2291         
2292         /* Check dimmed rule */ 
2293         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2294         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
2295
2296         /* free */
2297  frees:
2298         if (parent_folder != NULL)
2299                 g_object_unref (parent_folder);
2300
2301         return result;
2302 }
2303
2304 static gboolean
2305 _selected_folder_not_renameable (ModestMainWindow *win)
2306 {
2307         GtkWidget *folder_view = NULL;
2308         TnyFolderStore *parent_folder = NULL;
2309         ModestTnyFolderRules rules;
2310         gboolean result = FALSE;
2311
2312         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2313
2314         /* Get folder view */
2315         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2316                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2317         /* If no folder view, always dimmed */
2318         if (!folder_view)
2319                 return TRUE;
2320         
2321         /* Get selected folder as parent of new folder to create */
2322         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2323         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2324                 result = TRUE;
2325                 goto frees;             
2326         }
2327         
2328         /* Check dimmed rule */ 
2329         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2330         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
2331
2332         /* free */
2333  frees:
2334         if (parent_folder != NULL)
2335                 g_object_unref (parent_folder);
2336
2337         return result;
2338 }
2339
2340 static gboolean
2341 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
2342 {
2343         TnyFolderType types[2];
2344         gboolean result = FALSE;
2345
2346         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2347
2348         types[0] = TNY_FOLDER_TYPE_ROOT; 
2349         types[1] = TNY_FOLDER_TYPE_INBOX; 
2350
2351         /* Check folder type */
2352         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2353
2354         /* Check pop and MMC accounts */
2355         if (!result) {
2356                 result = _selected_folder_is_root (win);
2357         }
2358                 
2359         return result;
2360 }
2361
2362
2363 static gboolean
2364 _selected_folder_is_root (ModestMainWindow *win)
2365 {
2366         TnyFolderType types[1];
2367         gboolean result = FALSE;
2368
2369         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2370
2371         /* All accounts are root items: */
2372         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2373                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2374         if (folder_view) {                                      
2375                 gboolean is_account = FALSE;
2376                 TnyFolderStore *folder_store = 
2377                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2378                 if (folder_store) {
2379                         is_account = TNY_IS_ACCOUNT (folder_store);
2380
2381                         g_object_unref (folder_store);
2382                         folder_store = NULL;
2383                 }
2384                 
2385                 if (is_account)
2386                         return TRUE;
2387         }
2388                 
2389         /* Try something more precise: */
2390         types[0] = TNY_FOLDER_TYPE_ROOT; 
2391
2392         /* Check folder type */
2393         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2394                 
2395         return result;
2396 }
2397
2398 static gboolean
2399 _header_view_is_all_selected (ModestMainWindow *win)
2400 {
2401         const DimmedState *state = NULL;
2402
2403         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2404
2405         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2406
2407         return state->all_selected;
2408 }
2409
2410 static gboolean
2411 _selected_folder_is_empty (ModestMainWindow *win)
2412 {
2413         GtkWidget *folder_view = NULL, *header_view = NULL;
2414         TnyFolderStore *folder = NULL;
2415         gboolean result = FALSE;
2416
2417         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2418
2419         /* Get folder view */
2420         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2421                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2422
2423         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2424                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2425
2426         /* If no folder view, always dimmed */
2427         if (!folder_view || !header_view)
2428                 return TRUE;
2429         
2430         /* Get selected folder as parent of new folder to create */
2431         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2432         if (!(folder && TNY_IS_FOLDER(folder))) {
2433                 if (folder)
2434                         g_object_unref (folder);
2435                 return TRUE;
2436         }
2437         
2438         /* Check folder type */
2439         if (modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)) ||
2440             tny_folder_get_all_count (TNY_FOLDER (folder)) == 0)
2441                 result = TRUE;
2442
2443         /* free */
2444         g_object_unref (folder);
2445
2446         return result;
2447 }
2448
2449 static gboolean
2450 _folder_view_has_focus (ModestWindow *win)
2451 {
2452         GtkWidget *folder_view = NULL;
2453
2454         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2455
2456         /* Get folder view */
2457         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2458                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2459         if (!folder_view)
2460                 return FALSE;
2461         
2462         if (gtk_widget_is_focus(folder_view))
2463                 return TRUE;
2464
2465         return FALSE;
2466 }
2467
2468 static gboolean
2469 _selected_folder_is_same_as_source (ModestWindow *win)
2470 {
2471         ModestEmailClipboard *clipboard = NULL;
2472         GtkWidget *folder_view = NULL;
2473         TnyFolderStore *folder = NULL;
2474         gboolean result = FALSE;
2475
2476         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2477
2478         /* Get folder view */
2479         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2480                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2481         if (!folder_view)
2482                 return FALSE;
2483         
2484         /* Get selected folder as destination folder */
2485         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2486         if (!(folder && TNY_IS_FOLDER(folder))) {
2487                 result = FALSE;
2488                 goto frees;
2489         }
2490         
2491         /* Check clipboard is cleared */
2492         clipboard = modest_runtime_get_email_clipboard ();
2493         if (modest_email_clipboard_cleared (clipboard)) {
2494                 result = FALSE;
2495                 goto frees;
2496         }
2497                 
2498         /* Check source folder */
2499         result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2500         
2501         /* Free */
2502  frees:
2503         g_object_unref (folder);
2504         
2505         return result;
2506 }
2507
2508 static gboolean
2509 _selected_folder_is_any_of_type (ModestWindow *win,
2510                                  TnyFolderType types[], 
2511                                  guint ntypes)
2512 {
2513         GtkWidget *folder_view = NULL;
2514         TnyFolderStore *folder = NULL;
2515         TnyFolderType folder_type;
2516         guint i=0;
2517         gboolean result = FALSE;
2518
2519         /*Get current folder */
2520         if (MODEST_IS_MAIN_WINDOW(win)) {
2521
2522                 /* Get folder view */
2523                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2524                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2525                 /* If no folder view, always dimmed */
2526                 if (!folder_view)
2527                         return FALSE;
2528         
2529                 /* Get selected folder as parent of new folder to create */
2530                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2531
2532                 if (!(folder && TNY_IS_FOLDER(folder))) {
2533                         if (folder)
2534                                 g_object_unref (folder);
2535                         return FALSE;
2536                 }
2537                 
2538                 /* Check folder type */
2539                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2540         }
2541         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2542                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2543                 for (i=0; i < ntypes; i++) {
2544                         result = result || folder_type == types[i];
2545                 }
2546         }
2547
2548
2549         /* free */
2550         if (folder)
2551                 g_object_unref (folder);
2552
2553         return result;  
2554 }
2555
2556 static gboolean
2557 _folder_is_any_of_type (TnyFolder *folder,
2558                         TnyFolderType types[], 
2559                         guint ntypes)
2560 {
2561         TnyFolderType folder_type;
2562         gboolean result = FALSE;
2563         guint i;
2564
2565         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2566
2567         /* Get folder type */
2568         folder_type = modest_tny_folder_guess_folder_type (folder);
2569         if (folder_type == TNY_FOLDER_TYPE_INVALID)
2570                 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2571         
2572         /* Check foler type */
2573         for (i=0; i < ntypes; i++) {
2574                 result = result || folder_type == types[i];
2575         }
2576
2577         return result;
2578 }
2579
2580 static gboolean
2581 _clipboard_is_empty (ModestWindow *win)
2582 {
2583         gboolean result = FALSE;
2584         
2585         if (MODEST_IS_MAIN_WINDOW (win)) {
2586                 ModestEmailClipboard *clipboard = NULL;
2587                 clipboard = modest_runtime_get_email_clipboard ();
2588                 if (modest_email_clipboard_cleared (clipboard)) 
2589                  result = TRUE;  
2590         }
2591
2592         return result;
2593 }
2594
2595 static gboolean
2596 _invalid_clipboard_selected (ModestWindow *win,
2597                              ModestDimmingRule *rule) 
2598 {
2599         const DimmedState *state = NULL;
2600         gboolean result = FALSE;
2601         GtkWidget *focused = NULL;
2602
2603         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2604         state = modest_window_get_dimming_state (win);
2605         /* Get focuesed widget */
2606         focused = gtk_window_get_focus (GTK_WINDOW (win));
2607
2608         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2609                 gboolean has_selection = FALSE;
2610                 if (GTK_IS_TEXT_VIEW (focused)) {
2611                         GtkTextBuffer *buffer = NULL;
2612                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2613                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
2614                 } else if (GTK_IS_EDITABLE (focused)) {
2615                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2616                 }
2617                 result = !has_selection;
2618         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2619                 if (focused) {
2620                         MODEST_DEBUG_BLOCK (g_debug ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2621                         if (GTK_IS_LABEL (focused) && 
2622                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2623                                 result = TRUE;
2624                         } else if (GTK_IS_TEXT_VIEW (focused)) {
2625                                 GtkTextBuffer *buffer;
2626                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2627                                 result = !gtk_text_buffer_get_has_selection (buffer);
2628                         } else if (GTK_IS_HTML (focused)) {
2629                                 const gchar *sel;
2630                                 int len = -1;
2631                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2632                                 result = ((sel == NULL) || (sel[0] == '\0'));
2633                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2634                                 result = TRUE;
2635                         } else {
2636                                 GtkClipboard *clipboard;
2637                                 gchar *selection;
2638
2639                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2640                                 /* Get clipboard selection*/
2641                                 selection = gtk_clipboard_wait_for_text (clipboard);
2642                                 /* Check dimming */
2643                                 result = (selection == NULL);
2644                                 g_free (selection);
2645                         } 
2646                 } else {
2647                         result = TRUE;
2648                 }
2649                 
2650                 if (result)
2651                         modest_dimming_rule_set_notification (rule, "");
2652                 
2653         }               
2654         else if (MODEST_IS_MAIN_WINDOW (win)) {
2655                 /* Check dimming */
2656                 result = state->n_selected == 0;
2657                 if (result)
2658                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));                  
2659         }
2660         
2661         return result;
2662 }
2663
2664
2665 static gboolean
2666 _invalid_attach_selected (ModestWindow *win,
2667                           gboolean unique,
2668                           gboolean for_view,
2669                           gboolean for_remove,
2670                           ModestDimmingRule *rule) 
2671 {
2672         TnyList *attachments;
2673         gint n_selected;
2674         TnyHeaderFlags flags;
2675         gboolean nested_attachments = FALSE;
2676         gboolean selected_messages = FALSE;
2677         const DimmedState *state = NULL;
2678         gboolean result = FALSE;
2679
2680         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2681         state = modest_window_get_dimming_state (win);
2682
2683         if (MODEST_IS_MAIN_WINDOW (win)) {
2684                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2685                 if (!result)
2686                         result = !state->any_has_attachments;
2687         }
2688         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2689                 
2690                 /* Get selected atachments */
2691                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2692                 n_selected = tny_list_get_length (attachments);
2693
2694                 /* Check unique */              
2695                 if (!result) {
2696                         if (unique) 
2697                                 result = n_selected != 1;
2698                         else
2699                                 
2700                                 result = n_selected < 1;
2701                 }
2702                 
2703                 /* Check attached type (view operation not required) */
2704                 if (!result && !for_view)  {
2705                         TnyIterator *iter;
2706                         iter = tny_list_create_iterator (attachments);
2707                         while (!tny_iterator_is_done (iter) && !result) {
2708 #ifdef MODEST_TOOLKIT_HILDON2
2709                                 gboolean not_selectable = FALSE;
2710 #endif
2711                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2712                                 TnyList *nested_list = tny_simple_list_new ();
2713                                 tny_mime_part_get_parts (mime_part, nested_list);
2714
2715                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
2716                                         TnyMsg *window_msg;
2717                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2718                                         if ((TnyMimePart *) window_msg != mime_part) {
2719                                                 selected_messages = TRUE;
2720 #ifdef MODEST_TOOLKIT_HILDON2
2721                                                 not_selectable = TRUE;
2722 #else
2723                                                 result = TRUE;
2724 #endif
2725                                         }
2726                                         g_object_unref (window_msg);
2727                                 }
2728                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2729                                         nested_attachments = TRUE;
2730 #ifdef MODEST_TOOLKIT_HILDON2
2731                                         not_selectable = TRUE;
2732 #else
2733                                         result = TRUE;
2734 #endif
2735                                 }
2736 #ifdef MODEST_TOOLKIT_HILDON2
2737                                 if (not_selectable)
2738                                         n_selected --;
2739 #endif
2740                                 g_object_unref (nested_list);
2741                                 g_object_unref (mime_part);
2742                                 tny_iterator_next (iter);
2743                         }
2744                         g_object_unref (iter);
2745                 }
2746
2747                 /* No valid attachment available */
2748                 if (n_selected == 0)
2749                         result = TRUE;
2750                 
2751                 /* Set notifications */
2752                 if (result && rule != NULL) {
2753                         if (selected_messages) {
2754                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2755                         } else if (nested_attachments) {
2756                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2757                         } else if (n_selected == 0) {
2758                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2759                         } else if (unique) {
2760                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2761                         }
2762                 }
2763                 
2764                 /* Free */
2765                 g_object_unref (attachments);
2766         }
2767
2768         return result;
2769 }
2770
2771 static gboolean
2772 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2773 {
2774         TnyList *attachments = NULL;
2775         TnyIterator *iter;
2776         gint purged = 0;
2777         gint n_attachments = 0;
2778         gboolean result = FALSE;
2779
2780         /* This should check if _all_ the attachments are already purged. If only some
2781          * of them are purged, then it does not cause dim as there's a confirmation dialog
2782          * for removing only local attachments */
2783
2784         /* Get selected atachments */
2785         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2786                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2787         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2788                 /* If we're in main window, we won't know if there are already purged attachments */
2789                 return FALSE;
2790         }
2791
2792         if (attachments == NULL)
2793                 return FALSE;
2794
2795         if (tny_list_get_length (attachments) == 0) {
2796                 g_object_unref (attachments);
2797                 return FALSE;
2798         }
2799
2800         iter = tny_list_create_iterator (attachments);
2801         while (!tny_iterator_is_done (iter)) {
2802                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2803                 if (tny_mime_part_is_purged (mime_part)) {
2804                         purged++;
2805                 }
2806                 n_attachments++;
2807                 g_object_unref (mime_part);
2808                 tny_iterator_next (iter);
2809         }
2810         g_object_unref (iter);
2811                 
2812         /* Free */
2813         g_object_unref (attachments);
2814
2815         if (all)
2816                 result = (purged == n_attachments);
2817         else
2818                 result = (purged > 0);
2819
2820         /* This string no longer exists, refer to NB#75415 for more info
2821         if (result && (rule != NULL))
2822                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2823         */
2824
2825         return result;
2826 }
2827
2828 static gboolean
2829 _invalid_msg_selected (ModestMainWindow *win,
2830                        gboolean unique,
2831                        ModestDimmingRule *rule) 
2832 {
2833         GtkWidget *folder_view = NULL;
2834         const DimmedState *state = NULL;
2835         gboolean result = FALSE;
2836
2837         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2838         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2839         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2840                 
2841         /* Get folder view to check focus */
2842         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2843                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2844
2845         /* Check dimmed rule (TODO: check focus on widgets */   
2846         if (!result) {
2847                 result = ((state->n_selected == 0 ) ||
2848                           (gtk_widget_is_focus (folder_view)));
2849                 if (result)
2850                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2851         }
2852         if (!result && unique) {
2853                 result = state->n_selected > 1;
2854                 if (result)
2855                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2856         }
2857
2858         return result;
2859 }
2860
2861
2862 static gboolean
2863 _msg_download_in_progress (ModestWindow *win)
2864 {
2865         gboolean result = FALSE;
2866
2867         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2868
2869         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2870                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2871         }
2872         else if (MODEST_IS_MAIN_WINDOW (win)) {
2873                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2874         }
2875
2876         return result;
2877 }
2878
2879 static gboolean
2880 _msg_download_completed (ModestMainWindow *win)
2881 {
2882         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2883         return state->any_marked_as_cached;
2884 }
2885
2886 static void 
2887 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2888 {
2889         GSList **send_queues = (GSList **) userdata;
2890         *send_queues = g_slist_prepend (*send_queues, value);
2891 }
2892
2893 static gboolean
2894 _selected_msg_sent_in_progress (ModestWindow *win)
2895 {
2896         const DimmedState *state = modest_window_get_dimming_state (win);
2897         return state->sent_in_progress;
2898 }
2899
2900
2901 static gboolean
2902 _invalid_folder_for_purge (ModestWindow *win, 
2903                            ModestDimmingRule *rule)
2904 {
2905         TnyFolder *folder = NULL;
2906         TnyAccount *account = NULL;
2907         gboolean result = FALSE;
2908
2909         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2910
2911                 /* Get folder and account of message */
2912                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2913                 g_return_val_if_fail(msg != NULL, TRUE);                        
2914                 folder = tny_msg_get_folder (msg);      
2915                 g_object_unref (msg);
2916                 if (folder == NULL) {
2917                         result = TRUE;
2918                         goto frees;
2919                 }
2920         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2921                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2922                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2923                 if (!folder_view)
2924                         return FALSE;
2925                 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2926                 /* Could be a folder store */
2927                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2928                         goto frees;             
2929         } else {
2930                 g_return_val_if_reached (FALSE);
2931         }
2932         account = modest_tny_folder_get_account (folder);
2933         if (account == NULL) goto frees;                        
2934                 
2935         /* Check account */
2936         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2937                 TnyFolderType types[2];
2938                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2939                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2940                 
2941                 if (_selected_folder_is_any_of_type (win, types, 2)) {
2942                         result = TRUE;
2943                 }
2944         } else {
2945                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
2946                 /* If it's a remote folder then dim */
2947                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
2948                                                                     protocol_type,
2949                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
2950                         result = TRUE;
2951                 }
2952         }
2953         
2954 frees:
2955         if (folder != NULL)
2956                 g_object_unref (folder);
2957         if (account != NULL)
2958                 g_object_unref (account);
2959         
2960         return result;
2961 }
2962
2963 static gboolean
2964 _transfer_mode_enabled (ModestWindow *win)
2965 {
2966         gboolean result = FALSE;
2967
2968         /* Check dimming */
2969         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2970                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2971         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2972                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2973 #ifdef MODEST_TOOLKIT_HILDON2
2974         } else if (MODEST_IS_FOLDER_WINDOW (win)) {
2975                 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
2976         } else if (MODEST_IS_HEADER_WINDOW (win)) {
2977                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
2978 #endif
2979         } else {
2980                 g_warning("_transfer_mode_enabled called with wrong window type");
2981         }
2982
2983         return result;
2984 }
2985
2986 static gboolean
2987 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2988 {
2989         GtkWidget *folder_view = NULL;
2990         TnyFolderStore *folder = NULL;
2991         ModestEmailClipboard *clipboard = NULL;
2992         const gchar *folder_name = NULL;
2993         gboolean result = FALSE;
2994
2995         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2996
2997         /*Get current parent folder */
2998         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2999                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3000         /* If no folder view, always dimmed */
3001         if (!folder_view) return FALSE;
3002         
3003         /* Get selected folder as parent of new folder to create */
3004         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));     
3005         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
3006         
3007         /* get modest clipboard and source folder */
3008         clipboard = modest_runtime_get_email_clipboard ();
3009         folder_name = modest_email_clipboard_get_folder_name (clipboard);
3010         if (folder_name == NULL) goto frees;
3011
3012         /* Check source subfolders names */
3013         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
3014                                                             TRUE);
3015                 
3016         /* Free */
3017  frees:
3018         if (folder != NULL) 
3019                 g_object_unref (folder);
3020
3021
3022         return result;
3023 }
3024
3025 static gboolean
3026 _all_msgs_in_sending_status (ModestHeaderView *header_view)
3027 {
3028         GtkTreeModel *model;
3029         GtkTreeIter iter;
3030         gboolean all_sending = TRUE;
3031
3032         model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
3033         if (gtk_tree_model_get_iter_first (model, &iter)) {
3034                 do {
3035                         TnyHeader *header;
3036
3037                         gtk_tree_model_get (model, &iter,
3038                                             TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
3039                                             &header,
3040                                             -1);
3041
3042                         if (header) {
3043                                 if (modest_tny_all_send_queues_get_msg_status (header) !=
3044                                     MODEST_TNY_SEND_QUEUE_SENDING)
3045                                         all_sending = FALSE;
3046                                 g_object_unref (header);
3047                         }
3048
3049                 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
3050         }
3051         return all_sending;
3052 }
3053
3054 gboolean 
3055 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
3056                                            gpointer user_data)
3057 {
3058         ModestDimmingRule *rule = NULL;
3059
3060         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3061         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3062         rule = MODEST_DIMMING_RULE (user_data);
3063
3064         /* Check dimmed rule */ 
3065         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
3066 }
3067
3068 gboolean
3069 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
3070                                          gpointer user_data)
3071 {
3072         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3073
3074         ModestMsgEditFormat format =
3075           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
3076
3077         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
3078 }
3079
3080 static gboolean 
3081 _send_receive_in_progress (ModestWindow *win)
3082 {
3083         ModestMailOperationQueue *queue;
3084         GSList *op_list, *node;
3085         gboolean found_send_receive;
3086
3087         queue = modest_runtime_get_mail_operation_queue ();
3088         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
3089
3090         found_send_receive = FALSE;
3091         for (node = op_list; node != NULL; node = g_slist_next (node)) {
3092                 ModestMailOperation *op;
3093
3094                 op = (ModestMailOperation *) node->data;
3095                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
3096                         found_send_receive = TRUE;
3097                         break;
3098                 }
3099         }
3100
3101         if (op_list) {
3102                 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
3103                 g_slist_free (op_list);
3104         }
3105
3106         return found_send_receive;
3107 }
3108
3109 static gboolean
3110 _msgs_send_in_progress (void)
3111 {
3112         ModestCacheMgr *cache_mgr;
3113         GHashTable *send_queue_cache;
3114         ModestTnySendQueue *send_queue;
3115         GSList *send_queues = NULL, *node = NULL;
3116         gboolean found = FALSE;
3117
3118         cache_mgr = modest_runtime_get_cache_mgr ();
3119         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
3120                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
3121
3122         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
3123
3124         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
3125                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
3126
3127                 /* Check if msg uid is being processed inside send queue */
3128                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
3129                         found = TRUE;
3130                         break;
3131                 }
3132         }
3133
3134         g_slist_free (send_queues);
3135
3136         return found;
3137 }
3138
3139 /*****************************************************************************/
3140 /********************** HILDON2 only dimming rules ***************************/
3141 /*****************************************************************************/
3142
3143 #ifdef MODEST_TOOLKIT_HILDON2
3144 gboolean 
3145 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
3146 {
3147         ModestDimmingRule *rule = NULL;
3148         gboolean dimmed = FALSE;
3149
3150         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
3151         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3152         rule = MODEST_DIMMING_RULE (user_data);
3153
3154         /* Check dimmed rule */ 
3155         dimmed = _transfer_mode_enabled (win);
3156         if (dimmed)
3157                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3158
3159         if (!dimmed)
3160                 dimmed = _forbid_outgoing_xfers (win);
3161
3162         if (!dimmed) {
3163                 GtkWidget *header_view;
3164                 TnyFolder *folder;
3165
3166                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
3167                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
3168                 if (folder) {
3169                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
3170                                 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
3171
3172                         if (!dimmed &&
3173                             (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
3174                                 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
3175                         }
3176                         g_object_unref (folder);
3177                 }
3178         }
3179
3180         return dimmed;
3181 }
3182
3183 gboolean 
3184 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
3185 {
3186         ModestDimmingRule *rule = NULL;
3187         gboolean dimmed = FALSE;
3188
3189         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3190         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3191         rule = MODEST_DIMMING_RULE (user_data);
3192
3193         /* Check dimmed rule */ 
3194         dimmed = _transfer_mode_enabled (win);
3195         if (dimmed)
3196                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3197
3198         if (!dimmed)
3199                 dimmed = _forbid_outgoing_xfers (win);
3200
3201         if (MODEST_IS_FOLDER_WINDOW (win)) {
3202                 ModestFolderView *folder_view;
3203                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3204                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3205                                                                        MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
3206         }
3207
3208         if (!dimmed) {
3209                 dimmed = _transfer_mode_enabled (win);
3210                 if (dimmed)
3211                         modest_dimming_rule_set_notification (rule, "");
3212         }
3213
3214         return dimmed;
3215 }
3216
3217 gboolean 
3218 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
3219 {
3220         ModestDimmingRule *rule = NULL;
3221         gboolean dimmed = FALSE;
3222
3223         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3224         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3225         rule = MODEST_DIMMING_RULE (user_data);
3226
3227         /* Check dimmed rule */ 
3228         dimmed = _transfer_mode_enabled (win);
3229         if (dimmed)
3230                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3231
3232         if (MODEST_IS_FOLDER_WINDOW (win)) {
3233                 ModestFolderView *folder_view;
3234                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3235                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3236                                                                        MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
3237         }
3238
3239         if (!dimmed) {
3240                 dimmed = _transfer_mode_enabled (win);
3241                 if (dimmed)
3242                         modest_dimming_rule_set_notification (rule, "");
3243         }
3244
3245         return dimmed;
3246 }
3247
3248 gboolean
3249 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
3250 {
3251         return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);
3252 }
3253 #endif