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-ui-actions.h"
37 #include "modest-account-mgr-helpers.h"
38 #include "modest-dimming-rule.h"
39 #include "modest-debug.h"
40 #include "modest-tny-folder.h"
41 #include "modest-tny-account.h"
42 #include "modest-tny-msg.h"
43 #include "modest-tny-mime-part.h"
44 #include "modest-text-utils.h"
45 #include "widgets/modest-folder-view.h"
46 #include "modest-address-book.h"
47 #include <widgets/modest-attachments-view.h>
48 #include <modest-runtime.h>
49 #include <tny-simple-list.h>
50 #include <tny-merge-folder.h>
51 #include <widgets/modest-recpt-editor.h>
52 #include <gtkhtml/gtkhtml.h>
53 #include <modest-runtime.h>
54 #include <widgets/modest-header-window.h>
55 #include <widgets/modest-folder-window.h>
58 static gboolean _invalid_attach_selected (ModestWindow *win,
59 gboolean unique, gboolean for_view, gboolean for_remove,
60 ModestDimmingRule *rule);
61 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
62 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
63 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
64 static gboolean _msg_download_in_progress (ModestWindow *win);
65 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
66 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
67 static gboolean _transfer_mode_enabled (ModestWindow *win);
68 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
69 static gboolean _send_receive_in_progress (ModestWindow *win);
70 static gboolean _msgs_send_in_progress (void);
71 static gboolean _all_msgs_in_sending_status (ModestHeaderView *header_view) G_GNUC_UNUSED;
72 static gboolean _forbid_outgoing_xfers (ModestWindow *window);
77 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
79 DimmedState *state = NULL;
80 TnyHeader *header = NULL;
81 ModestCacheMgr *cache_mgr = NULL;
82 GHashTable *send_queue_cache = NULL;
83 ModestTnySendQueue *send_queue = NULL;
84 GSList *send_queues = NULL, *node = NULL;
85 gboolean found = FALSE;
86 gchar *msg_uid = NULL;
88 gboolean all_deleted = TRUE;
89 gboolean all_seen = TRUE;
90 gboolean all_cached = TRUE;
91 gboolean all_has_attach = TRUE;
93 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
96 state = g_slice_new0 (DimmedState);
97 state->n_selected = 0;
98 state->already_opened_msg = 0;
99 state->any_marked_as_deleted = FALSE;
100 state->all_marked_as_deleted = FALSE;
101 state->any_marked_as_seen = FALSE;
102 state->all_marked_as_seen = FALSE;
103 state->any_marked_as_cached = FALSE;
104 state->all_marked_as_cached = FALSE;
105 state->any_has_attachments = FALSE;
106 state->all_has_attachments = FALSE;
107 state->sent_in_progress = FALSE;
109 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
112 g_return_val_if_fail (TNY_IS_HEADER(header), state);
113 flags = tny_header_get_flags (header);
118 /* Mark as deleted */
119 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
120 state->all_marked_as_deleted = all_deleted;
121 if (!state->any_marked_as_deleted)
122 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
125 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
126 state->all_marked_as_seen = all_seen;
127 if (!state->any_marked_as_seen)
128 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
131 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
132 state->all_marked_as_cached = all_cached;
133 if (!state->any_marked_as_cached)
134 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
136 /* Mark has_attachments */
137 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
138 state->all_has_attachments = all_has_attach;
139 if (!state->any_has_attachments)
140 state->any_has_attachments = (flags & TNY_HEADER_FLAG_ATTACHMENTS)?1:0;
142 /* sent in progress */
143 msg_uid = modest_tny_send_queue_get_msg_id (header);
144 if (!state->sent_in_progress) {
145 cache_mgr = modest_runtime_get_cache_mgr ();
146 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
147 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
149 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
151 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
152 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
154 /* Check if msg uid is being processed inside send queue */
155 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
157 state->sent_in_progress = found;
162 g_object_unref (header);
163 g_slist_free (send_queues);
170 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
172 DimmedState *state = NULL;
174 g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
177 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
178 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
185 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
187 ModestDimmingRule *rule = NULL;
188 gboolean dimmed = FALSE;
190 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
191 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
192 rule = MODEST_DIMMING_RULE (user_data);
194 /* Check dimmed rule */
200 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
202 ModestDimmingRule *rule = NULL;
203 gboolean dimmed = FALSE;
205 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
206 rule = MODEST_DIMMING_RULE (user_data);
208 if (MODEST_IS_FOLDER_WINDOW (win)) {
209 #ifdef MODEST_TOOLKIT_HILDON2
210 dimmed = modest_ui_dimming_rules_on_folder_window_delete (win, user_data);
214 } else if (MODEST_IS_HEADER_WINDOW (win)) {
217 dimmed = _transfer_mode_enabled (win);
220 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
223 GtkWidget *header_view;
226 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
227 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
229 dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
230 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
233 (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
234 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
236 g_object_unref (folder);
246 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
248 gboolean dimmed = FALSE;
250 if (MODEST_IS_HEADER_WINDOW (win)) {
258 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
260 ModestDimmingRule *rule = NULL;
261 TnyFolderType types[4];
262 gboolean dimmed = FALSE;
264 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
265 rule = MODEST_DIMMING_RULE (user_data);
267 types[0] = TNY_FOLDER_TYPE_DRAFTS;
268 types[1] = TNY_FOLDER_TYPE_OUTBOX;
269 types[2] = TNY_FOLDER_TYPE_SENT;
270 types[3] = TNY_FOLDER_TYPE_ARCHIVE;
272 if (MODEST_IS_FOLDER_WINDOW (win)) {
273 ModestFolderView *folder_view;
274 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
275 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
276 MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE);
280 dimmed = _selected_folder_is_any_of_type (win, types, 4);
282 modest_dimming_rule_set_notification (rule, "");
290 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
292 ModestDimmingRule *rule = NULL;
293 gboolean dimmed = FALSE;
294 TnyFolderType types[3];
296 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
297 rule = MODEST_DIMMING_RULE (user_data);
299 types[0] = TNY_FOLDER_TYPE_DRAFTS;
300 types[1] = TNY_FOLDER_TYPE_OUTBOX;
301 types[2] = TNY_FOLDER_TYPE_ROOT;
303 /* Check dimmed rule */
304 dimmed = _selected_folder_is_any_of_type (win, types, 3);
306 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
309 /* msg view window dimming rules */
310 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
312 /* This could happen if we load the msg view window with a
313 preview before loading the full message */
314 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
318 g_object_unref (msg);
322 dimmed = _transfer_mode_enabled (win);
324 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
327 dimmed = _msg_download_in_progress (win);
329 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
338 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
340 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
346 _message_already_sent (ModestMsgViewWindow *view_window)
350 gboolean already_sent = FALSE;
352 header = modest_msg_view_window_get_header (view_window);
354 folder = tny_header_get_folder (header);
356 if (modest_tny_folder_guess_folder_type (folder) ==
357 TNY_FOLDER_TYPE_OUTBOX) {
358 ModestTnySendQueueStatus status =
359 modest_tny_all_send_queues_get_msg_status (header);
360 if (status == MODEST_TNY_SEND_QUEUE_UNKNOWN ||
361 status == MODEST_TNY_SEND_QUEUE_SENDING)
364 g_object_unref (folder);
366 g_object_unref (header);
373 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
375 ModestDimmingRule *rule = NULL;
376 const DimmedState *state = NULL;
377 gboolean dimmed = FALSE;
379 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
380 rule = MODEST_DIMMING_RULE (user_data);
381 state = modest_window_get_dimming_state (win);
383 /* If we're in transfer mode then do not allow to delete messages */
384 dimmed = _transfer_mode_enabled (win);
386 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
390 /* Check dimmed rule */
391 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
392 /* This could happen if we load the msg view window with a
393 preview before loading the full message */
394 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
398 g_object_unref (msg);
403 dimmed = state->any_marked_as_deleted;
405 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
406 modest_dimming_rule_set_notification (rule, msg);
412 dimmed = state->sent_in_progress;
414 modest_dimming_rule_set_notification (rule, _CS_UNABLE_TO_DELETE);
417 /* This could happen if we're viewing a message of the
418 outbox that has been already sent */
420 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
422 /* The delete button should be dimmed when viewing an attachment,
423 * but should be enabled when viewing a message from the list,
424 * or when viewing a search result.
427 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
428 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
430 modest_dimming_rule_set_notification (rule, _CS_UNABLE_TO_DELETE);
440 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
442 ModestDimmingRule *rule = NULL;
443 gboolean dimmed = FALSE;
445 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
446 rule = MODEST_DIMMING_RULE (user_data);
449 /* Check dimmed rule */
450 if (MODEST_IS_MSG_VIEW_WINDOW (win))
451 dimmed = _msg_download_in_progress (win);
453 modest_dimming_rule_set_notification (rule, "");
460 modest_ui_dimming_rules_on_fetch_images (ModestWindow *win, gpointer user_data)
462 gboolean dimmed = FALSE;
463 ModestDimmingRule *rule = NULL;
465 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
466 rule = MODEST_DIMMING_RULE (user_data);
468 dimmed = !modest_msg_view_window_has_blocked_external_images (MODEST_MSG_VIEW_WINDOW (win));
471 dimmed = _transfer_mode_enabled (win);
473 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
476 dimmed = _msg_download_in_progress (win);
478 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
486 modest_ui_dimming_rules_on_mark_as_read_msg_in_view (ModestWindow *win, gpointer user_data)
488 ModestDimmingRule *rule = NULL;
490 TnyHeaderFlags flags;
491 gboolean dimmed = FALSE;
494 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
495 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
496 rule = MODEST_DIMMING_RULE (user_data);
498 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
503 /* If the viewer is showing a message sent as attachment */
505 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
508 flags = tny_header_get_flags (header);
509 if (flags & TNY_HEADER_FLAG_SEEN)
514 g_object_unref (header);
520 modest_ui_dimming_rules_on_mark_as_unread_msg_in_view (ModestWindow *win, gpointer user_data)
522 ModestDimmingRule *rule = NULL;
524 TnyHeaderFlags flags;
525 gboolean dimmed = FALSE;
528 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
529 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
530 rule = MODEST_DIMMING_RULE (user_data);
532 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
537 /* If the viewer is showing a message sent as attachment */
539 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
542 flags = tny_header_get_flags (header);
543 if (!(flags & TNY_HEADER_FLAG_SEEN))
548 g_object_unref (header);
553 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
555 ModestDimmingRule *rule = NULL;
556 gboolean dimmed = FALSE;
558 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
559 rule = MODEST_DIMMING_RULE (user_data);
561 if (MODEST_IS_HEADER_WINDOW (win))
562 #ifdef MODEST_TOOLKIT_HILDON2
563 dimmed = modest_ui_dimming_rules_on_header_window_move_to (win, user_data);
567 else if (MODEST_IS_FOLDER_WINDOW (win))
568 #ifdef MODEST_TOOLKIT_HILDON2
569 dimmed = modest_ui_dimming_rules_on_folder_window_move_to (win, user_data);
573 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
574 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
581 _forbid_outgoing_xfers (ModestWindow *window)
583 const gchar *account_name = NULL;
584 TnyAccount *account = NULL;
585 gboolean dimmed = FALSE;
587 #ifdef MODEST_TOOLKIT_HILDON2
588 /* We cannot just get the active account because the active
589 account of a header window that shows the headers of a
590 local account is the ID of the remote account */
591 if (MODEST_IS_HEADER_WINDOW (window)) {
592 ModestHeaderView *header_view;
595 header_view = modest_header_window_get_header_view ((ModestHeaderWindow *) window);
596 folder = modest_header_view_get_folder (header_view);
599 account = modest_tny_folder_get_account (folder);
600 g_object_unref (folder);
606 account_name = modest_window_get_active_account (window);
607 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
609 TNY_ACCOUNT_TYPE_STORE);
613 ModestProtocolType protocol_type;
615 protocol_type = modest_tny_account_get_protocol_type (account);
616 dimmed = modest_protocol_registry_protocol_type_has_tag
617 (modest_runtime_get_protocol_registry (),
619 MODEST_PROTOCOL_REGISTRY_STORE_FORBID_OUTGOING_XFERS);
621 g_object_unref (account);
627 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
629 ModestDimmingRule *rule = NULL;
630 gboolean dimmed = FALSE;
632 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
633 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
634 rule = MODEST_DIMMING_RULE (user_data);
636 /* This could happen if we load the msg view window with a
637 preview before loading the full message */
638 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
642 g_object_unref (msg);
645 /* Check dimmed rule */
646 dimmed = _transfer_mode_enabled (win);
648 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
651 dimmed = _forbid_outgoing_xfers (win);
654 const DimmedState *state = modest_window_get_dimming_state (win);
656 dimmed = state->any_marked_as_deleted;
658 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
659 modest_dimming_rule_set_notification (rule, msg);
666 dimmed = _selected_msg_sent_in_progress (win);
668 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
671 /* This could happen if we're viewing a message of the outbox
672 that has been already sent */
674 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
677 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
678 /* The move_to button should be dimmed when viewing an attachment,
679 * but should be enabled when viewing a message from the list,
680 * or when viewing a search result.
682 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
683 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
687 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
694 modest_ui_dimming_rules_on_find_in_msg (ModestWindow *win, gpointer user_data)
696 ModestDimmingRule *rule = NULL;
697 gboolean dimmed = FALSE;
699 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
700 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
701 rule = MODEST_DIMMING_RULE (user_data);
703 /* This could happen if we load the msg view window with a
704 preview before loading the full message */
705 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
706 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
710 g_object_unref (msg);
714 /* Check dimmed rule */
715 dimmed = _transfer_mode_enabled (win);
717 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
724 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
726 ModestDimmingRule *rule = NULL;
727 gboolean dimmed = FALSE;
728 GtkWidget *focused = NULL;
730 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
731 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
732 rule = MODEST_DIMMING_RULE (user_data);
734 focused = gtk_container_get_focus_child ((GtkContainer *) win);
736 if (!dimmed && GTK_IS_ENTRY (focused)) {
737 const gchar *current_text;
738 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
739 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
742 if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
743 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
744 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
747 if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
753 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
755 ModestDimmingRule *rule = NULL;
756 gboolean dimmed = FALSE;
758 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
759 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
760 rule = MODEST_DIMMING_RULE (user_data);
762 /* Check dimmed rule */
763 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);
766 dimmed = _purged_attach_selected (win, FALSE, NULL);
768 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
776 _not_valid_attachments (ModestWindow *win, gboolean save_not_remove)
779 TnyList *attachments;
780 gboolean result = FALSE;
783 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
784 n_attachments = tny_list_get_length (attachments);
788 result = n_attachments < 1;
791 /* Check attached type (view operation not required) */
796 iter = tny_list_create_iterator (attachments);
797 while (!tny_iterator_is_done (iter)) {
798 gboolean is_valid = TRUE;
799 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
800 TnyList *nested_list = tny_simple_list_new ();
801 tny_mime_part_get_parts (mime_part, nested_list);
803 if (tny_mime_part_is_purged (mime_part)) {
807 if (is_valid && modest_tny_mime_part_is_msg (mime_part)) {
809 window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
811 if (save_not_remove && (TnyMimePart *) window_msg != mime_part) {
814 g_object_unref (window_msg);
816 if (is_valid && save_not_remove && tny_list_get_length (nested_list) > 0) {
820 g_object_unref (nested_list);
821 g_object_unref (mime_part);
822 tny_iterator_next (iter);
827 g_object_unref (iter);
828 result = (n_valid == 0);
830 g_object_unref (attachments);
836 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
838 ModestDimmingRule *rule = NULL;
839 gboolean dimmed = FALSE;
841 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
842 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
843 rule = MODEST_DIMMING_RULE (user_data);
845 /* Check dimmed rule */
847 dimmed = _not_valid_attachments (win, TRUE);
852 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
854 ModestDimmingRule *rule = NULL;
855 const DimmedState *state = NULL;
856 gboolean dimmed = FALSE;
858 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
859 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
860 rule = MODEST_DIMMING_RULE (user_data);
861 state = modest_window_get_dimming_state (win);
864 /* Check in view window if there's any attachment selected */
865 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
866 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
868 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
873 dimmed = _selected_msg_sent_in_progress (win);
875 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
879 /* cannot purge in editable drafts nor pop folders */
881 dimmed = _invalid_folder_for_purge (win, rule);
883 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
886 /* Check if all attachments are already purged */
888 dimmed = _purged_attach_selected (win, TRUE, rule);
895 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
897 ModestDimmingRule *rule = NULL;
898 gboolean dimmed = FALSE;
900 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
901 rule = MODEST_DIMMING_RULE (user_data);
903 /* Check dimmed rule */
904 if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
905 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
912 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
914 ModestDimmingRule *rule = NULL;
915 gboolean dimmed = FALSE;
917 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
918 rule = MODEST_DIMMING_RULE (user_data);
920 /* Check dimmed rule */
921 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
922 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
929 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
931 ModestDimmingRule *rule = NULL;
932 const DimmedState *state = NULL;
933 gboolean dimmed = FALSE;
935 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
936 rule = MODEST_DIMMING_RULE (user_data);
937 state = modest_window_get_dimming_state (win);
939 /* Check common dimming rules */
940 dimmed = _invalid_clipboard_selected (win, rule);
946 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
948 ModestDimmingRule *rule = NULL;
949 const DimmedState *state = NULL;
950 gboolean dimmed = FALSE;
952 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
953 rule = MODEST_DIMMING_RULE (user_data);
954 state = modest_window_get_dimming_state (win);
956 /* Check common dimming rules */
957 dimmed = _invalid_clipboard_selected (win, rule);
963 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
965 ModestDimmingRule *rule = NULL;
966 gboolean dimmed = FALSE;
968 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
969 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
970 rule = MODEST_DIMMING_RULE (user_data);
972 /* Check common dimming rules */
973 ModestMsgEditFormat format;
974 format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
976 dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
978 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
982 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
983 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
985 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
987 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
995 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
997 ModestDimmingRule *rule = NULL;
998 gboolean dimmed = FALSE;
1000 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1001 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1002 rule = MODEST_DIMMING_RULE (user_data);
1005 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1006 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1008 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1010 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1016 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1018 ModestDimmingRule *rule = NULL;
1019 gboolean dimmed = FALSE;
1020 GtkWidget *focused = NULL;
1022 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1023 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1024 rule = MODEST_DIMMING_RULE (user_data);
1026 focused = gtk_container_get_focus_child ((GtkContainer *) win);
1028 dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1031 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1035 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1036 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1038 dimmed = modest_email_clipboard_cleared (e_clipboard) &&
1039 ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1046 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1048 ModestDimmingRule *rule = NULL;
1049 gboolean dimmed = FALSE;
1050 TnyList *selected_attachments = NULL;
1051 gint n_att_selected = 0;
1052 GtkWidget *attachments_view;
1054 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1055 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1056 rule = MODEST_DIMMING_RULE (user_data);
1058 attachments_view = modest_msg_edit_window_get_child_widget (
1059 MODEST_MSG_EDIT_WINDOW (win),
1060 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1062 selected_attachments = modest_attachments_view_get_attachments (
1063 MODEST_ATTACHMENTS_VIEW (attachments_view));
1064 n_att_selected = tny_list_get_length (selected_attachments);
1065 g_object_unref (selected_attachments);
1067 dimmed = (n_att_selected < 1);
1073 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1075 ModestDimmingRule *rule = NULL;
1076 gboolean dimmed = FALSE;
1077 GtkWidget *body_field;
1079 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1080 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1081 rule = MODEST_DIMMING_RULE (user_data);
1083 body_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1084 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1087 GtkWidget *to_field, *cc_field, *bcc_field;
1088 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1089 cc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1090 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1091 to_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1092 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1093 bcc_field = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1094 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1095 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1096 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1097 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1099 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1100 gtk_text_buffer_get_char_count (cc_buffer) +
1101 gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1104 if (modest_text_utils_no_recipient (to_buffer) &&
1105 modest_text_utils_no_recipient (cc_buffer) &&
1106 modest_text_utils_no_recipient (bcc_buffer))
1111 modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1118 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1120 ModestDimmingRule *rule = NULL;
1121 gboolean dimmed = FALSE;
1123 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1124 rule = MODEST_DIMMING_RULE (user_data);
1126 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1128 /* Check dimmed rule */
1129 dimmed = _transfer_mode_enabled (win);
1131 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1134 dimmed = modest_msg_view_window_first_message_selected (
1135 MODEST_MSG_VIEW_WINDOW(win));
1136 modest_dimming_rule_set_notification (rule, NULL);
1143 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1145 ModestDimmingRule *rule = NULL;
1146 gboolean dimmed = FALSE;
1148 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1149 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1150 rule = MODEST_DIMMING_RULE (user_data);
1152 /* Check dimmed rule */
1153 dimmed = _transfer_mode_enabled (win);
1155 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1158 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1159 modest_dimming_rule_set_notification (rule, NULL);
1167 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1170 ModestAccountMgr *mgr;
1172 mgr = modest_runtime_get_account_mgr();
1173 dimmed = !modest_account_mgr_has_accounts(mgr, TRUE);
1175 /* Dimm it if we only have metaaccounts */
1177 ModestProtocolRegistry *reg = modest_runtime_get_protocol_registry ();
1178 GSList *account_names = modest_account_mgr_account_names (mgr, TRUE);
1180 if (account_names) {
1181 ModestProtocolType store_protocol;
1182 gboolean found = FALSE;
1183 GSList *iter = account_names;
1184 const gchar *tag = MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS;
1186 while (iter && !found) {
1187 gchar* account_name;
1189 account_name = (gchar *) iter->data;
1190 store_protocol = modest_account_mgr_get_store_protocol (mgr, account_name);
1192 if (!modest_protocol_registry_protocol_type_has_tag (reg, store_protocol, tag))
1195 iter = g_slist_next (iter);
1197 modest_account_mgr_free_account_names (account_names);
1206 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
1208 /* We dim if no msg send is in progress (and then cancelling send all has no
1210 return !_msgs_send_in_progress ();
1214 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1216 ModestDimmingRule *rule = NULL;
1217 gboolean dimmed = FALSE;
1218 ModestAccountMgr *mgr;
1219 const gchar* account_name;
1221 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1222 rule = MODEST_DIMMING_RULE (user_data);
1223 mgr = modest_runtime_get_account_mgr();
1225 /* Check dimmed rule */
1226 account_name = modest_window_get_active_account (win);
1229 dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
1234 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1240 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1242 ModestDimmingRule *rule = NULL;
1243 gboolean dimmed = FALSE;
1245 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1246 rule = MODEST_DIMMING_RULE (user_data);
1248 /* Check dimmed rule */
1249 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1250 if (g_slist_length (account_names) < 1)
1253 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1255 modest_account_mgr_free_account_names (account_names);
1258 dimmed = _send_receive_in_progress (win);
1265 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1267 GSList *recipients = NULL;
1268 gboolean has_recipients_to_add;
1270 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1272 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1275 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1277 /* Message is loaded asynchronously, so this could happen */
1281 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
1285 recipients = modest_tny_msg_header_get_all_recipients_list (header);
1286 g_object_unref (header);
1288 recipients = modest_tny_msg_get_all_recipients_list (msg);
1289 g_object_unref (msg);
1291 } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1292 /* Check if there are pending addresses to add */
1293 return !modest_msg_edit_window_has_pending_addresses ((ModestMsgEditWindow *) win);
1296 has_recipients_to_add = FALSE;
1300 for (node = recipients; node != NULL; node = g_slist_next (node)) {
1301 const gchar *recipient = (const gchar *) node->data;
1302 if (modest_text_utils_validate_recipient (recipient, NULL)) {
1303 if (!modest_address_book_has_address (recipient)) {
1304 has_recipients_to_add = TRUE;
1309 g_slist_foreach (recipients, (GFunc) g_free, NULL);
1310 g_slist_free (recipients);
1313 return !has_recipients_to_add;
1316 /* *********************** static utility functions ******************** */
1319 _selected_folder_is_any_of_type (ModestWindow *win,
1320 TnyFolderType types[],
1323 TnyFolderStore *folder = NULL;
1324 TnyFolderType folder_type;
1326 gboolean result = FALSE;
1328 /*Get current folder */
1329 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1330 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1331 for (i=0; i < ntypes; i++) {
1332 result = result || folder_type == types[i];
1338 g_object_unref (folder);
1344 _invalid_clipboard_selected (ModestWindow *win,
1345 ModestDimmingRule *rule)
1347 gboolean result = FALSE;
1348 GtkWidget *focused = NULL;
1350 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1352 /* Get focuesed widget */
1353 focused = gtk_container_get_focus_child ((GtkContainer *) win);
1355 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1356 gboolean has_selection = FALSE;
1357 if (GTK_IS_TEXT_VIEW (focused)) {
1358 GtkTextBuffer *buffer = NULL;
1359 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1360 has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
1361 } else if (GTK_IS_EDITABLE (focused)) {
1362 has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
1364 result = !has_selection;
1365 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1367 MODEST_DEBUG_BLOCK (g_debug ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
1368 if (GTK_IS_LABEL (focused) &&
1369 !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
1371 } else if (GTK_IS_TEXT_VIEW (focused)) {
1372 GtkTextBuffer *buffer;
1373 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1374 result = !gtk_text_buffer_get_has_selection (buffer);
1375 } else if (GTK_IS_HTML (focused)) {
1378 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1379 result = ((sel == NULL) || (sel[0] == '\0'));
1380 } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
1383 GtkClipboard *clipboard;
1386 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1387 /* Get clipboard selection*/
1388 selection = gtk_clipboard_wait_for_text (clipboard);
1390 result = (selection == NULL);
1397 modest_dimming_rule_set_notification (rule, "");
1405 _invalid_attach_selected (ModestWindow *win,
1408 gboolean for_remove,
1409 ModestDimmingRule *rule)
1411 TnyList *attachments;
1413 gboolean nested_attachments = FALSE;
1414 gboolean selected_messages = FALSE;
1415 gboolean result = FALSE;
1417 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1419 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1421 /* Get selected atachments */
1422 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1423 n_selected = tny_list_get_length (attachments);
1428 result = n_selected != 1;
1431 result = n_selected < 1;
1434 /* Check attached type (view operation not required) */
1435 if (!result && !for_view) {
1437 iter = tny_list_create_iterator (attachments);
1438 while (!tny_iterator_is_done (iter) && !result) {
1439 gboolean not_selectable = FALSE;
1440 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1441 TnyList *nested_list = tny_simple_list_new ();
1442 tny_mime_part_get_parts (mime_part, nested_list);
1444 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
1446 window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1447 if ((TnyMimePart *) window_msg != mime_part) {
1448 selected_messages = TRUE;
1449 not_selectable = TRUE;
1451 g_object_unref (window_msg);
1453 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1454 nested_attachments = TRUE;
1455 not_selectable = TRUE;
1459 g_object_unref (nested_list);
1460 g_object_unref (mime_part);
1461 tny_iterator_next (iter);
1463 g_object_unref (iter);
1466 /* No valid attachment available */
1467 if (n_selected == 0)
1470 /* Set notifications */
1471 if (result && rule != NULL) {
1472 if (selected_messages) {
1473 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1474 } else if (nested_attachments) {
1475 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1476 } else if (n_selected == 0) {
1477 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1478 } else if (unique) {
1479 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1484 g_object_unref (attachments);
1491 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule)
1493 TnyList *attachments = NULL;
1496 gint n_attachments = 0;
1497 gboolean result = FALSE;
1499 /* This should check if _all_ the attachments are already purged. If only some
1500 * of them are purged, then it does not cause dim as there's a confirmation dialog
1501 * for removing only local attachments */
1503 /* Get selected atachments */
1504 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1505 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1508 if (attachments == NULL)
1511 if (tny_list_get_length (attachments) == 0) {
1512 g_object_unref (attachments);
1516 iter = tny_list_create_iterator (attachments);
1517 while (!tny_iterator_is_done (iter)) {
1518 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1519 if (tny_mime_part_is_purged (mime_part)) {
1523 g_object_unref (mime_part);
1524 tny_iterator_next (iter);
1526 g_object_unref (iter);
1529 g_object_unref (attachments);
1532 result = (purged == n_attachments);
1534 result = (purged > 0);
1536 /* This string no longer exists, refer to NB#75415 for more info
1537 if (result && (rule != NULL))
1538 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1545 _msg_download_in_progress (ModestWindow *win)
1547 gboolean result = FALSE;
1549 g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
1551 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1552 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
1559 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
1561 GSList **send_queues = (GSList **) userdata;
1562 *send_queues = g_slist_prepend (*send_queues, value);
1566 _selected_msg_sent_in_progress (ModestWindow *win)
1568 const DimmedState *state = modest_window_get_dimming_state (win);
1569 return (state) ? state->sent_in_progress : TRUE;
1574 _invalid_folder_for_purge (ModestWindow *win,
1575 ModestDimmingRule *rule)
1577 TnyFolder *folder = NULL;
1578 TnyAccount *account = NULL;
1579 gboolean result = FALSE;
1581 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1583 /* Get folder and account of message */
1584 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1585 g_return_val_if_fail(msg != NULL, TRUE);
1586 folder = tny_msg_get_folder (msg);
1587 g_object_unref (msg);
1588 if (folder == NULL) {
1593 g_return_val_if_reached (FALSE);
1595 account = modest_tny_folder_get_account (folder);
1596 if (account == NULL) goto frees;
1599 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
1600 TnyFolderType types[2];
1601 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1602 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1604 if (_selected_folder_is_any_of_type (win, types, 2)) {
1608 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
1609 /* If it's a remote folder then dim */
1610 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
1612 MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
1619 g_object_unref (folder);
1620 if (account != NULL)
1621 g_object_unref (account);
1627 _transfer_mode_enabled (ModestWindow *win)
1629 gboolean result = FALSE;
1632 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1633 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
1634 } else if (MODEST_IS_FOLDER_WINDOW (win)) {
1635 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
1636 } else if (MODEST_IS_HEADER_WINDOW (win)) {
1637 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
1639 g_warning("_transfer_mode_enabled called with wrong window type");
1646 _all_msgs_in_sending_status (ModestHeaderView *header_view)
1648 GtkTreeModel *model;
1650 gboolean all_sending = TRUE;
1652 model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
1653 if (gtk_tree_model_get_iter_first (model, &iter)) {
1657 gtk_tree_model_get (model, &iter,
1658 TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1663 if (modest_tny_all_send_queues_get_msg_status (header) !=
1664 MODEST_TNY_SEND_QUEUE_SENDING)
1665 all_sending = FALSE;
1666 g_object_unref (header);
1669 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
1675 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win,
1678 ModestDimmingRule *rule = NULL;
1680 g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1681 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1682 rule = MODEST_DIMMING_RULE (user_data);
1684 /* Check dimmed rule */
1685 return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
1689 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
1692 g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
1694 ModestMsgEditFormat format =
1695 modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1697 return (format != MODEST_MSG_EDIT_FORMAT_HTML);
1701 _send_receive_in_progress (ModestWindow *win)
1703 ModestMailOperationQueue *queue;
1704 GSList *op_list, *node;
1705 gboolean found_send_receive;
1707 queue = modest_runtime_get_mail_operation_queue ();
1708 op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
1710 found_send_receive = FALSE;
1711 for (node = op_list; node != NULL; node = g_slist_next (node)) {
1712 ModestMailOperation *op;
1714 op = (ModestMailOperation *) node->data;
1715 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
1716 found_send_receive = TRUE;
1722 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
1723 g_slist_free (op_list);
1726 return found_send_receive;
1730 _msgs_send_in_progress (void)
1732 ModestCacheMgr *cache_mgr;
1733 GHashTable *send_queue_cache;
1734 ModestTnySendQueue *send_queue;
1735 GSList *send_queues = NULL, *node = NULL;
1736 gboolean found = FALSE;
1738 cache_mgr = modest_runtime_get_cache_mgr ();
1739 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
1740 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
1742 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
1744 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
1745 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
1747 /* Check if msg uid is being processed inside send queue */
1748 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
1754 g_slist_free (send_queues);
1759 /*****************************************************************************/
1760 /********************** HILDON2 only dimming rules ***************************/
1761 /*****************************************************************************/
1764 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
1766 ModestDimmingRule *rule = NULL;
1767 gboolean dimmed = FALSE;
1769 g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
1770 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1771 rule = MODEST_DIMMING_RULE (user_data);
1773 /* Check dimmed rule */
1774 dimmed = _transfer_mode_enabled (win);
1776 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1779 dimmed = _forbid_outgoing_xfers (win);
1782 GtkWidget *header_view;
1785 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
1786 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
1788 dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
1789 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
1792 (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
1793 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
1795 g_object_unref (folder);
1803 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
1805 ModestDimmingRule *rule = NULL;
1806 gboolean dimmed = FALSE;
1808 g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
1809 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1810 rule = MODEST_DIMMING_RULE (user_data);
1812 /* Check dimmed rule */
1813 dimmed = _transfer_mode_enabled (win);
1815 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1818 dimmed = _forbid_outgoing_xfers (win);
1820 if (!dimmed && MODEST_IS_FOLDER_WINDOW (win)) {
1821 ModestFolderView *folder_view;
1822 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1823 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1824 MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
1828 dimmed = _transfer_mode_enabled (win);
1830 modest_dimming_rule_set_notification (rule, "");
1837 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
1839 ModestDimmingRule *rule = NULL;
1840 gboolean dimmed = FALSE;
1842 g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
1843 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1844 rule = MODEST_DIMMING_RULE (user_data);
1846 /* Check dimmed rule */
1847 dimmed = _transfer_mode_enabled (win);
1849 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1851 if (MODEST_IS_FOLDER_WINDOW (win)) {
1852 ModestFolderView *folder_view;
1853 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
1854 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
1855 MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
1859 dimmed = _transfer_mode_enabled (win);
1861 modest_dimming_rule_set_notification (rule, "");
1868 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
1870 return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);