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