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