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