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