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