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