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