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 (ModestWindow *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 (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 (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_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 (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 (ModestWindow *win,
838 ModestDimmingRule *rule)
840 GList *attachments, *node;
842 TnyHeaderFlags flags;
843 gboolean nested_attachments = FALSE;
844 gboolean selected_messages = FALSE;
845 gboolean result = FALSE;
847 if (MODEST_IS_MAIN_WINDOW (win)) {
848 flags = TNY_HEADER_FLAG_ATTACHMENTS;
850 result = _selected_msg_marked_as (win, flags, TRUE);
853 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
855 /* Get selected atachments */
856 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
857 n_selected = g_list_length (attachments);
858 for (node = attachments; node != NULL; node = g_list_next (node)) {
859 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
860 TnyList *nested_list = tny_simple_list_new ();
861 if (!tny_mime_part_is_attachment (mime_part)) {
862 selected_messages = TRUE;
865 tny_mime_part_get_parts (mime_part, nested_list);
866 if (tny_list_get_length (nested_list) > 0)
867 nested_attachments = TRUE;
868 g_object_unref (nested_list);
873 result = n_selected != 1;
876 result = n_selected == 1;
878 /* Set notifications */
879 if (!result && rule != NULL) {
880 if (selected_messages) {
881 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
882 } else if (nested_attachments) {
883 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
884 } else if (n_selected == 0) {
885 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
890 g_list_free (attachments);
897 _invalid_msg_selected (ModestMainWindow *win,
899 ModestDimmingRule *rule)
901 GtkWidget *header_view = NULL;
902 GtkWidget *folder_view = NULL;
903 TnyList *selected_headers = NULL;
904 gboolean result = FALSE;
906 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
907 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
909 /* Get header view to check selected messages */
910 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
911 MODEST_WIDGET_TYPE_HEADER_VIEW);
913 /* Get folder view to check focus */
914 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
915 MODEST_WIDGET_TYPE_FOLDER_VIEW);
917 /* Get selected headers */
918 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
920 /* Check dimmed rule (TODO: check focus on widgets */
922 result = (selected_headers == NULL);
923 /* result = ((selected_headers == NULL) || */
924 /* (GTK_WIDGET_HAS_FOCUS (folder_view))); */
926 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
928 if (!result && unique) {
929 result = tny_list_get_length (selected_headers) > 1;
931 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
935 if (selected_headers != NULL)
936 g_object_unref (selected_headers);
942 _already_opened_msg (ModestWindow *win)
944 ModestWindow *window = NULL;
945 ModestWindowMgr *mgr = NULL;
946 GtkWidget *header_view = NULL;
947 TnyList *selected_headers = NULL;
948 TnyIterator *iter = NULL;
949 TnyHeader *header = NULL;
950 gboolean result = TRUE;
952 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
954 /* Get header view to check selected messages */
955 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
956 MODEST_WIDGET_TYPE_HEADER_VIEW);
958 /* Get selected headers */
959 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
960 if (selected_headers == NULL)
963 /* Check dimmed rule (TODO: check focus on widgets */
964 mgr = modest_runtime_get_window_mgr ();
965 iter = tny_list_create_iterator (selected_headers);
966 while (!tny_iterator_is_done (iter) && result) {
967 header = TNY_HEADER (tny_iterator_get_current (iter));
968 window = modest_window_mgr_find_window_by_header (mgr, header);
969 result = result && (window != NULL);
971 g_object_unref (header);
972 tny_iterator_next (iter);
976 if (selected_headers != NULL)
977 g_object_unref (selected_headers);
979 g_object_unref (iter);
985 _selected_msg_marked_as (ModestWindow *win,
989 GtkWidget *header_view = NULL;
990 TnyList *selected_headers = NULL;
991 TnyIterator *iter = NULL;
992 TnyHeader *header = NULL;
993 TnyHeaderFlags flags;
994 gboolean result = FALSE;
996 /* Get header view to check selected messages */
997 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
998 MODEST_WIDGET_TYPE_HEADER_VIEW);
1000 /* Get selected headers */
1001 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1002 if (selected_headers == NULL)
1005 /* Call the function for each header */
1006 iter = tny_list_create_iterator (selected_headers);
1007 while (!tny_iterator_is_done (iter) && !result) {
1008 header = TNY_HEADER (tny_iterator_get_current (iter));
1010 flags = tny_header_get_flags (header);
1012 result = (flags & mask) == 0;
1014 result = (flags & mask) != 0;
1016 g_object_unref (header);
1017 tny_iterator_next (iter);
1021 if (selected_headers != NULL)
1022 g_object_unref (selected_headers);
1024 g_object_unref (iter);
1030 _msg_download_in_progress (ModestMsgViewWindow *win)
1032 gboolean result = FALSE;
1034 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1036 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1042 _msg_download_completed (ModestMainWindow *win)
1044 GtkWidget *header_view = NULL;
1045 TnyList *selected_headers = NULL;
1046 TnyIterator *iter = NULL;
1047 TnyHeader *header = NULL;
1048 TnyHeaderFlags flags;
1049 gboolean result = FALSE;
1051 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1054 /* Get header view to check selected messages */
1055 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1056 MODEST_WIDGET_TYPE_HEADER_VIEW);
1058 /* Get selected headers */
1059 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1060 if (selected_headers == NULL)
1063 /* Check dimmed rule */
1065 iter = tny_list_create_iterator (selected_headers);
1066 while (!tny_iterator_is_done (iter) && result) {
1067 header = TNY_HEADER (tny_iterator_get_current (iter));
1069 flags = tny_header_get_flags (header);
1070 /* TODO: is this the right flag?, it seems that some
1071 headers that have been previously downloaded do not
1073 result = (flags & TNY_HEADER_FLAG_CACHED);
1075 g_object_unref (header);
1076 tny_iterator_next (iter);
1079 g_object_unref (iter);
1085 _msg_sent_in_progress (ModestWindow *win)
1087 /* ModestTnySendQueue *send_queue = NULL; */
1088 /* GtkWidget *header_view = NULL; */
1089 /* ModestTnyAccountStore *acc_store = NULL; */
1090 /* TnyAccount *account = NULL; */
1091 /* TnyList *header_list = NULL; */
1092 /* TnyIterator *iter = NULL; */
1093 /* TnyHeader *header = NULL; */
1094 /* const gchar *account_name = NULL; */
1095 gboolean result = FALSE;
1096 /* gchar *id = NULL; */
1098 /* g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE); */
1100 /* /\* Get transport account *\/ */
1101 /* acc_store = modest_runtime_get_account_store(); */
1102 /* account_name = modest_window_get_active_account (win); */
1103 /* account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); */
1105 /* /\* Get send queue for current ransport account *\/ */
1106 /* send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); */
1107 /* g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); */
1109 /* if (MODEST_IS_MAIN_WINDOW(win)) { */
1111 /* /\* Get header view to check selected messages *\/ */
1112 /* header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), */
1113 /* MODEST_WIDGET_TYPE_HEADER_VIEW); */
1115 /* /\* Get selected headers *\/ */
1116 /* header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view)); */
1118 /* /\* Get message header *\/ */
1119 /* if (!header_list) return FALSE; */
1120 /* iter = tny_list_create_iterator (header_list); */
1121 /* header = TNY_HEADER (tny_iterator_get_current (iter)); */
1123 /* /\* Get message id *\/ */
1124 /* id = g_strdup(tny_header_get_message_id (header)); */
1126 /* } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { */
1128 /* /\* Get message header *\/ */
1129 /* header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win)); */
1131 /* /\* Get message id *\/ */
1132 /* id = g_strdup(tny_header_get_message_id (header)); */
1135 /* /\* Check if msg id is being processed inside send queue *\/ */
1136 /* result = modest_tny_send_queue_msg_is_being_sent (send_queue, id); */
1140 /* g_object_unref (header); */
1141 /* g_free(header_list); */