dfbeb42e81f4b6801680b3d8419a2d8d5bb37391
[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         GSList *recipients;
2115         gboolean has_recipients_to_add;
2116
2117         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2118
2119         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2120                 TnyMsg *msg;
2121
2122                 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2123
2124                 /* Message is loaded asynchronously, so this could happen */
2125                 if (!msg) {
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                         recipients = modest_tny_msg_get_all_recipients_list (msg);
2136                         g_object_unref (msg);
2137                 }
2138         } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2139                 /* Get recipients */
2140                 gchar *joined, *after_remove;
2141                 MsgData *data = modest_msg_edit_window_get_msg_data ((ModestMsgEditWindow *) win);
2142
2143                 /* We don't check the from */
2144                 joined = modest_text_utils_join_addresses (NULL, data->to, data->cc, data->bcc);
2145                 after_remove = modest_text_utils_remove_duplicate_addresses (joined);
2146                 g_free (joined);
2147
2148                 recipients = modest_text_utils_split_addresses_list (after_remove);
2149                 g_free (after_remove);
2150
2151                 modest_msg_edit_window_free_msg_data ((ModestMsgEditWindow *) win, data);
2152         }
2153
2154         has_recipients_to_add = FALSE;
2155
2156         if (recipients) {
2157                 GSList *node;
2158                 for (node = recipients; node != NULL; node = g_slist_next (node)) {
2159                         const gchar *recipient = (const gchar *) node->data;
2160                         if (modest_text_utils_validate_recipient (recipient, NULL)) {
2161                                 if (!modest_address_book_has_address (recipient)) {
2162                                         has_recipients_to_add = TRUE;
2163                                         break;
2164                                 }
2165                         }
2166                 }
2167                 g_slist_foreach (recipients, (GFunc) g_free, NULL);
2168                 g_slist_free (recipients);
2169         }
2170
2171         return !has_recipients_to_add;
2172 }
2173 #else
2174 gboolean
2175 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
2176 {
2177         ModestDimmingRule *rule = NULL;
2178         gboolean dimmed = FALSE;
2179         GtkWidget *focused = NULL;
2180
2181         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2182         rule = MODEST_DIMMING_RULE (user_data);
2183         focused = gtk_window_get_focus (GTK_WINDOW (win));
2184
2185         dimmed = !focused;
2186
2187         if (!dimmed) {
2188                 gchar *selection = NULL;
2189                 if (GTK_IS_TEXT_VIEW (focused)) {
2190                         GtkTextIter start, end;
2191                         GtkTextBuffer *buffer = NULL;
2192                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2193                         if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
2194                                 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
2195                         }
2196                 } else if (GTK_IS_LABEL (focused)) {
2197                         selection = modest_text_utils_label_get_selection (GTK_LABEL (focused));
2198                 } else {
2199                         gboolean do_check = TRUE;
2200                         GtkClipboard *clipboard;
2201                         if (GTK_IS_HTML (focused)) {
2202                                 const gchar *sel;
2203                                 int len = -1;
2204                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2205                                 do_check = !((sel == NULL) || (sel[0] == '\0'));
2206                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2207                                 do_check = FALSE;
2208                         }
2209                         if (do_check) {
2210                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2211                                 selection = gtk_clipboard_wait_for_text (clipboard);
2212                         } else {
2213                                 selection = NULL;
2214                         }
2215                 }
2216                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
2217         }
2218
2219         return dimmed;
2220 }
2221 #endif
2222
2223 /* *********************** static utility functions ******************** */
2224
2225 #ifndef MODEST_TOOLKIT_HILDON2
2226 static gboolean
2227 _selected_folder_not_writeable (ModestMainWindow *win,
2228                                 gboolean for_paste)
2229 {
2230         GtkWidget *folder_view = NULL;
2231         TnyFolderStore *parent_folder = NULL;
2232         ModestEmailClipboard *clipboard = NULL;
2233         ModestTnyFolderRules rules;
2234         gboolean is_local_acc = FALSE;
2235         gboolean xfer_folders = FALSE;
2236         gboolean result = FALSE;
2237
2238         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2239
2240         /* Get folder view */
2241         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2242                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2243         /* If no folder view, always dimmed */
2244         if (!folder_view)
2245                 return TRUE;
2246         
2247         /* Get selected folder as parent of new folder to create */
2248         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2249         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2250                 /* If it's the local account and its transfering folders, then do not dim */            
2251                 if (TNY_IS_ACCOUNT (parent_folder)) {
2252                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
2253                         if (for_paste) {
2254                                 clipboard = modest_runtime_get_email_clipboard ();
2255                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
2256                         }
2257                 }
2258
2259                 if (for_paste) 
2260                         result = !(is_local_acc && xfer_folders); 
2261                 else
2262                         result = !is_local_acc;
2263                 goto frees;             
2264         }
2265         
2266         /* Check dimmed rule */ 
2267         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2268         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
2269
2270         /* free */
2271  frees:
2272         if (parent_folder != NULL)
2273                 g_object_unref (parent_folder);
2274
2275         return result;
2276 }
2277 #endif
2278
2279 #ifndef MODEST_TOOLKIT_HILDON2
2280 static gboolean
2281 _selected_folder_not_deletable (ModestMainWindow *win)
2282 {
2283         GtkWidget *folder_view = NULL;
2284         TnyFolderStore *parent_folder = NULL;
2285         ModestTnyFolderRules rules;
2286         gboolean result = FALSE;
2287
2288         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2289
2290         /* Get folder view */
2291         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2292                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2293         /* If no folder view, always dimmed */
2294         if (!folder_view)
2295                 return TRUE;
2296
2297         /* Get selected folder as parent of new folder to create */
2298         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2299         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2300                 result = TRUE;
2301                 goto frees;
2302         }
2303
2304         /* Check dimmed rule */
2305         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2306         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
2307
2308         /* free */
2309  frees:
2310         if (parent_folder != NULL)
2311                 g_object_unref (parent_folder);
2312
2313         return result;
2314 }
2315
2316 static gboolean
2317 _selected_folder_not_moveable (ModestMainWindow *win)
2318 {
2319         GtkWidget *folder_view = NULL;
2320         TnyFolderStore *parent_folder = NULL;
2321         ModestTnyFolderRules rules;
2322         gboolean result = FALSE;
2323
2324         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2325
2326         /* Get folder view */
2327         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2328                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2329         /* If no folder view, always dimmed */
2330         if (!folder_view)
2331                 return TRUE;
2332         
2333         /* Get selected folder as parent of new folder to create */
2334         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2335         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2336                 result = TRUE;
2337                 goto frees;             
2338         }
2339         
2340         /* Check dimmed rule */ 
2341         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2342         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
2343
2344         /* free */
2345  frees:
2346         if (parent_folder != NULL)
2347                 g_object_unref (parent_folder);
2348
2349         return result;
2350 }
2351
2352 static gboolean
2353 _selected_folder_not_renameable (ModestMainWindow *win)
2354 {
2355         GtkWidget *folder_view = NULL;
2356         TnyFolderStore *parent_folder = NULL;
2357         ModestTnyFolderRules rules;
2358         gboolean result = FALSE;
2359
2360         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2361
2362         /* Get folder view */
2363         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2364                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2365         /* If no folder view, always dimmed */
2366         if (!folder_view)
2367                 return TRUE;
2368         
2369         /* Get selected folder as parent of new folder to create */
2370         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2371         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2372                 result = TRUE;
2373                 goto frees;             
2374         }
2375         
2376         /* Check dimmed rule */ 
2377         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2378         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
2379
2380         /* free */
2381  frees:
2382         if (parent_folder != NULL)
2383                 g_object_unref (parent_folder);
2384
2385         return result;
2386 }
2387
2388 static gboolean
2389 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
2390 {
2391         TnyFolderType types[2];
2392         gboolean result = FALSE;
2393
2394         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2395
2396         types[0] = TNY_FOLDER_TYPE_ROOT; 
2397         types[1] = TNY_FOLDER_TYPE_INBOX; 
2398
2399         /* Check folder type */
2400         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2401
2402         /* Check pop and MMC accounts */
2403         if (!result) {
2404                 result = _selected_folder_is_root (win);
2405         }
2406                 
2407         return result;
2408 }
2409
2410
2411 static gboolean
2412 _selected_folder_is_root (ModestMainWindow *win)
2413 {
2414         TnyFolderType types[1];
2415         gboolean result = FALSE;
2416
2417         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2418
2419         /* All accounts are root items: */
2420         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2421                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2422         if (folder_view) {                                      
2423                 gboolean is_account = FALSE;
2424                 TnyFolderStore *folder_store = 
2425                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2426                 if (folder_store) {
2427                         is_account = TNY_IS_ACCOUNT (folder_store);
2428
2429                         g_object_unref (folder_store);
2430                         folder_store = NULL;
2431                 }
2432                 
2433                 if (is_account)
2434                         return TRUE;
2435         }
2436                 
2437         /* Try something more precise: */
2438         types[0] = TNY_FOLDER_TYPE_ROOT; 
2439
2440         /* Check folder type */
2441         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2442                 
2443         return result;
2444 }
2445
2446 static gboolean
2447 _header_view_is_all_selected (ModestMainWindow *win)
2448 {
2449         const DimmedState *state = NULL;
2450
2451         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2452
2453         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2454
2455         return (state) ? state->all_selected : TRUE;
2456 }
2457
2458 static gboolean
2459 _selected_folder_is_empty (ModestMainWindow *win)
2460 {
2461         GtkWidget *folder_view = NULL, *header_view = NULL;
2462         TnyFolderStore *folder = NULL;
2463         gboolean result = FALSE;
2464
2465         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2466
2467         /* Get folder view */
2468         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2469                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2470
2471         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2472                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2473
2474         /* If no folder view, always dimmed */
2475         if (!folder_view || !header_view)
2476                 return TRUE;
2477
2478         /* Get selected folder as parent of new folder to create */
2479         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2480         if (!(folder && TNY_IS_FOLDER(folder))) {
2481                 if (folder)
2482                         g_object_unref (folder);
2483                 return TRUE;
2484         }
2485
2486         /* Check folder type */
2487         if (modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)) ||
2488             tny_folder_get_all_count (TNY_FOLDER (folder)) == 0)
2489                 result = TRUE;
2490
2491         /* free */
2492         g_object_unref (folder);
2493
2494         return result;
2495 }
2496
2497 static gboolean
2498 _folder_view_has_focus (ModestWindow *win)
2499 {
2500         GtkWidget *folder_view = NULL;
2501
2502         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2503
2504         /* Get folder view */
2505         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2506                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2507         if (!folder_view)
2508                 return FALSE;
2509
2510         if (gtk_widget_is_focus(folder_view))
2511                 return TRUE;
2512
2513         return FALSE;
2514 }
2515
2516 static gboolean
2517 _selected_folder_is_same_as_source (ModestWindow *win)
2518 {
2519         ModestEmailClipboard *clipboard = NULL;
2520         GtkWidget *folder_view = NULL;
2521         TnyFolderStore *folder = NULL;
2522         gboolean result = FALSE;
2523
2524         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2525
2526         /* Get folder view */
2527         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2528                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2529         if (!folder_view)
2530                 return FALSE;
2531
2532         /* Get selected folder as destination folder */
2533         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2534         if (!(folder && TNY_IS_FOLDER(folder))) {
2535                 result = FALSE;
2536                 goto frees;
2537         }
2538
2539         /* Check clipboard is cleared */
2540         clipboard = modest_runtime_get_email_clipboard ();
2541         if (modest_email_clipboard_cleared (clipboard)) {
2542                 result = FALSE;
2543                 goto frees;
2544         }
2545
2546         /* Check source folder */
2547         result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2548
2549         /* Free */
2550  frees:
2551         g_object_unref (folder);
2552
2553         return result;
2554 }
2555 #endif
2556
2557 static gboolean
2558 _selected_folder_is_any_of_type (ModestWindow *win,
2559                                  TnyFolderType types[], 
2560                                  guint ntypes)
2561 {
2562         TnyFolderStore *folder = NULL;
2563         TnyFolderType folder_type;
2564         guint i=0;
2565         gboolean result = FALSE;
2566
2567         /*Get current folder */
2568         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2569                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2570                 for (i=0; i < ntypes; i++) {
2571                         result = result || folder_type == types[i];
2572                 }
2573 #ifndef MODEST_TOOLKIT_HILDON2
2574         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2575                 GtkWidget *folder_view = NULL;
2576
2577                 /* Get folder view */
2578                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2579                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2580                 /* If no folder view, always dimmed */
2581                 if (!folder_view)
2582                         return FALSE;
2583
2584                 /* Get selected folder as parent of new folder to create */
2585                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2586
2587                 if (!(folder && TNY_IS_FOLDER(folder))) {
2588                         if (folder)
2589                                 g_object_unref (folder);
2590                         return FALSE;
2591                 }
2592
2593                 /* Check folder type */
2594                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2595 #endif
2596         }
2597
2598         /* free */
2599         if (folder)
2600                 g_object_unref (folder);
2601
2602         return result;
2603 }
2604
2605 #ifndef MODEST_TOOLKIT_HILDON2
2606 static gboolean
2607 _folder_is_any_of_type (TnyFolder *folder,
2608                         TnyFolderType types[], 
2609                         guint ntypes)
2610 {
2611         TnyFolderType folder_type;
2612         gboolean result = FALSE;
2613         guint i;
2614
2615         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2616
2617         /* Get folder type */
2618         folder_type = modest_tny_folder_guess_folder_type (folder);
2619         if (folder_type == TNY_FOLDER_TYPE_INVALID)
2620                 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2621
2622         /* Check foler type */
2623         for (i=0; i < ntypes; i++) {
2624                 result = result || folder_type == types[i];
2625         }
2626
2627         return result;
2628 }
2629
2630 static gboolean
2631 _clipboard_is_empty (ModestWindow *win)
2632 {
2633         gboolean result = FALSE;
2634
2635         if (MODEST_IS_MAIN_WINDOW (win)) {
2636                 ModestEmailClipboard *clipboard = NULL;
2637                 clipboard = modest_runtime_get_email_clipboard ();
2638                 if (modest_email_clipboard_cleared (clipboard))
2639                  result = TRUE;
2640         }
2641
2642         return result;
2643 }
2644 #endif
2645
2646 static gboolean
2647 _invalid_clipboard_selected (ModestWindow *win,
2648                              ModestDimmingRule *rule) 
2649 {
2650         gboolean result = FALSE;
2651         GtkWidget *focused = NULL;
2652
2653         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2654
2655         /* Get focuesed widget */
2656         focused = gtk_window_get_focus (GTK_WINDOW (win));
2657
2658         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2659                 gboolean has_selection = FALSE;
2660                 if (GTK_IS_TEXT_VIEW (focused)) {
2661                         GtkTextBuffer *buffer = NULL;
2662                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2663                         has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
2664                 } else if (GTK_IS_EDITABLE (focused)) {
2665                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2666                 }
2667                 result = !has_selection;
2668         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2669                 if (focused) {
2670                         MODEST_DEBUG_BLOCK (g_debug ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2671                         if (GTK_IS_LABEL (focused) && 
2672                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2673                                 result = TRUE;
2674                         } else if (GTK_IS_TEXT_VIEW (focused)) {
2675                                 GtkTextBuffer *buffer;
2676                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2677                                 result = !gtk_text_buffer_get_has_selection (buffer);
2678                         } else if (GTK_IS_HTML (focused)) {
2679                                 const gchar *sel;
2680                                 int len = -1;
2681                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2682                                 result = ((sel == NULL) || (sel[0] == '\0'));
2683                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2684                                 result = TRUE;
2685                         } else {
2686                                 GtkClipboard *clipboard;
2687                                 gchar *selection;
2688
2689                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2690                                 /* Get clipboard selection*/
2691                                 selection = gtk_clipboard_wait_for_text (clipboard);
2692                                 /* Check dimming */
2693                                 result = (selection == NULL);
2694                                 g_free (selection);
2695                         }
2696                 } else {
2697                         result = TRUE;
2698                 }
2699                 if (result)
2700                         modest_dimming_rule_set_notification (rule, "");
2701 #ifndef MODEST_TOOLKIT_HILDON2
2702         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2703                 const DimmedState *state = NULL;
2704
2705                 /* Check dimming */
2706                 state = modest_window_get_dimming_state (win);
2707                 if (state)
2708                         result = state->n_selected == 0;
2709                 if (result)
2710                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2711 #endif
2712         }
2713
2714         return result;
2715 }
2716
2717
2718 static gboolean
2719 _invalid_attach_selected (ModestWindow *win,
2720                           gboolean unique,
2721                           gboolean for_view,
2722                           gboolean for_remove,
2723                           ModestDimmingRule *rule) 
2724 {
2725         TnyList *attachments;
2726         gint n_selected;
2727         gboolean nested_attachments = FALSE;
2728         gboolean selected_messages = FALSE;
2729         gboolean result = FALSE;
2730
2731         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2732
2733         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2734
2735                 /* Get selected atachments */
2736                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2737                 n_selected = tny_list_get_length (attachments);
2738
2739                 /* Check unique */
2740                 if (!result) {
2741                         if (unique)
2742                                 result = n_selected != 1;
2743                         else
2744
2745                                 result = n_selected < 1;
2746                 }
2747
2748                 /* Check attached type (view operation not required) */
2749                 if (!result && !for_view)  {
2750                         TnyIterator *iter;
2751                         iter = tny_list_create_iterator (attachments);
2752                         while (!tny_iterator_is_done (iter) && !result) {
2753 #ifdef MODEST_TOOLKIT_HILDON2
2754                                 gboolean not_selectable = FALSE;
2755 #endif
2756                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2757                                 TnyList *nested_list = tny_simple_list_new ();
2758                                 tny_mime_part_get_parts (mime_part, nested_list);
2759
2760                                 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
2761                                         TnyMsg *window_msg;
2762                                         window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2763                                         if ((TnyMimePart *) window_msg != mime_part) {
2764                                                 selected_messages = TRUE;
2765 #ifdef MODEST_TOOLKIT_HILDON2
2766                                                 not_selectable = TRUE;
2767 #else
2768                                                 result = TRUE;
2769 #endif
2770                                         }
2771                                         g_object_unref (window_msg);
2772                                 }
2773                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2774                                         nested_attachments = TRUE;
2775 #ifdef MODEST_TOOLKIT_HILDON2
2776                                         not_selectable = TRUE;
2777 #else
2778                                         result = TRUE;
2779 #endif
2780                                 }
2781 #ifdef MODEST_TOOLKIT_HILDON2
2782                                 if (not_selectable)
2783                                         n_selected --;
2784 #endif
2785                                 g_object_unref (nested_list);
2786                                 g_object_unref (mime_part);
2787                                 tny_iterator_next (iter);
2788                         }
2789                         g_object_unref (iter);
2790                 }
2791
2792                 /* No valid attachment available */
2793                 if (n_selected == 0)
2794                         result = TRUE;
2795
2796                 /* Set notifications */
2797                 if (result && rule != NULL) {
2798                         if (selected_messages) {
2799                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2800                         } else if (nested_attachments) {
2801                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2802                         } else if (n_selected == 0) {
2803                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2804                         } else if (unique) {
2805                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2806                         }
2807                 }
2808
2809                 /* Free */
2810                 g_object_unref (attachments);
2811 #ifndef MODEST_TOOLKIT_HILDON2
2812         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2813                 if (!result) {
2814                         const DimmedState *state = NULL;
2815                         state = modest_window_get_dimming_state (win);
2816                         result = !state->any_has_attachments;
2817                 }
2818 #endif
2819         }
2820
2821         return result;
2822 }
2823
2824 static gboolean
2825 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2826 {
2827         TnyList *attachments = NULL;
2828         TnyIterator *iter;
2829         gint purged = 0;
2830         gint n_attachments = 0;
2831         gboolean result = FALSE;
2832
2833         /* This should check if _all_ the attachments are already purged. If only some
2834          * of them are purged, then it does not cause dim as there's a confirmation dialog
2835          * for removing only local attachments */
2836
2837         /* Get selected atachments */
2838         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2839                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2840 #ifndef MODEST_TOOLKIT_HILDON2
2841         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2842                 /* If we're in main window, we won't know if there are already purged attachments */
2843                 return FALSE;
2844 #endif
2845         }
2846
2847         if (attachments == NULL)
2848                 return FALSE;
2849
2850         if (tny_list_get_length (attachments) == 0) {
2851                 g_object_unref (attachments);
2852                 return FALSE;
2853         }
2854
2855         iter = tny_list_create_iterator (attachments);
2856         while (!tny_iterator_is_done (iter)) {
2857                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2858                 if (tny_mime_part_is_purged (mime_part)) {
2859                         purged++;
2860                 }
2861                 n_attachments++;
2862                 g_object_unref (mime_part);
2863                 tny_iterator_next (iter);
2864         }
2865         g_object_unref (iter);
2866
2867         /* Free */
2868         g_object_unref (attachments);
2869
2870         if (all)
2871                 result = (purged == n_attachments);
2872         else
2873                 result = (purged > 0);
2874
2875         /* This string no longer exists, refer to NB#75415 for more info
2876         if (result && (rule != NULL))
2877                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2878         */
2879
2880         return result;
2881 }
2882
2883 #ifndef MODEST_TOOLKIT_HILDON2
2884 static gboolean
2885 _invalid_msg_selected (ModestMainWindow *win,
2886                        gboolean unique,
2887                        ModestDimmingRule *rule) 
2888 {
2889         GtkWidget *folder_view = NULL;
2890         const DimmedState *state = NULL;
2891         gboolean result = FALSE;
2892         gint n_selected = 0;
2893
2894         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2895         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2896
2897         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2898         if (state)
2899                 n_selected = state->n_selected;
2900
2901         /* Get folder view to check focus */
2902         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2903                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2904
2905         /* Check dimmed rule (TODO: check focus on widgets */   
2906         if (!result) {
2907                 result = ((n_selected == 0 ) ||
2908                           (gtk_widget_is_focus (folder_view)));
2909                 if (result)
2910                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2911         }
2912         if (!result && unique) {
2913                 result = n_selected > 1;
2914                 if (result)
2915                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2916         }
2917
2918         return result;
2919 }
2920 #endif
2921
2922 static gboolean
2923 _msg_download_in_progress (ModestWindow *win)
2924 {
2925         gboolean result = FALSE;
2926
2927         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2928
2929         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2930                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2931 #ifndef MODEST_TOOLKIT_HILDON2
2932         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2933                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2934 #endif
2935         }
2936
2937         return result;
2938 }
2939
2940 #ifndef MODEST_TOOLKIT_HILDON2
2941 static gboolean
2942 _msg_download_completed (ModestMainWindow *win)
2943 {
2944         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2945         return (state) ? state->any_marked_as_cached : TRUE;
2946 }
2947 #endif
2948
2949 static void
2950 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2951 {
2952         GSList **send_queues = (GSList **) userdata;
2953         *send_queues = g_slist_prepend (*send_queues, value);
2954 }
2955
2956 static gboolean
2957 _selected_msg_sent_in_progress (ModestWindow *win)
2958 {
2959         const DimmedState *state = modest_window_get_dimming_state (win);
2960         return (state) ? state->sent_in_progress : TRUE;
2961 }
2962
2963
2964 static gboolean
2965 _invalid_folder_for_purge (ModestWindow *win, 
2966                            ModestDimmingRule *rule)
2967 {
2968         TnyFolder *folder = NULL;
2969         TnyAccount *account = NULL;
2970         gboolean result = FALSE;
2971
2972         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2973
2974                 /* Get folder and account of message */
2975                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2976                 g_return_val_if_fail(msg != NULL, TRUE);
2977                 folder = tny_msg_get_folder (msg);
2978                 g_object_unref (msg);
2979                 if (folder == NULL) {
2980                         result = TRUE;
2981                         goto frees;
2982                 }
2983 #ifndef MODEST_TOOLKIT_HILDON2
2984         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2985                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2986                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2987                 if (!folder_view)
2988                         return FALSE;
2989                 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2990                 /* Could be a folder store */
2991                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2992                         goto frees;
2993 #endif
2994         } else {
2995                 g_return_val_if_reached (FALSE);
2996         }
2997         account = modest_tny_folder_get_account (folder);
2998         if (account == NULL) goto frees;
2999
3000         /* Check account */
3001         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
3002                 TnyFolderType types[2];
3003                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
3004                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
3005
3006                 if (_selected_folder_is_any_of_type (win, types, 2)) {
3007                         result = TRUE;
3008                 }
3009         } else {
3010                 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
3011                 /* If it's a remote folder then dim */
3012                 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
3013                                                                     protocol_type,
3014                                                                     MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
3015                         result = TRUE;
3016                 }
3017         }
3018         
3019 frees:
3020         if (folder != NULL)
3021                 g_object_unref (folder);
3022         if (account != NULL)
3023                 g_object_unref (account);
3024         
3025         return result;
3026 }
3027
3028 static gboolean
3029 _transfer_mode_enabled (ModestWindow *win)
3030 {
3031         gboolean result = FALSE;
3032
3033         /* Check dimming */
3034         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
3035                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
3036 #ifndef MODEST_TOOLKIT_HILDON2
3037         } else if (MODEST_IS_MAIN_WINDOW(win)) {
3038                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
3039 #else
3040         } else if (MODEST_IS_FOLDER_WINDOW (win)) {
3041                 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
3042         } else if (MODEST_IS_HEADER_WINDOW (win)) {
3043                 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
3044 #endif
3045         } else {
3046                 g_warning("_transfer_mode_enabled called with wrong window type");
3047         }
3048
3049         return result;
3050 }
3051
3052 #ifndef MODEST_TOOLKIT_HILDON2
3053 static gboolean
3054 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
3055 {
3056         GtkWidget *folder_view = NULL;
3057         TnyFolderStore *folder = NULL;
3058         ModestEmailClipboard *clipboard = NULL;
3059         const gchar *folder_name = NULL;
3060         gboolean result = FALSE;
3061
3062         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
3063
3064         /*Get current parent folder */
3065         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
3066                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3067         /* If no folder view, always dimmed */
3068         if (!folder_view) return FALSE;
3069
3070         /* Get selected folder as parent of new folder to create */
3071         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
3072         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
3073
3074         /* get modest clipboard and source folder */
3075         clipboard = modest_runtime_get_email_clipboard ();
3076         folder_name = modest_email_clipboard_get_folder_name (clipboard);
3077         if (folder_name == NULL) goto frees;
3078
3079         /* Check source subfolders names */
3080         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
3081                                                             TRUE);
3082
3083         /* Free */
3084  frees:
3085         if (folder != NULL) 
3086                 g_object_unref (folder);
3087
3088
3089         return result;
3090 }
3091 #endif
3092
3093 static gboolean
3094 _all_msgs_in_sending_status (ModestHeaderView *header_view)
3095 {
3096         GtkTreeModel *model;
3097         GtkTreeIter iter;
3098         gboolean all_sending = TRUE;
3099
3100         model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
3101         if (gtk_tree_model_get_iter_first (model, &iter)) {
3102                 do {
3103                         TnyHeader *header;
3104
3105                         gtk_tree_model_get (model, &iter,
3106                                             TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
3107                                             &header,
3108                                             -1);
3109
3110                         if (header) {
3111                                 if (modest_tny_all_send_queues_get_msg_status (header) !=
3112                                     MODEST_TNY_SEND_QUEUE_SENDING)
3113                                         all_sending = FALSE;
3114                                 g_object_unref (header);
3115                         }
3116
3117                 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
3118         }
3119         return all_sending;
3120 }
3121
3122 gboolean 
3123 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
3124                                            gpointer user_data)
3125 {
3126         ModestDimmingRule *rule = NULL;
3127
3128         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3129         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3130         rule = MODEST_DIMMING_RULE (user_data);
3131
3132         /* Check dimmed rule */ 
3133         return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
3134 }
3135
3136 gboolean
3137 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
3138                                          gpointer user_data)
3139 {
3140         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3141
3142         ModestMsgEditFormat format =
3143           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
3144
3145         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
3146 }
3147
3148 static gboolean 
3149 _send_receive_in_progress (ModestWindow *win)
3150 {
3151         ModestMailOperationQueue *queue;
3152         GSList *op_list, *node;
3153         gboolean found_send_receive;
3154
3155         queue = modest_runtime_get_mail_operation_queue ();
3156         op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
3157
3158         found_send_receive = FALSE;
3159         for (node = op_list; node != NULL; node = g_slist_next (node)) {
3160                 ModestMailOperation *op;
3161
3162                 op = (ModestMailOperation *) node->data;
3163                 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
3164                         found_send_receive = TRUE;
3165                         break;
3166                 }
3167         }
3168
3169         if (op_list) {
3170                 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
3171                 g_slist_free (op_list);
3172         }
3173
3174         return found_send_receive;
3175 }
3176
3177 static gboolean
3178 _msgs_send_in_progress (void)
3179 {
3180         ModestCacheMgr *cache_mgr;
3181         GHashTable *send_queue_cache;
3182         ModestTnySendQueue *send_queue;
3183         GSList *send_queues = NULL, *node = NULL;
3184         gboolean found = FALSE;
3185
3186         cache_mgr = modest_runtime_get_cache_mgr ();
3187         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
3188                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
3189
3190         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
3191
3192         for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
3193                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
3194
3195                 /* Check if msg uid is being processed inside send queue */
3196                 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
3197                         found = TRUE;
3198                         break;
3199                 }
3200         }
3201
3202         g_slist_free (send_queues);
3203
3204         return found;
3205 }
3206
3207 /*****************************************************************************/
3208 /********************** HILDON2 only dimming rules ***************************/
3209 /*****************************************************************************/
3210
3211 #ifdef MODEST_TOOLKIT_HILDON2
3212 gboolean 
3213 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
3214 {
3215         ModestDimmingRule *rule = NULL;
3216         gboolean dimmed = FALSE;
3217
3218         g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
3219         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3220         rule = MODEST_DIMMING_RULE (user_data);
3221
3222         /* Check dimmed rule */ 
3223         dimmed = _transfer_mode_enabled (win);
3224         if (dimmed)
3225                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3226
3227         if (!dimmed)
3228                 dimmed = _forbid_outgoing_xfers (win);
3229
3230         if (!dimmed) {
3231                 GtkWidget *header_view;
3232                 TnyFolder *folder;
3233
3234                 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
3235                 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
3236                 if (folder) {
3237                         dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
3238                                 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
3239
3240                         if (!dimmed &&
3241                             (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
3242                                 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
3243                         }
3244                         g_object_unref (folder);
3245                 }
3246         }
3247
3248         return dimmed;
3249 }
3250
3251 gboolean 
3252 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
3253 {
3254         ModestDimmingRule *rule = NULL;
3255         gboolean dimmed = FALSE;
3256
3257         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3258         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3259         rule = MODEST_DIMMING_RULE (user_data);
3260
3261         /* Check dimmed rule */ 
3262         dimmed = _transfer_mode_enabled (win);
3263         if (dimmed)
3264                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3265
3266         if (!dimmed)
3267                 dimmed = _forbid_outgoing_xfers (win);
3268
3269         if (!dimmed && MODEST_IS_FOLDER_WINDOW (win)) {
3270                 ModestFolderView *folder_view;
3271                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3272                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3273                                                                        MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
3274         }
3275
3276         if (!dimmed) {
3277                 dimmed = _transfer_mode_enabled (win);
3278                 if (dimmed)
3279                         modest_dimming_rule_set_notification (rule, "");
3280         }
3281
3282         return dimmed;
3283 }
3284
3285 gboolean 
3286 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
3287 {
3288         ModestDimmingRule *rule = NULL;
3289         gboolean dimmed = FALSE;
3290
3291         g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3292         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3293         rule = MODEST_DIMMING_RULE (user_data);
3294
3295         /* Check dimmed rule */ 
3296         dimmed = _transfer_mode_enabled (win);
3297         if (dimmed)
3298                 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3299
3300         if (MODEST_IS_FOLDER_WINDOW (win)) {
3301                 ModestFolderView *folder_view;
3302                 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3303                 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3304                                                                        MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
3305         }
3306
3307         if (!dimmed) {
3308                 dimmed = _transfer_mode_enabled (win);
3309                 if (dimmed)
3310                         modest_dimming_rule_set_notification (rule, "");
3311         }
3312
3313         return dimmed;
3314 }
3315
3316 gboolean
3317 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
3318 {
3319         return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);
3320 }
3321 #endif