1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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.
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.
32 #endif /*HAVE_CONFIG_H*/
35 #include "modest-ui-dimming-rules.h"
36 #include "modest-dimming-rule.h"
37 #include "modest-tny-folder.h"
38 #include "modest-tny-account.h"
39 #include "modest-text-utils.h"
40 #include <widgets/modest-attachments-view.h>
41 #include <modest-runtime.h>
42 #include <tny-simple-list.h>
45 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
46 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
47 static gboolean _invalid_attach_selected (ModestWindow *win,
48 gboolean unique, gboolean for_view, gboolean for_remove,
49 ModestDimmingRule *rule);
50 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
51 static gboolean _clipboard_is_empty (ModestWindow *win);
52 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
53 /* static gboolean _already_opened_msg (ModestWindow *win, guint *n_messages); */
54 /* static gboolean _selected_msg_marked_as (ModestMainWindow *win, TnyHeaderFlags mask, gboolean opposite, gboolean all); */
55 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
56 static gboolean _selected_folder_is_snd_level (ModestMainWindow *win);
57 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
58 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
59 static gboolean _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win);
60 static gboolean _selected_folder_is_root (ModestMainWindow *win);
61 static gboolean _header_view_is_all_selected (ModestMainWindow *win);
62 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
63 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
64 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
65 static gboolean _msg_download_completed (ModestMainWindow *win);
66 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
67 static gboolean _sending_in_progress (ModestWindow *win);
68 /* static gboolean _message_is_marked_as_deleted (ModestMsgViewWindow *win); */
69 /* static gboolean _selected_message_is_marked_as_deleted (ModestMainWindow *win); */
70 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
71 static gboolean _transfer_mode_enabled (ModestWindow *win);
73 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
77 _define_main_window_dimming_state (ModestMainWindow *window)
79 DimmedState *state = NULL;
80 GtkWidget *focused_widget = NULL;
81 GtkWidget *header_view = NULL;
82 TnyList *selected_headers = NULL;
83 TnyIterator *iter = NULL;
84 TnyHeader *header = NULL;
85 ModestCacheMgr *cache_mgr = NULL;
86 GHashTable *send_queue_cache = NULL;
87 ModestTnySendQueue *send_queue = NULL;
88 GSList *send_queues = NULL, *node = NULL;
89 ModestWindowMgr *mgr = NULL;
90 gboolean found = FALSE;
91 gchar *msg_uid = NULL;
93 gboolean all_deleted = TRUE;
94 gboolean all_seen = TRUE;
95 gboolean all_cached = TRUE;
96 gboolean all_has_attach = TRUE;
98 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
101 state = g_slice_new0 (DimmedState);
102 state->n_selected = 0;
103 state->already_opened_msg = FALSE;
104 state->any_marked_as_deleted = FALSE;
105 state->all_marked_as_deleted = FALSE;
106 state->any_marked_as_seen = FALSE;
107 state->all_marked_as_seen = FALSE;
108 state->any_marked_as_cached = FALSE;
109 state->all_marked_as_cached = FALSE;
110 state->any_has_attachments = FALSE;
111 state->all_has_attachments = FALSE;
112 state->sent_in_progress = FALSE;
114 /* Get focused widget */
115 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
116 if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
119 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
120 header_view = focused_widget;
122 header_view = modest_main_window_get_child_widget (window, MODEST_WIDGET_TYPE_HEADER_VIEW);
125 /* Get header view and selected headers */
126 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
127 if (!selected_headers)
130 /* Examine selected headers */
131 iter = tny_list_create_iterator (selected_headers);
132 while (!tny_iterator_is_done (iter)) {
133 header = TNY_HEADER (tny_iterator_get_current (iter));
134 flags = tny_header_get_flags (header);
140 mgr = modest_runtime_get_window_mgr ();
141 if (!state->already_opened_msg)
142 state->already_opened_msg = modest_window_mgr_find_registered_header (mgr, header, NULL);
145 /* Mark as deleted */
146 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
147 state->all_marked_as_deleted = all_deleted;
148 if (!state->any_marked_as_deleted)
149 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
152 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
153 state->all_marked_as_seen = all_seen;
154 if (!state->any_marked_as_seen)
155 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
158 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
159 state->all_marked_as_cached = all_cached;
160 if (!state->any_marked_as_cached)
161 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
163 /* Mark has_attachments */
164 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
165 state->all_has_attachments = all_has_attach;
166 if (!state->any_has_attachments)
167 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
169 /* sent in progress */
170 msg_uid = modest_tny_send_queue_get_msg_id (header);
171 if (!state->sent_in_progress) {
172 cache_mgr = modest_runtime_get_cache_mgr ();
173 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
174 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
176 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
178 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
179 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
181 /* Check if msg uid is being processed inside send queue */
182 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
184 state->sent_in_progress = found;
187 tny_iterator_next (iter);
188 g_object_unref (header);
193 g_object_unref(selected_headers);
194 g_object_unref(iter);
195 g_slist_free (send_queues);
201 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
203 DimmedState *state = NULL;
204 TnyHeader *header = NULL;
205 ModestCacheMgr *cache_mgr = NULL;
206 GHashTable *send_queue_cache = NULL;
207 ModestTnySendQueue *send_queue = NULL;
208 GSList *send_queues = NULL, *node = NULL;
209 gboolean found = FALSE;
210 gchar *msg_uid = NULL;
211 TnyHeaderFlags flags;
212 gboolean all_deleted = TRUE;
213 gboolean all_seen = TRUE;
214 gboolean all_cached = TRUE;
215 gboolean all_has_attach = TRUE;
217 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
220 state = g_slice_new0 (DimmedState);
221 state->n_selected = 0;
222 state->already_opened_msg = FALSE;
223 state->any_marked_as_deleted = FALSE;
224 state->all_marked_as_deleted = FALSE;
225 state->any_marked_as_seen = FALSE;
226 state->all_marked_as_seen = FALSE;
227 state->any_marked_as_cached = FALSE;
228 state->all_marked_as_cached = FALSE;
229 state->any_has_attachments = FALSE;
230 state->all_has_attachments = FALSE;
231 state->sent_in_progress = FALSE;
233 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
234 g_return_val_if_fail (TNY_IS_HEADER(header), state);
235 flags = tny_header_get_flags (header);
240 /* Mark as deleted */
241 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
242 state->all_marked_as_deleted = all_deleted;
243 if (!state->any_marked_as_deleted)
244 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
247 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
248 state->all_marked_as_seen = all_seen;
249 if (!state->any_marked_as_seen)
250 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
253 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
254 state->all_marked_as_cached = all_cached;
255 if (!state->any_marked_as_cached)
256 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
258 /* Mark has_attachments */
259 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
260 state->all_has_attachments = all_has_attach;
261 if (!state->any_has_attachments)
262 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
264 /* sent in progress */
265 msg_uid = modest_tny_send_queue_get_msg_id (header);
266 if (!state->sent_in_progress) {
267 cache_mgr = modest_runtime_get_cache_mgr ();
268 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
269 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
271 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
273 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
274 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
276 /* Check if msg uid is being processed inside send queue */
277 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
279 state->sent_in_progress = found;
284 g_object_unref (header);
285 g_slist_free (send_queues);
292 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
294 DimmedState *state = NULL;
296 g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
298 if (MODEST_IS_MAIN_WINDOW (window))
299 state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
300 else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
301 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
309 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
311 ModestDimmingRule *rule = NULL;
312 gboolean dimmed = FALSE;
314 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
315 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
316 rule = MODEST_DIMMING_RULE (user_data);
318 /* Check dimmed rule */
320 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
322 modest_dimming_rule_set_notification (rule, "");
329 modest_ui_dimming_rules_on_csm_new_folder (ModestWindow *win, gpointer user_data)
331 ModestDimmingRule *rule = NULL;
332 gboolean dimmed = FALSE;
334 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
335 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
336 rule = MODEST_DIMMING_RULE (user_data);
338 /* Check common new folder menu item dimming rules */
339 dimmed = modest_ui_dimming_rules_on_new_folder (win, user_data);
341 /* Check CSM specific dimming rules */
343 dimmed = _selected_folder_is_snd_level (MODEST_MAIN_WINDOW(win));
345 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
352 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
354 ModestDimmingRule *rule = NULL;
355 GtkWidget *folder_view = NULL;
356 TnyFolderStore *parent_folder = NULL;
357 gboolean dimmed = FALSE;
359 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
360 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
361 rule = MODEST_DIMMING_RULE (user_data);
363 /* Get selected folder as parent of new folder to create */
364 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
365 MODEST_WIDGET_TYPE_FOLDER_VIEW);
366 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
370 if (TNY_IS_ACCOUNT (parent_folder)) {
371 /* If it's the local account then do not dim */
372 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
375 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
376 /* If it's POP then dim */
377 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
378 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
380 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
383 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
385 TnyFolderType types[3];
387 types[0] = TNY_FOLDER_TYPE_DRAFTS;
388 types[1] = TNY_FOLDER_TYPE_OUTBOX;
389 types[2] = TNY_FOLDER_TYPE_SENT;
391 /* Apply folder rules */
393 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
395 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
398 dimmed = _selected_folder_is_any_of_type (win, types, 3);
400 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
403 g_object_unref (parent_folder);
409 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
411 ModestDimmingRule *rule = NULL;
412 GtkWidget *folder_view = NULL;
413 GtkWidget *header_view = NULL;
414 gboolean dimmed = FALSE;
416 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
417 rule = MODEST_DIMMING_RULE (user_data);
419 if (MODEST_IS_MAIN_WINDOW (win)) {
420 /* Get the folder view */
421 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
422 MODEST_WIDGET_TYPE_FOLDER_VIEW);
424 /* Get header view */
425 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
426 MODEST_WIDGET_TYPE_HEADER_VIEW);
428 if (header_view && gtk_widget_is_focus (header_view))
429 dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
431 if (folder_view && gtk_widget_is_focus (folder_view))
432 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
434 if (header_view && folder_view &&
435 !gtk_widget_is_focus (header_view) &&
436 !gtk_widget_is_focus (folder_view)) {
438 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));
441 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
450 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
452 ModestDimmingRule *rule = NULL;
453 TnyFolderType types[6];
454 gboolean dimmed = FALSE;
456 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
457 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
458 rule = MODEST_DIMMING_RULE (user_data);
460 types[0] = TNY_FOLDER_TYPE_DRAFTS;
461 types[1] = TNY_FOLDER_TYPE_OUTBOX;
462 types[2] = TNY_FOLDER_TYPE_SENT;
463 types[3] = TNY_FOLDER_TYPE_INBOX;
464 types[4] = TNY_FOLDER_TYPE_ROOT;
465 types[5] = TNY_FOLDER_TYPE_ARCHIVE;
468 /* Check dimmed rule */
470 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
472 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
475 dimmed = _selected_folder_is_any_of_type (win, types, 6);
477 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
480 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
482 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
485 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
487 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
490 dimmed = _transfer_mode_enabled (win);
492 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
499 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
501 ModestDimmingRule *rule = NULL;
502 gboolean dimmed = FALSE;
504 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
505 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
506 rule = MODEST_DIMMING_RULE (user_data);
508 /* Check dimmed rule */
510 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
511 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
515 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
516 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
524 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
526 ModestDimmingRule *rule = NULL;
527 TnyFolderType types[4];
528 gboolean dimmed = FALSE;
530 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
531 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
532 rule = MODEST_DIMMING_RULE (user_data);
534 types[0] = TNY_FOLDER_TYPE_DRAFTS;
535 types[1] = TNY_FOLDER_TYPE_OUTBOX;
536 types[2] = TNY_FOLDER_TYPE_SENT;
537 types[3] = TNY_FOLDER_TYPE_ARCHIVE;
539 /* Check dimmed rule */
541 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
543 modest_dimming_rule_set_notification (rule, "");
546 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
548 modest_dimming_rule_set_notification (rule, "");
551 dimmed = _selected_folder_is_any_of_type (win, types, 4);
553 modest_dimming_rule_set_notification (rule, "");
560 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
562 ModestDimmingRule *rule = NULL;
563 gboolean dimmed = FALSE;
564 const DimmedState *state = NULL;
566 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
567 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
568 rule = MODEST_DIMMING_RULE (user_data);
569 state = modest_window_get_dimming_state (win);
571 /* Check dimmed rule */
573 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
576 dimmed = state->any_marked_as_deleted;
578 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
581 dimmed = _selected_msg_sent_in_progress (win);
583 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
590 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
592 ModestDimmingRule *rule = NULL;
593 gboolean dimmed = FALSE;
594 TnyFolderType types[3];
596 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
597 rule = MODEST_DIMMING_RULE (user_data);
599 /* main window dimming rules */
600 if (MODEST_IS_MAIN_WINDOW(win)) {
602 types[0] = TNY_FOLDER_TYPE_DRAFTS;
603 types[1] = TNY_FOLDER_TYPE_OUTBOX;
604 types[2] = TNY_FOLDER_TYPE_ROOT;
606 /* Check dimmed rule */
608 dimmed = _selected_folder_is_any_of_type (win, types, 3);
610 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
613 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
615 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
618 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
620 /* msg view window dimming rules */
621 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
623 /* Check dimmed rule */
625 dimmed = _transfer_mode_enabled (win);
627 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
630 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
632 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
641 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
643 ModestDimmingRule *rule = NULL;
644 gboolean dimmed = FALSE;
646 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
647 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
648 rule = MODEST_DIMMING_RULE (user_data);
650 /* Check dimmed rule */
652 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
655 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
657 modest_dimming_rule_set_notification (rule, "");
664 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
666 gboolean dimmed = FALSE;
668 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
670 /* Check dimmed rule */
678 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
680 ModestDimmingRule *rule = NULL;
681 guint n_messages = 0;
682 const DimmedState *state = NULL;
683 gboolean dimmed = FALSE;
685 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
686 rule = MODEST_DIMMING_RULE (user_data);
687 state = modest_window_get_dimming_state (win);
689 /* Check dimmed rule */
690 if (MODEST_IS_MAIN_WINDOW (win)) {
692 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
694 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
697 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
700 dimmed = state->already_opened_msg;
701 n_messages = state->n_selected;
703 gchar *num = g_strdup_printf ("%d", n_messages);
704 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
705 modest_dimming_rule_set_notification (rule, message);
712 dimmed = state->any_marked_as_deleted;
714 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
718 dimmed = state->sent_in_progress;
720 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
723 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
725 dimmed = _transfer_mode_enabled (win);
727 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
730 dimmed = state->any_marked_as_deleted;
732 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
735 /* The delete button should be dimmed when viewing an attachment,
736 * but should be enabled when viewing a message from the list,
737 * or when viewing a search result.
740 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
741 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
743 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
753 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
755 ModestDimmingRule *rule = NULL;
756 GtkWidget *header_view = NULL;
757 gboolean dimmed = FALSE;
759 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
760 rule = MODEST_DIMMING_RULE (user_data);
762 /* main window dimming rules */
763 if (MODEST_IS_MAIN_WINDOW(win)) {
765 /* Check dimmed rule */
766 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
767 MODEST_WIDGET_TYPE_HEADER_VIEW);
769 /* If the header view has the focus: */
770 if (header_view && gtk_widget_is_focus (header_view)) {
771 /* Check dimmed rule */
773 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
776 /* If the folder view has the focus: */
777 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
778 MODEST_WIDGET_TYPE_FOLDER_VIEW);
779 if (folder_view && gtk_widget_is_focus (folder_view)) {
780 TnyFolderStore *folder_store
781 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
783 /* Only enable for folders, not accounts,
784 * though the UI spec is not clear about that.
785 * If we enable this for accounts then we must
786 * add code to handle them in modest_ui_actions_on_details(). */
787 if (!TNY_IS_FOLDER(folder_store)) {
789 modest_dimming_rule_set_notification (rule, "");
792 g_object_unref (folder_store);
798 /* msg view window dimming rules */
801 /* Check dimmed rule */
803 if (MODEST_IS_MSG_VIEW_WINDOW (win))
804 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
806 modest_dimming_rule_set_notification (rule, "");
815 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
817 ModestDimmingRule *rule = NULL;
818 TnyHeaderFlags flags;
819 const DimmedState *state = NULL;
820 gboolean dimmed = FALSE;
822 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
823 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
824 rule = MODEST_DIMMING_RULE (user_data);
825 state = modest_window_get_dimming_state (win);
827 flags = TNY_HEADER_FLAG_SEEN;
829 /* Check dimmed rule */
831 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
834 dimmed = state->all_marked_as_seen;
836 modest_dimming_rule_set_notification (rule, "");
843 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
845 ModestDimmingRule *rule = NULL;
846 TnyHeaderFlags flags;
847 const DimmedState *state = NULL;
848 gboolean dimmed = FALSE;
850 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
851 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
852 rule = MODEST_DIMMING_RULE (user_data);
853 state = modest_window_get_dimming_state (win);
855 flags = TNY_HEADER_FLAG_SEEN;
857 /* Check dimmed rule */
859 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
861 dimmed = !state->any_marked_as_seen;
863 modest_dimming_rule_set_notification (rule, "");
870 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
872 ModestDimmingRule *rule = NULL;
873 gboolean dimmed = FALSE;
875 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
876 rule = MODEST_DIMMING_RULE (user_data);
878 if (MODEST_IS_MAIN_WINDOW (win))
879 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
880 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
881 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
888 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
890 GtkWidget *folder_view = NULL;
891 ModestDimmingRule *rule = NULL;
892 guint n_messages = 0;
893 const DimmedState *state = NULL;
894 gboolean dimmed = FALSE;
896 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
897 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
898 rule = MODEST_DIMMING_RULE (user_data);
899 state = modest_window_get_dimming_state (win);
901 /* Get the folder view */
902 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
903 MODEST_WIDGET_TYPE_FOLDER_VIEW);
906 /* Check diming rules for folders transfer */
907 if (gtk_widget_is_focus (folder_view)) {
908 TnyFolderType types[5];
910 types[0] = TNY_FOLDER_TYPE_DRAFTS;
911 types[1] = TNY_FOLDER_TYPE_OUTBOX;
912 types[2] = TNY_FOLDER_TYPE_SENT;
913 types[3] = TNY_FOLDER_TYPE_ROOT;
914 types[4] = TNY_FOLDER_TYPE_INBOX;
916 /* Apply folder rules */
918 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
920 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
923 dimmed = _selected_folder_is_any_of_type (win, types, 5);
925 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
929 /* Check diming rules for messages transfer */
931 dimmed = state->already_opened_msg;
932 n_messages = state->n_selected;
934 gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"), n_messages);
935 modest_dimming_rule_set_notification (rule, message);
940 if (!gtk_widget_is_focus (folder_view))
941 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
949 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
951 ModestDimmingRule *rule = NULL;
952 gboolean dimmed = FALSE;
954 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
955 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
956 rule = MODEST_DIMMING_RULE (user_data);
958 /* Check dimmed rule */
960 dimmed = _transfer_mode_enabled (win);
962 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
966 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
967 /* The move_to button should be dimmed when viewing an attachment,
968 * but should be enabled when viewing a message from the list,
969 * or when viewing a search result.
971 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
972 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
977 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
984 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
986 ModestDimmingRule *rule = NULL;
987 gboolean dimmed = FALSE;
989 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
990 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
991 rule = MODEST_DIMMING_RULE (user_data);
993 /* Check dimmed rule */
995 dimmed = _transfer_mode_enabled (win);
997 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1004 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
1006 ModestDimmingRule *rule = NULL;
1007 TnyFolderType types[3];
1008 gboolean dimmed = FALSE;
1010 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1011 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1012 rule = MODEST_DIMMING_RULE (user_data);
1014 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1015 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1016 types[2] = TNY_FOLDER_TYPE_SENT;
1018 /* Check dimmed rule */
1020 dimmed = _clipboard_is_empty (win);
1022 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ecoc_ib_edwin_nothing_to_paste"));
1025 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1027 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
1030 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
1032 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
1036 dimmed = _selected_folder_is_same_as_source (win);
1038 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
1046 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1048 ModestDimmingRule *rule = NULL;
1049 gboolean dimmed = FALSE;
1051 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1052 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1053 rule = MODEST_DIMMING_RULE (user_data);
1055 /* Check dimmed rule */
1057 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1060 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1063 modest_dimming_rule_set_notification (rule, "");
1069 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1071 ModestDimmingRule *rule = NULL;
1072 gboolean dimmed = FALSE;
1074 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1075 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1076 rule = MODEST_DIMMING_RULE (user_data);
1078 /* Check dimmed rule */
1080 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);
1083 dimmed = _purged_attach_selected (win, FALSE, NULL);
1085 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1093 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1095 ModestDimmingRule *rule = NULL;
1096 gboolean dimmed = FALSE;
1098 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1099 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1100 rule = MODEST_DIMMING_RULE (user_data);
1102 /* Check dimmed rule */
1104 dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1107 dimmed = _purged_attach_selected (win, FALSE, NULL);
1109 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1117 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1119 ModestDimmingRule *rule = NULL;
1120 const DimmedState *state = NULL;
1121 gboolean dimmed = FALSE;
1123 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1124 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1125 rule = MODEST_DIMMING_RULE (user_data);
1126 state = modest_window_get_dimming_state (win);
1128 /* Check in main window if there's only one message selected */
1129 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1130 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1133 /* Check in view window if there's any attachment selected */
1134 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1135 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1137 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1140 /* cannot purge in editable drafts nor pop folders */
1142 dimmed = _invalid_folder_for_purge (win, rule);
1145 /* Check if the selected message in main window has attachments */
1146 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1147 dimmed = state->any_has_attachments;
1149 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1152 /* Check if all attachments are already purged */
1154 dimmed = _purged_attach_selected (win, TRUE, rule);
1157 /* Check if the message is already downloaded */
1158 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1159 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1161 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1169 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1171 ModestDimmingRule *rule = NULL;
1172 gboolean dimmed = FALSE;
1174 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1175 rule = MODEST_DIMMING_RULE (user_data);
1177 /* Check dimmed rule */
1179 dimmed = _clipboard_is_empty (win);
1181 modest_dimming_rule_set_notification (rule, "");
1188 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1190 ModestDimmingRule *rule = NULL;
1191 gboolean dimmed = FALSE;
1193 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1194 rule = MODEST_DIMMING_RULE (user_data);
1196 /* Check common dimming rules */
1198 dimmed = _invalid_clipboard_selected (win, rule);
1201 /* Check window specific dimming rules */
1202 if (MODEST_IS_MAIN_WINDOW (win)) {
1203 /* Get focused widget */
1204 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1206 if (MODEST_IS_HEADER_VIEW (focused)) {
1208 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1210 modest_dimming_rule_set_notification (rule, "");
1213 dimmed = _selected_msg_sent_in_progress (win);
1215 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1218 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1219 TnyFolderType types[3];
1221 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1222 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1223 types[2] = TNY_FOLDER_TYPE_SENT;
1225 /* Apply folder rules */
1227 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
1229 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
1232 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1234 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1237 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1239 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1248 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1250 ModestDimmingRule *rule = NULL;
1251 gboolean dimmed = FALSE;
1253 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1254 rule = MODEST_DIMMING_RULE (user_data);
1256 /* Check common dimming rules */
1258 dimmed = _invalid_clipboard_selected (win, rule);
1261 /* Check window specific dimming rules */
1262 if (MODEST_IS_MAIN_WINDOW (win)) {
1263 /* Get focused widget */
1264 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1266 if (MODEST_IS_HEADER_VIEW (focused)) {
1268 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1270 modest_dimming_rule_set_notification (rule, "");
1273 dimmed = _selected_msg_sent_in_progress (win);
1275 modest_dimming_rule_set_notification (rule, _(""));
1278 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1280 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1282 modest_dimming_rule_set_notification (rule, _(""));
1291 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1293 ModestDimmingRule *rule = NULL;
1294 gboolean dimmed = FALSE;
1296 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1297 rule = MODEST_DIMMING_RULE (user_data);
1299 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1301 /* Check dimmed rule */
1303 dimmed = _transfer_mode_enabled (win);
1305 modest_dimming_rule_set_notification (
1306 rule, _("mail_ib_notavailable_downloading"));
1309 dimmed = modest_msg_view_window_first_message_selected (
1310 MODEST_MSG_VIEW_WINDOW(win));
1311 modest_dimming_rule_set_notification (rule, NULL);
1318 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1320 ModestDimmingRule *rule = NULL;
1321 gboolean dimmed = FALSE;
1323 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1324 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1325 rule = MODEST_DIMMING_RULE (user_data);
1327 /* Check dimmed rule */
1329 dimmed = _transfer_mode_enabled (win);
1331 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1334 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1335 modest_dimming_rule_set_notification (rule, NULL);
1343 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1345 const gboolean dimmed =
1346 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1353 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1355 ModestDimmingRule *rule = NULL;
1356 TnyFolderType types[1];
1357 guint n_messages = 0;
1358 const DimmedState *state = NULL;
1359 gboolean dimmed = FALSE;
1361 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1362 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1363 rule = MODEST_DIMMING_RULE (user_data);
1364 state = modest_window_get_dimming_state (win);
1366 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1368 /* Check dimmed rules */
1370 dimmed = state->already_opened_msg;
1371 n_messages = state->n_selected;
1373 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_cancel_send"));
1376 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1378 modest_dimming_rule_set_notification (rule, "");
1381 dimmed = !_sending_in_progress (win);
1383 modest_dimming_rule_set_notification (rule, "");
1390 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1392 ModestDimmingRule *rule = NULL;
1393 gboolean dimmed = FALSE;
1395 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1396 rule = MODEST_DIMMING_RULE (user_data);
1398 /* Check dimmed rule */
1400 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1403 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1410 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1412 ModestDimmingRule *rule = NULL;
1413 gboolean dimmed = FALSE;
1415 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1416 rule = MODEST_DIMMING_RULE (user_data);
1418 /* Check dimmed rule */
1420 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1421 gchar *selection = NULL;
1422 selection = gtk_clipboard_wait_for_text (clipboard);
1424 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1430 /* *********************** static utility functions ******************** */
1434 _selected_folder_not_writeable (ModestMainWindow *win)
1436 GtkWidget *folder_view = NULL;
1437 TnyFolderStore *parent_folder = NULL;
1438 ModestTnyFolderRules rules;
1439 gboolean result = FALSE;
1441 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1443 /* Get folder view */
1444 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1445 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1446 /* If no folder view, always dimmed */
1450 /* Get selected folder as parent of new folder to create */
1451 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1452 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1454 g_object_unref (parent_folder);
1458 /* Check dimmed rule */
1459 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1460 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1463 g_object_unref (parent_folder);
1469 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1471 TnyFolderType types[2];
1472 gboolean result = FALSE;
1474 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1476 types[0] = TNY_FOLDER_TYPE_ROOT;
1477 types[1] = TNY_FOLDER_TYPE_INBOX;
1479 /* Check folder type */
1480 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
1482 /* Check pop and MMC accounts */
1484 result = _selected_folder_is_MMC_or_POP_root (win);
1492 _selected_folder_is_root (ModestMainWindow *win)
1494 TnyFolderType types[1];
1495 gboolean result = FALSE;
1497 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1499 /* All accounts are root items: */
1500 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1501 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1503 gboolean is_account = FALSE;
1504 TnyFolderStore *folder_store =
1505 modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1507 is_account = TNY_IS_ACCOUNT (folder_store);
1508 g_object_unref (folder_store);
1509 folder_store = NULL;
1516 /* Try something more precise: */
1517 types[0] = TNY_FOLDER_TYPE_ROOT;
1519 /* Check folder type */
1520 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1522 /* Check pop and MMC accounts */
1524 result = _selected_folder_is_MMC_or_POP_root (win);
1531 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1533 GtkWidget *folder_view = NULL;
1534 TnyFolderStore *parent_folder = NULL;
1535 gboolean result = FALSE;
1537 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1538 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1539 /* Get selected folder as parent of new folder to create */
1540 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1544 if (TNY_IS_ACCOUNT (parent_folder)) {
1545 /* If it's the local account then do not dim */
1546 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1549 /* If it's the MMC root folder then dim it */
1550 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1553 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1554 /* If it's POP then dim */
1555 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
1556 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1560 g_object_unref (parent_folder);
1566 _header_view_is_all_selected (ModestMainWindow *win)
1568 GtkTreeSelection *sel = NULL;
1569 GtkTreeModel *model = NULL;
1570 GtkTreeView *header_view = NULL;
1571 gint count_sel, count_model;
1573 header_view = GTK_TREE_VIEW(modest_main_window_get_child_widget(
1574 win, MODEST_WIDGET_TYPE_HEADER_VIEW));
1575 if(header_view == NULL)
1578 model = gtk_tree_view_get_model(header_view);
1582 sel = gtk_tree_view_get_selection(header_view);
1586 /* check if all the headers are selected or not */
1587 count_sel = gtk_tree_selection_count_selected_rows (sel);
1588 count_model = gtk_tree_model_iter_n_children(model, NULL);
1589 if(count_sel == count_model != 0)
1590 /*all header is selected*/
1597 _selected_folder_is_empty (ModestMainWindow *win)
1599 GtkWidget *folder_view = NULL;
1600 TnyFolderStore *folder = NULL;
1601 gboolean result = FALSE;
1603 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1605 /* Get folder view */
1606 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1607 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1608 /* If no folder view, always dimmed */
1612 /* Get selected folder as parent of new folder to create */
1613 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1614 if (!(folder && TNY_IS_FOLDER(folder))) {
1616 g_object_unref (folder);
1620 /* Check folder type */
1621 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
1624 g_object_unref (folder);
1630 _selected_folder_is_same_as_source (ModestWindow *win)
1632 ModestEmailClipboard *clipboard = NULL;
1633 GtkWidget *folder_view = NULL;
1634 TnyFolderStore *folder = NULL;
1635 gboolean result = FALSE;
1637 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1639 /* Get folder view */
1640 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1641 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1645 /* Get selected folder as destination folder */
1646 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1647 if (!(folder && TNY_IS_FOLDER(folder))) {
1652 /* Check clipboard is cleared */
1653 clipboard = modest_runtime_get_email_clipboard ();
1654 if (modest_email_clipboard_cleared (clipboard)) {
1659 /* Check source folder */
1660 result = modest_email_clipboard_check_source_folder (clipboard,
1661 (const TnyFolder *) folder);
1665 g_object_unref (folder);
1671 _selected_folder_is_any_of_type (ModestWindow *win,
1672 TnyFolderType types[],
1675 GtkWidget *folder_view = NULL;
1676 TnyFolderStore *folder = NULL;
1677 TnyFolderType folder_type;
1679 gboolean result = FALSE;
1681 /*Get current folder */
1682 if (MODEST_IS_MAIN_WINDOW(win)) {
1684 /* Get folder view */
1685 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1686 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1687 /* If no folder view, always dimmed */
1691 /* Get selected folder as parent of new folder to create */
1692 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1694 if (!(folder && TNY_IS_FOLDER(folder))) {
1696 g_object_unref (folder);
1700 /* Check folder type */
1701 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
1703 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1704 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1705 for (i=0; i < ntypes; i++) {
1706 result = result || folder_type == types[i];
1712 g_object_unref (folder);
1718 _folder_is_any_of_type (TnyFolder *folder,
1719 TnyFolderType types[],
1722 TnyFolderType folder_type;
1723 gboolean result = FALSE;
1726 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
1728 /* Get folder type */
1729 folder_type = modest_tny_folder_guess_folder_type (folder);
1731 /* Check foler type */
1732 for (i=0; i < ntypes; i++) {
1733 result = result || folder_type == types[i];
1740 _selected_folder_is_snd_level (ModestMainWindow *win)
1742 GtkWidget *folder_view = NULL;
1743 GtkTreeSelection *sel = NULL;
1744 GtkTreeModel *model = NULL;
1745 GtkTreePath *path = NULL;
1747 TnyFolderStore *folder = NULL;
1748 gboolean result = FALSE;
1750 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1752 /*Get curent folder */
1753 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1754 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1755 /* If no folder view, always dimmed */
1759 /* Get selected folder as parent of new folder to create */
1760 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1761 if (!(folder && TNY_IS_FOLDER(folder))) {
1765 /* Check folder level */
1766 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(folder_view));
1767 if (!gtk_tree_selection_get_selected (sel, &model, &iter))
1769 path = gtk_tree_model_get_path (model, &iter);
1770 result = gtk_tree_path_get_depth (path) > 2;
1774 g_object_unref (folder);
1776 gtk_tree_path_free (path);
1783 _clipboard_is_empty (ModestWindow *win)
1785 gboolean result = FALSE;
1787 if (MODEST_IS_MAIN_WINDOW (win)) {
1788 ModestEmailClipboard *clipboard = NULL;
1789 clipboard = modest_runtime_get_email_clipboard ();
1790 if (modest_email_clipboard_cleared (clipboard))
1798 _invalid_clipboard_selected (ModestWindow *win,
1799 ModestDimmingRule *rule)
1801 const DimmedState *state = NULL;
1802 gboolean result = FALSE;
1804 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1805 state = modest_window_get_dimming_state (win);
1807 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1808 GtkClipboard *clipboard = NULL;
1809 gchar *selection = NULL;
1810 GtkWidget *focused = NULL;
1812 /* Get clipboard selection*/
1813 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1814 selection = gtk_clipboard_wait_for_text (clipboard);
1816 /* Get focuesed widget */
1817 focused = gtk_window_get_focus (GTK_WINDOW (win));
1820 result = ((selection == NULL) ||
1821 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
1824 modest_dimming_rule_set_notification (rule, "");
1826 if (selection != NULL)
1829 else if (MODEST_IS_MAIN_WINDOW (win)) {
1831 result = state->n_selected == 0;
1833 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1841 _invalid_attach_selected (ModestWindow *win,
1844 gboolean for_remove,
1845 ModestDimmingRule *rule)
1847 GList *attachments, *node;
1849 TnyHeaderFlags flags;
1850 gboolean nested_attachments = FALSE;
1851 gboolean selected_messages = FALSE;
1852 const DimmedState *state = NULL;
1853 gboolean result = FALSE;
1855 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1856 state = modest_window_get_dimming_state (win);
1858 if (MODEST_IS_MAIN_WINDOW (win)) {
1859 flags = TNY_HEADER_FLAG_ATTACHMENTS;
1861 result = !state->any_has_attachments;
1863 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1865 /* Get selected atachments */
1866 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1867 n_selected = g_list_length (attachments);
1872 result = n_selected != 1;
1875 result = n_selected < 1;
1878 /* Check attached type (view operation not required) */
1879 if (!result && !for_view) {
1880 for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
1881 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1882 TnyList *nested_list = tny_simple_list_new ();
1883 if (!for_remove && TNY_IS_MSG (mime_part)) {
1884 selected_messages = TRUE;
1887 tny_mime_part_get_parts (mime_part, nested_list);
1888 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1889 nested_attachments = TRUE;
1892 g_object_unref (nested_list);
1896 /* Set notifications */
1897 if (result && rule != NULL) {
1898 if (selected_messages) {
1899 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1900 } else if (nested_attachments) {
1901 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1902 } else if (n_selected == 0) {
1903 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1904 } else if (unique) {
1905 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1910 g_list_free (attachments);
1917 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule)
1919 GList *attachments = NULL, *node;
1921 gint n_attachments = 0;
1922 gboolean result = FALSE;
1924 /* This should check if _all_ the attachments are already purged. If only some
1925 * of them are purged, then it does not cause dim as there's a confirmation dialog
1926 * for removing only local attachments */
1928 /* Get selected atachments */
1929 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1930 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1931 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1932 /* If we're in main window, we won't know if there are already purged attachments */
1936 if (attachments == NULL)
1939 for (node = attachments; node != NULL; node = g_list_next (node)) {
1940 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1941 if (tny_mime_part_is_purged (mime_part)) {
1948 g_list_free (attachments);
1951 result = (purged == n_attachments);
1953 result = (purged > 0);
1955 if (result && (rule != NULL))
1956 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1962 _invalid_msg_selected (ModestMainWindow *win,
1964 ModestDimmingRule *rule)
1966 GtkWidget *folder_view = NULL;
1967 const DimmedState *state = NULL;
1968 gboolean result = FALSE;
1970 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1971 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
1972 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
1974 /* Get folder view to check focus */
1975 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1976 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1978 /* Check dimmed rule (TODO: check focus on widgets */
1980 result = ((state->n_selected == 0 ) ||
1981 (gtk_widget_is_focus (folder_view)));
1983 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1985 if (!result && unique) {
1986 result = state->n_selected > 1;
1988 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1996 _msg_download_in_progress (ModestMsgViewWindow *win)
1998 gboolean result = FALSE;
2000 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
2002 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
2008 _msg_download_completed (ModestMainWindow *win)
2010 const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2011 return state->any_marked_as_cached;
2015 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2017 GSList **send_queues = (GSList **) userdata;
2018 *send_queues = g_slist_prepend (*send_queues, value);
2022 _selected_msg_sent_in_progress (ModestWindow *win)
2024 const DimmedState *state = modest_window_get_dimming_state (win);
2025 return state->sent_in_progress;
2030 _sending_in_progress (ModestWindow *win)
2032 gboolean result = FALSE;
2034 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
2036 /* Check if send operation is in progress */
2037 result = modest_main_window_send_receive_in_progress (MODEST_MAIN_WINDOW (win));
2043 _invalid_folder_for_purge (ModestWindow *win,
2044 ModestDimmingRule *rule)
2047 TnyFolder *folder = NULL;
2048 TnyAccount *account = NULL;
2049 gboolean result = FALSE;
2051 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2053 /* Get folder and account of message */
2054 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2055 g_return_val_if_fail(msg != NULL, TRUE);
2056 folder = tny_msg_get_folder (msg);
2057 if (folder == NULL) {
2058 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2061 g_object_unref (msg);
2062 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2063 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2064 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2067 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
2068 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2071 g_return_val_if_reached (FALSE);
2073 account = modest_tny_folder_get_account (folder);
2074 if (account == NULL) goto frees;
2077 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2078 TnyFolderType types[2];
2079 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2080 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2082 if (_selected_folder_is_any_of_type (win, types, 2)) {
2084 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
2086 /* We're currently disabling purge in any local store */
2088 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2091 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2092 /* If it's POP then dim */
2093 if (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2094 MODEST_PROTOCOL_STORE_POP) {
2095 GList *attachments = NULL;
2096 gint n_selected = 0;
2099 /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
2101 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2102 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2103 n_selected = g_list_length (attachments);
2104 g_list_free (attachments);
2107 modest_dimming_rule_set_notification (rule,
2108 ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
2109 "mail_ib_unable_to_pure_attach_pop_mail_plural",
2116 g_object_unref (folder);
2117 if (account != NULL)
2118 g_object_unref (account);
2124 _transfer_mode_enabled (ModestWindow *win)
2126 gboolean result = FALSE;
2129 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2130 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2131 } else if (MODEST_IS_MAIN_WINDOW(win)) {
2132 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2134 g_warning("_transfer_mode_enabled called with wrong window type");