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