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