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