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 <widgets/modest-attachments-view.h>
39 #include <modest-runtime.h>
40 #include <tny-simple-list.h>
43 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
44 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
45 static gboolean _invalid_attach_selected (ModestMsgViewWindow *win, gboolean unique, ModestDimmingRule *rule);
46 static gboolean _invalid_clipboard_selected (ModestMsgViewWindow *win);
47 static gboolean _already_opened_msg (ModestWindow *win);
48 static gboolean _selected_msg_marked_as (ModestWindow *win, TnyHeaderFlags mask, gboolean opposite);
49 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
50 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
51 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
52 static gboolean _selected_folder_is_root (ModestMainWindow *win);
53 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
54 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
55 static gboolean _msg_download_completed (ModestMainWindow *win);
56 static gboolean _msg_sent_in_progress (ModestWindow *win);
57 static gboolean _marked_as_deleted (ModestWindow *win);
61 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
63 gboolean dimmed = FALSE;
65 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
67 /* Check dimmed rule */
69 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
75 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
77 gboolean dimmed = FALSE;
78 GtkWidget *folder_view = NULL;
79 TnyFolderStore *parent_folder = NULL;
81 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
84 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
85 MODEST_WIDGET_TYPE_FOLDER_VIEW);
86 /* Get selected folder as parent of new folder to create */
87 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
91 if (TNY_IS_ACCOUNT (parent_folder)) {
92 /* If it's the local account then do not dim */
93 if (modest_tny_account_is_virtual_local_folders (
94 TNY_ACCOUNT (parent_folder)))
97 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
98 /* If it's POP then dim */
99 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
100 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
103 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
105 /* Apply folder rules */
106 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
113 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
115 gboolean dimmed = FALSE;
117 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
119 /* Check dimmed rule */
121 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
123 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
129 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
131 gboolean dimmed = FALSE;
133 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
135 /* Check dimmed rule */
137 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
144 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
146 gboolean dimmed = FALSE;
148 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
150 /* Check dimmed rule */
152 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
154 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
160 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
162 ModestDimmingRule *rule = NULL;
163 gboolean dimmed = FALSE;
165 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
166 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
167 rule = MODEST_DIMMING_RULE (user_data);
169 /* Check dimmed rule */
171 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
173 dimmed = _msg_sent_in_progress (win);
175 modest_dimming_rule_set_notification (rule, _("TEST"));
182 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
184 ModestDimmingRule *rule = NULL;
185 gboolean dimmed = FALSE;
186 TnyFolderType types[3];
188 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
189 rule = MODEST_DIMMING_RULE (user_data);
191 /* main window dimming rules */
192 if (MODEST_IS_MAIN_WINDOW(win)) {
194 types[0] = TNY_FOLDER_TYPE_DRAFTS;
195 types[1] = TNY_FOLDER_TYPE_OUTBOX;
196 types[2] = TNY_FOLDER_TYPE_ROOT;
198 /* Check dimmed rule */
200 dimmed = _selected_folder_is_any_of_type (win, types, 3);
202 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
205 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
207 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
210 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
212 /* msg view window dimming rules */
213 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
215 /* Check dimmed rule */
217 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
225 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
227 gboolean dimmed = FALSE;
229 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
231 /* Check dimmed rule */
233 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
235 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
241 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
243 gboolean dimmed = FALSE;
245 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
247 /* Check dimmed rule */
255 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
257 ModestDimmingRule *rule = NULL;
258 gboolean dimmed = FALSE;
260 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
261 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
262 rule = MODEST_DIMMING_RULE (user_data);
264 /* Check dimmed rule */
265 if (MODEST_IS_MAIN_WINDOW (win)) {
267 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
269 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_del"));
272 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
274 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
277 dimmed = _already_opened_msg (win);
279 modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages"));
282 dimmed = _marked_as_deleted (win);
284 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
287 dimmed = _msg_sent_in_progress (win);
289 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
292 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
294 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
302 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
304 gboolean dimmed = FALSE;
305 GtkWidget *header_view = NULL;
307 /* main window dimming rules */
308 if (MODEST_IS_MAIN_WINDOW(win)) {
310 /* Check dimmed rule */
311 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
312 MODEST_WIDGET_TYPE_HEADER_VIEW);
314 /* If the header view does not have the focus then do
315 not apply msg dimming rules because the action will
316 show the folder details that have no dimming
318 if (gtk_widget_is_focus (header_view)) {
319 /* Check dimmed rule */
321 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
324 /* msg view window dimming rules */
327 /* Check dimmed rule */
329 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
337 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
339 gboolean dimmed = FALSE;
340 TnyHeaderFlags flags;
342 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
344 flags = TNY_HEADER_FLAG_SEEN;
346 /* Check dimmed rule */
348 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
350 dimmed = _selected_msg_marked_as (win, flags, FALSE);
356 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
358 gboolean dimmed = FALSE;
359 TnyHeaderFlags flags;
361 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
363 flags = TNY_HEADER_FLAG_SEEN;
365 /* Check dimmed rule */
367 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
369 dimmed = _selected_msg_marked_as (win, flags, TRUE);
375 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
377 gboolean dimmed = FALSE;
379 if (MODEST_IS_MAIN_WINDOW (win))
380 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
381 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
382 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
389 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
391 GtkWidget *folder_view = NULL;
392 GtkWidget *header_view = NULL;
393 gboolean dimmed = FALSE;
395 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
397 /* Get the folder view */
398 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
399 MODEST_WIDGET_TYPE_FOLDER_VIEW);
401 /* Get header view */
402 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
403 MODEST_WIDGET_TYPE_HEADER_VIEW);
405 /* Check common diming rules */
407 /* Check diming rules for folder transfer */
408 if (gtk_widget_is_focus (folder_view)) {
410 dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win));
412 /* Check diming rules for msg transfer */
413 else if (gtk_widget_is_focus (header_view)) {
415 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
423 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
425 gboolean dimmed = FALSE;
427 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
429 /* Check dimmed rule */
431 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
437 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
439 TnyFolderType types[3];
440 gboolean dimmed = FALSE;
442 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
444 types[0] = TNY_FOLDER_TYPE_DRAFTS;
445 types[1] = TNY_FOLDER_TYPE_OUTBOX;
446 types[2] = TNY_FOLDER_TYPE_SENT;
448 /* Check dimmed rule */
450 dimmed = _selected_folder_is_any_of_type (win, types, 3);
456 modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data)
458 TnyFolderType types[5];
459 gboolean dimmed = FALSE;
461 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
463 types[0] = TNY_FOLDER_TYPE_DRAFTS;
464 types[1] = TNY_FOLDER_TYPE_OUTBOX;
465 types[2] = TNY_FOLDER_TYPE_SENT;
466 types[3] = TNY_FOLDER_TYPE_INBOX;
467 types[4] = TNY_FOLDER_TYPE_ROOT;
469 /* Check dimmed rule */
471 dimmed = _selected_folder_is_any_of_type (win, types, 5);
477 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
479 gboolean dimmed = FALSE;
481 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
483 /* Check dimmed rule */
485 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
491 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
493 ModestDimmingRule *rule = NULL;
494 gboolean dimmed = FALSE;
496 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
497 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
498 rule = MODEST_DIMMING_RULE (user_data);
500 /* Check dimmed rule */
502 dimmed = _invalid_attach_selected (MODEST_MSG_VIEW_WINDOW(win), TRUE, rule);
508 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
510 ModestDimmingRule *rule = NULL;
511 gboolean dimmed = FALSE;
513 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
514 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
515 rule = MODEST_DIMMING_RULE (user_data);
517 /* Check dimmed rule */
519 dimmed = _invalid_attach_selected (MODEST_MSG_VIEW_WINDOW(win), FALSE, rule);
525 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
527 ModestDimmingRule *rule = NULL;
528 gboolean dimmed = FALSE;
530 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
531 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
532 rule = MODEST_DIMMING_RULE (user_data);
534 /* Check dimmed rule */
536 dimmed = _invalid_attach_selected (MODEST_MSG_VIEW_WINDOW(win), FALSE, NULL);
537 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
544 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
546 gboolean dimmed = FALSE;
548 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
550 /* Check dimmed rule */
552 dimmed = _invalid_clipboard_selected (MODEST_MSG_VIEW_WINDOW(win));
558 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
560 gboolean dimmed = FALSE;
562 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
564 /* Check dimmed rule */
566 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
572 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
574 gboolean dimmed = FALSE;
576 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
578 /* Check dimmed rule */
580 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
586 gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
588 const gboolean dimmed =
589 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
596 /* *********************** static utility functions ******************** */
599 _marked_as_deleted (ModestWindow *win)
601 gboolean result = FALSE;
602 TnyHeaderFlags flags;
604 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
606 flags = TNY_HEADER_FLAG_DELETED;
608 /* Check dimmed rule */
609 result = _selected_msg_marked_as (win, flags, FALSE);
615 _selected_folder_not_writeable (ModestMainWindow *win)
617 GtkWidget *folder_view = NULL;
618 TnyFolderStore *parent_folder = NULL;
619 ModestTnyFolderRules rules;
620 gboolean result = FALSE;
622 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
624 /* Get folder view */
625 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
626 MODEST_WIDGET_TYPE_FOLDER_VIEW);
627 /* If no folder view, always dimmed */
631 /* Get selected folder as parent of new folder to create */
632 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
633 if (!(parent_folder && TNY_IS_FOLDER(parent_folder)))
636 /* Check dimmed rule */
637 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
638 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
641 g_object_unref (parent_folder);
647 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
649 TnyFolderType types[2];
650 gboolean result = FALSE;
652 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
654 types[0] = TNY_FOLDER_TYPE_ROOT;
655 types[1] = TNY_FOLDER_TYPE_INBOX;
657 /* Check folder type */
658 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
661 GtkWidget *folder_view = NULL;
662 TnyFolderStore *parent_folder = NULL;
664 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
665 MODEST_WIDGET_TYPE_FOLDER_VIEW);
666 /* Get selected folder as parent of new folder to create */
667 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
671 if (TNY_IS_ACCOUNT (parent_folder)) {
672 /* If it's the local account then do not dim */
673 if (modest_tny_account_is_virtual_local_folders (
674 TNY_ACCOUNT (parent_folder)))
677 /* If it's the MMC root folder then dim it */
678 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
681 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
682 /* If it's POP then dim */
683 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
684 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
694 _selected_folder_is_root (ModestMainWindow *win)
696 TnyFolderType types[1];
697 gboolean result = FALSE;
699 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
701 types[0] = TNY_FOLDER_TYPE_ROOT;
703 /* Check folder type */
704 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
711 _selected_folder_is_empty (ModestMainWindow *win)
713 GtkWidget *folder_view = NULL;
714 TnyFolderStore *folder = NULL;
715 gboolean result = FALSE;
717 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
719 /* Get folder view */
720 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
721 MODEST_WIDGET_TYPE_FOLDER_VIEW);
722 /* If no folder view, always dimmed */
726 /* Get selected folder as parent of new folder to create */
727 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
728 if (!(folder && TNY_IS_FOLDER(folder)))
731 /* Check folder type */
732 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
735 g_object_unref (folder);
741 _selected_folder_is_any_of_type (ModestWindow *win,
742 TnyFolderType types[],
745 GtkWidget *folder_view = NULL;
746 TnyFolderStore *folder = NULL;
747 TnyFolderType folder_type;
749 gboolean result = FALSE;
751 /*Get curent folder */
752 if (MODEST_IS_MAIN_WINDOW(win)) {
754 /* Get folder view */
755 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
756 MODEST_WIDGET_TYPE_FOLDER_VIEW);
757 /* If no folder view, always dimmed */
761 /* Get selected folder as parent of new folder to create */
762 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
764 if (!(folder && TNY_IS_FOLDER(folder)))
767 /* Check folder type */
768 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
770 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
771 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
772 for (i=0; i < ntypes; i++) {
773 result = result || folder_type == types[i];
779 g_object_unref (folder);
785 _folder_is_any_of_type (TnyFolder *folder,
786 TnyFolderType types[],
789 TnyFolderType folder_type;
790 gboolean result = FALSE;
793 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
795 /* Get folder type */
796 if (modest_tny_folder_is_local_folder (folder))
797 folder_type = modest_tny_folder_get_local_folder_type (folder);
799 folder_type = modest_tny_folder_guess_folder_type (folder);
801 /* Check foler type */
802 for (i=0; i < ntypes; i++) {
803 result = result || folder_type == types[i];
812 _invalid_clipboard_selected (ModestMsgViewWindow *win)
814 GtkClipboard *clipboard = NULL;
815 gchar *selection = NULL;
816 GtkWidget *focused = NULL;
817 gboolean result = FALSE;
819 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE);
821 /* Get clipboard selection*/
822 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
823 selection = gtk_clipboard_wait_for_text (clipboard);
825 /* Get focuesed widget */
826 focused = gtk_window_get_focus (GTK_WINDOW (win));
829 result = ((selection == NULL) ||
830 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
836 _invalid_attach_selected (ModestMsgViewWindow *win,
838 ModestDimmingRule *rule)
840 GList *attachments, *node;
842 gboolean nested_attachments = FALSE;
843 gboolean selected_messages = FALSE;
844 gboolean result = FALSE;
846 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE);
848 /* Get selected atachments */
849 attachments = modest_msg_view_window_get_attachments (win);
850 n_selected = g_list_length (attachments);
851 for (node = attachments; node != NULL; node = g_list_next (node)) {
852 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
853 TnyList *nested_list = tny_simple_list_new ();
854 if (!tny_mime_part_is_attachment (mime_part)) {
855 selected_messages = TRUE;
858 tny_mime_part_get_parts (mime_part, nested_list);
859 if (tny_list_get_length (nested_list) > 0)
860 nested_attachments = TRUE;
861 g_object_unref (nested_list);
866 result = n_selected != 1;
869 result = n_selected == 1;
871 /* Set notifications */
872 if (!result && rule != NULL) {
873 if (selected_messages) {
874 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
875 } else if (nested_attachments) {
876 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
877 } else if (n_selected == 0) {
878 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
883 g_list_free (attachments);
889 _invalid_msg_selected (ModestMainWindow *win,
891 ModestDimmingRule *rule)
893 GtkWidget *header_view = NULL;
894 GtkWidget *folder_view = NULL;
895 TnyList *selected_headers = NULL;
896 gboolean result = FALSE;
898 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
899 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
901 /* Get header view to check selected messages */
902 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
903 MODEST_WIDGET_TYPE_HEADER_VIEW);
905 /* Get folder view to check focus */
906 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
907 MODEST_WIDGET_TYPE_FOLDER_VIEW);
909 /* Get selected headers */
910 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
912 /* Check dimmed rule (TODO: check focus on widgets */
914 result = (selected_headers == NULL);
915 /* result = ((selected_headers == NULL) || */
916 /* (GTK_WIDGET_HAS_FOCUS (folder_view))); */
918 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
920 if (!result && unique) {
921 result = tny_list_get_length (selected_headers) > 1;
923 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
927 if (selected_headers != NULL)
928 g_object_unref (selected_headers);
934 _already_opened_msg (ModestWindow *win)
936 ModestWindow *window = NULL;
937 ModestWindowMgr *mgr = NULL;
938 GtkWidget *header_view = NULL;
939 TnyList *selected_headers = NULL;
940 TnyIterator *iter = NULL;
941 TnyHeader *header = NULL;
942 gboolean result = TRUE;
944 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
946 /* Get header view to check selected messages */
947 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
948 MODEST_WIDGET_TYPE_HEADER_VIEW);
950 /* Get selected headers */
951 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
952 if (selected_headers == NULL)
955 /* Check dimmed rule (TODO: check focus on widgets */
956 mgr = modest_runtime_get_window_mgr ();
957 iter = tny_list_create_iterator (selected_headers);
958 while (!tny_iterator_is_done (iter) && result) {
959 header = TNY_HEADER (tny_iterator_get_current (iter));
960 window = modest_window_mgr_find_window_by_header (mgr, header);
961 result = result && (window != NULL);
963 g_object_unref (header);
964 tny_iterator_next (iter);
968 if (selected_headers != NULL)
969 g_object_unref (selected_headers);
971 g_object_unref (iter);
977 _selected_msg_marked_as (ModestWindow *win,
981 GtkWidget *header_view = NULL;
982 TnyList *selected_headers = NULL;
983 TnyIterator *iter = NULL;
984 TnyHeader *header = NULL;
985 TnyHeaderFlags flags;
986 gboolean result = FALSE;
988 /* Get header view to check selected messages */
989 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
990 MODEST_WIDGET_TYPE_HEADER_VIEW);
992 /* Get selected headers */
993 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
994 if (selected_headers == NULL)
997 /* Call the function for each header */
998 iter = tny_list_create_iterator (selected_headers);
999 while (!tny_iterator_is_done (iter) && !result) {
1000 header = TNY_HEADER (tny_iterator_get_current (iter));
1002 flags = tny_header_get_flags (header);
1004 result = (flags & mask) == 0;
1006 result = (flags & mask) != 0;
1008 g_object_unref (header);
1009 tny_iterator_next (iter);
1013 if (selected_headers != NULL)
1014 g_object_unref (selected_headers);
1016 g_object_unref (iter);
1022 _msg_download_in_progress (ModestMsgViewWindow *win)
1024 gboolean result = FALSE;
1026 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1028 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1034 _msg_download_completed (ModestMainWindow *win)
1036 GtkWidget *header_view = NULL;
1037 TnyList *selected_headers = NULL;
1038 TnyIterator *iter = NULL;
1039 TnyHeader *header = NULL;
1040 TnyHeaderFlags flags;
1041 gboolean result = FALSE;
1043 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1046 /* Get header view to check selected messages */
1047 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1048 MODEST_WIDGET_TYPE_HEADER_VIEW);
1050 /* Get selected headers */
1051 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1052 if (selected_headers == NULL)
1055 /* Check dimmed rule */
1057 iter = tny_list_create_iterator (selected_headers);
1058 while (!tny_iterator_is_done (iter) && result) {
1059 header = TNY_HEADER (tny_iterator_get_current (iter));
1061 flags = tny_header_get_flags (header);
1062 /* TODO: is this the right flag?, it seems that some
1063 headers that have been previously downloaded do not
1065 result = (flags & TNY_HEADER_FLAG_CACHED);
1067 g_object_unref (header);
1068 tny_iterator_next (iter);
1071 g_object_unref (iter);
1077 _msg_sent_in_progress (ModestWindow *win)
1079 /* ModestTnySendQueue *send_queue = NULL; */
1080 /* GtkWidget *header_view = NULL; */
1081 /* ModestTnyAccountStore *acc_store = NULL; */
1082 /* TnyAccount *account = NULL; */
1083 /* TnyList *header_list = NULL; */
1084 /* TnyIterator *iter = NULL; */
1085 /* TnyHeader *header = NULL; */
1086 /* const gchar *account_name = NULL; */
1087 gboolean result = FALSE;
1088 /* gchar *id = NULL; */
1090 /* g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE); */
1092 /* /\* Get transport account *\/ */
1093 /* acc_store = modest_runtime_get_account_store(); */
1094 /* account_name = modest_window_get_active_account (win); */
1095 /* account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); */
1097 /* /\* Get send queue for current ransport account *\/ */
1098 /* send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); */
1099 /* g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); */
1101 /* if (MODEST_IS_MAIN_WINDOW(win)) { */
1103 /* /\* Get header view to check selected messages *\/ */
1104 /* header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), */
1105 /* MODEST_WIDGET_TYPE_HEADER_VIEW); */
1107 /* /\* Get selected headers *\/ */
1108 /* header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view)); */
1110 /* /\* Get message header *\/ */
1111 /* if (!header_list) return FALSE; */
1112 /* iter = tny_list_create_iterator (header_list); */
1113 /* header = TNY_HEADER (tny_iterator_get_current (iter)); */
1115 /* /\* Get message id *\/ */
1116 /* id = g_strdup(tny_header_get_message_id (header)); */
1118 /* } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { */
1120 /* /\* Get message header *\/ */
1121 /* header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win)); */
1123 /* /\* Get message id *\/ */
1124 /* id = g_strdup(tny_header_get_message_id (header)); */
1127 /* /\* Check if msg id is being processed inside send queue *\/ */
1128 /* result = modest_tny_send_queue_msg_is_being_sent (send_queue, id); */
1132 /* g_object_unref (header); */
1133 /* g_free(header_list); */