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