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