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