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