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 TnyList *selected_headers = NULL;
84 TnyIterator *iter = NULL;
85 TnyHeader *header = NULL;
86 ModestCacheMgr *cache_mgr = NULL;
87 GHashTable *send_queue_cache = NULL;
88 ModestTnySendQueue *send_queue = NULL;
89 GSList *send_queues = NULL, *node = NULL;
90 ModestWindowMgr *mgr = NULL;
91 gboolean found = FALSE;
92 gchar *msg_uid = NULL;
94 gboolean all_deleted = TRUE;
95 gboolean all_seen = TRUE;
96 gboolean all_cached = TRUE;
97 gboolean all_has_attach = TRUE;
99 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
102 state = g_slice_new0 (DimmedState);
103 state->n_selected = 0;
104 state->already_opened_msg = FALSE;
105 state->any_marked_as_deleted = FALSE;
106 state->all_marked_as_deleted = FALSE;
107 state->any_marked_as_seen = FALSE;
108 state->all_marked_as_seen = FALSE;
109 state->any_marked_as_cached = FALSE;
110 state->all_marked_as_cached = FALSE;
111 state->any_has_attachments = FALSE;
112 state->all_has_attachments = FALSE;
113 state->sent_in_progress = FALSE;
115 /* Get focused widget */
116 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
117 if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
120 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
121 header_view = focused_widget;
123 header_view = modest_main_window_get_child_widget (window, MODEST_WIDGET_TYPE_HEADER_VIEW);
126 /* Get header view and selected headers */
127 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
128 if (!selected_headers)
131 /* Examine selected headers */
132 iter = tny_list_create_iterator (selected_headers);
133 while (!tny_iterator_is_done (iter)) {
134 header = TNY_HEADER (tny_iterator_get_current (iter));
135 flags = tny_header_get_flags (header);
141 mgr = modest_runtime_get_window_mgr ();
142 if (!state->already_opened_msg)
143 state->already_opened_msg = modest_window_mgr_find_registered_header (mgr, header, NULL);
146 /* Mark as deleted */
147 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
148 state->all_marked_as_deleted = all_deleted;
149 if (!state->any_marked_as_deleted)
150 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
153 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
154 state->all_marked_as_seen = all_seen;
155 if (!state->any_marked_as_seen)
156 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
159 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
160 state->all_marked_as_cached = all_cached;
161 if (!state->any_marked_as_cached)
162 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
164 /* Mark has_attachments */
165 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
166 state->all_has_attachments = all_has_attach;
167 if (!state->any_has_attachments)
168 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
170 /* sent in progress */
171 msg_uid = modest_tny_send_queue_get_msg_id (header);
172 if (!state->sent_in_progress) {
173 cache_mgr = modest_runtime_get_cache_mgr ();
174 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
175 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
177 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
179 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
180 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
182 /* Check if msg uid is being processed inside send queue */
183 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
185 state->sent_in_progress = found;
188 tny_iterator_next (iter);
189 g_object_unref (header);
194 g_object_unref(selected_headers);
195 g_object_unref(iter);
196 g_slist_free (send_queues);
202 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
204 DimmedState *state = NULL;
205 TnyHeader *header = NULL;
206 ModestCacheMgr *cache_mgr = NULL;
207 GHashTable *send_queue_cache = NULL;
208 ModestTnySendQueue *send_queue = NULL;
209 GSList *send_queues = NULL, *node = NULL;
210 gboolean found = FALSE;
211 gchar *msg_uid = NULL;
212 TnyHeaderFlags flags;
213 gboolean all_deleted = TRUE;
214 gboolean all_seen = TRUE;
215 gboolean all_cached = TRUE;
216 gboolean all_has_attach = TRUE;
218 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
221 state = g_slice_new0 (DimmedState);
222 state->n_selected = 0;
223 state->already_opened_msg = FALSE;
224 state->any_marked_as_deleted = FALSE;
225 state->all_marked_as_deleted = FALSE;
226 state->any_marked_as_seen = FALSE;
227 state->all_marked_as_seen = FALSE;
228 state->any_marked_as_cached = FALSE;
229 state->all_marked_as_cached = FALSE;
230 state->any_has_attachments = FALSE;
231 state->all_has_attachments = FALSE;
232 state->sent_in_progress = FALSE;
234 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
235 g_return_val_if_fail (TNY_IS_HEADER(header), state);
236 flags = tny_header_get_flags (header);
241 /* Mark as deleted */
242 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
243 state->all_marked_as_deleted = all_deleted;
244 if (!state->any_marked_as_deleted)
245 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
248 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
249 state->all_marked_as_seen = all_seen;
250 if (!state->any_marked_as_seen)
251 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
254 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
255 state->all_marked_as_cached = all_cached;
256 if (!state->any_marked_as_cached)
257 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
259 /* Mark has_attachments */
260 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
261 state->all_has_attachments = all_has_attach;
262 if (!state->any_has_attachments)
263 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
265 /* sent in progress */
266 msg_uid = modest_tny_send_queue_get_msg_id (header);
267 if (!state->sent_in_progress) {
268 cache_mgr = modest_runtime_get_cache_mgr ();
269 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
270 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
272 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
274 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
275 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
277 /* Check if msg uid is being processed inside send queue */
278 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
280 state->sent_in_progress = found;
285 g_object_unref (header);
286 g_slist_free (send_queues);
293 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
295 DimmedState *state = NULL;
297 g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
299 if (MODEST_IS_MAIN_WINDOW (window))
300 state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
301 else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
302 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
310 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
312 ModestDimmingRule *rule = NULL;
313 gboolean dimmed = FALSE;
315 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
316 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
317 rule = MODEST_DIMMING_RULE (user_data);
319 /* Check dimmed rule */
321 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
323 modest_dimming_rule_set_notification (rule, "");
330 modest_ui_dimming_rules_on_csm_new_folder (ModestWindow *win, gpointer user_data)
332 ModestDimmingRule *rule = NULL;
333 gboolean dimmed = FALSE;
335 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
336 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
337 rule = MODEST_DIMMING_RULE (user_data);
339 /* Check common new folder menu item dimming rules */
340 dimmed = modest_ui_dimming_rules_on_new_folder (win, user_data);
342 /* Check CSM specific dimming rules */
344 dimmed = _selected_folder_is_snd_level (MODEST_MAIN_WINDOW(win));
346 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
353 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
355 ModestDimmingRule *rule = NULL;
356 GtkWidget *folder_view = NULL;
357 TnyFolderStore *parent_folder = NULL;
358 gboolean dimmed = FALSE;
360 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
361 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
362 rule = MODEST_DIMMING_RULE (user_data);
364 /* Get selected folder as parent of new folder to create */
365 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
366 MODEST_WIDGET_TYPE_FOLDER_VIEW);
367 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
371 if (TNY_IS_ACCOUNT (parent_folder)) {
372 /* If it's the local account then do not dim */
373 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
376 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
377 /* If it's POP then dim */
378 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
379 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
381 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
384 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
386 TnyFolderType types[3];
388 types[0] = TNY_FOLDER_TYPE_DRAFTS;
389 types[1] = TNY_FOLDER_TYPE_OUTBOX;
390 types[2] = TNY_FOLDER_TYPE_SENT;
392 /* Apply folder rules */
394 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
396 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
399 dimmed = _selected_folder_is_any_of_type (win, types, 3);
401 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
404 g_object_unref (parent_folder);
410 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
412 ModestDimmingRule *rule = NULL;
413 GtkWidget *folder_view = NULL;
414 GtkWidget *header_view = NULL;
415 gboolean dimmed = FALSE;
417 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
418 rule = MODEST_DIMMING_RULE (user_data);
420 if (MODEST_IS_MAIN_WINDOW (win)) {
421 /* Get the folder view */
422 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
423 MODEST_WIDGET_TYPE_FOLDER_VIEW);
425 /* Get header view */
426 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
427 MODEST_WIDGET_TYPE_HEADER_VIEW);
429 if (header_view && gtk_widget_is_focus (header_view))
430 dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
432 if (folder_view && gtk_widget_is_focus (folder_view))
433 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
435 if (header_view && folder_view &&
436 !gtk_widget_is_focus (header_view) &&
437 !gtk_widget_is_focus (folder_view)) {
439 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));
442 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
451 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
453 ModestDimmingRule *rule = NULL;
454 TnyFolderType types[6];
455 gboolean dimmed = FALSE;
457 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
458 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
459 rule = MODEST_DIMMING_RULE (user_data);
461 types[0] = TNY_FOLDER_TYPE_DRAFTS;
462 types[1] = TNY_FOLDER_TYPE_OUTBOX;
463 types[2] = TNY_FOLDER_TYPE_SENT;
464 types[3] = TNY_FOLDER_TYPE_INBOX;
465 types[4] = TNY_FOLDER_TYPE_ROOT;
466 types[5] = TNY_FOLDER_TYPE_ARCHIVE;
469 /* Check dimmed rule */
471 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
473 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
476 dimmed = _selected_folder_is_any_of_type (win, types, 6);
478 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
481 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
483 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
486 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
488 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
491 dimmed = _transfer_mode_enabled (win);
493 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
500 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
502 ModestDimmingRule *rule = NULL;
503 gboolean dimmed = FALSE;
505 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
506 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
507 rule = MODEST_DIMMING_RULE (user_data);
509 /* Check dimmed rule */
511 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
512 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
516 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
517 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
525 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
527 ModestDimmingRule *rule = NULL;
528 TnyFolderType types[4];
529 gboolean dimmed = FALSE;
531 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
532 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
533 rule = MODEST_DIMMING_RULE (user_data);
535 types[0] = TNY_FOLDER_TYPE_DRAFTS;
536 types[1] = TNY_FOLDER_TYPE_OUTBOX;
537 types[2] = TNY_FOLDER_TYPE_SENT;
538 types[3] = TNY_FOLDER_TYPE_ARCHIVE;
540 /* Check dimmed rule */
542 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
544 modest_dimming_rule_set_notification (rule, "");
547 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
549 modest_dimming_rule_set_notification (rule, "");
552 dimmed = _selected_folder_is_any_of_type (win, types, 4);
554 modest_dimming_rule_set_notification (rule, "");
561 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
563 ModestDimmingRule *rule = NULL;
564 gboolean dimmed = FALSE;
565 const DimmedState *state = NULL;
567 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
568 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
569 rule = MODEST_DIMMING_RULE (user_data);
570 state = modest_window_get_dimming_state (win);
572 /* Check dimmed rule */
574 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
577 dimmed = state->any_marked_as_deleted;
579 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
582 dimmed = _selected_msg_sent_in_progress (win);
584 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
591 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
593 ModestDimmingRule *rule = NULL;
594 gboolean dimmed = FALSE;
595 TnyFolderType types[3];
597 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
598 rule = MODEST_DIMMING_RULE (user_data);
600 /* main window dimming rules */
601 if (MODEST_IS_MAIN_WINDOW(win)) {
603 types[0] = TNY_FOLDER_TYPE_DRAFTS;
604 types[1] = TNY_FOLDER_TYPE_OUTBOX;
605 types[2] = TNY_FOLDER_TYPE_ROOT;
607 /* Check dimmed rule */
609 dimmed = _selected_folder_is_any_of_type (win, types, 3);
611 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
614 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
616 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
619 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
621 /* msg view window dimming rules */
622 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
624 /* Check dimmed rule */
626 dimmed = _transfer_mode_enabled (win);
628 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
631 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
633 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
642 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
644 ModestDimmingRule *rule = NULL;
645 gboolean dimmed = FALSE;
647 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
648 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
649 rule = MODEST_DIMMING_RULE (user_data);
651 /* Check dimmed rule */
653 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
656 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
658 modest_dimming_rule_set_notification (rule, "");
665 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
667 gboolean dimmed = FALSE;
669 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
671 /* Check dimmed rule */
679 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
681 ModestDimmingRule *rule = NULL;
682 guint n_messages = 0;
683 const DimmedState *state = NULL;
684 gboolean dimmed = FALSE;
686 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
687 rule = MODEST_DIMMING_RULE (user_data);
688 state = modest_window_get_dimming_state (win);
690 /* Check dimmed rule */
691 if (MODEST_IS_MAIN_WINDOW (win)) {
693 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
695 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
698 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
701 dimmed = state->already_opened_msg;
702 n_messages = state->n_selected;
704 gchar *num = g_strdup_printf ("%d", n_messages);
705 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
706 modest_dimming_rule_set_notification (rule, message);
713 dimmed = state->any_marked_as_deleted;
715 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
719 dimmed = state->sent_in_progress;
721 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
724 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
726 dimmed = _transfer_mode_enabled (win);
728 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
731 dimmed = state->any_marked_as_deleted;
733 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
736 /* The delete button should be dimmed when viewing an attachment,
737 * but should be enabled when viewing a message from the list,
738 * or when viewing a search result.
741 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
742 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
744 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
754 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
756 ModestDimmingRule *rule = NULL;
757 GtkWidget *header_view = NULL;
758 gboolean dimmed = FALSE;
760 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
761 rule = MODEST_DIMMING_RULE (user_data);
763 /* main window dimming rules */
764 if (MODEST_IS_MAIN_WINDOW(win)) {
766 /* Check dimmed rule */
767 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
768 MODEST_WIDGET_TYPE_HEADER_VIEW);
770 /* If the header view has the focus: */
771 if (header_view && gtk_widget_is_focus (header_view)) {
772 /* Check dimmed rule */
774 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
777 /* If the folder view has the focus: */
778 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
779 MODEST_WIDGET_TYPE_FOLDER_VIEW);
780 if (folder_view && gtk_widget_is_focus (folder_view)) {
781 TnyFolderStore *folder_store
782 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
784 /* Only enable for folders, not accounts,
785 * though the UI spec is not clear about that.
786 * If we enable this for accounts then we must
787 * add code to handle them in modest_ui_actions_on_details(). */
788 if (!TNY_IS_FOLDER(folder_store)) {
790 modest_dimming_rule_set_notification (rule, "");
793 g_object_unref (folder_store);
799 /* msg view window dimming rules */
802 /* Check dimmed rule */
804 if (MODEST_IS_MSG_VIEW_WINDOW (win))
805 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
807 modest_dimming_rule_set_notification (rule, "");
816 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
818 ModestDimmingRule *rule = NULL;
819 TnyHeaderFlags flags;
820 const DimmedState *state = NULL;
821 gboolean dimmed = FALSE;
823 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
824 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
825 rule = MODEST_DIMMING_RULE (user_data);
826 state = modest_window_get_dimming_state (win);
828 flags = TNY_HEADER_FLAG_SEEN;
830 /* Check dimmed rule */
832 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
835 dimmed = state->all_marked_as_seen;
837 modest_dimming_rule_set_notification (rule, "");
844 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
846 ModestDimmingRule *rule = NULL;
847 TnyHeaderFlags flags;
848 const DimmedState *state = NULL;
849 gboolean dimmed = FALSE;
851 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
852 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
853 rule = MODEST_DIMMING_RULE (user_data);
854 state = modest_window_get_dimming_state (win);
856 flags = TNY_HEADER_FLAG_SEEN;
858 /* Check dimmed rule */
860 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
862 dimmed = !state->any_marked_as_seen;
864 modest_dimming_rule_set_notification (rule, "");
871 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
873 ModestDimmingRule *rule = NULL;
874 gboolean dimmed = FALSE;
876 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
877 rule = MODEST_DIMMING_RULE (user_data);
879 if (MODEST_IS_MAIN_WINDOW (win))
880 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
881 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
882 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
889 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
891 GtkWidget *folder_view = NULL;
892 ModestDimmingRule *rule = NULL;
893 guint n_messages = 0;
894 const DimmedState *state = NULL;
895 gboolean dimmed = FALSE;
897 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
898 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
899 rule = MODEST_DIMMING_RULE (user_data);
900 state = modest_window_get_dimming_state (win);
902 /* Get the folder view */
903 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
904 MODEST_WIDGET_TYPE_FOLDER_VIEW);
907 /* Check diming rules for folders transfer */
908 if (gtk_widget_is_focus (folder_view)) {
909 TnyFolderType types[5];
911 types[0] = TNY_FOLDER_TYPE_DRAFTS;
912 types[1] = TNY_FOLDER_TYPE_OUTBOX;
913 types[2] = TNY_FOLDER_TYPE_SENT;
914 types[3] = TNY_FOLDER_TYPE_ROOT;
915 types[4] = TNY_FOLDER_TYPE_INBOX;
917 /* Apply folder rules */
919 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
921 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
924 dimmed = _selected_folder_is_any_of_type (win, types, 5);
926 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
930 /* Check diming rules for messages transfer */
932 dimmed = state->already_opened_msg;
933 n_messages = state->n_selected;
935 gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"), n_messages);
936 modest_dimming_rule_set_notification (rule, message);
941 if (!gtk_widget_is_focus (folder_view))
942 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
950 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
952 ModestDimmingRule *rule = NULL;
953 gboolean dimmed = FALSE;
955 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
956 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
957 rule = MODEST_DIMMING_RULE (user_data);
959 /* Check dimmed rule */
961 dimmed = _transfer_mode_enabled (win);
963 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
967 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
968 /* The move_to button should be dimmed when viewing an attachment,
969 * but should be enabled when viewing a message from the list,
970 * or when viewing a search result.
972 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
973 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
978 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
985 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
987 ModestDimmingRule *rule = NULL;
988 gboolean dimmed = FALSE;
990 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
991 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
992 rule = MODEST_DIMMING_RULE (user_data);
994 /* Check dimmed rule */
996 dimmed = _transfer_mode_enabled (win);
998 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1005 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
1007 ModestDimmingRule *rule = NULL;
1008 TnyFolderType types[3];
1009 gboolean dimmed = FALSE;
1011 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1012 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1013 rule = MODEST_DIMMING_RULE (user_data);
1015 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1016 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1017 types[2] = TNY_FOLDER_TYPE_SENT;
1019 /* Check dimmed rule */
1021 dimmed = _clipboard_is_empty (win);
1023 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ecoc_ib_edwin_nothing_to_paste"));
1026 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1028 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
1031 dimmed = !_folder_view_has_focus (win);
1033 modest_dimming_rule_set_notification (rule,
1034 dgettext("hildon-common-strings",
1035 "ckct_ib_unable_to_paste_here"));
1038 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
1040 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
1044 dimmed = _selected_folder_is_same_as_source (win);
1046 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
1054 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1056 ModestDimmingRule *rule = NULL;
1057 gboolean dimmed = FALSE;
1059 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1060 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1061 rule = MODEST_DIMMING_RULE (user_data);
1063 /* Check dimmed rule */
1065 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1068 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1071 modest_dimming_rule_set_notification (rule, "");
1077 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1079 ModestDimmingRule *rule = NULL;
1080 gboolean dimmed = FALSE;
1082 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1083 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1084 rule = MODEST_DIMMING_RULE (user_data);
1086 /* Check dimmed rule */
1088 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);
1091 dimmed = _purged_attach_selected (win, FALSE, NULL);
1093 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1101 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1103 ModestDimmingRule *rule = NULL;
1104 gboolean dimmed = FALSE;
1106 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1107 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1108 rule = MODEST_DIMMING_RULE (user_data);
1110 /* Check dimmed rule */
1112 dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1115 dimmed = _purged_attach_selected (win, FALSE, NULL);
1117 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1125 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1127 ModestDimmingRule *rule = NULL;
1128 const DimmedState *state = NULL;
1129 gboolean dimmed = FALSE;
1131 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1132 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1133 rule = MODEST_DIMMING_RULE (user_data);
1134 state = modest_window_get_dimming_state (win);
1136 /* Check in main window if there's only one message selected */
1137 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1138 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1141 /* Check in view window if there's any attachment selected */
1142 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1143 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1145 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1148 /* cannot purge in editable drafts nor pop folders */
1150 dimmed = _invalid_folder_for_purge (win, rule);
1153 /* Check if the selected message in main window has attachments */
1154 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1155 dimmed = state->any_has_attachments;
1157 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1160 /* Check if all attachments are already purged */
1162 dimmed = _purged_attach_selected (win, TRUE, rule);
1165 /* Check if the message is already downloaded */
1166 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1167 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1169 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1177 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1179 ModestDimmingRule *rule = NULL;
1180 gboolean dimmed = FALSE;
1182 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1183 rule = MODEST_DIMMING_RULE (user_data);
1185 /* Check dimmed rule */
1187 dimmed = _clipboard_is_empty (win);
1189 modest_dimming_rule_set_notification (rule, "");
1196 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1198 ModestDimmingRule *rule = NULL;
1199 gboolean dimmed = FALSE;
1201 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1202 rule = MODEST_DIMMING_RULE (user_data);
1204 /* Check common dimming rules */
1206 dimmed = _invalid_clipboard_selected (win, rule);
1209 /* Check window specific dimming rules */
1210 if (MODEST_IS_MAIN_WINDOW (win)) {
1211 /* Get focused widget */
1212 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1214 if (MODEST_IS_HEADER_VIEW (focused)) {
1216 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1218 modest_dimming_rule_set_notification (rule, "");
1221 dimmed = _selected_msg_sent_in_progress (win);
1223 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1226 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1227 TnyFolderType types[3];
1229 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1230 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1231 types[2] = TNY_FOLDER_TYPE_SENT;
1233 /* Apply folder rules */
1235 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
1237 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
1240 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1242 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1245 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1247 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1256 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1258 ModestDimmingRule *rule = NULL;
1259 gboolean dimmed = FALSE;
1261 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1262 rule = MODEST_DIMMING_RULE (user_data);
1264 /* Check common dimming rules */
1266 dimmed = _invalid_clipboard_selected (win, rule);
1269 /* Check window specific dimming rules */
1270 if (MODEST_IS_MAIN_WINDOW (win)) {
1271 /* Get focused widget */
1272 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1274 if (MODEST_IS_HEADER_VIEW (focused)) {
1276 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1278 modest_dimming_rule_set_notification (rule, "");
1281 dimmed = _selected_msg_sent_in_progress (win);
1283 modest_dimming_rule_set_notification (rule, _(""));
1286 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1288 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1290 modest_dimming_rule_set_notification (rule, _(""));
1299 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1301 ModestDimmingRule *rule = NULL;
1302 gboolean dimmed = FALSE;
1304 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1305 rule = MODEST_DIMMING_RULE (user_data);
1307 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1309 /* Check dimmed rule */
1311 dimmed = _transfer_mode_enabled (win);
1313 modest_dimming_rule_set_notification (
1314 rule, _("mail_ib_notavailable_downloading"));
1317 dimmed = modest_msg_view_window_first_message_selected (
1318 MODEST_MSG_VIEW_WINDOW(win));
1319 modest_dimming_rule_set_notification (rule, NULL);
1326 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1328 ModestDimmingRule *rule = NULL;
1329 gboolean dimmed = FALSE;
1331 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1332 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1333 rule = MODEST_DIMMING_RULE (user_data);
1335 /* Check dimmed rule */
1337 dimmed = _transfer_mode_enabled (win);
1339 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1342 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1343 modest_dimming_rule_set_notification (rule, NULL);
1351 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1353 const gboolean dimmed =
1354 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1361 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1363 ModestDimmingRule *rule = NULL;
1364 TnyFolderType types[1];
1365 guint n_messages = 0;
1366 const DimmedState *state = NULL;
1367 gboolean dimmed = FALSE;
1369 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1370 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1371 rule = MODEST_DIMMING_RULE (user_data);
1372 state = modest_window_get_dimming_state (win);
1374 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1376 /* Check dimmed rules */
1378 dimmed = state->already_opened_msg;
1379 n_messages = state->n_selected;
1381 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_cancel_send"));
1384 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1386 modest_dimming_rule_set_notification (rule, "");
1389 dimmed = !_sending_in_progress (win);
1391 modest_dimming_rule_set_notification (rule, "");
1398 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1400 ModestDimmingRule *rule = NULL;
1401 gboolean dimmed = FALSE;
1403 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1404 rule = MODEST_DIMMING_RULE (user_data);
1406 /* Check dimmed rule */
1408 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1411 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1418 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1420 ModestDimmingRule *rule = NULL;
1421 gboolean dimmed = FALSE;
1423 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1424 rule = MODEST_DIMMING_RULE (user_data);
1426 /* Check dimmed rule */
1428 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1429 gchar *selection = NULL;
1430 selection = gtk_clipboard_wait_for_text (clipboard);
1432 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1438 /* *********************** static utility functions ******************** */
1442 _selected_folder_not_writeable (ModestMainWindow *win)
1444 GtkWidget *folder_view = NULL;
1445 TnyFolderStore *parent_folder = NULL;
1446 ModestTnyFolderRules rules;
1447 gboolean result = FALSE;
1449 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1451 /* Get folder view */
1452 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1453 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1454 /* If no folder view, always dimmed */
1458 /* Get selected folder as parent of new folder to create */
1459 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1460 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1462 g_object_unref (parent_folder);
1466 /* Check dimmed rule */
1467 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1468 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1471 g_object_unref (parent_folder);
1477 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1479 TnyFolderType types[2];
1480 gboolean result = FALSE;
1482 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1484 types[0] = TNY_FOLDER_TYPE_ROOT;
1485 types[1] = TNY_FOLDER_TYPE_INBOX;
1487 /* Check folder type */
1488 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
1490 /* Check pop and MMC accounts */
1492 result = _selected_folder_is_MMC_or_POP_root (win);
1500 _selected_folder_is_root (ModestMainWindow *win)
1502 TnyFolderType types[1];
1503 gboolean result = FALSE;
1505 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1507 /* All accounts are root items: */
1508 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1509 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1511 gboolean is_account = FALSE;
1512 TnyFolderStore *folder_store =
1513 modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1515 is_account = TNY_IS_ACCOUNT (folder_store);
1516 g_object_unref (folder_store);
1517 folder_store = NULL;
1524 /* Try something more precise: */
1525 types[0] = TNY_FOLDER_TYPE_ROOT;
1527 /* Check folder type */
1528 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1530 /* Check pop and MMC accounts */
1532 result = _selected_folder_is_MMC_or_POP_root (win);
1539 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1541 GtkWidget *folder_view = NULL;
1542 TnyFolderStore *parent_folder = NULL;
1543 gboolean result = FALSE;
1545 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1546 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1547 /* Get selected folder as parent of new folder to create */
1548 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1552 if (TNY_IS_ACCOUNT (parent_folder)) {
1553 /* If it's the local account then do not dim */
1554 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1557 /* If it's the MMC root folder then dim it */
1558 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1561 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1562 /* If it's POP then dim */
1563 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
1564 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1568 g_object_unref (parent_folder);
1574 _header_view_is_all_selected (ModestMainWindow *win)
1576 GtkTreeSelection *sel = NULL;
1577 GtkTreeModel *model = NULL;
1578 GtkTreeView *header_view = NULL;
1579 gint count_sel, count_model;
1581 header_view = GTK_TREE_VIEW(modest_main_window_get_child_widget(
1582 win, MODEST_WIDGET_TYPE_HEADER_VIEW));
1583 if(header_view == NULL)
1586 model = gtk_tree_view_get_model(header_view);
1590 sel = gtk_tree_view_get_selection(header_view);
1594 /* check if all the headers are selected or not */
1595 count_sel = gtk_tree_selection_count_selected_rows (sel);
1596 count_model = gtk_tree_model_iter_n_children(model, NULL);
1597 if(count_sel == count_model != 0)
1598 /*all header is selected*/
1605 _selected_folder_is_empty (ModestMainWindow *win)
1607 GtkWidget *folder_view = NULL;
1608 TnyFolderStore *folder = NULL;
1609 gboolean result = FALSE;
1611 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1613 /* Get folder view */
1614 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1615 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1616 /* If no folder view, always dimmed */
1620 /* Get selected folder as parent of new folder to create */
1621 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1622 if (!(folder && TNY_IS_FOLDER(folder))) {
1624 g_object_unref (folder);
1628 /* Check folder type */
1629 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
1632 g_object_unref (folder);
1638 _folder_view_has_focus (ModestWindow *win)
1640 GtkWidget *folder_view = NULL;
1642 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1644 /* Get folder view */
1645 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1646 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1650 if(gtk_widget_is_focus(folder_view))
1657 _selected_folder_is_same_as_source (ModestWindow *win)
1659 ModestEmailClipboard *clipboard = NULL;
1660 GtkWidget *folder_view = NULL;
1661 TnyFolderStore *folder = NULL;
1662 gboolean result = FALSE;
1664 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1666 /* Get folder view */
1667 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1668 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1672 /* Get selected folder as destination folder */
1673 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1674 if (!(folder && TNY_IS_FOLDER(folder))) {
1679 /* Check clipboard is cleared */
1680 clipboard = modest_runtime_get_email_clipboard ();
1681 if (modest_email_clipboard_cleared (clipboard)) {
1686 /* Check source folder */
1687 result = modest_email_clipboard_check_source_folder (clipboard,
1688 (const TnyFolder *) folder);
1692 g_object_unref (folder);
1698 _selected_folder_is_any_of_type (ModestWindow *win,
1699 TnyFolderType types[],
1702 GtkWidget *folder_view = NULL;
1703 TnyFolderStore *folder = NULL;
1704 TnyFolderType folder_type;
1706 gboolean result = FALSE;
1708 /*Get current folder */
1709 if (MODEST_IS_MAIN_WINDOW(win)) {
1711 /* Get folder view */
1712 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1713 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1714 /* If no folder view, always dimmed */
1718 /* Get selected folder as parent of new folder to create */
1719 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1721 if (!(folder && TNY_IS_FOLDER(folder))) {
1723 g_object_unref (folder);
1727 /* Check folder type */
1728 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
1730 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1731 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1732 for (i=0; i < ntypes; i++) {
1733 result = result || folder_type == types[i];
1739 g_object_unref (folder);
1745 _folder_is_any_of_type (TnyFolder *folder,
1746 TnyFolderType types[],
1749 TnyFolderType folder_type;
1750 gboolean result = FALSE;
1753 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
1755 /* Get folder type */
1756 folder_type = modest_tny_folder_guess_folder_type (folder);
1758 /* Check foler type */
1759 for (i=0; i < ntypes; i++) {
1760 result = result || folder_type == types[i];
1767 _selected_folder_is_snd_level (ModestMainWindow *win)
1769 GtkWidget *folder_view = NULL;
1770 GtkTreeSelection *sel = NULL;
1771 GtkTreeModel *model = NULL;
1772 GtkTreePath *path = NULL;
1774 TnyFolderStore *folder = NULL;
1775 gboolean result = FALSE;
1777 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1779 /*Get curent folder */
1780 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1781 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1782 /* If no folder view, always dimmed */
1786 /* Get selected folder as parent of new folder to create */
1787 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1788 if (!(folder && TNY_IS_FOLDER(folder))) {
1792 /* Check folder level */
1793 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(folder_view));
1794 if (!gtk_tree_selection_get_selected (sel, &model, &iter))
1796 path = gtk_tree_model_get_path (model, &iter);
1797 result = gtk_tree_path_get_depth (path) > 2;
1801 g_object_unref (folder);
1803 gtk_tree_path_free (path);
1810 _clipboard_is_empty (ModestWindow *win)
1812 gboolean result = FALSE;
1814 if (MODEST_IS_MAIN_WINDOW (win)) {
1815 ModestEmailClipboard *clipboard = NULL;
1816 clipboard = modest_runtime_get_email_clipboard ();
1817 if (modest_email_clipboard_cleared (clipboard))
1825 _invalid_clipboard_selected (ModestWindow *win,
1826 ModestDimmingRule *rule)
1828 const DimmedState *state = NULL;
1829 gboolean result = FALSE;
1831 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1832 state = modest_window_get_dimming_state (win);
1834 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1835 GtkClipboard *clipboard = NULL;
1836 gchar *selection = NULL;
1837 GtkWidget *focused = NULL;
1839 /* Get clipboard selection*/
1840 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1841 selection = gtk_clipboard_wait_for_text (clipboard);
1843 /* Get focuesed widget */
1844 focused = gtk_window_get_focus (GTK_WINDOW (win));
1847 result = ((selection == NULL) ||
1848 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
1851 modest_dimming_rule_set_notification (rule, "");
1853 if (selection != NULL)
1856 else if (MODEST_IS_MAIN_WINDOW (win)) {
1858 result = state->n_selected == 0;
1860 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1868 _invalid_attach_selected (ModestWindow *win,
1871 gboolean for_remove,
1872 ModestDimmingRule *rule)
1874 GList *attachments, *node;
1876 TnyHeaderFlags flags;
1877 gboolean nested_attachments = FALSE;
1878 gboolean selected_messages = FALSE;
1879 const DimmedState *state = NULL;
1880 gboolean result = FALSE;
1882 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1883 state = modest_window_get_dimming_state (win);
1885 if (MODEST_IS_MAIN_WINDOW (win)) {
1886 flags = TNY_HEADER_FLAG_ATTACHMENTS;
1888 result = !state->any_has_attachments;
1890 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1892 /* Get selected atachments */
1893 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1894 n_selected = g_list_length (attachments);
1899 result = n_selected != 1;
1902 result = n_selected < 1;
1905 /* Check attached type (view operation not required) */
1906 if (!result && !for_view) {
1907 for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
1908 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1909 TnyList *nested_list = tny_simple_list_new ();
1910 if (!for_remove && TNY_IS_MSG (mime_part)) {
1911 selected_messages = TRUE;
1914 tny_mime_part_get_parts (mime_part, nested_list);
1915 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1916 nested_attachments = TRUE;
1919 g_object_unref (nested_list);
1923 /* Set notifications */
1924 if (result && rule != NULL) {
1925 if (selected_messages) {
1926 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1927 } else if (nested_attachments) {
1928 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1929 } else if (n_selected == 0) {
1930 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1931 } else if (unique) {
1932 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1937 g_list_free (attachments);
1944 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule)
1946 GList *attachments = NULL, *node;
1948 gint n_attachments = 0;
1949 gboolean result = FALSE;
1951 /* This should check if _all_ the attachments are already purged. If only some
1952 * of them are purged, then it does not cause dim as there's a confirmation dialog
1953 * for removing only local attachments */
1955 /* Get selected atachments */
1956 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1957 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1958 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1959 /* If we're in main window, we won't know if there are already purged attachments */
1963 if (attachments == NULL)
1966 for (node = attachments; node != NULL; node = g_list_next (node)) {
1967 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1968 if (tny_mime_part_is_purged (mime_part)) {
1975 g_list_free (attachments);
1978 result = (purged == n_attachments);
1980 result = (purged > 0);
1982 if (result && (rule != NULL))
1983 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1989 _invalid_msg_selected (ModestMainWindow *win,
1991 ModestDimmingRule *rule)
1993 GtkWidget *folder_view = NULL;
1994 const DimmedState *state = NULL;
1995 gboolean result = FALSE;
1997 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1998 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
1999 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2001 /* Get folder view to check focus */
2002 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2003 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2005 /* Check dimmed rule (TODO: check focus on widgets */
2007 result = ((state->n_selected == 0 ) ||
2008 (gtk_widget_is_focus (folder_view)));
2010 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2012 if (!result && unique) {
2013 result = state->n_selected > 1;
2015 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2023 _msg_download_in_progress (ModestMsgViewWindow *win)
2025 gboolean result = FALSE;
2027 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
2029 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
2035 _msg_download_completed (ModestMainWindow *win)
2037 const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2038 return state->any_marked_as_cached;
2042 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2044 GSList **send_queues = (GSList **) userdata;
2045 *send_queues = g_slist_prepend (*send_queues, value);
2049 _selected_msg_sent_in_progress (ModestWindow *win)
2051 const DimmedState *state = modest_window_get_dimming_state (win);
2052 return state->sent_in_progress;
2057 _sending_in_progress (ModestWindow *win)
2059 gboolean result = FALSE;
2061 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
2063 /* Check if send operation is in progress */
2064 result = modest_main_window_send_receive_in_progress (MODEST_MAIN_WINDOW (win));
2070 _invalid_folder_for_purge (ModestWindow *win,
2071 ModestDimmingRule *rule)
2074 TnyFolder *folder = NULL;
2075 TnyAccount *account = NULL;
2076 gboolean result = FALSE;
2078 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2080 /* Get folder and account of message */
2081 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2082 g_return_val_if_fail(msg != NULL, TRUE);
2083 folder = tny_msg_get_folder (msg);
2084 if (folder == NULL) {
2085 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2088 g_object_unref (msg);
2089 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2090 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2091 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2094 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
2095 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2098 g_return_val_if_reached (FALSE);
2100 account = modest_tny_folder_get_account (folder);
2101 if (account == NULL) goto frees;
2104 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2105 TnyFolderType types[2];
2106 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2107 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2109 if (_selected_folder_is_any_of_type (win, types, 2)) {
2111 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
2113 /* We're currently disabling purge in any local store */
2115 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2118 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2119 /* If it's POP then dim */
2120 if (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2121 MODEST_PROTOCOL_STORE_POP) {
2122 GList *attachments = NULL;
2123 gint n_selected = 0;
2126 /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
2128 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2129 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2130 n_selected = g_list_length (attachments);
2131 g_list_free (attachments);
2134 modest_dimming_rule_set_notification (rule,
2135 ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
2136 "mail_ib_unable_to_pure_attach_pop_mail_plural",
2143 g_object_unref (folder);
2144 if (account != NULL)
2145 g_object_unref (account);
2151 _transfer_mode_enabled (ModestWindow *win)
2153 gboolean result = FALSE;
2156 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2157 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2158 } else if (MODEST_IS_MAIN_WINDOW(win)) {
2159 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2161 g_warning("_transfer_mode_enabled called with wrong window type");