* Fixes NB#100626, do not check the body empty when sending messages
[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, _CS("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         /* If we're in transfer mode then do not allow to delete messages */
759         dimmed = _transfer_mode_enabled (win);
760         if (dimmed) {
761                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
762                 return dimmed;
763         }
764
765         /* Check dimmed rule */ 
766         if (MODEST_IS_MAIN_WINDOW (win)) {
767                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
768                 if (dimmed)
769                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
770                 if (!dimmed) {
771                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
772                 }
773                 if (!dimmed) {
774                         dimmed = state->sent_in_progress;
775                         if (dimmed)
776                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
777                 }
778                 if (!dimmed) {
779                         dimmed = state->any_marked_as_deleted;
780                         if (dimmed) {
781                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
782                                 modest_dimming_rule_set_notification (rule, msg);
783                                 g_free (msg);
784                         }
785                 }
786                 if (!dimmed) {
787                         dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
788                         if (dimmed) {
789                                 gchar *message = NULL;
790
791                                 message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"),
792                                                           state->already_opened_msg);
793                                 modest_dimming_rule_set_notification (rule, message);
794                                 g_free(message);
795                         }
796
797                 }
798         } 
799         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
800                 if (!dimmed) {
801                         dimmed = state->any_marked_as_deleted;
802                         if (dimmed) {
803                                 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
804                                 modest_dimming_rule_set_notification (rule, msg);
805                                 g_free (msg);
806                         }
807                 }
808                 if (!dimmed) {
809                         dimmed = state->sent_in_progress;
810                         if (dimmed)
811                                 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
812                 }
813
814                 /* This could happen if we're viewing a message of the
815                    outbox that has been already sent */
816                 if (!dimmed)
817                         dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
818
819                 /* The delete button should be dimmed when viewing an attachment,
820                  * but should be enabled when viewing a message from the list, 
821                  * or when viewing a search result.
822                  */
823                 if (!dimmed) {
824                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
825                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
826                                 if (dimmed) {
827                                         modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
828                                 }
829                         }
830                 }
831         }
832
833         return dimmed;
834 }
835
836 gboolean 
837 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
838 {
839         ModestDimmingRule *rule = NULL;
840         GtkWidget *header_view = NULL;
841         gboolean dimmed = FALSE;
842
843         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
844         rule = MODEST_DIMMING_RULE (user_data);
845         
846         /* main window dimming rules */
847         if (MODEST_IS_MAIN_WINDOW(win)) {
848                                 
849                 /* Check dimmed rule */
850                 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
851                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
852                 
853                 /* If the header view has the focus: */
854                 if (header_view && gtk_widget_is_focus (header_view)) {
855                         /* Check dimmed rule */ 
856                         if (!dimmed)
857                                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
858                 }
859                 else {
860                         /* If the folder view has the focus: */
861                         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
862                                 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
863                         if (folder_view && gtk_widget_is_focus (folder_view)) {
864                                 TnyFolderStore *folder_store
865                                         = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
866                                 if (folder_store) {
867                                         /* Only enable for folders, not accounts,
868                                          * though the UI spec is not clear about that.
869                                          * If we enable this for accounts then we must 
870                                          * add code to handle them in modest_ui_actions_on_details(). */
871                                         if (!TNY_IS_FOLDER(folder_store)) {
872                                                 dimmed = TRUE;
873                                                 modest_dimming_rule_set_notification (rule, "");
874                                         }
875
876                                         g_object_unref (folder_store);
877                                 } else {
878                                         dimmed = TRUE;
879                                         modest_dimming_rule_set_notification (rule, "");
880                                 }
881                                 if (!dimmed) {
882                                         dimmed = _msg_download_in_progress (win);
883                                         if (dimmed)
884                                                 modest_dimming_rule_set_notification (rule, "");
885                                 }
886
887                         } else {
888                                 return TRUE;
889                         }
890                 }
891
892         /* msg view window dimming rules */
893         } else {
894                 /* Check dimmed rule */ 
895                 if (MODEST_IS_MSG_VIEW_WINDOW (win))
896                         dimmed = _msg_download_in_progress (win);
897                 if (dimmed)
898                         modest_dimming_rule_set_notification (rule, "");                
899                 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
900                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
901                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
902                         }
903                         if (dimmed)
904                                 modest_dimming_rule_set_notification (rule, "");
905                 }
906         }
907
908         return dimmed;
909 }
910
911
912 gboolean 
913 modest_ui_dimming_rules_on_mark_as_read_msg_in_view (ModestWindow *win, gpointer user_data)
914 {
915         ModestDimmingRule *rule = NULL;
916         TnyHeader *header;
917         TnyHeaderFlags flags;
918         gboolean dimmed = FALSE;
919
920
921         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
922         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
923         rule = MODEST_DIMMING_RULE (user_data);
924
925         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
926         if (!header) {
927                 dimmed = TRUE;
928         }
929
930         /* If the viewer is showing a message sent as attachment */
931         if (!dimmed)
932                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
933
934         if (!dimmed) {
935                 flags = tny_header_get_flags (header);
936                 if (flags & TNY_HEADER_FLAG_SEEN)
937                         dimmed = TRUE;
938         }
939
940         if (header)
941                 g_object_unref (header);
942         return dimmed;
943 }
944
945
946 gboolean 
947 modest_ui_dimming_rules_on_mark_as_unread_msg_in_view (ModestWindow *win, gpointer user_data)
948 {
949         ModestDimmingRule *rule = NULL;
950         TnyHeader *header;
951         TnyHeaderFlags flags;
952         gboolean dimmed = FALSE;
953         
954
955         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
956         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
957         rule = MODEST_DIMMING_RULE (user_data);
958         
959         header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
960         if (!header) {
961                 dimmed = TRUE;
962         }
963
964         /* If the viewer is showing a message sent as attachment */
965         if (!dimmed)
966                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
967
968         if (!dimmed) {
969                 flags = tny_header_get_flags (header);
970                 if (!(flags & TNY_HEADER_FLAG_SEEN))
971                         dimmed = TRUE;
972         }
973
974         if (header)
975                 g_object_unref (header);
976         return dimmed;
977 }
978
979 gboolean 
980 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
981 {
982         ModestDimmingRule *rule = NULL;
983         TnyHeaderFlags flags;
984         const DimmedState *state = NULL;
985         gboolean dimmed = FALSE;
986
987         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
988         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
989         rule = MODEST_DIMMING_RULE (user_data);
990         state = modest_window_get_dimming_state (win);          
991         
992         flags = TNY_HEADER_FLAG_SEEN; 
993
994         /* Check dimmed rule */ 
995         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);     
996         if (!dimmed) {
997                 dimmed = state->all_marked_as_seen;
998                 if (dimmed)
999                         modest_dimming_rule_set_notification (rule, "");
1000         }       
1001
1002         return dimmed;
1003 }
1004
1005 gboolean 
1006 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
1007 {
1008         ModestDimmingRule *rule = NULL;
1009         TnyHeaderFlags flags;
1010         const DimmedState *state = NULL;
1011         gboolean dimmed = FALSE;
1012
1013         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1014         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1015         rule = MODEST_DIMMING_RULE (user_data);
1016         state = modest_window_get_dimming_state (win);          
1017         
1018         flags = TNY_HEADER_FLAG_SEEN; 
1019
1020         /* Check dimmed rule */ 
1021         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1022         if (!dimmed) {
1023                 dimmed = !state->any_marked_as_seen;
1024                 if (dimmed)
1025                         modest_dimming_rule_set_notification (rule, "");
1026         }
1027
1028         return dimmed;
1029 }
1030
1031 gboolean 
1032 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
1033 {
1034         ModestDimmingRule *rule = NULL;
1035         gboolean dimmed = FALSE;
1036
1037         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1038         rule = MODEST_DIMMING_RULE (user_data);
1039
1040         if (MODEST_IS_MAIN_WINDOW (win)) 
1041                 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
1042 #ifdef MODEST_TOOLKIT_HILDON2
1043         else if (MODEST_IS_HEADER_WINDOW (win))
1044                 dimmed = modest_ui_dimming_rules_on_header_window_move_to (win, user_data);
1045 #endif
1046         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) 
1047                  dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
1048
1049         return dimmed;
1050 }
1051
1052
1053 gboolean 
1054 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
1055 {
1056         GtkWidget *folder_view = NULL;
1057         ModestDimmingRule *rule = NULL;
1058         const DimmedState *state = NULL;
1059         gboolean dimmed = FALSE;
1060         
1061         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1062         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1063         rule = MODEST_DIMMING_RULE (user_data);
1064         state = modest_window_get_dimming_state (win);          
1065         
1066         /* Get the folder view */
1067         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1068                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1069
1070         
1071         /* Check diming rules for folders transfer  */
1072         if (folder_view && gtk_widget_is_focus (folder_view)) {
1073                 TnyFolderType types[5];
1074                 
1075                 types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1076                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1077                 types[2] = TNY_FOLDER_TYPE_SENT;
1078                 types[3] = TNY_FOLDER_TYPE_ROOT; 
1079                 types[4] = TNY_FOLDER_TYPE_INBOX; 
1080                 
1081                 /* Apply folder rules */        
1082                 dimmed = _selected_folder_not_moveable (MODEST_MAIN_WINDOW(win));
1083                 if (dimmed)
1084                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));           
1085                 if (!dimmed) {
1086                         dimmed = _selected_folder_is_any_of_type (win, types, 5);
1087                         if (dimmed)
1088                                 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1089                 }
1090         }
1091         
1092         /* Check diming rules for messages transfer  */
1093         if (!dimmed) {
1094                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1095                 if (dimmed) {
1096                         gchar *message = g_strdup_printf(_("emev_nc_unabletomove_items"),
1097                                                          state->already_opened_msg);
1098                         modest_dimming_rule_set_notification (rule, message);
1099                         g_free(message);
1100                 }
1101         }
1102         if (!dimmed) {
1103                 if (!(folder_view && gtk_widget_is_focus (folder_view)))
1104                         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1105                 
1106         }
1107         if (!dimmed) {
1108                 dimmed = _selected_msg_sent_in_progress (win);
1109                 if (dimmed)
1110                         modest_dimming_rule_set_notification (rule, _("sfil_ib_unable_to_move_selected_items"));
1111         }
1112         
1113         return dimmed;
1114 }
1115
1116 gboolean 
1117 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
1118 {
1119         ModestDimmingRule *rule = NULL;
1120         gboolean dimmed = FALSE;
1121
1122         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1123         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1124         rule = MODEST_DIMMING_RULE (user_data);
1125
1126         /* Check dimmed rule */ 
1127         dimmed = _transfer_mode_enabled (win);                  
1128         if (dimmed)
1129                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
1130         if (!dimmed) {
1131                 dimmed = modest_window_get_dimming_state (win)->any_marked_as_deleted;
1132                 if (dimmed) {
1133                         gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
1134                         modest_dimming_rule_set_notification (rule, msg);
1135                         g_free (msg);
1136                 }
1137         }
1138         
1139         if (!dimmed) {
1140                 dimmed = _selected_msg_sent_in_progress (win);
1141                 if (dimmed)
1142                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1143         }
1144
1145         /* This could happen if we're viewing a message of the outbox
1146            that has been already sent */
1147         if (!dimmed)
1148                 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
1149
1150         if (!dimmed) {
1151                 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1152                         /* The move_to button should be dimmed when viewing an attachment,
1153                          * but should be enabled when viewing a message from the list, 
1154                          * or when viewing a search result.
1155                          */
1156                         if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
1157                                 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1158                         }
1159                 }
1160                 
1161                 if (dimmed) 
1162                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1163         }
1164
1165         return dimmed;
1166 }
1167
1168 #ifdef MODEST_TOOLKIT_HILDON2
1169 gboolean 
1170 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
1171 {
1172         ModestDimmingRule *rule = NULL;
1173         gboolean dimmed = FALSE;
1174
1175         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
1176         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1177         rule = MODEST_DIMMING_RULE (user_data);
1178
1179         /* Check dimmed rule */ 
1180         dimmed = _transfer_mode_enabled (win);
1181         if (dimmed)
1182                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
1183
1184         if (!dimmed) {
1185                 GtkWidget *header_view;
1186                 TnyFolder *folder;
1187
1188                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
1189                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
1190                 if (folder) {
1191                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0);
1192                         g_object_unref (folder);
1193                 }
1194         }
1195
1196         return dimmed;
1197 }
1198 #endif
1199
1200 gboolean 
1201 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
1202 {
1203         ModestDimmingRule *rule = NULL;
1204         gboolean dimmed = FALSE;
1205
1206         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1207         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1208         rule = MODEST_DIMMING_RULE (user_data);
1209
1210         /* Check dimmed rule */ 
1211         dimmed = _transfer_mode_enabled (win);                  
1212         if (dimmed)
1213                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));     
1214
1215         return dimmed;
1216 }
1217
1218 gboolean 
1219 modest_ui_dimming_rules_on_paste (ModestWindow *win, gpointer user_data)
1220 {
1221         ModestDimmingRule *rule = NULL;
1222         TnyFolderType types[3];
1223         gboolean dimmed = FALSE;
1224         
1225         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1226         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1227         rule = MODEST_DIMMING_RULE (user_data);
1228
1229         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1230         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1231         types[2] = TNY_FOLDER_TYPE_SENT;
1232         
1233         /* Check dimmed rule */ 
1234         dimmed = _clipboard_is_empty (win);
1235         if (dimmed)
1236                 modest_dimming_rule_set_notification (rule, 
1237                                                       _CS("ecoc_ib_edwin_nothing_to_paste"));
1238         if (!dimmed) {
1239                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1240                 if (dimmed)
1241                         modest_dimming_rule_set_notification (rule, 
1242                                                               _CS("ckct_ib_unable_to_paste_here"));
1243         }
1244         if (!dimmed) {
1245                 dimmed = !_folder_view_has_focus (win);
1246                 if (dimmed)
1247                         modest_dimming_rule_set_notification (rule,
1248                                         _CS("ckct_ib_unable_to_paste_here"));
1249         }
1250         if (!dimmed) {
1251                 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), TRUE);
1252                 if (dimmed) 
1253                         modest_dimming_rule_set_notification (rule, 
1254                                                               _CS("ckct_ib_unable_to_paste_here"));
1255         }
1256         if (!dimmed) {
1257                 dimmed = _selected_folder_is_same_as_source (win);
1258                 if (dimmed)
1259                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1260         }
1261         if (!dimmed) {
1262                 dimmed = _selected_folder_has_subfolder_with_same_name (win);
1263                 if (dimmed)
1264                         modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1265         }
1266         
1267         return dimmed;
1268 }
1269
1270
1271 gboolean 
1272 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1273 {
1274         ModestDimmingRule *rule = NULL;
1275         gboolean dimmed = FALSE;
1276         GtkWidget *focused = NULL;
1277
1278         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1279         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1280         rule = MODEST_DIMMING_RULE (user_data);
1281
1282         focused = gtk_window_get_focus (GTK_WINDOW (win));
1283
1284         /* Main window dimming rules */ 
1285         if (MODEST_IS_MAIN_WINDOW (win))
1286                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1287
1288         if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
1289                 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1290
1291         if (!dimmed && GTK_IS_ENTRY (focused)) {
1292                 const gchar *current_text;
1293                 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
1294                 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
1295         }
1296
1297         if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
1298                 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1299                 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
1300         }
1301
1302         if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
1303                 dimmed = FALSE;
1304         return dimmed;
1305 }
1306
1307 gboolean 
1308 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1309 {
1310         ModestDimmingRule *rule = NULL;
1311         gboolean dimmed = FALSE;
1312
1313         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1314         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1315         rule = MODEST_DIMMING_RULE (user_data);
1316
1317         /* Check dimmed rule */ 
1318         dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);                       
1319
1320         if (!dimmed) {
1321                 dimmed = _purged_attach_selected (win, FALSE, NULL);
1322                 if (dimmed) {
1323                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1324                 }
1325         }
1326                 
1327         return dimmed;
1328 }
1329
1330 gboolean 
1331 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1332 {
1333         ModestDimmingRule *rule = NULL;
1334         gboolean dimmed = FALSE;
1335
1336         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1337         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1338         rule = MODEST_DIMMING_RULE (user_data);
1339
1340         /* Check dimmed rule */ 
1341         dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1342
1343         if (!dimmed) {
1344                 dimmed = _purged_attach_selected (win, FALSE, NULL);
1345                 if (dimmed) {
1346                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1347                 }
1348         }
1349                 
1350         return dimmed;
1351 }
1352
1353 gboolean 
1354 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1355 {
1356         ModestDimmingRule *rule = NULL;
1357         const DimmedState *state = NULL;
1358         gboolean dimmed = FALSE;
1359
1360         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1361         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1362         rule = MODEST_DIMMING_RULE (user_data);
1363         state = modest_window_get_dimming_state (win);          
1364
1365         /* Check in main window if there's only one message selected */
1366         if (MODEST_IS_MAIN_WINDOW (win)) {
1367                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1368         }
1369
1370         /* Check in view window if there's any attachment selected */
1371         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1372                 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1373                 if (dimmed)
1374                         modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1375         }
1376
1377 #ifndef MODEST_TOOLKIT_HILDON2
1378         /* Messages as attachments could not be removed */
1379         if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1380                 TnyList *attachments;
1381                 TnyIterator *iter;
1382                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW (win));
1383                 if (attachments) {
1384                         iter = tny_list_create_iterator (attachments);
1385                         while (!tny_iterator_is_done (iter) && !dimmed) {
1386                                 TnyMimePart *mime_part = (TnyMimePart *)
1387                                         tny_iterator_get_current (iter);
1388                                 if (modest_tny_mime_part_is_msg (mime_part))
1389                                         dimmed = TRUE;
1390                                 g_object_unref (mime_part);
1391                                 tny_iterator_next (iter);
1392                         }
1393                         g_object_unref (iter);
1394                         g_object_unref (attachments);
1395                 }
1396         }
1397 #endif
1398
1399         if (!dimmed) {
1400
1401                 dimmed = _selected_msg_sent_in_progress (win);
1402                 if (dimmed) {
1403                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1404                 }
1405         }
1406
1407         /* cannot purge in editable drafts nor pop folders */
1408         if (!dimmed) {
1409                 dimmed = _invalid_folder_for_purge (win, rule);
1410                 if (dimmed)
1411                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1412         }
1413
1414         /* Check if the selected message in main window has attachments */
1415         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1416                 dimmed = !(state->any_has_attachments);
1417                 if (dimmed)
1418                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1419         }
1420
1421         /* Check if all attachments are already purged */
1422         if (!dimmed) {
1423                 dimmed = _purged_attach_selected (win, TRUE, rule);
1424         }
1425
1426         /* Check if the message is already downloaded */
1427         if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1428                 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1429                 if (dimmed)
1430                         modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1431         }
1432
1433         return dimmed;
1434 }
1435
1436 gboolean 
1437 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1438 {
1439         ModestDimmingRule *rule = NULL;
1440         gboolean dimmed = FALSE;
1441         
1442         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1443         rule = MODEST_DIMMING_RULE (user_data);
1444
1445         /* Check dimmed rule */ 
1446         if (MODEST_IS_MAIN_WINDOW (win)) {
1447                 dimmed = _clipboard_is_empty (win); 
1448                 if (dimmed)
1449                         modest_dimming_rule_set_notification (rule, "");
1450         }
1451
1452         if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1453                 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
1454         }
1455                                 
1456         return dimmed;  
1457 }
1458
1459 gboolean 
1460 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
1461 {
1462         ModestDimmingRule *rule = NULL;
1463         gboolean dimmed = FALSE;
1464         
1465         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1466         rule = MODEST_DIMMING_RULE (user_data);
1467
1468         /* Check dimmed rule */ 
1469         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1470                 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
1471         }
1472                                 
1473         return dimmed;  
1474 }
1475
1476 gboolean 
1477 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1478 {
1479         ModestDimmingRule *rule = NULL;
1480         const DimmedState *state = NULL;
1481         gboolean dimmed = FALSE;
1482         
1483         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1484         rule = MODEST_DIMMING_RULE (user_data);
1485         state = modest_window_get_dimming_state (win);
1486
1487         /* Check common dimming rules */
1488         dimmed = _invalid_clipboard_selected (win, rule);
1489
1490         /* Check window specific dimming rules */
1491         if (MODEST_IS_MAIN_WINDOW (win)) {
1492                 /* Get focused widget */
1493                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1494                 
1495                 if (MODEST_IS_HEADER_VIEW (focused)) {
1496                         if (!dimmed) { 
1497                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1498                                 if (dimmed)
1499                                         modest_dimming_rule_set_notification (rule, "");
1500                         }
1501                         if (!dimmed) {
1502                                 dimmed = _selected_msg_sent_in_progress (win);
1503                                 if (dimmed)
1504                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1505                         }
1506                         if (!dimmed) {
1507                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1508                                 if(dimmed)
1509                                         modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1510                         }
1511                 }
1512                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1513                         TnyFolderType types[3];
1514                         
1515                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1516                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1517                         types[2] = TNY_FOLDER_TYPE_SENT;
1518                         
1519                         /* Apply folder rules */        
1520                         if (!dimmed) {
1521                                 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
1522                                 if (dimmed)
1523                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1524                         }
1525                         if (!dimmed) {
1526                                 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1527                                 if (dimmed)
1528                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1529                         }
1530                         if (!dimmed) {
1531                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1532                                 if (dimmed)
1533                                         modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1534                         }
1535                 }
1536         }
1537
1538         return dimmed;
1539 }
1540
1541 gboolean 
1542 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1543 {
1544         ModestDimmingRule *rule = NULL;
1545         const DimmedState *state = NULL;
1546         gboolean dimmed = FALSE;
1547
1548         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1549         rule = MODEST_DIMMING_RULE (user_data);
1550         state = modest_window_get_dimming_state (win);
1551
1552         /* Check common dimming rules */
1553         dimmed = _invalid_clipboard_selected (win, rule);       
1554         
1555         /* Check window specific dimming rules */
1556         if (MODEST_IS_MAIN_WINDOW (win)) {
1557                 /* Get focused widget */
1558                 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1559                 
1560                 if (MODEST_IS_HEADER_VIEW (focused)) {
1561                         if (!dimmed) {
1562                                 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));                   
1563                                 if (dimmed)
1564                                         modest_dimming_rule_set_notification (rule, "");
1565                         }               
1566                         if (!dimmed) {
1567                                 dimmed = _selected_msg_sent_in_progress (win);
1568                                 if (dimmed)
1569                                         modest_dimming_rule_set_notification (rule, _(""));
1570                         }
1571                         if (!dimmed) {
1572                                 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1573                                 if(dimmed)
1574                                         modest_dimming_rule_set_notification (rule, _(""));
1575                         }
1576                 }
1577                 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1578                         TnyFolderType types[3];
1579                         
1580                         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
1581                         types[1] = TNY_FOLDER_TYPE_OUTBOX;
1582                         types[2] = TNY_FOLDER_TYPE_SENT;
1583
1584                         if (!dimmed) {
1585                                 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1586                                 if (dimmed)
1587                                         modest_dimming_rule_set_notification (rule, _(""));
1588                         }
1589                         if (!dimmed) {
1590                                 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1591                                 if (dimmed)
1592                                         modest_dimming_rule_set_notification (rule, _(""));
1593                         }
1594                 }
1595         }
1596                 
1597         return dimmed;
1598 }
1599
1600 gboolean 
1601 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
1602 {
1603         ModestDimmingRule *rule = NULL;
1604         const DimmedState *state = NULL;
1605         gboolean dimmed = FALSE;
1606         
1607         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1608         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1609         rule = MODEST_DIMMING_RULE (user_data);
1610         state = modest_window_get_dimming_state (win);
1611
1612
1613         /* Check common dimming rules */
1614         ModestMsgEditFormat format;
1615         format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1616
1617         dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
1618         if (dimmed)
1619                 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
1620
1621         if (!dimmed) {
1622                 GtkWidget *body;
1623                 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1624                                                                 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1625                 
1626                 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1627                 if (dimmed)
1628                         modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1629         }
1630                
1631         
1632         return dimmed;
1633 }
1634
1635 gboolean 
1636 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
1637 {
1638         ModestDimmingRule *rule = NULL;
1639         const DimmedState *state = NULL;
1640         gboolean dimmed = FALSE;
1641         
1642         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1643         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1644         rule = MODEST_DIMMING_RULE (user_data);
1645         state = modest_window_get_dimming_state (win);
1646
1647         GtkWidget *body;
1648         body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1649                                                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1650         
1651         dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1652         if (dimmed)
1653                 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1654         
1655         return dimmed;
1656 }
1657
1658 gboolean 
1659 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1660 {
1661         ModestDimmingRule *rule = NULL;
1662         const DimmedState *state = NULL;
1663         gboolean dimmed = FALSE;
1664         GtkWidget *focused = NULL;
1665         
1666         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1667         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1668         rule = MODEST_DIMMING_RULE (user_data);
1669         state = modest_window_get_dimming_state (win);
1670
1671         focused = gtk_window_get_focus (GTK_WINDOW (win));
1672
1673         dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1674         
1675         if (!dimmed) {
1676                 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1677         }
1678
1679         if (!dimmed) {
1680                 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1681                 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1682
1683                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1684                   ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1685         }
1686         
1687         return dimmed;
1688 }
1689
1690 gboolean 
1691 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1692 {
1693         ModestDimmingRule *rule = NULL;
1694         const DimmedState *state = NULL;
1695         gboolean dimmed = FALSE;
1696         TnyList *selected_attachments = NULL;
1697         gint n_att_selected = 0;
1698         GtkWidget *attachments_view;
1699         
1700         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1701         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1702         rule = MODEST_DIMMING_RULE (user_data);
1703         state = modest_window_get_dimming_state (win);
1704
1705         attachments_view = modest_msg_edit_window_get_child_widget (
1706                                                                     MODEST_MSG_EDIT_WINDOW (win),
1707                                                                     MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1708         
1709         selected_attachments = modest_attachments_view_get_selection (
1710                                                                       MODEST_ATTACHMENTS_VIEW (attachments_view));
1711         n_att_selected = tny_list_get_length (selected_attachments);
1712         g_object_unref (selected_attachments);
1713         
1714         dimmed = (n_att_selected < 1);  
1715         
1716         return dimmed;
1717 }
1718
1719 gboolean 
1720 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1721 {
1722         ModestDimmingRule *rule = NULL;
1723         const DimmedState *state = NULL;
1724         gboolean dimmed = FALSE;
1725         GtkWidget *subject_field, *body_field;
1726         const gchar *subject = NULL;
1727
1728         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1729         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1730         rule = MODEST_DIMMING_RULE (user_data);
1731         state = modest_window_get_dimming_state (win);
1732
1733         body_field = modest_msg_edit_window_get_child_widget (
1734                                                               MODEST_MSG_EDIT_WINDOW (win),
1735                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1736         subject_field = modest_msg_edit_window_get_child_widget (
1737                                                                  MODEST_MSG_EDIT_WINDOW (win),
1738                                                                  MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT);
1739         subject = gtk_entry_get_text (GTK_ENTRY (subject_field));
1740
1741         dimmed = (subject == NULL || subject[0] == '\0');
1742         if (dimmed)
1743                 modest_dimming_rule_set_notification (rule, _("mcen_ib_subject_not_modified"));
1744
1745         if (!dimmed) {
1746                 GtkWidget *to_field, *cc_field, *bcc_field;
1747                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1748                 cc_field = modest_msg_edit_window_get_child_widget (
1749                         MODEST_MSG_EDIT_WINDOW (win),
1750                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1751                 to_field = modest_msg_edit_window_get_child_widget (
1752                         MODEST_MSG_EDIT_WINDOW (win),
1753                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1754                 bcc_field = modest_msg_edit_window_get_child_widget (
1755                         MODEST_MSG_EDIT_WINDOW (win),
1756                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1757                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1758                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1759                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1760
1761                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1762                            gtk_text_buffer_get_char_count (cc_buffer) +
1763                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1764                 if (dimmed)
1765                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1766         }
1767         
1768         return dimmed;
1769 }
1770
1771 gboolean 
1772 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1773 {
1774         ModestDimmingRule *rule = NULL;
1775         gboolean dimmed = FALSE;
1776         
1777         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1778         rule = MODEST_DIMMING_RULE (user_data);
1779
1780         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1781
1782         /* Check dimmed rule */
1783         dimmed = _transfer_mode_enabled (win);
1784         if (dimmed)
1785                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1786         
1787         if (!dimmed) {
1788                 dimmed = modest_msg_view_window_first_message_selected (
1789                                 MODEST_MSG_VIEW_WINDOW(win));
1790                 modest_dimming_rule_set_notification (rule, NULL);
1791         }
1792
1793         return dimmed;
1794 }
1795
1796 gboolean 
1797 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1798 {
1799         ModestDimmingRule *rule = NULL;
1800         gboolean dimmed = FALSE;
1801
1802         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1803         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1804         rule = MODEST_DIMMING_RULE (user_data);
1805
1806         /* Check dimmed rule */ 
1807         dimmed = _transfer_mode_enabled (win);                  
1808         if (dimmed)
1809                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1810         
1811         if (!dimmed) {
1812                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1813                 modest_dimming_rule_set_notification (rule, NULL);
1814         }               
1815
1816         return dimmed;
1817 }
1818
1819
1820 gboolean 
1821 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1822 {
1823         return !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1824                                                 TRUE);  
1825 }
1826
1827 gboolean 
1828 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1829 {
1830         ModestDimmingRule *rule = NULL;
1831         TnyFolderType types[1];
1832         const DimmedState *state = NULL;
1833         gboolean dimmed = FALSE;
1834
1835         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1836         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1837         rule = MODEST_DIMMING_RULE (user_data);
1838         state = modest_window_get_dimming_state (win);
1839
1840         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
1841
1842         /* Check dimmed rules */        
1843         dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1844         if (dimmed) 
1845                 modest_dimming_rule_set_notification (rule, "");        
1846         if (!dimmed) {
1847                 dimmed = !state->sent_in_progress;
1848                 if (dimmed)
1849                         modest_dimming_rule_set_notification (rule, "");
1850         }
1851
1852         return dimmed;
1853 }
1854
1855 gboolean 
1856 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
1857 {
1858         /* We dim if no msg send is in progress (and then cancelling send all has no
1859          * effect */
1860         return !_msgs_send_in_progress ();
1861 }
1862
1863 gboolean 
1864 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1865 {
1866         ModestDimmingRule *rule = NULL;
1867         gboolean dimmed = FALSE;
1868         ModestAccountMgr *mgr;
1869         const gchar* account_name;
1870
1871         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1872         rule = MODEST_DIMMING_RULE (user_data);
1873         mgr = modest_runtime_get_account_mgr();
1874
1875         /* Check dimmed rule */
1876         account_name = modest_window_get_active_account (win);
1877
1878         if (account_name)
1879                 dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
1880         else
1881                 dimmed = TRUE;
1882
1883         if (dimmed)
1884                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1885
1886         return dimmed;
1887 }
1888
1889 gboolean 
1890 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1891 {
1892         ModestDimmingRule *rule = NULL;
1893         gboolean dimmed = FALSE;
1894
1895         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1896         rule = MODEST_DIMMING_RULE (user_data);
1897  
1898         /* Check dimmed rule */ 
1899         GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1900         if (g_slist_length (account_names) < 1)
1901                 dimmed = TRUE;
1902         if (dimmed)
1903                 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1904
1905         modest_account_mgr_free_account_names (account_names);
1906
1907         if (!dimmed) {
1908                 dimmed = _send_receive_in_progress (win);
1909         }
1910
1911         return dimmed;
1912 }
1913
1914 #ifdef MODEST_TOOLKIT_HILDON2
1915 gboolean
1916 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1917 {
1918         TnyMsg *msg;
1919         GSList *recipients, *node;
1920         gboolean has_recipients_to_add;
1921
1922         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1923         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1924
1925         msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1926
1927         /* Message is loaded asynchronously, so this could happen */
1928         if (!msg) {
1929 #ifdef MODEST_TOOLKIT_HILDON2
1930                 TnyHeader *header;
1931
1932                 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
1933                 if (!header)
1934                         return TRUE;
1935
1936                 recipients = modest_tny_msg_header_get_all_recipients_list (header);
1937                 g_object_unref (header);
1938 #else
1939                 return TRUE;
1940 #endif
1941         } else {
1942                 recipients = modest_tny_msg_get_all_recipients_list (msg);
1943                 g_object_unref (msg);
1944         }
1945
1946         has_recipients_to_add = FALSE;
1947         for (node = recipients; node != NULL; node = g_slist_next (node)) {
1948                 if (!modest_address_book_has_address ((const gchar *) node->data)) {
1949                         has_recipients_to_add = TRUE;
1950                         break;
1951                 }
1952         }
1953
1954         g_slist_foreach (recipients, (GFunc) g_free, NULL);
1955         g_slist_free (recipients);
1956   
1957         return !has_recipients_to_add;
1958 }
1959 #else
1960 gboolean
1961 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1962 {
1963         ModestDimmingRule *rule = NULL;
1964         gboolean dimmed = FALSE;
1965         GtkWidget *focused = NULL;
1966
1967         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1968         rule = MODEST_DIMMING_RULE (user_data);
1969         focused = gtk_window_get_focus (GTK_WINDOW (win));
1970
1971         dimmed = !focused;
1972
1973         if (!dimmed) {
1974                 gchar *selection = NULL;
1975                 if (GTK_IS_TEXT_VIEW (focused)) {
1976                         GtkTextIter start, end;
1977                         GtkTextBuffer *buffer = NULL;
1978                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1979                         if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
1980                                 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1981                         }
1982                 } else if (GTK_IS_LABEL (focused)) {
1983                         selection = modest_text_utils_label_get_selection (GTK_LABEL (focused));
1984                 } else {
1985                         gboolean do_check = TRUE;
1986                         GtkClipboard *clipboard;
1987                         if (GTK_IS_HTML (focused)) {
1988                                 const gchar *sel;
1989                                 int len = -1;
1990                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1991                                 do_check = !((sel == NULL) || (sel[0] == '\0'));
1992                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
1993                                 do_check = FALSE;
1994                         }
1995                         if (do_check) {
1996                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1997                                 selection = gtk_clipboard_wait_for_text (clipboard);
1998                         } else {
1999                                 selection = NULL;
2000                         }
2001                 }
2002                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
2003         }
2004
2005         return dimmed;
2006 }
2007 #endif
2008
2009 /* *********************** static utility functions ******************** */
2010
2011
2012 static gboolean
2013 _selected_folder_not_writeable (ModestMainWindow *win,
2014                                 gboolean for_paste)
2015 {
2016         GtkWidget *folder_view = NULL;
2017         TnyFolderStore *parent_folder = NULL;
2018         ModestEmailClipboard *clipboard = NULL;
2019         ModestTnyFolderRules rules;
2020         gboolean is_local_acc = FALSE;
2021         gboolean xfer_folders = FALSE;
2022         gboolean result = FALSE;
2023
2024         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2025
2026         /* Get folder view */
2027         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2028                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2029         /* If no folder view, always dimmed */
2030         if (!folder_view)
2031                 return TRUE;
2032         
2033         /* Get selected folder as parent of new folder to create */
2034         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2035         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2036                 /* If it's the local account and its transfering folders, then do not dim */            
2037                 if (TNY_IS_ACCOUNT (parent_folder)) {
2038                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
2039                         if (for_paste) {
2040                                 clipboard = modest_runtime_get_email_clipboard ();
2041                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
2042                         }
2043                 }
2044
2045                 if (for_paste) 
2046                         result = !(is_local_acc && xfer_folders); 
2047                 else
2048                         result = !is_local_acc;
2049                 goto frees;             
2050         }
2051         
2052         /* Check dimmed rule */ 
2053         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2054         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
2055
2056         /* free */
2057  frees:
2058         if (parent_folder != NULL)
2059                 g_object_unref (parent_folder);
2060
2061         return result;
2062 }
2063
2064 static gboolean
2065 _selected_folder_not_deletable (ModestMainWindow *win)
2066 {
2067         GtkWidget *folder_view = NULL;
2068         TnyFolderStore *parent_folder = NULL;
2069         ModestTnyFolderRules rules;
2070         gboolean result = FALSE;
2071
2072         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2073
2074         /* Get folder view */
2075         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2076                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2077         /* If no folder view, always dimmed */
2078         if (!folder_view)
2079                 return TRUE;
2080         
2081         /* Get selected folder as parent of new folder to create */
2082         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2083         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2084                 result = TRUE;
2085                 goto frees;             
2086         }
2087         
2088         /* Check dimmed rule */ 
2089         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2090         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
2091
2092         /* free */
2093  frees:
2094         if (parent_folder != NULL)
2095                 g_object_unref (parent_folder);
2096
2097         return result;
2098 }
2099
2100 static gboolean
2101 _selected_folder_not_moveable (ModestMainWindow *win)
2102 {
2103         GtkWidget *folder_view = NULL;
2104         TnyFolderStore *parent_folder = NULL;
2105         ModestTnyFolderRules rules;
2106         gboolean result = FALSE;
2107
2108         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2109
2110         /* Get folder view */
2111         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2112                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2113         /* If no folder view, always dimmed */
2114         if (!folder_view)
2115                 return TRUE;
2116         
2117         /* Get selected folder as parent of new folder to create */
2118         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2119         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2120                 result = TRUE;
2121                 goto frees;             
2122         }
2123         
2124         /* Check dimmed rule */ 
2125         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2126         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
2127
2128         /* free */
2129  frees:
2130         if (parent_folder != NULL)
2131                 g_object_unref (parent_folder);
2132
2133         return result;
2134 }
2135
2136 static gboolean
2137 _selected_folder_not_renameable (ModestMainWindow *win)
2138 {
2139         GtkWidget *folder_view = NULL;
2140         TnyFolderStore *parent_folder = NULL;
2141         ModestTnyFolderRules rules;
2142         gboolean result = FALSE;
2143
2144         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2145
2146         /* Get folder view */
2147         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2148                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2149         /* If no folder view, always dimmed */
2150         if (!folder_view)
2151                 return TRUE;
2152         
2153         /* Get selected folder as parent of new folder to create */
2154         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2155         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2156                 result = TRUE;
2157                 goto frees;             
2158         }
2159         
2160         /* Check dimmed rule */ 
2161         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2162         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
2163
2164         /* free */
2165  frees:
2166         if (parent_folder != NULL)
2167                 g_object_unref (parent_folder);
2168
2169         return result;
2170 }
2171
2172 static gboolean
2173 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
2174 {
2175         TnyFolderType types[2];
2176         gboolean result = FALSE;
2177
2178         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2179
2180         types[0] = TNY_FOLDER_TYPE_ROOT; 
2181         types[1] = TNY_FOLDER_TYPE_INBOX; 
2182
2183         /* Check folder type */
2184         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2185
2186         /* Check pop and MMC accounts */
2187         if (!result) {
2188                 result = _selected_folder_is_root (win);
2189         }
2190                 
2191         return result;
2192 }
2193
2194
2195 static gboolean
2196 _selected_folder_is_root (ModestMainWindow *win)
2197 {
2198         TnyFolderType types[1];
2199         gboolean result = FALSE;
2200
2201         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2202
2203         /* All accounts are root items: */
2204         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2205                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2206         if (folder_view) {                                      
2207                 gboolean is_account = FALSE;
2208                 TnyFolderStore *folder_store = 
2209                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2210                 if (folder_store) {
2211                         is_account = TNY_IS_ACCOUNT (folder_store);
2212
2213                         g_object_unref (folder_store);
2214                         folder_store = NULL;
2215                 }
2216                 
2217                 if (is_account)
2218                         return TRUE;
2219         }
2220                 
2221         /* Try something more precise: */
2222         types[0] = TNY_FOLDER_TYPE_ROOT; 
2223
2224         /* Check folder type */
2225         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2226                 
2227         return result;
2228 }
2229
2230 static gboolean
2231 _header_view_is_all_selected (ModestMainWindow *win)
2232 {
2233         const DimmedState *state = NULL;
2234
2235         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2236
2237         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2238
2239         return state->all_selected;
2240 }
2241
2242 static gboolean
2243 _selected_folder_is_empty (ModestMainWindow *win)
2244 {
2245         GtkWidget *folder_view = NULL, *header_view = NULL;
2246         TnyFolderStore *folder = NULL;
2247         gboolean result = FALSE;
2248
2249         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2250
2251         /* Get folder view */
2252         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2253                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2254
2255         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2256                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2257
2258         /* If no folder view, always dimmed */
2259         if (!folder_view || !header_view)
2260                 return TRUE;
2261         
2262         /* Get selected folder as parent of new folder to create */
2263         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2264         if (!(folder && TNY_IS_FOLDER(folder))) {
2265                 if (folder)
2266                         g_object_unref (folder);
2267                 return TRUE;
2268         }
2269         
2270         /* Check folder type */
2271         if (modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)) ||
2272             tny_folder_get_all_count (TNY_FOLDER (folder)) == 0)
2273                 result = TRUE;
2274
2275         /* free */
2276         g_object_unref (folder);
2277
2278         return result;
2279 }
2280
2281 static gboolean
2282 _folder_view_has_focus (ModestWindow *win)
2283 {
2284         GtkWidget *folder_view = NULL;
2285
2286         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2287
2288         /* Get folder view */
2289         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2290                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2291         if (!folder_view)
2292                 return FALSE;
2293         
2294         if (gtk_widget_is_focus(folder_view))
2295                 return TRUE;
2296
2297         return FALSE;
2298 }
2299
2300 static gboolean
2301 _selected_folder_is_same_as_source (ModestWindow *win)
2302 {
2303         ModestEmailClipboard *clipboard = NULL;
2304         GtkWidget *folder_view = NULL;
2305         TnyFolderStore *folder = NULL;
2306         gboolean result = FALSE;
2307
2308         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2309
2310         /* Get folder view */
2311         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2312                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2313         if (!folder_view)
2314                 return FALSE;
2315         
2316         /* Get selected folder as destination folder */
2317         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2318         if (!(folder && TNY_IS_FOLDER(folder))) {
2319                 result = FALSE;
2320                 goto frees;
2321         }
2322         
2323         /* Check clipboard is cleared */
2324         clipboard = modest_runtime_get_email_clipboard ();
2325         if (modest_email_clipboard_cleared (clipboard)) {
2326                 result = FALSE;
2327                 goto frees;
2328         }
2329                 
2330         /* Check source folder */
2331         result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2332         
2333         /* Free */
2334  frees:
2335         g_object_unref (folder);
2336         
2337         return result;
2338 }
2339
2340 static gboolean
2341 _selected_folder_is_any_of_type (ModestWindow *win,
2342                                  TnyFolderType types[], 
2343                                  guint ntypes)
2344 {
2345         GtkWidget *folder_view = NULL;
2346         TnyFolderStore *folder = NULL;
2347         TnyFolderType folder_type;
2348         guint i=0;
2349         gboolean result = FALSE;
2350
2351         /*Get current folder */
2352         if (MODEST_IS_MAIN_WINDOW(win)) {
2353
2354                 /* Get folder view */
2355                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2356                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2357                 /* If no folder view, always dimmed */
2358                 if (!folder_view)
2359                         return FALSE;
2360         
2361                 /* Get selected folder as parent of new folder to create */
2362                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2363
2364                 if (!(folder && TNY_IS_FOLDER(folder))) {
2365                         if (folder)
2366                                 g_object_unref (folder);
2367                         return FALSE;
2368                 }
2369                 
2370                 /* Check folder type */
2371                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2372         }
2373         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2374                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2375                 for (i=0; i < ntypes; i++) {
2376                         result = result || folder_type == types[i];
2377                 }
2378         }
2379
2380
2381         /* free */
2382         if (folder)
2383                 g_object_unref (folder);
2384
2385         return result;  
2386 }
2387
2388 static gboolean
2389 _folder_is_any_of_type (TnyFolder *folder,
2390                         TnyFolderType types[], 
2391                         guint ntypes)
2392 {
2393         TnyFolderType folder_type;
2394         gboolean result = FALSE;
2395         guint i;
2396
2397         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2398
2399         /* Get folder type */
2400         folder_type = modest_tny_folder_guess_folder_type (folder);
2401         if (folder_type == TNY_FOLDER_TYPE_INVALID)
2402                 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2403         
2404         /* Check foler type */
2405         for (i=0; i < ntypes; i++) {
2406                 result = result || folder_type == types[i];
2407         }
2408
2409         return result;
2410 }
2411
2412 static gboolean
2413 _clipboard_is_empty (ModestWindow *win)
2414 {
2415         gboolean result = FALSE;
2416         
2417         if (MODEST_IS_MAIN_WINDOW (win)) {
2418                 ModestEmailClipboard *clipboard = NULL;
2419                 clipboard = modest_runtime_get_email_clipboard ();
2420                 if (modest_email_clipboard_cleared (clipboard)) 
2421                  result = TRUE;  
2422         }
2423
2424         return result;
2425 }
2426
2427 static gboolean
2428 _invalid_clipboard_selected (ModestWindow *win,
2429                              ModestDimmingRule *rule) 
2430 {
2431         const DimmedState *state = NULL;
2432         gboolean result = FALSE;
2433         GtkWidget *focused = NULL;
2434
2435         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2436         state = modest_window_get_dimming_state (win);
2437         /* Get focuesed widget */
2438         focused = gtk_window_get_focus (GTK_WINDOW (win));
2439
2440         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2441                 gboolean has_selection = FALSE;
2442                 if (GTK_IS_TEXT_VIEW (focused)) {
2443                         GtkTextBuffer *buffer = NULL;
2444                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2445                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
2446                 } else if (GTK_IS_EDITABLE (focused)) {
2447                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2448                 }
2449                 result = !has_selection;
2450         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2451                 if (focused) {
2452                         MODEST_DEBUG_BLOCK (g_message ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2453                         if (GTK_IS_LABEL (focused) && 
2454                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2455                                 result = TRUE;
2456                         } else if (GTK_IS_TEXT_VIEW (focused)) {
2457                                 GtkTextBuffer *buffer;
2458                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2459                                 result = !gtk_text_buffer_get_has_selection (buffer);
2460                         } else if (GTK_IS_HTML (focused)) {
2461                                 const gchar *sel;
2462                                 int len = -1;
2463                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2464                                 result = ((sel == NULL) || (sel[0] == '\0'));
2465                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2466                                 result = TRUE;
2467                         } else {
2468                                 GtkClipboard *clipboard;
2469                                 gchar *selection;
2470
2471                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2472                                 /* Get clipboard selection*/
2473                                 selection = gtk_clipboard_wait_for_text (clipboard);
2474                                 /* Check dimming */
2475                                 result = (selection == NULL);
2476                                 g_free (selection);
2477                         } 
2478                 } else {
2479                         result = TRUE;
2480                 }
2481                 
2482                 if (result)
2483                         modest_dimming_rule_set_notification (rule, "");
2484                 
2485         }               
2486         else if (MODEST_IS_MAIN_WINDOW (win)) {
2487                 /* Check dimming */
2488                 result = state->n_selected == 0;
2489                 if (result)
2490                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));                  
2491         }
2492         
2493         return result;
2494 }
2495
2496
2497 static gboolean
2498 _invalid_attach_selected (ModestWindow *win,
2499                           gboolean unique,
2500                           gboolean for_view,
2501                           gboolean for_remove,
2502                           ModestDimmingRule *rule) 
2503 {
2504         TnyList *attachments;
2505         gint n_selected;
2506         TnyHeaderFlags flags;
2507         gboolean nested_attachments = FALSE;
2508         gboolean selected_messages = FALSE;
2509         const DimmedState *state = NULL;
2510         gboolean result = FALSE;
2511
2512         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2513         state = modest_window_get_dimming_state (win);
2514
2515         if (MODEST_IS_MAIN_WINDOW (win)) {
2516                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2517                 if (!result)
2518                         result = !state->any_has_attachments;
2519         }
2520         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2521                 
2522                 /* Get selected atachments */
2523                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2524                 n_selected = tny_list_get_length (attachments);
2525
2526                 /* Check unique */              
2527                 if (!result) {
2528                         if (unique) 
2529                                 result = n_selected != 1;
2530                         else
2531                                 
2532                                 result = n_selected < 1;
2533                 }
2534                 
2535                 /* Check attached type (view operation not required) */
2536                 if (!result && !for_view)  {
2537                         TnyIterator *iter;
2538                         iter = tny_list_create_iterator (attachments);
2539                         while (!tny_iterator_is_done (iter) && !result) {
2540 #ifdef MODEST_TOOLKIT_HILDON2
2541                                 gboolean not_selectable = FALSE;
2542 #endif
2543                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2544                                 TnyList *nested_list = tny_simple_list_new ();
2545                                 tny_mime_part_get_parts (mime_part, nested_list);
2546
2547                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
2548                                         TnyMsg *window_msg;
2549                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2550                                         if ((TnyMimePart *) window_msg != mime_part) {
2551                                                 selected_messages = TRUE;
2552 #ifdef MODEST_TOOLKIT_HILDON2
2553                                                 not_selectable = TRUE;
2554 #else
2555                                                 result = TRUE;
2556 #endif
2557                                         }
2558                                         g_object_unref (window_msg);
2559                                 }
2560                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2561                                         nested_attachments = TRUE;
2562 #ifdef MODEST_TOOLKIT_HILDON2
2563                                         not_selectable = TRUE;
2564 #else
2565                                         result = TRUE;
2566 #endif
2567                                 }
2568 #ifdef MODEST_TOOLKIT_HILDON2
2569                                 if (not_selectable)
2570                                         n_selected --;
2571 #endif
2572                                 g_object_unref (nested_list);
2573                                 g_object_unref (mime_part);
2574                                 tny_iterator_next (iter);
2575                         }
2576                         g_object_unref (iter);
2577                 }
2578
2579                 /* No valid attachment available */
2580                 if (n_selected == 0)
2581                         result = TRUE;
2582                 
2583                 /* Set notifications */
2584                 if (result && rule != NULL) {
2585                         if (selected_messages) {
2586                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2587                         } else if (nested_attachments) {
2588                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2589                         } else if (n_selected == 0) {
2590                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2591                         } else if (unique) {
2592                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2593                         }
2594                 }
2595                 
2596                 /* Free */
2597                 g_object_unref (attachments);
2598         }
2599
2600         return result;
2601 }
2602
2603 static gboolean
2604 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2605 {
2606         TnyList *attachments = NULL;
2607         TnyIterator *iter;
2608         gint purged = 0;
2609         gint n_attachments = 0;
2610         gboolean result = FALSE;
2611
2612         /* This should check if _all_ the attachments are already purged. If only some
2613          * of them are purged, then it does not cause dim as there's a confirmation dialog
2614          * for removing only local attachments */
2615
2616         /* Get selected atachments */
2617         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2618                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2619         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2620                 /* If we're in main window, we won't know if there are already purged attachments */
2621                 return FALSE;
2622         }
2623
2624         if (attachments == NULL)
2625                 return FALSE;
2626
2627         if (tny_list_get_length (attachments) == 0) {
2628                 g_object_unref (attachments);
2629                 return FALSE;
2630         }
2631
2632         iter = tny_list_create_iterator (attachments);
2633         while (!tny_iterator_is_done (iter)) {
2634                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2635                 if (tny_mime_part_is_purged (mime_part)) {
2636                         purged++;
2637                 }
2638                 n_attachments++;
2639                 g_object_unref (mime_part);
2640                 tny_iterator_next (iter);
2641         }
2642         g_object_unref (iter);
2643                 
2644         /* Free */
2645         g_object_unref (attachments);
2646
2647         if (all)
2648                 result = (purged == n_attachments);
2649         else
2650                 result = (purged > 0);
2651
2652         /* This string no longer exists, refer to NB#75415 for more info
2653         if (result && (rule != NULL))
2654                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2655         */
2656
2657         return result;
2658 }
2659
2660 static gboolean
2661 _invalid_msg_selected (ModestMainWindow *win,
2662                        gboolean unique,
2663                        ModestDimmingRule *rule) 
2664 {
2665         GtkWidget *folder_view = NULL;
2666         const DimmedState *state = NULL;
2667         gboolean result = FALSE;
2668
2669         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2670         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2671         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2672                 
2673         /* Get folder view to check focus */
2674         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2675                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2676
2677         /* Check dimmed rule (TODO: check focus on widgets */   
2678         if (!result) {
2679                 result = ((state->n_selected == 0 ) ||
2680                           (gtk_widget_is_focus (folder_view)));
2681                 if (result)
2682                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2683         }
2684         if (!result && unique) {
2685                 result = state->n_selected > 1;
2686                 if (result)
2687                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2688         }
2689
2690         return result;
2691 }
2692
2693
2694 static gboolean
2695 _msg_download_in_progress (ModestWindow *win)
2696 {
2697         gboolean result = FALSE;
2698
2699         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2700
2701         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2702                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2703         }
2704         else if (MODEST_IS_MAIN_WINDOW (win)) {
2705                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2706         }
2707
2708         return result;
2709 }
2710
2711 static gboolean
2712 _msg_download_completed (ModestMainWindow *win)
2713 {
2714         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2715         return state->any_marked_as_cached;
2716 }
2717
2718 static void 
2719 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2720 {
2721         GSList **send_queues = (GSList **) userdata;
2722         *send_queues = g_slist_prepend (*send_queues, value);
2723 }
2724
2725 static gboolean
2726 _selected_msg_sent_in_progress (ModestWindow *win)
2727 {
2728         const DimmedState *state = modest_window_get_dimming_state (win);
2729         return state->sent_in_progress;
2730 }
2731
2732
2733 static gboolean
2734 _invalid_folder_for_purge (ModestWindow *win, 
2735                            ModestDimmingRule *rule)
2736 {
2737         TnyFolder *folder = NULL;
2738         TnyAccount *account = NULL;
2739         gboolean result = FALSE;
2740
2741         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2742
2743                 /* Get folder and account of message */
2744                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2745                 g_return_val_if_fail(msg != NULL, TRUE);                        
2746                 folder = tny_msg_get_folder (msg);      
2747                 g_object_unref (msg);
2748                 if (folder == NULL) {
2749                         result = TRUE;
2750                         goto frees;
2751                 }
2752         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2753                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2754                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2755                 if (!folder_view)
2756                         return FALSE;
2757                 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2758                 /* Could be a folder store */
2759                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2760                         goto frees;             
2761         } else {
2762                 g_return_val_if_reached (FALSE);
2763         }
2764         account = modest_tny_folder_get_account (folder);
2765         if (account == NULL) goto frees;                        
2766                 
2767         /* Check account */
2768         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2769                 TnyFolderType types[2];
2770                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2771                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2772                 
2773                 if (_selected_folder_is_any_of_type (win, types, 2)) {
2774                         result = TRUE;
2775                 }
2776         } else {
2777                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
2778                 /* If it's a remote folder then dim */
2779                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
2780                                                                     protocol_type,
2781                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
2782                         result = TRUE;
2783                 }
2784         }
2785         
2786 frees:
2787         if (folder != NULL)
2788                 g_object_unref (folder);
2789         if (account != NULL)
2790                 g_object_unref (account);
2791         
2792         return result;
2793 }
2794
2795 static gboolean
2796 _transfer_mode_enabled (ModestWindow *win)
2797 {
2798         gboolean result = FALSE;
2799
2800         /* Check dimming */
2801         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2802                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2803         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2804                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2805 #ifdef MODEST_TOOLKIT_HILDON2
2806         } else if (MODEST_IS_HEADER_WINDOW (win)) {
2807                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
2808 #endif
2809         } else {
2810                 g_warning("_transfer_mode_enabled called with wrong window type");
2811         }
2812
2813         return result;
2814 }
2815
2816 static gboolean
2817 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2818 {
2819         GtkWidget *folder_view = NULL;
2820         TnyFolderStore *folder = NULL;
2821         ModestEmailClipboard *clipboard = NULL;
2822         const gchar *folder_name = NULL;
2823         gboolean result = FALSE;
2824
2825         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2826
2827         /*Get current parent folder */
2828         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2829                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2830         /* If no folder view, always dimmed */
2831         if (!folder_view) return FALSE;
2832         
2833         /* Get selected folder as parent of new folder to create */
2834         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));     
2835         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
2836         
2837         /* get modest clipboard and source folder */
2838         clipboard = modest_runtime_get_email_clipboard ();
2839         folder_name = modest_email_clipboard_get_folder_name (clipboard);
2840         if (folder_name == NULL) goto frees;
2841
2842         /* Check source subfolders names */
2843         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
2844                                                             TRUE);
2845                 
2846         /* Free */
2847  frees:
2848         if (folder != NULL) 
2849                 g_object_unref (folder);
2850
2851
2852         return result;
2853 }       
2854
2855 gboolean 
2856 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
2857                                            gpointer user_data)
2858 {
2859         ModestDimmingRule *rule = NULL;
2860
2861         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2862         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2863         rule = MODEST_DIMMING_RULE (user_data);
2864
2865         /* Check dimmed rule */ 
2866         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
2867 }
2868
2869 gboolean
2870 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
2871                                          gpointer user_data)
2872 {
2873         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2874
2875         ModestMsgEditFormat format =
2876           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
2877
2878         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
2879 }
2880
2881 static gboolean 
2882 _send_receive_in_progress (ModestWindow *win)
2883 {
2884         ModestMailOperationQueue *queue;
2885         GSList *op_list, *node;
2886         gboolean found_send_receive;
2887
2888         queue = modest_runtime_get_mail_operation_queue ();
2889         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
2890
2891         found_send_receive = FALSE;
2892         for (node = op_list; node != NULL; node = g_slist_next (node)) {
2893                 ModestMailOperation *op;
2894
2895                 op = (ModestMailOperation *) node->data;
2896                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
2897                         found_send_receive = TRUE;
2898                         break;
2899                 }
2900         }
2901
2902         g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
2903         g_slist_free (op_list);
2904
2905         return found_send_receive;
2906 }
2907
2908 static gboolean
2909 _msgs_send_in_progress (void)
2910 {
2911         ModestCacheMgr *cache_mgr;
2912         GHashTable *send_queue_cache;
2913         ModestTnySendQueue *send_queue;
2914         GSList *send_queues = NULL, *node = NULL;
2915         gboolean found = FALSE;
2916
2917         cache_mgr = modest_runtime_get_cache_mgr ();
2918         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
2919                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
2920
2921         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
2922
2923         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
2924                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
2925
2926                 /* Check if msg uid is being processed inside send queue */
2927                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
2928                         found = TRUE;
2929                         break;
2930                 }
2931         }
2932
2933         g_slist_free (send_queues);
2934
2935         return found;
2936 }