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