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