cebe0239f995bc1f49982b4d07c1e2c67b874425
[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                 dimmed = modest_email_clipboard_cleared (e_clipboard) && 
1519                         (modest_msg_edit_window_get_clipboard_text(MODEST_MSG_EDIT_WINDOW (win)) == NULL) &&
1520                         !gtk_clipboard_wait_is_text_available(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
1521         }
1522         
1523         return dimmed;
1524 }
1525
1526 gboolean 
1527 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1528 {
1529         ModestDimmingRule *rule = NULL;
1530         const DimmedState *state = NULL;
1531         gboolean dimmed = FALSE;
1532         
1533         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1534         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1535         rule = MODEST_DIMMING_RULE (user_data);
1536         state = modest_window_get_dimming_state (win);
1537
1538         if (!dimmed) {
1539                 TnyList *selected_attachments = NULL;
1540                 gint n_att_selected = 0;
1541                 GtkWidget *attachments_view;
1542                 attachments_view = modest_msg_edit_window_get_child_widget (
1543                         MODEST_MSG_EDIT_WINDOW (win),
1544                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1545                 
1546                 selected_attachments = modest_attachments_view_get_selection (
1547                         MODEST_ATTACHMENTS_VIEW (attachments_view));
1548                 n_att_selected = tny_list_get_length (selected_attachments);
1549                 g_object_unref (selected_attachments);
1550
1551                 dimmed = (n_att_selected != 1);
1552         }
1553         
1554         return dimmed;
1555 }
1556
1557 gboolean 
1558 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1559 {
1560         ModestDimmingRule *rule = NULL;
1561         const DimmedState *state = NULL;
1562         gboolean dimmed = FALSE;
1563         
1564         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1565         g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1566         rule = MODEST_DIMMING_RULE (user_data);
1567         state = modest_window_get_dimming_state (win);
1568
1569         if (!dimmed) {
1570                 GtkWidget *subject_field, *body_field;
1571                 GtkTextBuffer *body_buffer;
1572                 const gchar *subject = NULL;
1573                 body_field = modest_msg_edit_window_get_child_widget (
1574                         MODEST_MSG_EDIT_WINDOW (win),
1575                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1576                 subject_field = modest_msg_edit_window_get_child_widget (
1577                         MODEST_MSG_EDIT_WINDOW (win),
1578                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT);
1579                 body_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (body_field));
1580                 subject = gtk_entry_get_text (GTK_ENTRY (subject_field));
1581
1582                 dimmed = ((subject == NULL || subject[0] == '\0')
1583                           || (gtk_text_buffer_get_char_count(body_buffer) == 0));
1584                 if (dimmed)
1585                         modest_dimming_rule_set_notification (rule, _("mcen_ib_subject_or_body_not_modified"));
1586         }
1587                
1588         if (!dimmed) {
1589                 GtkWidget *to_field, *cc_field, *bcc_field;
1590                 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1591                 cc_field = modest_msg_edit_window_get_child_widget (
1592                         MODEST_MSG_EDIT_WINDOW (win),
1593                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1594                 to_field = modest_msg_edit_window_get_child_widget (
1595                         MODEST_MSG_EDIT_WINDOW (win),
1596                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1597                 bcc_field = modest_msg_edit_window_get_child_widget (
1598                         MODEST_MSG_EDIT_WINDOW (win),
1599                         MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1600                 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1601                 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1602                 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1603
1604                 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1605                            gtk_text_buffer_get_char_count (cc_buffer) +
1606                            gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1607                 if (dimmed)
1608                         modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1609         }
1610         
1611         return dimmed;
1612 }
1613
1614 gboolean 
1615 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1616 {
1617         ModestDimmingRule *rule = NULL;
1618         gboolean dimmed = FALSE;
1619         
1620         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1621         rule = MODEST_DIMMING_RULE (user_data);
1622
1623         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1624
1625         /* Check dimmed rule */
1626         if (!dimmed) {
1627                 dimmed = _transfer_mode_enabled (win);
1628                 if (dimmed)
1629                         modest_dimming_rule_set_notification (
1630                                         rule, _("mail_ib_notavailable_downloading"));
1631         }
1632         if (!dimmed) {
1633                 dimmed = modest_msg_view_window_first_message_selected (
1634                                 MODEST_MSG_VIEW_WINDOW(win));
1635                 modest_dimming_rule_set_notification (rule, NULL);
1636         }
1637
1638         return dimmed;
1639 }
1640
1641 gboolean 
1642 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1643 {
1644         ModestDimmingRule *rule = NULL;
1645         gboolean dimmed = FALSE;
1646
1647         g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1648         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1649         rule = MODEST_DIMMING_RULE (user_data);
1650
1651         /* Check dimmed rule */ 
1652         if (!dimmed) {
1653                 dimmed = _transfer_mode_enabled (win);                  
1654                 if (dimmed)
1655                         modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1656         }
1657         if (!dimmed) {
1658                 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1659                 modest_dimming_rule_set_notification (rule, NULL);
1660         }               
1661
1662         return dimmed;
1663 }
1664
1665
1666 gboolean 
1667 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1668 {
1669         const gboolean dimmed = 
1670                 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1671                         TRUE);  
1672                 
1673         return dimmed;
1674 }
1675
1676 gboolean 
1677 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1678 {
1679         ModestDimmingRule *rule = NULL;
1680         TnyFolderType types[1];
1681         const DimmedState *state = NULL;
1682         gboolean dimmed = FALSE;
1683
1684         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1685         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1686         rule = MODEST_DIMMING_RULE (user_data);
1687         state = modest_window_get_dimming_state (win);
1688
1689         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
1690
1691         /* Check dimmed rules */        
1692         if (!dimmed) {
1693                 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1694                 if (dimmed) 
1695                         modest_dimming_rule_set_notification (rule, "");
1696         }
1697         if (!dimmed) {
1698                 dimmed = !_sending_in_progress (win);
1699                 if (dimmed)
1700                         modest_dimming_rule_set_notification (rule, "");
1701         }
1702
1703         return dimmed;
1704 }
1705
1706 gboolean 
1707 modest_ui_dimming_rules_on_csm_cancel_sending (ModestWindow *win, gpointer user_data)
1708 {
1709         ModestDimmingRule *rule = NULL;
1710         TnyFolderType types[1];
1711         const DimmedState *state = NULL;
1712         gboolean dimmed = FALSE;
1713
1714         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1715         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1716         rule = MODEST_DIMMING_RULE (user_data);
1717         state = modest_window_get_dimming_state (win);
1718
1719         types[0] = TNY_FOLDER_TYPE_OUTBOX; 
1720
1721         /* Check dimmed rules */        
1722         if (!dimmed) {
1723                 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1724                 if (dimmed) 
1725                         modest_dimming_rule_set_notification (rule, "");
1726         }
1727         if (!dimmed) {
1728                 dimmed = !_sending_in_progress (win);
1729                 if (dimmed)
1730                         modest_dimming_rule_set_notification (rule, "");
1731         }
1732
1733         return dimmed;
1734 }
1735
1736 gboolean 
1737 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1738 {
1739         ModestDimmingRule *rule = NULL;
1740         gboolean dimmed = FALSE;
1741         
1742         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1743         rule = MODEST_DIMMING_RULE (user_data);
1744  
1745         /* Check dimmed rule */ 
1746         if (!dimmed) {
1747                 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), 
1748                                                           TRUE);        
1749                 if (dimmed)
1750                         modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1751         }
1752
1753         return dimmed;
1754 }
1755
1756 gboolean 
1757 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1758 {
1759         ModestDimmingRule *rule = NULL;
1760         gboolean dimmed = FALSE;
1761         
1762         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1763         rule = MODEST_DIMMING_RULE (user_data);
1764  
1765         /* Check dimmed rule */ 
1766         if (!dimmed) {
1767                 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1768                 if (g_slist_length (account_names) <= 1)
1769                         dimmed = TRUE;
1770                 if (dimmed)
1771                         modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1772                 
1773                 modest_account_mgr_free_account_names (account_names);
1774         }
1775
1776         return dimmed;
1777 }
1778
1779 gboolean
1780 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1781 {
1782         ModestDimmingRule *rule = NULL;
1783         gboolean dimmed = FALSE;
1784         GtkWidget *focused = NULL;
1785
1786         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1787         rule = MODEST_DIMMING_RULE (user_data);
1788         focused = gtk_window_get_focus (GTK_WINDOW (win));
1789
1790         dimmed = !focused;
1791
1792         if (!dimmed) {
1793                 gchar *selection = NULL;
1794                 if (GTK_IS_TEXT_VIEW (focused)) {
1795                         GtkTextIter start, end;
1796                         GtkTextBuffer *buffer = NULL;
1797                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1798                         if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
1799                                 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1800                         }
1801                 } else if (GTK_IS_LABEL (focused)) {
1802                         gint start, end;
1803                         if (gtk_label_get_selection_bounds (GTK_LABEL (focused), &start, &end)) {
1804                                 const gchar *start_offset;
1805                                 start_offset = gtk_label_get_text (GTK_LABEL (focused));
1806                                 start_offset = g_utf8_offset_to_pointer (start_offset, start);
1807                                 selection = g_new0 (gchar, end - start + 1);
1808                                 g_utf8_strncpy (selection, start_offset, end - start);
1809                         }
1810                 } else {
1811                         gboolean do_check = TRUE;
1812                         GtkClipboard *clipboard;
1813                         if (GTK_IS_HTML (focused)) {
1814                                 const gchar *sel;
1815                                 int len = -1;
1816                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1817                                 do_check = !((sel == NULL) || (sel[0] == '\0'));
1818                         }
1819                         if (do_check) {
1820                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1821                                 selection = gtk_clipboard_wait_for_text (clipboard);
1822                         } else {
1823                                 selection = NULL;
1824                         }
1825                 }
1826                 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1827         }
1828
1829         return dimmed;
1830 }
1831
1832 /* *********************** static utility functions ******************** */
1833
1834
1835 static gboolean
1836 _selected_folder_not_writeable (ModestMainWindow *win,
1837                                 gboolean for_paste)
1838 {
1839         GtkWidget *folder_view = NULL;
1840         TnyFolderStore *parent_folder = NULL;
1841         ModestEmailClipboard *clipboard = NULL;
1842         ModestTnyFolderRules rules;
1843         gboolean is_local_acc = FALSE;
1844         gboolean xfer_folders = FALSE;
1845         gboolean result = FALSE;
1846
1847         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1848
1849         /* Get folder view */
1850         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1851                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1852         /* If no folder view, always dimmed */
1853         if (!folder_view)
1854                 return TRUE;
1855         
1856         /* Get selected folder as parent of new folder to create */
1857         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1858         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1859                 /* If it's the local account and its transfering folders, then do not dim */            
1860                 if (TNY_IS_ACCOUNT (parent_folder)) {
1861                         is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
1862                         if (for_paste) {
1863                                 clipboard = modest_runtime_get_email_clipboard ();
1864                                 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
1865                         }
1866                 }
1867
1868                 if (for_paste) 
1869                         result = !(is_local_acc && xfer_folders); 
1870                 else
1871                         result = !is_local_acc;
1872                 goto frees;             
1873         }
1874         
1875         /* Check dimmed rule */ 
1876         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1877         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1878
1879         /* free */
1880  frees:
1881         if (parent_folder != NULL)
1882                 g_object_unref (parent_folder);
1883
1884         return result;
1885 }
1886
1887 static gboolean
1888 _selected_folder_not_deletable (ModestMainWindow *win)
1889 {
1890         GtkWidget *folder_view = NULL;
1891         TnyFolderStore *parent_folder = NULL;
1892         ModestTnyFolderRules rules;
1893         gboolean result = FALSE;
1894
1895         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1896
1897         /* Get folder view */
1898         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1899                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1900         /* If no folder view, always dimmed */
1901         if (!folder_view)
1902                 return TRUE;
1903         
1904         /* Get selected folder as parent of new folder to create */
1905         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1906         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1907                 result = TRUE;
1908                 goto frees;             
1909         }
1910         
1911         /* Check dimmed rule */ 
1912         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1913         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
1914
1915         /* free */
1916  frees:
1917         if (parent_folder != NULL)
1918                 g_object_unref (parent_folder);
1919
1920         return result;
1921 }
1922
1923 static gboolean
1924 _selected_folder_not_moveable (ModestMainWindow *win)
1925 {
1926         GtkWidget *folder_view = NULL;
1927         TnyFolderStore *parent_folder = NULL;
1928         ModestTnyFolderRules rules;
1929         gboolean result = FALSE;
1930
1931         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1932
1933         /* Get folder view */
1934         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1935                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1936         /* If no folder view, always dimmed */
1937         if (!folder_view)
1938                 return TRUE;
1939         
1940         /* Get selected folder as parent of new folder to create */
1941         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1942         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1943                 result = TRUE;
1944                 goto frees;             
1945         }
1946         
1947         /* Check dimmed rule */ 
1948         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1949         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
1950
1951         /* free */
1952  frees:
1953         if (parent_folder != NULL)
1954                 g_object_unref (parent_folder);
1955
1956         return result;
1957 }
1958
1959 static gboolean
1960 _selected_folder_not_renameable (ModestMainWindow *win)
1961 {
1962         GtkWidget *folder_view = NULL;
1963         TnyFolderStore *parent_folder = NULL;
1964         ModestTnyFolderRules rules;
1965         gboolean result = FALSE;
1966
1967         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1968
1969         /* Get folder view */
1970         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1971                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1972         /* If no folder view, always dimmed */
1973         if (!folder_view)
1974                 return TRUE;
1975         
1976         /* Get selected folder as parent of new folder to create */
1977         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1978         if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1979                 result = TRUE;
1980                 goto frees;             
1981         }
1982         
1983         /* Check dimmed rule */ 
1984         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1985         result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
1986
1987         /* free */
1988  frees:
1989         if (parent_folder != NULL)
1990                 g_object_unref (parent_folder);
1991
1992         return result;
1993 }
1994
1995 static gboolean
1996 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1997 {
1998         TnyFolderType types[2];
1999         gboolean result = FALSE;
2000
2001         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2002
2003         types[0] = TNY_FOLDER_TYPE_ROOT; 
2004         types[1] = TNY_FOLDER_TYPE_INBOX; 
2005
2006         /* Check folder type */
2007         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2008
2009         /* Check pop and MMC accounts */
2010         if (!result) {
2011                 result = _selected_folder_is_MMC_or_POP_root (win);
2012         }
2013                 
2014         return result;
2015 }
2016
2017
2018 static gboolean
2019 _selected_folder_is_root (ModestMainWindow *win)
2020 {
2021         TnyFolderType types[1];
2022         gboolean result = FALSE;
2023
2024         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2025
2026         /* All accounts are root items: */
2027         GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2028                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2029         if (folder_view) {                                      
2030                 gboolean is_account = FALSE;
2031                 TnyFolderStore *folder_store = 
2032                         modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2033                 if (folder_store) {
2034                         is_account = TNY_IS_ACCOUNT (folder_store);
2035                         g_object_unref (folder_store);
2036                         folder_store = NULL;
2037                 }
2038                 
2039                 if (is_account)
2040                         return TRUE;
2041         }
2042                 
2043         /* Try something more precise: */
2044         types[0] = TNY_FOLDER_TYPE_ROOT; 
2045
2046         /* Check folder type */
2047         result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2048                 
2049         /* Check pop and MMC accounts */
2050         if (!result) {
2051                 result = _selected_folder_is_MMC_or_POP_root (win);
2052         }
2053
2054         return result;
2055 }
2056
2057 static gboolean
2058 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
2059 {
2060         GtkWidget *folder_view = NULL;
2061         TnyFolderStore *parent_folder = NULL;
2062         gboolean result = FALSE;
2063
2064         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2065                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2066         if (!folder_view)
2067                 return FALSE;
2068
2069         /* Get selected folder as parent of new folder to create */
2070         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2071         if (!parent_folder)
2072                 return TRUE;
2073         
2074         if (TNY_IS_ACCOUNT (parent_folder)) {
2075                 /* If it's the local account then do not dim */
2076                 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
2077                         result = FALSE;
2078                 } else {
2079                                 /* If it's the MMC root folder then dim it */
2080                         if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
2081                                         result = TRUE;
2082                         } else {
2083                                 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
2084                                 /* If it's POP then dim */
2085                                 result = (modest_protocol_info_get_transport_store_protocol (proto_str) == 
2086                                                   MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
2087                         }
2088                 }
2089         }
2090         g_object_unref (parent_folder);
2091
2092         return result;
2093 }
2094
2095 static gboolean
2096 _header_view_is_all_selected (ModestMainWindow *win)
2097 {
2098         const DimmedState *state = NULL;
2099
2100         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2101
2102         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2103
2104         return state->all_selected;
2105 }
2106
2107 static gboolean
2108 _selected_folder_is_empty (ModestMainWindow *win)
2109 {
2110         GtkWidget *folder_view = NULL;
2111         TnyFolderStore *folder = NULL;
2112         gboolean result = FALSE;
2113
2114         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2115
2116         /* Get folder view */
2117         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2118                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2119         /* If no folder view, always dimmed */
2120         if (!folder_view)
2121                 return TRUE;
2122         
2123         /* Get selected folder as parent of new folder to create */
2124         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2125         if (!(folder && TNY_IS_FOLDER(folder))) {
2126                 if (folder)
2127                         g_object_unref (folder);
2128                 return TRUE;
2129         }
2130         
2131         /* Check folder type */
2132         result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
2133
2134         /* free */
2135         g_object_unref (folder);
2136
2137         return result;
2138 }
2139
2140 static gboolean
2141 _folder_view_has_focus (ModestWindow *win)
2142 {
2143         GtkWidget *folder_view = NULL;
2144
2145         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2146
2147         /* Get folder view */
2148         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2149                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2150         if (!folder_view)
2151                 return FALSE;
2152         
2153         if (gtk_widget_is_focus(folder_view))
2154                 return TRUE;
2155
2156         return FALSE;
2157 }
2158
2159 static gboolean
2160 _selected_folder_is_same_as_source (ModestWindow *win)
2161 {
2162         ModestEmailClipboard *clipboard = NULL;
2163         GtkWidget *folder_view = NULL;
2164         TnyFolderStore *folder = NULL;
2165         gboolean result = FALSE;
2166
2167         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2168
2169         /* Get folder view */
2170         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2171                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2172         if (!folder_view)
2173                 return FALSE;
2174         
2175         /* Get selected folder as destination folder */
2176         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2177         if (!(folder && TNY_IS_FOLDER(folder))) {
2178                 result = FALSE;
2179                 goto frees;
2180         }
2181         
2182         /* Check clipboard is cleared */
2183         clipboard = modest_runtime_get_email_clipboard ();
2184         if (modest_email_clipboard_cleared (clipboard)) {
2185                 result = FALSE;
2186                 goto frees;
2187         }
2188                 
2189         /* Check source folder */
2190         result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2191         
2192         /* Free */
2193  frees:
2194         g_object_unref (folder);
2195         
2196         return result;
2197 }
2198
2199 static gboolean
2200 _selected_folder_is_any_of_type (ModestWindow *win,
2201                                  TnyFolderType types[], 
2202                                  guint ntypes)
2203 {
2204         GtkWidget *folder_view = NULL;
2205         TnyFolderStore *folder = NULL;
2206         TnyFolderType folder_type;
2207         guint i=0;
2208         gboolean result = FALSE;
2209
2210         /*Get current folder */
2211         if (MODEST_IS_MAIN_WINDOW(win)) {
2212
2213                 /* Get folder view */
2214                 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2215                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2216                 /* If no folder view, always dimmed */
2217                 if (!folder_view)
2218                         return FALSE;
2219         
2220                 /* Get selected folder as parent of new folder to create */
2221                 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2222
2223                 if (!(folder && TNY_IS_FOLDER(folder))) {
2224                         if (folder)
2225                                 g_object_unref (folder);
2226                         return FALSE;
2227                 }
2228                 
2229                 /* Check folder type */
2230                 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2231         }
2232         else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2233                 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2234                 for (i=0; i < ntypes; i++) {
2235                         result = result || folder_type == types[i];
2236                 }
2237         }
2238
2239
2240         /* free */
2241         g_object_unref (folder);
2242
2243         return result;  
2244 }
2245
2246 static gboolean
2247 _folder_is_any_of_type (TnyFolder *folder,
2248                         TnyFolderType types[], 
2249                         guint ntypes)
2250 {
2251         TnyFolderType folder_type;
2252         gboolean result = FALSE;
2253         guint i;
2254
2255         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2256
2257         /* Get folder type */
2258         folder_type = modest_tny_folder_guess_folder_type (folder);
2259         if (folder_type == TNY_FOLDER_TYPE_INVALID)
2260                 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2261         
2262         /* Check foler type */
2263         for (i=0; i < ntypes; i++) {
2264                 result = result || folder_type == types[i];
2265         }
2266
2267         return result;
2268 }
2269
2270 static gboolean
2271 _clipboard_is_empty (ModestWindow *win)
2272 {
2273         gboolean result = FALSE;
2274         
2275         if (MODEST_IS_MAIN_WINDOW (win)) {
2276                 ModestEmailClipboard *clipboard = NULL;
2277                 clipboard = modest_runtime_get_email_clipboard ();
2278                 if (modest_email_clipboard_cleared (clipboard)) 
2279                  result = TRUE;  
2280         }
2281
2282         return result;
2283 }
2284
2285 static gboolean
2286 _invalid_clipboard_selected (ModestWindow *win,
2287                              ModestDimmingRule *rule) 
2288 {
2289         const DimmedState *state = NULL;
2290         gboolean result = FALSE;
2291         GtkWidget *focused = NULL;
2292
2293         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2294         state = modest_window_get_dimming_state (win);
2295         /* Get focuesed widget */
2296         focused = gtk_window_get_focus (GTK_WINDOW (win));
2297
2298         if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2299                 gboolean has_selection = FALSE;
2300                 if (GTK_IS_TEXT_VIEW (focused)) {
2301                         GtkTextBuffer *buffer = NULL;
2302                         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2303                         has_selection = gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (buffer));
2304                 } else if (GTK_IS_EDITABLE (focused)) {
2305                         has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2306                 }
2307                 result = !has_selection;
2308         } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2309                 if (focused) {
2310                         MODEST_DEBUG_BLOCK (g_message ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2311                         if (GTK_IS_LABEL (focused) && 
2312                             !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2313                                 result = TRUE;
2314                         } else if (GTK_IS_TEXT_VIEW (focused)) {
2315                                 GtkTextBuffer *buffer;
2316                                 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2317                                 result = !gtk_text_buffer_get_has_selection (buffer);
2318                         } else if (GTK_IS_HTML (focused)) {
2319                                 const gchar *sel;
2320                                 int len = -1;
2321                                 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2322                                 result = ((sel == NULL) || (sel[0] == '\0'));
2323                         } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2324                                 result = TRUE;
2325                         } else {
2326                                 GtkClipboard *clipboard;
2327                                 gchar *selection;
2328
2329                                 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2330                                 /* Get clipboard selection*/
2331                                 selection = gtk_clipboard_wait_for_text (clipboard);
2332                                 /* Check dimming */
2333                                 result = (selection == NULL);
2334                                 g_free (selection);
2335                         } 
2336                 } else {
2337                         result = TRUE;
2338                 }
2339                 
2340                 if (result)
2341                         modest_dimming_rule_set_notification (rule, "");
2342                 
2343         }               
2344         else if (MODEST_IS_MAIN_WINDOW (win)) {
2345                 /* Check dimming */
2346                 result = state->n_selected == 0;
2347                 if (result)
2348                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));                  
2349         }
2350         
2351         return result;
2352 }
2353
2354
2355 static gboolean
2356 _invalid_attach_selected (ModestWindow *win,
2357                           gboolean unique,
2358                           gboolean for_view,
2359                           gboolean for_remove,
2360                           ModestDimmingRule *rule) 
2361 {
2362         TnyList *attachments;
2363         gint n_selected;
2364         TnyHeaderFlags flags;
2365         gboolean nested_attachments = FALSE;
2366         gboolean selected_messages = FALSE;
2367         const DimmedState *state = NULL;
2368         gboolean result = FALSE;
2369
2370         g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2371         state = modest_window_get_dimming_state (win);
2372
2373         if (MODEST_IS_MAIN_WINDOW (win)) {
2374                 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2375                 if (!result)
2376                         result = !state->any_has_attachments;
2377         }
2378         else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2379                 
2380                 /* Get selected atachments */
2381                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2382                 n_selected = tny_list_get_length (attachments);
2383
2384                 /* Check unique */              
2385                 if (!result) {
2386                         if (unique) 
2387                                 result = n_selected != 1;
2388                         else
2389                                 
2390                                 result = n_selected < 1;
2391                 }
2392                 
2393                 /* Check attached type (view operation not required) */
2394                 if (!result && !for_view)  {
2395                         TnyIterator *iter;
2396                         iter = tny_list_create_iterator (attachments);
2397                         while (!tny_iterator_is_done (iter) && !result) {
2398                                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2399                                 TnyList *nested_list = tny_simple_list_new ();
2400                                 if (!for_remove && TNY_IS_MSG (mime_part)) {
2401                                         selected_messages = TRUE;
2402                                         result = TRUE;
2403                                 }
2404                                 tny_mime_part_get_parts (mime_part, nested_list);
2405                                 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2406                                         nested_attachments = TRUE;
2407                                         result = TRUE;
2408                                 }
2409                                 g_object_unref (nested_list);
2410                                 g_object_unref (mime_part);
2411                                 tny_iterator_next (iter);
2412                         }
2413                         g_object_unref (iter);
2414                 }
2415                 
2416                 /* Set notifications */
2417                 if (result && rule != NULL) {
2418                         if (selected_messages) {
2419                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2420                         } else if (nested_attachments) {
2421                                 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2422                         } else if (n_selected == 0) {
2423                                 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2424                         } else if (unique) {
2425                                 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2426                         }
2427                 }
2428                 
2429                 /* Free */
2430                 g_object_unref (attachments);
2431         }
2432
2433         return result;
2434 }
2435
2436 static gboolean
2437 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule) 
2438 {
2439         TnyList *attachments = NULL;
2440         TnyIterator *iter;
2441         gint purged = 0;
2442         gint n_attachments = 0;
2443         gboolean result = FALSE;
2444
2445         /* This should check if _all_ the attachments are already purged. If only some
2446          * of them are purged, then it does not cause dim as there's a confirmation dialog
2447          * for removing only local attachments */
2448
2449         /* Get selected atachments */
2450         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2451                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2452         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2453                 /* If we're in main window, we won't know if there are already purged attachments */
2454                 return FALSE;
2455         }
2456
2457         if (attachments == NULL)
2458                 return FALSE;
2459
2460         if (tny_list_get_length (attachments)) {
2461                 g_object_unref (attachments);
2462                 return FALSE;
2463         }
2464
2465         iter = tny_list_create_iterator (attachments);
2466         while (!tny_iterator_is_done (iter)) {
2467                 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2468                 if (tny_mime_part_is_purged (mime_part)) {
2469                         purged++;
2470                 }
2471                 n_attachments++;
2472                 g_object_unref (mime_part);
2473                 tny_iterator_next (iter);
2474         }
2475         g_object_unref (iter);
2476                 
2477         /* Free */
2478         g_object_unref (attachments);
2479
2480         if (all)
2481                 result = (purged == n_attachments);
2482         else
2483                 result = (purged > 0);
2484
2485         /* This string no longer exists, refer to NB#75415 for more info
2486         if (result && (rule != NULL))
2487                 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2488         */
2489
2490         return result;
2491 }
2492
2493 static gboolean
2494 _invalid_msg_selected (ModestMainWindow *win,
2495                        gboolean unique,
2496                        ModestDimmingRule *rule) 
2497 {
2498         GtkWidget *folder_view = NULL;
2499         const DimmedState *state = NULL;
2500         gboolean result = FALSE;
2501
2502         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2503         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2504         state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2505                 
2506         /* Get folder view to check focus */
2507         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2508                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2509
2510         /* Check dimmed rule (TODO: check focus on widgets */   
2511         if (!result) {
2512                 result = ((state->n_selected == 0 ) ||
2513                           (gtk_widget_is_focus (folder_view)));
2514                 if (result)
2515                         modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2516         }
2517         if (!result && unique) {
2518                 result = state->n_selected > 1;
2519                 if (result)
2520                         modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2521         }
2522
2523         return result;
2524 }
2525
2526
2527 static gboolean
2528 _msg_download_in_progress (ModestWindow *win)
2529 {
2530         gboolean result = FALSE;
2531
2532         g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2533
2534         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2535                 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2536         }
2537         else if (MODEST_IS_MAIN_WINDOW (win)) {
2538                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2539         }
2540
2541         return result;
2542 }
2543
2544 static gboolean
2545 _msg_download_completed (ModestMainWindow *win)
2546 {
2547         const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2548         return state->any_marked_as_cached;
2549 }
2550
2551 static void 
2552 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2553 {
2554         GSList **send_queues = (GSList **) userdata;
2555         *send_queues = g_slist_prepend (*send_queues, value);
2556 }
2557
2558 static gboolean
2559 _selected_msg_sent_in_progress (ModestWindow *win)
2560 {
2561         const DimmedState *state = modest_window_get_dimming_state (win);
2562         return state->sent_in_progress;
2563 }
2564
2565
2566 static gboolean
2567 _sending_in_progress (ModestWindow *win)
2568 {
2569         GHashTable *send_queue_cache = NULL;
2570         ModestCacheMgr *cache_mgr = NULL;
2571         ModestTnySendQueue *send_queue = NULL;
2572         GSList *send_queues = NULL, *node = NULL;
2573         gboolean result = FALSE;
2574         
2575         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
2576         
2577         /* Get send queue */
2578         cache_mgr = modest_runtime_get_cache_mgr ();
2579         send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
2580                                                        MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
2581         
2582         g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
2583         
2584         for (node = send_queues; node != NULL && !result; node = g_slist_next (node)) {
2585                 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
2586                 
2587                 /* Check if send operation is in progress */
2588                 result = modest_tny_send_queue_sending_in_progress (send_queue);
2589         }
2590        
2591         return result;
2592 }
2593
2594 static gboolean
2595 _invalid_folder_for_purge (ModestWindow *win, 
2596                            ModestDimmingRule *rule)
2597 {
2598         TnyFolder *folder = NULL;
2599         TnyAccount *account = NULL;
2600         gboolean result = FALSE;
2601
2602         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2603
2604                 /* Get folder and account of message */
2605                 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2606                 g_return_val_if_fail(msg != NULL, TRUE);                        
2607                 folder = tny_msg_get_folder (msg);      
2608                 g_object_unref (msg);
2609                 if (folder == NULL) {
2610                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2611                         goto frees;
2612                 }
2613         } else if (MODEST_IS_MAIN_WINDOW (win)) {
2614                 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2615                                                                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2616                 if (!folder_view)
2617                         return FALSE;
2618                 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
2619                 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2620                         goto frees;             
2621         } else {
2622                 g_return_val_if_reached (FALSE);
2623         }
2624         account = modest_tny_folder_get_account (folder);
2625         if (account == NULL) goto frees;                        
2626                 
2627         /* Check account */
2628         if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2629                 TnyFolderType types[2];
2630                 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2631                 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2632                 
2633                 if (_selected_folder_is_any_of_type (win, types, 2)) {
2634                         result = TRUE;
2635                         modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
2636                 } else {
2637                         result = FALSE;
2638                 }
2639         } else {
2640                 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2641                 /* If it's POP then dim */
2642                 if (modest_protocol_info_get_transport_store_protocol (proto_str) == 
2643                     MODEST_PROTOCOL_STORE_POP) {
2644                         TnyList *attachments = NULL;
2645                         gint n_selected = 0;
2646                         result = TRUE;
2647                         
2648                         /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
2649                          * murrayc */
2650                         if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2651                                 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2652                                 n_selected = tny_list_get_length (attachments);
2653                                 g_object_unref (attachments);
2654                         }
2655                         
2656                         modest_dimming_rule_set_notification (rule, 
2657                                                               ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
2658                                                                         "mail_ib_unable_to_pure_attach_pop_mail_plural", 
2659                                                                         n_selected));
2660                 }
2661         }
2662         
2663 frees:
2664         if (folder != NULL)
2665                 g_object_unref (folder);
2666         if (account != NULL)
2667                 g_object_unref (account);
2668         
2669         return result;
2670 }
2671
2672 static gboolean
2673 _transfer_mode_enabled (ModestWindow *win)
2674 {
2675         gboolean result = FALSE;
2676
2677         /* Check dimming */
2678         if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2679                 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2680         } else if (MODEST_IS_MAIN_WINDOW(win)) {
2681                 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2682         } else {
2683                 g_warning("_transfer_mode_enabled called with wrong window type");
2684         }
2685
2686         return result;
2687 }
2688
2689 static gboolean
2690 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2691 {
2692         GtkWidget *folder_view = NULL;
2693         TnyFolderStore *folder = NULL;
2694         ModestEmailClipboard *clipboard = NULL;
2695         const gchar *folder_name = NULL;
2696         gboolean result = FALSE;
2697
2698         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2699
2700         /*Get current parent folder */
2701         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2702                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2703         /* If no folder view, always dimmed */
2704         if (!folder_view) return FALSE;
2705         
2706         /* Get selected folder as parent of new folder to create */
2707         folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));     
2708         if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
2709         
2710         /* get modest clipboard and source folder */
2711         clipboard = modest_runtime_get_email_clipboard ();
2712         folder_name = modest_email_clipboard_get_folder_name (clipboard);
2713         if (folder_name == NULL) goto frees;
2714
2715         /* Check source subfolders names */
2716         result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
2717                                                             TRUE);
2718                 
2719         /* Free */
2720  frees:
2721         if (folder != NULL) 
2722                 g_object_unref (folder);
2723
2724
2725         return result;
2726 }       
2727
2728 gboolean 
2729 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win, 
2730                                            gpointer user_data)
2731 {
2732         ModestDimmingRule *rule = NULL;
2733         gboolean dimmed = FALSE;
2734
2735         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2736         g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2737         rule = MODEST_DIMMING_RULE (user_data);
2738
2739         /* Check dimmed rule */ 
2740         if (!dimmed) {
2741                 dimmed = !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
2742         }
2743
2744         return dimmed;  
2745 }
2746
2747 gboolean
2748 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
2749                                          gpointer user_data)
2750 {
2751         g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2752
2753         ModestMsgEditFormat format =
2754           modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
2755
2756         return (format != MODEST_MSG_EDIT_FORMAT_HTML);
2757 }