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