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