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 _folder_view_has_focus (ModestWindow *win);
64 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
65 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
66 static gboolean _msg_download_completed (ModestMainWindow *win);
67 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
68 static gboolean _sending_in_progress (ModestWindow *win);
69 /* static gboolean _message_is_marked_as_deleted (ModestMsgViewWindow *win); */
70 /* static gboolean _selected_message_is_marked_as_deleted (ModestMainWindow *win); */
71 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
72 static gboolean _transfer_mode_enabled (ModestWindow *win);
74 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
78 _define_main_window_dimming_state (ModestMainWindow *window)
80 DimmedState *state = NULL;
81 GtkWidget *focused_widget = NULL;
82 GtkWidget *header_view = NULL;
83 GtkTreeModel *model = NULL;
84 TnyList *selected_headers = NULL;
85 TnyIterator *iter = NULL;
86 TnyHeader *header = NULL;
87 ModestCacheMgr *cache_mgr = NULL;
88 GHashTable *send_queue_cache = NULL;
89 ModestTnySendQueue *send_queue = NULL;
90 GSList *send_queues = NULL, *node = NULL;
91 ModestWindowMgr *mgr = NULL;
92 gboolean found = FALSE;
93 gchar *msg_uid = NULL;
95 gboolean all_deleted = TRUE;
96 gboolean all_seen = TRUE;
97 gboolean all_cached = TRUE;
98 gboolean all_has_attach = TRUE;
100 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
103 state = g_slice_new0 (DimmedState);
104 state->n_selected = 0;
105 state->already_opened_msg = FALSE;
106 state->any_marked_as_deleted = FALSE;
107 state->all_marked_as_deleted = FALSE;
108 state->any_marked_as_seen = FALSE;
109 state->all_marked_as_seen = FALSE;
110 state->any_marked_as_cached = FALSE;
111 state->all_marked_as_cached = FALSE;
112 state->any_has_attachments = FALSE;
113 state->all_has_attachments = FALSE;
114 state->sent_in_progress = FALSE;
115 state->all_selected = FALSE;
117 /* Get focused widget */
118 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
119 if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
122 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
123 header_view = focused_widget;
125 header_view = modest_main_window_get_child_widget (window, MODEST_WIDGET_TYPE_HEADER_VIEW);
128 /* Get header view and selected headers */
129 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
130 if (!selected_headers)
133 /* Examine selected headers */
134 iter = tny_list_create_iterator (selected_headers);
135 while (!tny_iterator_is_done (iter)) {
136 header = TNY_HEADER (tny_iterator_get_current (iter));
137 flags = tny_header_get_flags (header);
143 mgr = modest_runtime_get_window_mgr ();
144 if (!state->already_opened_msg)
145 state->already_opened_msg = modest_window_mgr_find_registered_header (mgr, header, NULL);
148 /* Mark as deleted */
149 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
150 state->all_marked_as_deleted = all_deleted;
151 if (!state->any_marked_as_deleted)
152 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
155 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
156 state->all_marked_as_seen = all_seen;
157 if (!state->any_marked_as_seen)
158 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
161 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
162 state->all_marked_as_cached = all_cached;
163 if (!state->any_marked_as_cached)
164 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
166 /* Mark has_attachments */
167 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
168 state->all_has_attachments = all_has_attach;
169 if (!state->any_has_attachments)
170 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
172 /* sent in progress */
173 msg_uid = modest_tny_send_queue_get_msg_id (header);
174 if (!state->sent_in_progress) {
175 cache_mgr = modest_runtime_get_cache_mgr ();
176 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
177 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
179 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
181 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
182 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
184 /* Check if msg uid is being processed inside send queue */
185 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
187 state->sent_in_progress = found;
190 tny_iterator_next (iter);
191 g_object_unref (header);
194 /* check if all the headers are selected or not */
195 model = gtk_tree_view_get_model(GTK_TREE_VIEW(header_view));
198 count = gtk_tree_model_iter_n_children(model, NULL);
199 if(state->n_selected == count != 0)
200 state->all_selected = TRUE;
205 g_object_unref(selected_headers);
206 g_object_unref(iter);
207 g_slist_free (send_queues);
213 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
215 DimmedState *state = NULL;
216 TnyHeader *header = NULL;
217 ModestCacheMgr *cache_mgr = NULL;
218 GHashTable *send_queue_cache = NULL;
219 ModestTnySendQueue *send_queue = NULL;
220 GSList *send_queues = NULL, *node = NULL;
221 gboolean found = FALSE;
222 gchar *msg_uid = NULL;
223 TnyHeaderFlags flags;
224 gboolean all_deleted = TRUE;
225 gboolean all_seen = TRUE;
226 gboolean all_cached = TRUE;
227 gboolean all_has_attach = TRUE;
229 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
232 state = g_slice_new0 (DimmedState);
233 state->n_selected = 0;
234 state->already_opened_msg = FALSE;
235 state->any_marked_as_deleted = FALSE;
236 state->all_marked_as_deleted = FALSE;
237 state->any_marked_as_seen = FALSE;
238 state->all_marked_as_seen = FALSE;
239 state->any_marked_as_cached = FALSE;
240 state->all_marked_as_cached = FALSE;
241 state->any_has_attachments = FALSE;
242 state->all_has_attachments = FALSE;
243 state->sent_in_progress = FALSE;
245 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
246 g_return_val_if_fail (TNY_IS_HEADER(header), state);
247 flags = tny_header_get_flags (header);
252 /* Mark as deleted */
253 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
254 state->all_marked_as_deleted = all_deleted;
255 if (!state->any_marked_as_deleted)
256 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
259 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
260 state->all_marked_as_seen = all_seen;
261 if (!state->any_marked_as_seen)
262 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
265 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
266 state->all_marked_as_cached = all_cached;
267 if (!state->any_marked_as_cached)
268 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
270 /* Mark has_attachments */
271 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
272 state->all_has_attachments = all_has_attach;
273 if (!state->any_has_attachments)
274 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
276 /* sent in progress */
277 msg_uid = modest_tny_send_queue_get_msg_id (header);
278 if (!state->sent_in_progress) {
279 cache_mgr = modest_runtime_get_cache_mgr ();
280 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
281 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
283 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
285 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
286 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
288 /* Check if msg uid is being processed inside send queue */
289 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
291 state->sent_in_progress = found;
296 g_object_unref (header);
297 g_slist_free (send_queues);
304 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
306 DimmedState *state = NULL;
308 g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
310 if (MODEST_IS_MAIN_WINDOW (window))
311 state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
312 else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
313 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
321 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
323 ModestDimmingRule *rule = NULL;
324 gboolean dimmed = FALSE;
326 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
327 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
328 rule = MODEST_DIMMING_RULE (user_data);
330 /* Check dimmed rule */
332 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
334 modest_dimming_rule_set_notification (rule, "");
341 modest_ui_dimming_rules_on_csm_new_folder (ModestWindow *win, gpointer user_data)
343 ModestDimmingRule *rule = NULL;
344 gboolean dimmed = FALSE;
346 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
347 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
348 rule = MODEST_DIMMING_RULE (user_data);
350 /* Check common new folder menu item dimming rules */
351 dimmed = modest_ui_dimming_rules_on_new_folder (win, user_data);
353 /* Check CSM specific dimming rules */
355 dimmed = _selected_folder_is_snd_level (MODEST_MAIN_WINDOW(win));
357 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
364 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
366 ModestDimmingRule *rule = NULL;
367 GtkWidget *folder_view = NULL;
368 TnyFolderStore *parent_folder = NULL;
369 gboolean dimmed = FALSE;
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);
375 /* Get selected folder as parent of new folder to create */
376 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
377 MODEST_WIDGET_TYPE_FOLDER_VIEW);
378 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
382 if (TNY_IS_ACCOUNT (parent_folder)) {
383 /* If it's the local account then do not dim */
384 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
387 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
388 /* If it's POP then dim */
389 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
390 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
392 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
395 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
397 TnyFolderType types[3];
399 types[0] = TNY_FOLDER_TYPE_DRAFTS;
400 types[1] = TNY_FOLDER_TYPE_OUTBOX;
401 types[2] = TNY_FOLDER_TYPE_SENT;
403 /* Apply folder rules */
405 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
407 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
410 dimmed = _selected_folder_is_any_of_type (win, types, 3);
412 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
415 g_object_unref (parent_folder);
421 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
423 ModestDimmingRule *rule = NULL;
424 GtkWidget *folder_view = NULL;
425 GtkWidget *header_view = NULL;
426 gboolean dimmed = FALSE;
428 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
429 rule = MODEST_DIMMING_RULE (user_data);
431 if (MODEST_IS_MAIN_WINDOW (win)) {
432 /* Get the folder view */
433 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
434 MODEST_WIDGET_TYPE_FOLDER_VIEW);
436 /* Get header view */
437 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
438 MODEST_WIDGET_TYPE_HEADER_VIEW);
440 if (header_view && gtk_widget_is_focus (header_view))
441 dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
443 if (folder_view && gtk_widget_is_focus (folder_view))
444 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
446 if (header_view && folder_view &&
447 !gtk_widget_is_focus (header_view) &&
448 !gtk_widget_is_focus (folder_view)) {
450 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));
453 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
462 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
464 ModestDimmingRule *rule = NULL;
465 TnyFolderType types[6];
466 gboolean dimmed = FALSE;
468 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
469 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
470 rule = MODEST_DIMMING_RULE (user_data);
472 types[0] = TNY_FOLDER_TYPE_DRAFTS;
473 types[1] = TNY_FOLDER_TYPE_OUTBOX;
474 types[2] = TNY_FOLDER_TYPE_SENT;
475 types[3] = TNY_FOLDER_TYPE_INBOX;
476 types[4] = TNY_FOLDER_TYPE_ROOT;
477 types[5] = TNY_FOLDER_TYPE_ARCHIVE;
480 /* Check dimmed rule */
482 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
484 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
487 dimmed = _selected_folder_is_any_of_type (win, types, 6);
489 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
492 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
494 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
497 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
499 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
502 dimmed = _transfer_mode_enabled (win);
504 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
511 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
513 ModestDimmingRule *rule = NULL;
514 gboolean dimmed = FALSE;
516 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
517 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
518 rule = MODEST_DIMMING_RULE (user_data);
520 /* Check dimmed rule */
522 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
523 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
527 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
528 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
536 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
538 ModestDimmingRule *rule = NULL;
539 TnyFolderType types[4];
540 gboolean dimmed = FALSE;
542 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
543 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
544 rule = MODEST_DIMMING_RULE (user_data);
546 types[0] = TNY_FOLDER_TYPE_DRAFTS;
547 types[1] = TNY_FOLDER_TYPE_OUTBOX;
548 types[2] = TNY_FOLDER_TYPE_SENT;
549 types[3] = TNY_FOLDER_TYPE_ARCHIVE;
551 /* Check dimmed rule */
553 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
555 modest_dimming_rule_set_notification (rule, "");
558 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
560 modest_dimming_rule_set_notification (rule, "");
563 dimmed = _selected_folder_is_any_of_type (win, types, 4);
565 modest_dimming_rule_set_notification (rule, "");
572 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
574 ModestDimmingRule *rule = NULL;
575 gboolean dimmed = FALSE;
576 const DimmedState *state = NULL;
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 state = modest_window_get_dimming_state (win);
583 /* Check dimmed rule */
585 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
588 dimmed = state->any_marked_as_deleted;
590 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
593 dimmed = _selected_msg_sent_in_progress (win);
595 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
602 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
604 ModestDimmingRule *rule = NULL;
605 gboolean dimmed = FALSE;
606 TnyFolderType types[3];
608 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
609 rule = MODEST_DIMMING_RULE (user_data);
611 /* main window dimming rules */
612 if (MODEST_IS_MAIN_WINDOW(win)) {
614 types[0] = TNY_FOLDER_TYPE_DRAFTS;
615 types[1] = TNY_FOLDER_TYPE_OUTBOX;
616 types[2] = TNY_FOLDER_TYPE_ROOT;
618 /* Check dimmed rule */
620 dimmed = _selected_folder_is_any_of_type (win, types, 3);
622 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
625 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
627 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
630 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
632 /* msg view window dimming rules */
633 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
635 /* Check dimmed rule */
637 dimmed = _transfer_mode_enabled (win);
639 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
642 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
644 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
653 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
655 ModestDimmingRule *rule = NULL;
656 gboolean dimmed = FALSE;
658 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
659 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
660 rule = MODEST_DIMMING_RULE (user_data);
662 /* Check dimmed rule */
664 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
667 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
669 modest_dimming_rule_set_notification (rule, "");
676 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
678 gboolean dimmed = FALSE;
680 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
682 /* Check dimmed rule */
690 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
692 ModestDimmingRule *rule = NULL;
693 guint n_messages = 0;
694 const DimmedState *state = NULL;
695 gboolean dimmed = FALSE;
697 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
698 rule = MODEST_DIMMING_RULE (user_data);
699 state = modest_window_get_dimming_state (win);
701 /* Check dimmed rule */
702 if (MODEST_IS_MAIN_WINDOW (win)) {
704 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
706 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
709 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
712 dimmed = state->already_opened_msg;
713 n_messages = state->n_selected;
715 gchar *num = g_strdup_printf ("%d", n_messages);
716 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
717 modest_dimming_rule_set_notification (rule, message);
724 dimmed = state->any_marked_as_deleted;
726 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
730 dimmed = state->sent_in_progress;
732 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
735 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
737 dimmed = _transfer_mode_enabled (win);
739 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
742 dimmed = state->any_marked_as_deleted;
744 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
747 /* The delete button should be dimmed when viewing an attachment,
748 * but should be enabled when viewing a message from the list,
749 * or when viewing a search result.
752 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
753 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
755 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
765 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
767 ModestDimmingRule *rule = NULL;
768 GtkWidget *header_view = NULL;
769 gboolean dimmed = FALSE;
771 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
772 rule = MODEST_DIMMING_RULE (user_data);
774 /* main window dimming rules */
775 if (MODEST_IS_MAIN_WINDOW(win)) {
777 /* Check dimmed rule */
778 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
779 MODEST_WIDGET_TYPE_HEADER_VIEW);
781 /* If the header view has the focus: */
782 if (header_view && gtk_widget_is_focus (header_view)) {
783 /* Check dimmed rule */
785 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
788 /* If the folder view has the focus: */
789 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
790 MODEST_WIDGET_TYPE_FOLDER_VIEW);
791 if (folder_view && gtk_widget_is_focus (folder_view)) {
792 TnyFolderStore *folder_store
793 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
795 /* Only enable for folders, not accounts,
796 * though the UI spec is not clear about that.
797 * If we enable this for accounts then we must
798 * add code to handle them in modest_ui_actions_on_details(). */
799 if (!TNY_IS_FOLDER(folder_store)) {
801 modest_dimming_rule_set_notification (rule, "");
804 g_object_unref (folder_store);
810 /* msg view window dimming rules */
813 /* Check dimmed rule */
815 if (MODEST_IS_MSG_VIEW_WINDOW (win))
816 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
818 modest_dimming_rule_set_notification (rule, "");
827 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
829 ModestDimmingRule *rule = NULL;
830 TnyHeaderFlags flags;
831 const DimmedState *state = NULL;
832 gboolean dimmed = FALSE;
834 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
835 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
836 rule = MODEST_DIMMING_RULE (user_data);
837 state = modest_window_get_dimming_state (win);
839 flags = TNY_HEADER_FLAG_SEEN;
841 /* Check dimmed rule */
843 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
846 dimmed = state->all_marked_as_seen;
848 modest_dimming_rule_set_notification (rule, "");
855 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
857 ModestDimmingRule *rule = NULL;
858 TnyHeaderFlags flags;
859 const DimmedState *state = NULL;
860 gboolean dimmed = FALSE;
862 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
863 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
864 rule = MODEST_DIMMING_RULE (user_data);
865 state = modest_window_get_dimming_state (win);
867 flags = TNY_HEADER_FLAG_SEEN;
869 /* Check dimmed rule */
871 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
873 dimmed = !state->any_marked_as_seen;
875 modest_dimming_rule_set_notification (rule, "");
882 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
884 ModestDimmingRule *rule = NULL;
885 gboolean dimmed = FALSE;
887 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
888 rule = MODEST_DIMMING_RULE (user_data);
890 if (MODEST_IS_MAIN_WINDOW (win))
891 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
892 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
893 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
900 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
902 GtkWidget *folder_view = NULL;
903 ModestDimmingRule *rule = NULL;
904 guint n_messages = 0;
905 const DimmedState *state = NULL;
906 gboolean dimmed = FALSE;
908 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
909 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
910 rule = MODEST_DIMMING_RULE (user_data);
911 state = modest_window_get_dimming_state (win);
913 /* Get the folder view */
914 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
915 MODEST_WIDGET_TYPE_FOLDER_VIEW);
918 /* Check diming rules for folders transfer */
919 if (gtk_widget_is_focus (folder_view)) {
920 TnyFolderType types[5];
922 types[0] = TNY_FOLDER_TYPE_DRAFTS;
923 types[1] = TNY_FOLDER_TYPE_OUTBOX;
924 types[2] = TNY_FOLDER_TYPE_SENT;
925 types[3] = TNY_FOLDER_TYPE_ROOT;
926 types[4] = TNY_FOLDER_TYPE_INBOX;
928 /* Apply folder rules */
930 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
932 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
935 dimmed = _selected_folder_is_any_of_type (win, types, 5);
937 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
941 /* Check diming rules for messages transfer */
943 dimmed = state->already_opened_msg;
944 n_messages = state->n_selected;
946 gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"), n_messages);
947 modest_dimming_rule_set_notification (rule, message);
952 if (!gtk_widget_is_focus (folder_view))
953 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
961 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
963 ModestDimmingRule *rule = NULL;
964 gboolean dimmed = FALSE;
966 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
967 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
968 rule = MODEST_DIMMING_RULE (user_data);
970 /* Check dimmed rule */
972 dimmed = _transfer_mode_enabled (win);
974 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
978 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
979 /* The move_to button should be dimmed when viewing an attachment,
980 * but should be enabled when viewing a message from the list,
981 * or when viewing a search result.
983 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
984 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
989 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
996 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
998 ModestDimmingRule *rule = NULL;
999 gboolean dimmed = FALSE;
1001 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1002 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1003 rule = MODEST_DIMMING_RULE (user_data);
1005 /* Check dimmed rule */
1007 dimmed = _transfer_mode_enabled (win);
1009 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1016 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
1018 ModestDimmingRule *rule = NULL;
1019 TnyFolderType types[3];
1020 gboolean dimmed = FALSE;
1022 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1023 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1024 rule = MODEST_DIMMING_RULE (user_data);
1026 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1027 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1028 types[2] = TNY_FOLDER_TYPE_SENT;
1030 /* Check dimmed rule */
1032 dimmed = _clipboard_is_empty (win);
1034 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ecoc_ib_edwin_nothing_to_paste"));
1037 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1039 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
1042 dimmed = !_folder_view_has_focus (win);
1044 modest_dimming_rule_set_notification (rule,
1045 dgettext("hildon-common-strings",
1046 "ckct_ib_unable_to_paste_here"));
1049 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
1051 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
1055 dimmed = _selected_folder_is_same_as_source (win);
1057 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
1065 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1067 ModestDimmingRule *rule = NULL;
1068 gboolean dimmed = FALSE;
1070 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1071 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1072 rule = MODEST_DIMMING_RULE (user_data);
1074 /* Check dimmed rule */
1076 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1079 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1082 modest_dimming_rule_set_notification (rule, "");
1088 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1090 ModestDimmingRule *rule = NULL;
1091 gboolean dimmed = FALSE;
1093 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1094 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1095 rule = MODEST_DIMMING_RULE (user_data);
1097 /* Check dimmed rule */
1099 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);
1102 dimmed = _purged_attach_selected (win, FALSE, NULL);
1104 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1112 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1114 ModestDimmingRule *rule = NULL;
1115 gboolean dimmed = FALSE;
1117 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1118 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1119 rule = MODEST_DIMMING_RULE (user_data);
1121 /* Check dimmed rule */
1123 dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1126 dimmed = _purged_attach_selected (win, FALSE, NULL);
1128 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1136 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1138 ModestDimmingRule *rule = NULL;
1139 const DimmedState *state = NULL;
1140 gboolean dimmed = FALSE;
1142 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1143 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1144 rule = MODEST_DIMMING_RULE (user_data);
1145 state = modest_window_get_dimming_state (win);
1147 /* Check in main window if there's only one message selected */
1148 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1149 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1152 /* Check in view window if there's any attachment selected */
1153 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1154 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1156 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1159 /* cannot purge in editable drafts nor pop folders */
1161 dimmed = _invalid_folder_for_purge (win, rule);
1164 /* Check if the selected message in main window has attachments */
1165 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1166 dimmed = state->any_has_attachments;
1168 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1171 /* Check if all attachments are already purged */
1173 dimmed = _purged_attach_selected (win, TRUE, rule);
1176 /* Check if the message is already downloaded */
1177 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1178 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1180 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1188 modest_ui_dimming_rules_on_undo (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 dimmed rule */
1198 dimmed = _clipboard_is_empty (win);
1200 modest_dimming_rule_set_notification (rule, "");
1207 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1209 ModestDimmingRule *rule = NULL;
1210 gboolean dimmed = FALSE;
1212 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1213 rule = MODEST_DIMMING_RULE (user_data);
1215 /* Check common dimming rules */
1217 dimmed = _invalid_clipboard_selected (win, rule);
1220 /* Check window specific dimming rules */
1221 if (MODEST_IS_MAIN_WINDOW (win)) {
1222 /* Get focused widget */
1223 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1225 if (MODEST_IS_HEADER_VIEW (focused)) {
1227 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1229 modest_dimming_rule_set_notification (rule, "");
1232 dimmed = _selected_msg_sent_in_progress (win);
1234 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1237 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1238 TnyFolderType types[3];
1240 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1241 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1242 types[2] = TNY_FOLDER_TYPE_SENT;
1244 /* Apply folder rules */
1246 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
1248 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
1251 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1253 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1256 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1258 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1267 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1269 ModestDimmingRule *rule = NULL;
1270 gboolean dimmed = FALSE;
1272 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1273 rule = MODEST_DIMMING_RULE (user_data);
1275 /* Check common dimming rules */
1277 dimmed = _invalid_clipboard_selected (win, rule);
1280 /* Check window specific dimming rules */
1281 if (MODEST_IS_MAIN_WINDOW (win)) {
1282 /* Get focused widget */
1283 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1285 if (MODEST_IS_HEADER_VIEW (focused)) {
1287 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1289 modest_dimming_rule_set_notification (rule, "");
1292 dimmed = _selected_msg_sent_in_progress (win);
1294 modest_dimming_rule_set_notification (rule, _(""));
1297 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1299 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1301 modest_dimming_rule_set_notification (rule, _(""));
1310 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1312 ModestDimmingRule *rule = NULL;
1313 gboolean dimmed = FALSE;
1315 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1316 rule = MODEST_DIMMING_RULE (user_data);
1318 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1320 /* Check dimmed rule */
1322 dimmed = _transfer_mode_enabled (win);
1324 modest_dimming_rule_set_notification (
1325 rule, _("mail_ib_notavailable_downloading"));
1328 dimmed = modest_msg_view_window_first_message_selected (
1329 MODEST_MSG_VIEW_WINDOW(win));
1330 modest_dimming_rule_set_notification (rule, NULL);
1337 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1339 ModestDimmingRule *rule = NULL;
1340 gboolean dimmed = FALSE;
1342 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1343 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1344 rule = MODEST_DIMMING_RULE (user_data);
1346 /* Check dimmed rule */
1348 dimmed = _transfer_mode_enabled (win);
1350 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1353 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1354 modest_dimming_rule_set_notification (rule, NULL);
1362 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1364 const gboolean dimmed =
1365 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1372 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1374 ModestDimmingRule *rule = NULL;
1375 TnyFolderType types[1];
1376 guint n_messages = 0;
1377 const DimmedState *state = NULL;
1378 gboolean dimmed = FALSE;
1380 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1381 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1382 rule = MODEST_DIMMING_RULE (user_data);
1383 state = modest_window_get_dimming_state (win);
1385 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1387 /* Check dimmed rules */
1389 dimmed = state->already_opened_msg;
1390 n_messages = state->n_selected;
1392 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_cancel_send"));
1395 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1397 modest_dimming_rule_set_notification (rule, "");
1400 dimmed = !_sending_in_progress (win);
1402 modest_dimming_rule_set_notification (rule, "");
1409 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1411 ModestDimmingRule *rule = NULL;
1412 gboolean dimmed = FALSE;
1414 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1415 rule = MODEST_DIMMING_RULE (user_data);
1417 /* Check dimmed rule */
1419 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1422 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1429 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1431 ModestDimmingRule *rule = NULL;
1432 gboolean dimmed = FALSE;
1434 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1435 rule = MODEST_DIMMING_RULE (user_data);
1437 /* Check dimmed rule */
1439 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1440 gchar *selection = NULL;
1441 selection = gtk_clipboard_wait_for_text (clipboard);
1443 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1449 /* *********************** static utility functions ******************** */
1453 _selected_folder_not_writeable (ModestMainWindow *win)
1455 GtkWidget *folder_view = NULL;
1456 TnyFolderStore *parent_folder = NULL;
1457 ModestTnyFolderRules rules;
1458 gboolean result = FALSE;
1460 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1462 /* Get folder view */
1463 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1464 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1465 /* If no folder view, always dimmed */
1469 /* Get selected folder as parent of new folder to create */
1470 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1471 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1473 g_object_unref (parent_folder);
1477 /* Check dimmed rule */
1478 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1479 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1482 g_object_unref (parent_folder);
1488 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1490 TnyFolderType types[2];
1491 gboolean result = FALSE;
1493 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1495 types[0] = TNY_FOLDER_TYPE_ROOT;
1496 types[1] = TNY_FOLDER_TYPE_INBOX;
1498 /* Check folder type */
1499 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
1501 /* Check pop and MMC accounts */
1503 result = _selected_folder_is_MMC_or_POP_root (win);
1511 _selected_folder_is_root (ModestMainWindow *win)
1513 TnyFolderType types[1];
1514 gboolean result = FALSE;
1516 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1518 /* All accounts are root items: */
1519 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1520 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1522 gboolean is_account = FALSE;
1523 TnyFolderStore *folder_store =
1524 modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1526 is_account = TNY_IS_ACCOUNT (folder_store);
1527 g_object_unref (folder_store);
1528 folder_store = NULL;
1535 /* Try something more precise: */
1536 types[0] = TNY_FOLDER_TYPE_ROOT;
1538 /* Check folder type */
1539 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1541 /* Check pop and MMC accounts */
1543 result = _selected_folder_is_MMC_or_POP_root (win);
1550 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1552 GtkWidget *folder_view = NULL;
1553 TnyFolderStore *parent_folder = NULL;
1554 gboolean result = FALSE;
1556 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1557 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1561 /* Get selected folder as parent of new folder to create */
1562 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1566 if (TNY_IS_ACCOUNT (parent_folder)) {
1567 /* If it's the local account then do not dim */
1568 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1571 /* If it's the MMC root folder then dim it */
1572 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1575 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1576 /* If it's POP then dim */
1577 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
1578 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1582 g_object_unref (parent_folder);
1588 _header_view_is_all_selected (ModestMainWindow *win)
1590 const DimmedState *state = NULL;
1592 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1594 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
1596 return state->all_selected;
1600 _selected_folder_is_empty (ModestMainWindow *win)
1602 GtkWidget *folder_view = NULL;
1603 TnyFolderStore *folder = NULL;
1604 gboolean result = FALSE;
1606 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1608 /* Get folder view */
1609 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1610 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1611 /* If no folder view, always dimmed */
1615 /* Get selected folder as parent of new folder to create */
1616 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1617 if (!(folder && TNY_IS_FOLDER(folder))) {
1619 g_object_unref (folder);
1623 /* Check folder type */
1624 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
1627 g_object_unref (folder);
1633 _folder_view_has_focus (ModestWindow *win)
1635 GtkWidget *folder_view = NULL;
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 if (gtk_widget_is_focus(folder_view))
1652 _selected_folder_is_same_as_source (ModestWindow *win)
1654 ModestEmailClipboard *clipboard = NULL;
1655 GtkWidget *folder_view = NULL;
1656 TnyFolderStore *folder = NULL;
1657 gboolean result = FALSE;
1659 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1661 /* Get folder view */
1662 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1663 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1667 /* Get selected folder as destination folder */
1668 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1669 if (!(folder && TNY_IS_FOLDER(folder))) {
1674 /* Check clipboard is cleared */
1675 clipboard = modest_runtime_get_email_clipboard ();
1676 if (modest_email_clipboard_cleared (clipboard)) {
1681 /* Check source folder */
1682 result = modest_email_clipboard_check_source_folder (clipboard,
1683 (const TnyFolder *) folder);
1687 g_object_unref (folder);
1693 _selected_folder_is_any_of_type (ModestWindow *win,
1694 TnyFolderType types[],
1697 GtkWidget *folder_view = NULL;
1698 TnyFolderStore *folder = NULL;
1699 TnyFolderType folder_type;
1701 gboolean result = FALSE;
1703 /*Get current folder */
1704 if (MODEST_IS_MAIN_WINDOW(win)) {
1706 /* Get folder view */
1707 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1708 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1709 /* If no folder view, always dimmed */
1713 /* Get selected folder as parent of new folder to create */
1714 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1716 if (!(folder && TNY_IS_FOLDER(folder))) {
1718 g_object_unref (folder);
1722 /* Check folder type */
1723 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
1725 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1726 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1727 for (i=0; i < ntypes; i++) {
1728 result = result || folder_type == types[i];
1734 g_object_unref (folder);
1740 _folder_is_any_of_type (TnyFolder *folder,
1741 TnyFolderType types[],
1744 TnyFolderType folder_type;
1745 gboolean result = FALSE;
1748 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
1750 /* Get folder type */
1751 folder_type = modest_tny_folder_guess_folder_type (folder);
1753 /* Check foler type */
1754 for (i=0; i < ntypes; i++) {
1755 result = result || folder_type == types[i];
1762 _selected_folder_is_snd_level (ModestMainWindow *win)
1764 GtkWidget *folder_view = NULL;
1765 GtkTreeSelection *sel = NULL;
1766 GtkTreeModel *model = NULL;
1767 GtkTreePath *path = NULL;
1769 TnyFolderStore *folder = NULL;
1770 gboolean result = FALSE;
1772 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1774 /*Get curent folder */
1775 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1776 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1777 /* If no folder view, always dimmed */
1781 /* Get selected folder as parent of new folder to create */
1782 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1783 if (!(folder && TNY_IS_FOLDER(folder))) {
1787 /* Check folder level */
1788 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(folder_view));
1789 if (!gtk_tree_selection_get_selected (sel, &model, &iter))
1791 path = gtk_tree_model_get_path (model, &iter);
1792 result = gtk_tree_path_get_depth (path) > 2;
1796 g_object_unref (folder);
1798 gtk_tree_path_free (path);
1805 _clipboard_is_empty (ModestWindow *win)
1807 gboolean result = FALSE;
1809 if (MODEST_IS_MAIN_WINDOW (win)) {
1810 ModestEmailClipboard *clipboard = NULL;
1811 clipboard = modest_runtime_get_email_clipboard ();
1812 if (modest_email_clipboard_cleared (clipboard))
1820 _invalid_clipboard_selected (ModestWindow *win,
1821 ModestDimmingRule *rule)
1823 const DimmedState *state = NULL;
1824 gboolean result = FALSE;
1826 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1827 state = modest_window_get_dimming_state (win);
1829 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1830 GtkClipboard *clipboard = NULL;
1831 gchar *selection = NULL;
1832 GtkWidget *focused = NULL;
1834 /* Get clipboard selection*/
1835 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1836 selection = gtk_clipboard_wait_for_text (clipboard);
1838 /* Get focuesed widget */
1839 focused = gtk_window_get_focus (GTK_WINDOW (win));
1842 result = ((selection == NULL) ||
1843 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
1846 modest_dimming_rule_set_notification (rule, "");
1848 if (selection != NULL)
1851 else if (MODEST_IS_MAIN_WINDOW (win)) {
1853 result = state->n_selected == 0;
1855 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1863 _invalid_attach_selected (ModestWindow *win,
1866 gboolean for_remove,
1867 ModestDimmingRule *rule)
1869 GList *attachments, *node;
1871 TnyHeaderFlags flags;
1872 gboolean nested_attachments = FALSE;
1873 gboolean selected_messages = FALSE;
1874 const DimmedState *state = NULL;
1875 gboolean result = FALSE;
1877 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1878 state = modest_window_get_dimming_state (win);
1880 if (MODEST_IS_MAIN_WINDOW (win)) {
1881 flags = TNY_HEADER_FLAG_ATTACHMENTS;
1883 result = !state->any_has_attachments;
1885 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1887 /* Get selected atachments */
1888 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1889 n_selected = g_list_length (attachments);
1894 result = n_selected != 1;
1897 result = n_selected < 1;
1900 /* Check attached type (view operation not required) */
1901 if (!result && !for_view) {
1902 for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
1903 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1904 TnyList *nested_list = tny_simple_list_new ();
1905 if (!for_remove && TNY_IS_MSG (mime_part)) {
1906 selected_messages = TRUE;
1909 tny_mime_part_get_parts (mime_part, nested_list);
1910 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1911 nested_attachments = TRUE;
1914 g_object_unref (nested_list);
1918 /* Set notifications */
1919 if (result && rule != NULL) {
1920 if (selected_messages) {
1921 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1922 } else if (nested_attachments) {
1923 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1924 } else if (n_selected == 0) {
1925 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1926 } else if (unique) {
1927 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1932 g_list_free (attachments);
1939 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule)
1941 GList *attachments = NULL, *node;
1943 gint n_attachments = 0;
1944 gboolean result = FALSE;
1946 /* This should check if _all_ the attachments are already purged. If only some
1947 * of them are purged, then it does not cause dim as there's a confirmation dialog
1948 * for removing only local attachments */
1950 /* Get selected atachments */
1951 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1952 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1953 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1954 /* If we're in main window, we won't know if there are already purged attachments */
1958 if (attachments == NULL)
1961 for (node = attachments; node != NULL; node = g_list_next (node)) {
1962 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1963 if (tny_mime_part_is_purged (mime_part)) {
1970 g_list_free (attachments);
1973 result = (purged == n_attachments);
1975 result = (purged > 0);
1977 if (result && (rule != NULL))
1978 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1984 _invalid_msg_selected (ModestMainWindow *win,
1986 ModestDimmingRule *rule)
1988 GtkWidget *folder_view = NULL;
1989 const DimmedState *state = NULL;
1990 gboolean result = FALSE;
1992 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1993 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
1994 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
1996 /* Get folder view to check focus */
1997 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1998 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2000 /* Check dimmed rule (TODO: check focus on widgets */
2002 result = ((state->n_selected == 0 ) ||
2003 (gtk_widget_is_focus (folder_view)));
2005 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2007 if (!result && unique) {
2008 result = state->n_selected > 1;
2010 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2018 _msg_download_in_progress (ModestMsgViewWindow *win)
2020 gboolean result = FALSE;
2022 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
2024 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
2030 _msg_download_completed (ModestMainWindow *win)
2032 const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2033 return state->any_marked_as_cached;
2037 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2039 GSList **send_queues = (GSList **) userdata;
2040 *send_queues = g_slist_prepend (*send_queues, value);
2044 _selected_msg_sent_in_progress (ModestWindow *win)
2046 const DimmedState *state = modest_window_get_dimming_state (win);
2047 return state->sent_in_progress;
2052 _sending_in_progress (ModestWindow *win)
2054 gboolean result = FALSE;
2056 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
2058 /* Check if send operation is in progress */
2059 result = modest_main_window_send_receive_in_progress (MODEST_MAIN_WINDOW (win));
2065 _invalid_folder_for_purge (ModestWindow *win,
2066 ModestDimmingRule *rule)
2069 TnyFolder *folder = NULL;
2070 TnyAccount *account = NULL;
2071 gboolean result = FALSE;
2073 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2075 /* Get folder and account of message */
2076 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2077 g_return_val_if_fail(msg != NULL, TRUE);
2078 folder = tny_msg_get_folder (msg);
2079 if (folder == NULL) {
2080 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2083 g_object_unref (msg);
2084 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2085 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2086 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2089 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
2090 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2093 g_return_val_if_reached (FALSE);
2095 account = modest_tny_folder_get_account (folder);
2096 if (account == NULL) goto frees;
2099 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2100 TnyFolderType types[2];
2101 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2102 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2104 if (_selected_folder_is_any_of_type (win, types, 2)) {
2106 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
2108 /* We're currently disabling purge in any local store */
2110 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2113 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2114 /* If it's POP then dim */
2115 if (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2116 MODEST_PROTOCOL_STORE_POP) {
2117 GList *attachments = NULL;
2118 gint n_selected = 0;
2121 /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
2123 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2124 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2125 n_selected = g_list_length (attachments);
2126 g_list_free (attachments);
2129 modest_dimming_rule_set_notification (rule,
2130 ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
2131 "mail_ib_unable_to_pure_attach_pop_mail_plural",
2138 g_object_unref (folder);
2139 if (account != NULL)
2140 g_object_unref (account);
2146 _transfer_mode_enabled (ModestWindow *win)
2148 gboolean result = FALSE;
2151 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2152 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2153 } else if (MODEST_IS_MAIN_WINDOW(win)) {
2154 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2156 g_warning("_transfer_mode_enabled called with wrong window type");