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