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-text-utils.h"
39 #include <widgets/modest-attachments-view.h>
40 #include <modest-runtime.h>
41 #include <tny-simple-list.h>
44 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
45 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
46 static gboolean _invalid_attach_selected (ModestWindow *win, gboolean unique, ModestDimmingRule *rule);
47 static gboolean _invalid_clipboard_selected (ModestMsgViewWindow *win);
48 static gboolean _already_opened_msg (ModestWindow *win);
49 static gboolean _selected_msg_marked_as (ModestWindow *win, TnyHeaderFlags mask, gboolean opposite);
50 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
51 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
52 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
53 static gboolean _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win);
54 static gboolean _selected_folder_is_root (ModestMainWindow *win);
55 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
56 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
57 static gboolean _msg_download_completed (ModestMainWindow *win);
58 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
59 static gboolean _sending_in_progress (ModestWindow *win);
60 static gboolean _marked_as_deleted (ModestWindow *win);
64 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
66 gboolean dimmed = FALSE;
68 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
70 /* Check dimmed rule */
72 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
78 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
80 gboolean dimmed = FALSE;
81 GtkWidget *folder_view = NULL;
82 TnyFolderStore *parent_folder = NULL;
84 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
87 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
88 MODEST_WIDGET_TYPE_FOLDER_VIEW);
89 /* Get selected folder as parent of new folder to create */
90 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
94 if (TNY_IS_ACCOUNT (parent_folder)) {
95 /* If it's the local account then do not dim */
96 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
99 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
100 /* If it's POP then dim */
101 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
102 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
105 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
107 TnyFolderType types[3];
109 types[0] = TNY_FOLDER_TYPE_DRAFTS;
110 types[1] = TNY_FOLDER_TYPE_OUTBOX;
111 types[2] = TNY_FOLDER_TYPE_SENT;
113 /* Apply folder rules */
115 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
117 dimmed = _selected_folder_is_any_of_type (win, types, 3);
119 g_object_unref (parent_folder);
125 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
127 gboolean dimmed = FALSE;
128 TnyFolderType types[3];
130 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
132 types[0] = TNY_FOLDER_TYPE_DRAFTS;
133 types[1] = TNY_FOLDER_TYPE_OUTBOX;
134 types[2] = TNY_FOLDER_TYPE_SENT;
136 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
138 /* Check dimmed rule */
140 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
142 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
144 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
146 dimmed = _selected_folder_is_any_of_type (win, types, 3);
152 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
154 gboolean dimmed = FALSE;
156 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
158 /* Check dimmed rule */
160 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
167 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
169 gboolean dimmed = FALSE;
170 TnyFolderType types[3];
172 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
174 types[0] = TNY_FOLDER_TYPE_DRAFTS;
175 types[1] = TNY_FOLDER_TYPE_OUTBOX;
176 types[2] = TNY_FOLDER_TYPE_SENT;
178 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
180 /* Check dimmed rule */
182 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
184 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
186 dimmed = _selected_folder_is_any_of_type (win, types, 3);
192 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
194 ModestDimmingRule *rule = NULL;
195 gboolean dimmed = FALSE;
197 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
198 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
199 rule = MODEST_DIMMING_RULE (user_data);
201 /* Check dimmed rule */
203 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
205 dimmed = _selected_msg_sent_in_progress (win);
207 modest_dimming_rule_set_notification (rule, _("TEST"));
214 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
216 ModestDimmingRule *rule = NULL;
217 gboolean dimmed = FALSE;
218 TnyFolderType types[3];
220 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
221 rule = MODEST_DIMMING_RULE (user_data);
223 /* main window dimming rules */
224 if (MODEST_IS_MAIN_WINDOW(win)) {
226 types[0] = TNY_FOLDER_TYPE_DRAFTS;
227 types[1] = TNY_FOLDER_TYPE_OUTBOX;
228 types[2] = TNY_FOLDER_TYPE_ROOT;
230 /* Check dimmed rule */
232 dimmed = _selected_folder_is_any_of_type (win, types, 3);
234 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
237 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
239 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
242 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
244 /* msg view window dimming rules */
245 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
247 /* Check dimmed rule */
249 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
257 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
259 gboolean dimmed = FALSE;
261 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
263 /* Check dimmed rule */
265 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
267 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
273 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
275 gboolean dimmed = FALSE;
277 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
279 /* Check dimmed rule */
287 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
289 ModestDimmingRule *rule = NULL;
290 gboolean dimmed = FALSE;
292 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
293 rule = MODEST_DIMMING_RULE (user_data);
295 /* Check dimmed rule */
296 if (MODEST_IS_MAIN_WINDOW (win)) {
298 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
300 modest_dimming_rule_set_notification (rule, _("ckct_ib_nothing_to_delete"));
303 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
305 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
308 dimmed = _already_opened_msg (win);
310 modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages"));
313 dimmed = _marked_as_deleted (win);
315 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
318 dimmed = _selected_msg_sent_in_progress (win);
320 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
323 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
325 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
333 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
335 gboolean dimmed = FALSE;
336 GtkWidget *header_view = NULL;
338 /* main window dimming rules */
339 if (MODEST_IS_MAIN_WINDOW(win)) {
341 /* Check dimmed rule */
342 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
343 MODEST_WIDGET_TYPE_HEADER_VIEW);
345 /* If the header view does not have the focus then do
346 not apply msg dimming rules because the action will
347 show the folder details that have no dimming
349 if (gtk_widget_is_focus (header_view)) {
350 /* Check dimmed rule */
352 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
355 /* msg view window dimming rules */
358 /* Check dimmed rule */
360 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
368 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
370 gboolean dimmed = FALSE;
371 TnyHeaderFlags flags;
373 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
375 flags = TNY_HEADER_FLAG_SEEN;
377 /* Check dimmed rule */
379 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
381 dimmed = _selected_msg_marked_as (win, flags, FALSE);
387 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
389 gboolean dimmed = FALSE;
390 TnyHeaderFlags flags;
392 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
394 flags = TNY_HEADER_FLAG_SEEN;
396 /* Check dimmed rule */
398 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
400 dimmed = _selected_msg_marked_as (win, flags, TRUE);
406 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
408 gboolean dimmed = FALSE;
410 if (MODEST_IS_MAIN_WINDOW (win))
411 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
412 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
413 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
420 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
422 GtkWidget *folder_view = NULL;
423 GtkWidget *header_view = NULL;
424 gboolean dimmed = FALSE;
426 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
428 /* Get the folder view */
429 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
430 MODEST_WIDGET_TYPE_FOLDER_VIEW);
432 /* Get header view */
433 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
434 MODEST_WIDGET_TYPE_HEADER_VIEW);
436 /* Check common diming rules */
438 /* Check diming rules for folder transfer */
439 if (gtk_widget_is_focus (folder_view)) {
441 dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win));
443 /* Check diming rules for msg transfer */
444 else if (gtk_widget_is_focus (header_view)) {
446 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
454 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
456 gboolean dimmed = FALSE;
458 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
460 /* Check dimmed rule */
462 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
468 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
470 TnyFolderType types[3];
471 gboolean dimmed = FALSE;
473 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
475 types[0] = TNY_FOLDER_TYPE_DRAFTS;
476 types[1] = TNY_FOLDER_TYPE_OUTBOX;
477 types[2] = TNY_FOLDER_TYPE_SENT;
479 /* Check dimmed rule */
481 dimmed = _selected_folder_is_any_of_type (win, types, 3);
487 modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data)
489 TnyFolderType types[5];
490 gboolean dimmed = FALSE;
492 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
494 types[0] = TNY_FOLDER_TYPE_DRAFTS;
495 types[1] = TNY_FOLDER_TYPE_OUTBOX;
496 types[2] = TNY_FOLDER_TYPE_SENT;
497 types[3] = TNY_FOLDER_TYPE_INBOX;
498 types[4] = TNY_FOLDER_TYPE_ROOT;
500 /* Check dimmed rule */
502 dimmed = _selected_folder_is_any_of_type (win, types, 5);
508 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
510 gboolean dimmed = FALSE;
512 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
514 /* Check dimmed rule */
516 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
522 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
524 ModestDimmingRule *rule = NULL;
525 gboolean dimmed = FALSE;
527 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
528 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
529 rule = MODEST_DIMMING_RULE (user_data);
531 /* Check dimmed rule */
533 dimmed = _invalid_attach_selected (win, TRUE, rule);
539 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
541 ModestDimmingRule *rule = NULL;
542 gboolean dimmed = FALSE;
544 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
545 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
546 rule = MODEST_DIMMING_RULE (user_data);
548 /* Check dimmed rule */
550 dimmed = _invalid_attach_selected (win, FALSE, rule);
556 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
558 ModestDimmingRule *rule = NULL;
559 gboolean dimmed = FALSE;
561 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
562 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
563 rule = MODEST_DIMMING_RULE (user_data);
565 /* Check dimmed rule */
567 dimmed = _invalid_attach_selected (win, FALSE, NULL);
568 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
575 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
577 gboolean dimmed = FALSE;
579 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
581 /* Check dimmed rule */
583 dimmed = _invalid_clipboard_selected (MODEST_MSG_VIEW_WINDOW(win));
589 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
591 gboolean dimmed = FALSE;
593 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
595 /* Check dimmed rule */
597 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
603 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
605 gboolean dimmed = FALSE;
607 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
609 /* Check dimmed rule */
611 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
618 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
620 const gboolean dimmed =
621 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
628 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
630 gboolean dimmed = FALSE;
632 /* Check dimmed rule */
634 dimmed = !_sending_in_progress (win);
640 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
642 ModestDimmingRule *rule = NULL;
643 gboolean dimmed = FALSE;
645 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
646 rule = MODEST_DIMMING_RULE (user_data);
648 /* Check dimmed rule */
650 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
652 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
659 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
661 ModestDimmingRule *rule = NULL;
662 gboolean dimmed = FALSE;
664 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
665 rule = MODEST_DIMMING_RULE (user_data);
667 /* Check dimmed rule */
669 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
670 gchar *selection = NULL;
671 selection = gtk_clipboard_wait_for_text (clipboard);
673 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection)));
679 /* *********************** static utility functions ******************** */
682 _marked_as_deleted (ModestWindow *win)
684 gboolean result = FALSE;
685 TnyHeaderFlags flags;
687 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
689 flags = TNY_HEADER_FLAG_DELETED;
691 /* Check dimmed rule */
692 result = _selected_msg_marked_as (win, flags, FALSE);
698 _selected_folder_not_writeable (ModestMainWindow *win)
700 GtkWidget *folder_view = NULL;
701 TnyFolderStore *parent_folder = NULL;
702 ModestTnyFolderRules rules;
703 gboolean result = FALSE;
705 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
707 /* Get folder view */
708 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
709 MODEST_WIDGET_TYPE_FOLDER_VIEW);
710 /* If no folder view, always dimmed */
714 /* Get selected folder as parent of new folder to create */
715 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
716 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
718 g_object_unref (parent_folder);
722 /* Check dimmed rule */
723 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
724 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
727 g_object_unref (parent_folder);
733 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
735 TnyFolderType types[2];
736 gboolean result = FALSE;
738 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
740 types[0] = TNY_FOLDER_TYPE_ROOT;
741 types[1] = TNY_FOLDER_TYPE_INBOX;
743 /* Check folder type */
744 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
746 /* Check pop and MMC accounts */
748 result = _selected_folder_is_MMC_or_POP_root (win);
756 _selected_folder_is_root (ModestMainWindow *win)
758 TnyFolderType types[1];
759 gboolean result = FALSE;
761 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
763 types[0] = TNY_FOLDER_TYPE_ROOT;
765 /* Check folder type */
766 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
768 /* Check pop and MMC accounts */
770 result = _selected_folder_is_MMC_or_POP_root (win);
777 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
779 GtkWidget *folder_view = NULL;
780 TnyFolderStore *parent_folder = NULL;
781 gboolean result = FALSE;
783 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
784 MODEST_WIDGET_TYPE_FOLDER_VIEW);
785 /* Get selected folder as parent of new folder to create */
786 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
790 if (TNY_IS_ACCOUNT (parent_folder)) {
791 /* If it's the local account then do not dim */
792 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
795 /* If it's the MMC root folder then dim it */
796 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
799 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
800 /* If it's POP then dim */
801 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
802 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
806 g_object_unref (parent_folder);
815 _selected_folder_is_empty (ModestMainWindow *win)
817 GtkWidget *folder_view = NULL;
818 TnyFolderStore *folder = NULL;
819 gboolean result = FALSE;
821 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
823 /* Get folder view */
824 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
825 MODEST_WIDGET_TYPE_FOLDER_VIEW);
826 /* If no folder view, always dimmed */
830 /* Get selected folder as parent of new folder to create */
831 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
832 if (!(folder && TNY_IS_FOLDER(folder))) {
834 g_object_unref (folder);
838 /* Check folder type */
839 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
842 g_object_unref (folder);
848 _selected_folder_is_any_of_type (ModestWindow *win,
849 TnyFolderType types[],
852 GtkWidget *folder_view = NULL;
853 TnyFolderStore *folder = NULL;
854 TnyFolderType folder_type;
856 gboolean result = FALSE;
858 /*Get curent folder */
859 if (MODEST_IS_MAIN_WINDOW(win)) {
861 /* Get folder view */
862 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
863 MODEST_WIDGET_TYPE_FOLDER_VIEW);
864 /* If no folder view, always dimmed */
868 /* Get selected folder as parent of new folder to create */
869 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
871 if (!(folder && TNY_IS_FOLDER(folder))) {
873 g_object_unref (folder);
877 /* Check folder type */
878 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
880 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
881 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
882 for (i=0; i < ntypes; i++) {
883 result = result || folder_type == types[i];
889 g_object_unref (folder);
895 _folder_is_any_of_type (TnyFolder *folder,
896 TnyFolderType types[],
899 TnyFolderType folder_type;
900 gboolean result = FALSE;
903 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
905 /* Get folder type */
906 if (modest_tny_folder_is_local_folder (folder))
907 folder_type = modest_tny_folder_get_local_folder_type (folder);
909 folder_type = modest_tny_folder_guess_folder_type (folder);
911 /* Check foler type */
912 for (i=0; i < ntypes; i++) {
913 result = result || folder_type == types[i];
922 _invalid_clipboard_selected (ModestMsgViewWindow *win)
924 GtkClipboard *clipboard = NULL;
925 gchar *selection = NULL;
926 GtkWidget *focused = NULL;
927 gboolean result = FALSE;
929 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE);
931 /* Get clipboard selection*/
932 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
933 selection = gtk_clipboard_wait_for_text (clipboard);
935 /* Get focuesed widget */
936 focused = gtk_window_get_focus (GTK_WINDOW (win));
939 result = ((selection == NULL) ||
940 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
946 _invalid_attach_selected (ModestWindow *win,
948 ModestDimmingRule *rule)
950 GList *attachments, *node;
952 TnyHeaderFlags flags;
953 gboolean nested_attachments = FALSE;
954 gboolean selected_messages = FALSE;
955 gboolean result = FALSE;
957 if (MODEST_IS_MAIN_WINDOW (win)) {
958 flags = TNY_HEADER_FLAG_ATTACHMENTS;
960 result = _selected_msg_marked_as (win, flags, TRUE);
963 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
965 /* Get selected atachments */
966 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
967 n_selected = g_list_length (attachments);
968 for (node = attachments; node != NULL; node = g_list_next (node)) {
969 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
970 TnyList *nested_list = tny_simple_list_new ();
971 if (!tny_mime_part_is_attachment (mime_part)) {
972 selected_messages = TRUE;
975 tny_mime_part_get_parts (mime_part, nested_list);
976 if (tny_list_get_length (nested_list) > 0)
977 nested_attachments = TRUE;
978 g_object_unref (nested_list);
983 result = n_selected != 1;
986 result = n_selected < 1;
988 /* Set notifications */
989 if (!result && rule != NULL) {
990 if (selected_messages) {
991 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
992 } else if (nested_attachments) {
993 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
994 } else if (n_selected == 0) {
995 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1000 g_list_free (attachments);
1007 _invalid_msg_selected (ModestMainWindow *win,
1009 ModestDimmingRule *rule)
1011 GtkWidget *header_view = NULL;
1012 GtkWidget *folder_view = NULL;
1013 TnyList *selected_headers = NULL;
1014 gboolean result = FALSE;
1016 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1017 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
1019 /* Get header view to check selected messages */
1020 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1021 MODEST_WIDGET_TYPE_HEADER_VIEW);
1023 /* Get folder view to check focus */
1024 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1025 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1027 /* Get selected headers */
1028 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1030 /* Check dimmed rule (TODO: check focus on widgets */
1032 /* result = (selected_headers == NULL); */
1033 result = ((selected_headers == NULL) ||
1034 (gtk_widget_is_focus (folder_view)));
1036 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1038 if (!result && unique) {
1039 result = tny_list_get_length (selected_headers) > 1;
1041 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1045 if (selected_headers != NULL)
1046 g_object_unref (selected_headers);
1052 _already_opened_msg (ModestWindow *win)
1054 ModestWindow *window = NULL;
1055 ModestWindowMgr *mgr = NULL;
1056 GtkWidget *header_view = NULL;
1057 TnyList *selected_headers = NULL;
1058 TnyIterator *iter = NULL;
1059 TnyHeader *header = NULL;
1060 gboolean result = TRUE;
1062 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1064 /* Get header view to check selected messages */
1065 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1066 MODEST_WIDGET_TYPE_HEADER_VIEW);
1068 /* Get selected headers */
1069 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1070 if (selected_headers == NULL)
1073 /* Check dimmed rule (TODO: check focus on widgets */
1074 mgr = modest_runtime_get_window_mgr ();
1075 iter = tny_list_create_iterator (selected_headers);
1076 while (!tny_iterator_is_done (iter) && result) {
1077 header = TNY_HEADER (tny_iterator_get_current (iter));
1078 window = modest_window_mgr_find_window_by_header (mgr, header);
1079 result = result && (window != NULL);
1081 g_object_unref (header);
1082 tny_iterator_next (iter);
1086 if (selected_headers != NULL)
1087 g_object_unref (selected_headers);
1089 g_object_unref (iter);
1095 _selected_msg_marked_as (ModestWindow *win,
1096 TnyHeaderFlags mask,
1099 GtkWidget *header_view = NULL;
1100 TnyList *selected_headers = NULL;
1101 TnyIterator *iter = NULL;
1102 TnyHeader *header = NULL;
1103 TnyHeaderFlags flags;
1104 gboolean result = FALSE;
1106 /* Get header view to check selected messages */
1107 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1108 MODEST_WIDGET_TYPE_HEADER_VIEW);
1110 /* Get selected headers */
1111 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1112 if (selected_headers == NULL)
1115 /* Call the function for each header */
1116 iter = tny_list_create_iterator (selected_headers);
1117 while (!tny_iterator_is_done (iter) && !result) {
1118 header = TNY_HEADER (tny_iterator_get_current (iter));
1120 flags = tny_header_get_flags (header);
1122 result = (flags & mask) == 0;
1124 result = (flags & mask) != 0;
1126 g_object_unref (header);
1127 tny_iterator_next (iter);
1131 if (selected_headers != NULL)
1132 g_object_unref (selected_headers);
1134 g_object_unref (iter);
1140 _msg_download_in_progress (ModestMsgViewWindow *win)
1142 gboolean result = FALSE;
1144 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1146 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1152 _msg_download_completed (ModestMainWindow *win)
1154 GtkWidget *header_view = NULL;
1155 TnyList *selected_headers = NULL;
1156 TnyIterator *iter = NULL;
1157 TnyHeader *header = NULL;
1158 TnyHeaderFlags flags;
1159 gboolean result = FALSE;
1161 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1164 /* Get header view to check selected messages */
1165 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1166 MODEST_WIDGET_TYPE_HEADER_VIEW);
1168 /* Get selected headers */
1169 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1170 if (selected_headers == NULL)
1173 /* Check dimmed rule */
1175 iter = tny_list_create_iterator (selected_headers);
1176 while (!tny_iterator_is_done (iter) && result) {
1177 header = TNY_HEADER (tny_iterator_get_current (iter));
1179 flags = tny_header_get_flags (header);
1180 /* TODO: is this the right flag?, it seems that some
1181 headers that have been previously downloaded do not
1183 result = (flags & TNY_HEADER_FLAG_CACHED);
1185 g_object_unref (header);
1186 tny_iterator_next (iter);
1189 g_object_unref (iter);
1195 _selected_msg_sent_in_progress (ModestWindow *win)
1197 ModestTnySendQueue *send_queue = NULL;
1198 GtkWidget *header_view = NULL;
1199 ModestTnyAccountStore *acc_store = NULL;
1200 TnyAccount *account = NULL;
1201 TnyList *header_list = NULL;
1202 TnyIterator *iter = NULL;
1203 TnyHeader *header = NULL;
1204 const gchar *account_name = NULL;
1205 gboolean result = FALSE;
1208 /* Get transport account */
1209 acc_store = modest_runtime_get_account_store();
1210 account_name = modest_window_get_active_account (win);
1212 /* If no account defined, this action must be always dimmed */
1213 if (account_name == NULL) return FALSE;
1214 account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1215 if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1217 /* Get send queue for current ransport account */
1218 send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1219 g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1221 if (MODEST_IS_MAIN_WINDOW(win)) {
1223 /* Get header view to check selected messages */
1224 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1225 MODEST_WIDGET_TYPE_HEADER_VIEW);
1227 /* Get selected headers */
1228 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1230 /* Get message header */
1231 if (!header_list) return FALSE;
1232 iter = tny_list_create_iterator (header_list);
1233 header = TNY_HEADER (tny_iterator_get_current (iter));
1235 /* Get message id */
1236 id = g_strdup(tny_header_get_message_id (header));
1238 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1240 /* Get message header */
1241 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
1243 /* Get message id */
1244 id = g_strdup(tny_header_get_message_id (header));
1247 /* Check if msg id is being processed inside send queue */
1248 result = modest_tny_send_queue_msg_is_being_sent (send_queue, id);
1252 g_object_unref (header);
1253 g_object_unref(header_list);
1254 g_object_unref(iter);
1261 _sending_in_progress (ModestWindow *win)
1263 ModestTnySendQueue *send_queue = NULL;
1264 ModestTnyAccountStore *acc_store = NULL;
1265 TnyAccount *account = NULL;
1266 const gchar *account_name = NULL;
1267 gboolean result = FALSE;
1269 /* Get transport account */
1270 acc_store = modest_runtime_get_account_store();
1271 account_name = modest_window_get_active_account (win);
1273 /* If no account defined, this action must be always dimmed */
1274 if (account_name == NULL) return FALSE;
1275 account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1276 if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1278 /* Get send queue for current ransport account */
1279 send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1280 g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1282 /* Check if send queue is perfimring any send operation */
1283 result = modest_tny_send_queue_sending_in_progress (send_queue);