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