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 TnyFolderType types[3];
107 types[0] = TNY_FOLDER_TYPE_DRAFTS;
108 types[1] = TNY_FOLDER_TYPE_OUTBOX;
109 types[2] = TNY_FOLDER_TYPE_SENT;
111 /* Apply folder rules */
113 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
115 dimmed = _selected_folder_is_any_of_type (win, types, 3);
122 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
124 gboolean dimmed = FALSE;
125 TnyFolderType types[3];
127 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
129 types[0] = TNY_FOLDER_TYPE_DRAFTS;
130 types[1] = TNY_FOLDER_TYPE_OUTBOX;
131 types[2] = TNY_FOLDER_TYPE_SENT;
133 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
135 /* Check dimmed rule */
137 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
139 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
141 dimmed = _selected_folder_is_any_of_type (win, types, 3);
147 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
149 gboolean dimmed = FALSE;
151 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
153 /* Check dimmed rule */
155 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
162 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
164 gboolean dimmed = FALSE;
165 TnyFolderType types[3];
167 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
169 types[0] = TNY_FOLDER_TYPE_DRAFTS;
170 types[1] = TNY_FOLDER_TYPE_OUTBOX;
171 types[2] = TNY_FOLDER_TYPE_SENT;
173 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
175 /* Check dimmed rule */
177 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
179 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
181 dimmed = _selected_folder_is_any_of_type (win, types, 3);
187 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
189 ModestDimmingRule *rule = NULL;
190 gboolean dimmed = FALSE;
192 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
193 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
194 rule = MODEST_DIMMING_RULE (user_data);
196 /* Check dimmed rule */
198 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
200 dimmed = _msg_sent_in_progress (win);
202 modest_dimming_rule_set_notification (rule, _("TEST"));
209 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
211 ModestDimmingRule *rule = NULL;
212 gboolean dimmed = FALSE;
213 TnyFolderType types[3];
215 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
216 rule = MODEST_DIMMING_RULE (user_data);
218 /* main window dimming rules */
219 if (MODEST_IS_MAIN_WINDOW(win)) {
221 types[0] = TNY_FOLDER_TYPE_DRAFTS;
222 types[1] = TNY_FOLDER_TYPE_OUTBOX;
223 types[2] = TNY_FOLDER_TYPE_ROOT;
225 /* Check dimmed rule */
227 dimmed = _selected_folder_is_any_of_type (win, types, 3);
229 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
232 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
234 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
237 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
239 /* msg view window dimming rules */
240 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
242 /* Check dimmed rule */
244 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
252 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
254 gboolean dimmed = FALSE;
256 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
258 /* Check dimmed rule */
260 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
262 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
268 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
270 gboolean dimmed = FALSE;
272 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
274 /* Check dimmed rule */
282 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
284 ModestDimmingRule *rule = NULL;
285 gboolean dimmed = FALSE;
287 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
288 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
289 rule = MODEST_DIMMING_RULE (user_data);
291 /* Check dimmed rule */
292 if (MODEST_IS_MAIN_WINDOW (win)) {
294 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
296 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_del"));
299 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
301 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
304 dimmed = _already_opened_msg (win);
306 modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages"));
309 dimmed = _marked_as_deleted (win);
311 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
314 dimmed = _msg_sent_in_progress (win);
316 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
319 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
321 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
329 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
331 gboolean dimmed = FALSE;
332 GtkWidget *header_view = NULL;
334 /* main window dimming rules */
335 if (MODEST_IS_MAIN_WINDOW(win)) {
337 /* Check dimmed rule */
338 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
339 MODEST_WIDGET_TYPE_HEADER_VIEW);
341 /* If the header view does not have the focus then do
342 not apply msg dimming rules because the action will
343 show the folder details that have no dimming
345 if (gtk_widget_is_focus (header_view)) {
346 /* Check dimmed rule */
348 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
351 /* msg view window dimming rules */
354 /* Check dimmed rule */
356 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
364 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
366 gboolean dimmed = FALSE;
367 TnyHeaderFlags flags;
369 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
371 flags = TNY_HEADER_FLAG_SEEN;
373 /* Check dimmed rule */
375 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
377 dimmed = _selected_msg_marked_as (win, flags, FALSE);
383 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
385 gboolean dimmed = FALSE;
386 TnyHeaderFlags flags;
388 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
390 flags = TNY_HEADER_FLAG_SEEN;
392 /* Check dimmed rule */
394 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
396 dimmed = _selected_msg_marked_as (win, flags, TRUE);
402 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
404 gboolean dimmed = FALSE;
406 if (MODEST_IS_MAIN_WINDOW (win))
407 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
408 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
409 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
416 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
418 GtkWidget *folder_view = NULL;
419 GtkWidget *header_view = NULL;
420 gboolean dimmed = FALSE;
422 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
424 /* Get the folder view */
425 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
426 MODEST_WIDGET_TYPE_FOLDER_VIEW);
428 /* Get header view */
429 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
430 MODEST_WIDGET_TYPE_HEADER_VIEW);
432 /* Check common diming rules */
434 /* Check diming rules for folder transfer */
435 if (gtk_widget_is_focus (folder_view)) {
437 dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win));
439 /* Check diming rules for msg transfer */
440 else if (gtk_widget_is_focus (header_view)) {
442 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
450 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
452 gboolean dimmed = FALSE;
454 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
456 /* Check dimmed rule */
458 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
464 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
466 TnyFolderType types[3];
467 gboolean dimmed = FALSE;
469 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
471 types[0] = TNY_FOLDER_TYPE_DRAFTS;
472 types[1] = TNY_FOLDER_TYPE_OUTBOX;
473 types[2] = TNY_FOLDER_TYPE_SENT;
475 /* Check dimmed rule */
477 dimmed = _selected_folder_is_any_of_type (win, types, 3);
483 modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data)
485 TnyFolderType types[5];
486 gboolean dimmed = FALSE;
488 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
490 types[0] = TNY_FOLDER_TYPE_DRAFTS;
491 types[1] = TNY_FOLDER_TYPE_OUTBOX;
492 types[2] = TNY_FOLDER_TYPE_SENT;
493 types[3] = TNY_FOLDER_TYPE_INBOX;
494 types[4] = TNY_FOLDER_TYPE_ROOT;
496 /* Check dimmed rule */
498 dimmed = _selected_folder_is_any_of_type (win, types, 5);
504 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
506 gboolean dimmed = FALSE;
508 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
510 /* Check dimmed rule */
512 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
518 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
520 ModestDimmingRule *rule = NULL;
521 gboolean dimmed = FALSE;
523 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
524 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
525 rule = MODEST_DIMMING_RULE (user_data);
527 /* Check dimmed rule */
529 dimmed = _invalid_attach_selected (win, TRUE, rule);
535 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
537 ModestDimmingRule *rule = NULL;
538 gboolean dimmed = FALSE;
540 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
541 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
542 rule = MODEST_DIMMING_RULE (user_data);
544 /* Check dimmed rule */
546 dimmed = _invalid_attach_selected (win, FALSE, rule);
552 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
554 ModestDimmingRule *rule = NULL;
555 gboolean dimmed = FALSE;
557 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
558 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
559 rule = MODEST_DIMMING_RULE (user_data);
561 /* Check dimmed rule */
563 dimmed = _invalid_attach_selected (win, FALSE, NULL);
564 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
571 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
573 gboolean dimmed = FALSE;
575 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
577 /* Check dimmed rule */
579 dimmed = _invalid_clipboard_selected (MODEST_MSG_VIEW_WINDOW(win));
585 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
587 gboolean dimmed = FALSE;
589 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
591 /* Check dimmed rule */
593 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
599 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
601 gboolean dimmed = FALSE;
603 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
605 /* Check dimmed rule */
607 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
613 gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
615 const gboolean dimmed =
616 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
623 /* *********************** static utility functions ******************** */
626 _marked_as_deleted (ModestWindow *win)
628 gboolean result = FALSE;
629 TnyHeaderFlags flags;
631 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
633 flags = TNY_HEADER_FLAG_DELETED;
635 /* Check dimmed rule */
636 result = _selected_msg_marked_as (win, flags, FALSE);
642 _selected_folder_not_writeable (ModestMainWindow *win)
644 GtkWidget *folder_view = NULL;
645 TnyFolderStore *parent_folder = NULL;
646 ModestTnyFolderRules rules;
647 gboolean result = FALSE;
649 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
651 /* Get folder view */
652 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
653 MODEST_WIDGET_TYPE_FOLDER_VIEW);
654 /* If no folder view, always dimmed */
658 /* Get selected folder as parent of new folder to create */
659 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
660 if (!(parent_folder && TNY_IS_FOLDER(parent_folder)))
663 /* Check dimmed rule */
664 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
665 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
668 g_object_unref (parent_folder);
674 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
676 TnyFolderType types[2];
677 gboolean result = FALSE;
679 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
681 types[0] = TNY_FOLDER_TYPE_ROOT;
682 types[1] = TNY_FOLDER_TYPE_INBOX;
684 /* Check folder type */
685 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
688 GtkWidget *folder_view = NULL;
689 TnyFolderStore *parent_folder = NULL;
691 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
692 MODEST_WIDGET_TYPE_FOLDER_VIEW);
693 /* Get selected folder as parent of new folder to create */
694 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
698 if (TNY_IS_ACCOUNT (parent_folder)) {
699 /* If it's the local account then do not dim */
700 if (modest_tny_account_is_virtual_local_folders (
701 TNY_ACCOUNT (parent_folder)))
704 /* If it's the MMC root folder then dim it */
705 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
708 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
709 /* If it's POP then dim */
710 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
711 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
721 _selected_folder_is_root (ModestMainWindow *win)
723 TnyFolderType types[1];
724 gboolean result = FALSE;
726 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
728 types[0] = TNY_FOLDER_TYPE_ROOT;
730 /* Check folder type */
731 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
738 _selected_folder_is_empty (ModestMainWindow *win)
740 GtkWidget *folder_view = NULL;
741 TnyFolderStore *folder = NULL;
742 gboolean result = FALSE;
744 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
746 /* Get folder view */
747 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
748 MODEST_WIDGET_TYPE_FOLDER_VIEW);
749 /* If no folder view, always dimmed */
753 /* Get selected folder as parent of new folder to create */
754 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
755 if (!(folder && TNY_IS_FOLDER(folder)))
758 /* Check folder type */
759 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
762 g_object_unref (folder);
768 _selected_folder_is_any_of_type (ModestWindow *win,
769 TnyFolderType types[],
772 GtkWidget *folder_view = NULL;
773 TnyFolderStore *folder = NULL;
774 TnyFolderType folder_type;
776 gboolean result = FALSE;
778 /*Get curent folder */
779 if (MODEST_IS_MAIN_WINDOW(win)) {
781 /* Get folder view */
782 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
783 MODEST_WIDGET_TYPE_FOLDER_VIEW);
784 /* If no folder view, always dimmed */
788 /* Get selected folder as parent of new folder to create */
789 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
791 if (!(folder && TNY_IS_FOLDER(folder)))
794 /* Check folder type */
795 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
797 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
798 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
799 for (i=0; i < ntypes; i++) {
800 result = result || folder_type == types[i];
806 g_object_unref (folder);
812 _folder_is_any_of_type (TnyFolder *folder,
813 TnyFolderType types[],
816 TnyFolderType folder_type;
817 gboolean result = FALSE;
820 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
822 /* Get folder type */
823 if (modest_tny_folder_is_local_folder (folder))
824 folder_type = modest_tny_folder_get_local_folder_type (folder);
826 folder_type = modest_tny_folder_guess_folder_type (folder);
828 /* Check foler type */
829 for (i=0; i < ntypes; i++) {
830 result = result || folder_type == types[i];
839 _invalid_clipboard_selected (ModestMsgViewWindow *win)
841 GtkClipboard *clipboard = NULL;
842 gchar *selection = NULL;
843 GtkWidget *focused = NULL;
844 gboolean result = FALSE;
846 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE);
848 /* Get clipboard selection*/
849 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
850 selection = gtk_clipboard_wait_for_text (clipboard);
852 /* Get focuesed widget */
853 focused = gtk_window_get_focus (GTK_WINDOW (win));
856 result = ((selection == NULL) ||
857 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
863 _invalid_attach_selected (ModestWindow *win,
865 ModestDimmingRule *rule)
867 GList *attachments, *node;
869 TnyHeaderFlags flags;
870 gboolean nested_attachments = FALSE;
871 gboolean selected_messages = FALSE;
872 gboolean result = FALSE;
874 if (MODEST_IS_MAIN_WINDOW (win)) {
875 flags = TNY_HEADER_FLAG_ATTACHMENTS;
877 result = _selected_msg_marked_as (win, flags, TRUE);
880 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
882 /* Get selected atachments */
883 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
884 n_selected = g_list_length (attachments);
885 for (node = attachments; node != NULL; node = g_list_next (node)) {
886 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
887 TnyList *nested_list = tny_simple_list_new ();
888 if (!tny_mime_part_is_attachment (mime_part)) {
889 selected_messages = TRUE;
892 tny_mime_part_get_parts (mime_part, nested_list);
893 if (tny_list_get_length (nested_list) > 0)
894 nested_attachments = TRUE;
895 g_object_unref (nested_list);
900 result = n_selected != 1;
903 result = n_selected == 1;
905 /* Set notifications */
906 if (!result && rule != NULL) {
907 if (selected_messages) {
908 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
909 } else if (nested_attachments) {
910 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
911 } else if (n_selected == 0) {
912 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
917 g_list_free (attachments);
924 _invalid_msg_selected (ModestMainWindow *win,
926 ModestDimmingRule *rule)
928 GtkWidget *header_view = NULL;
929 GtkWidget *folder_view = NULL;
930 TnyList *selected_headers = NULL;
931 gboolean result = FALSE;
933 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
934 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
936 /* Get header view to check selected messages */
937 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
938 MODEST_WIDGET_TYPE_HEADER_VIEW);
940 /* Get folder view to check focus */
941 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
942 MODEST_WIDGET_TYPE_FOLDER_VIEW);
944 /* Get selected headers */
945 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
947 /* Check dimmed rule (TODO: check focus on widgets */
949 result = (selected_headers == NULL);
950 /* result = ((selected_headers == NULL) || */
951 /* (GTK_WIDGET_HAS_FOCUS (folder_view))); */
953 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
955 if (!result && unique) {
956 result = tny_list_get_length (selected_headers) > 1;
958 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
962 if (selected_headers != NULL)
963 g_object_unref (selected_headers);
969 _already_opened_msg (ModestWindow *win)
971 ModestWindow *window = NULL;
972 ModestWindowMgr *mgr = NULL;
973 GtkWidget *header_view = NULL;
974 TnyList *selected_headers = NULL;
975 TnyIterator *iter = NULL;
976 TnyHeader *header = NULL;
977 gboolean result = TRUE;
979 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
981 /* Get header view to check selected messages */
982 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
983 MODEST_WIDGET_TYPE_HEADER_VIEW);
985 /* Get selected headers */
986 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
987 if (selected_headers == NULL)
990 /* Check dimmed rule (TODO: check focus on widgets */
991 mgr = modest_runtime_get_window_mgr ();
992 iter = tny_list_create_iterator (selected_headers);
993 while (!tny_iterator_is_done (iter) && result) {
994 header = TNY_HEADER (tny_iterator_get_current (iter));
995 window = modest_window_mgr_find_window_by_header (mgr, header);
996 result = result && (window != NULL);
998 g_object_unref (header);
999 tny_iterator_next (iter);
1003 if (selected_headers != NULL)
1004 g_object_unref (selected_headers);
1006 g_object_unref (iter);
1012 _selected_msg_marked_as (ModestWindow *win,
1013 TnyHeaderFlags mask,
1016 GtkWidget *header_view = NULL;
1017 TnyList *selected_headers = NULL;
1018 TnyIterator *iter = NULL;
1019 TnyHeader *header = NULL;
1020 TnyHeaderFlags flags;
1021 gboolean result = FALSE;
1023 /* Get header view to check selected messages */
1024 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1025 MODEST_WIDGET_TYPE_HEADER_VIEW);
1027 /* Get selected headers */
1028 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1029 if (selected_headers == NULL)
1032 /* Call the function for each header */
1033 iter = tny_list_create_iterator (selected_headers);
1034 while (!tny_iterator_is_done (iter) && !result) {
1035 header = TNY_HEADER (tny_iterator_get_current (iter));
1037 flags = tny_header_get_flags (header);
1039 result = (flags & mask) == 0;
1041 result = (flags & mask) != 0;
1043 g_object_unref (header);
1044 tny_iterator_next (iter);
1048 if (selected_headers != NULL)
1049 g_object_unref (selected_headers);
1051 g_object_unref (iter);
1057 _msg_download_in_progress (ModestMsgViewWindow *win)
1059 gboolean result = FALSE;
1061 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1063 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1069 _msg_download_completed (ModestMainWindow *win)
1071 GtkWidget *header_view = NULL;
1072 TnyList *selected_headers = NULL;
1073 TnyIterator *iter = NULL;
1074 TnyHeader *header = NULL;
1075 TnyHeaderFlags flags;
1076 gboolean result = FALSE;
1078 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1081 /* Get header view to check selected messages */
1082 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1083 MODEST_WIDGET_TYPE_HEADER_VIEW);
1085 /* Get selected headers */
1086 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1087 if (selected_headers == NULL)
1090 /* Check dimmed rule */
1092 iter = tny_list_create_iterator (selected_headers);
1093 while (!tny_iterator_is_done (iter) && result) {
1094 header = TNY_HEADER (tny_iterator_get_current (iter));
1096 flags = tny_header_get_flags (header);
1097 /* TODO: is this the right flag?, it seems that some
1098 headers that have been previously downloaded do not
1100 result = (flags & TNY_HEADER_FLAG_CACHED);
1102 g_object_unref (header);
1103 tny_iterator_next (iter);
1106 g_object_unref (iter);
1112 _msg_sent_in_progress (ModestWindow *win)
1114 /* ModestTnySendQueue *send_queue = NULL; */
1115 /* GtkWidget *header_view = NULL; */
1116 /* ModestTnyAccountStore *acc_store = NULL; */
1117 /* TnyAccount *account = NULL; */
1118 /* TnyList *header_list = NULL; */
1119 /* TnyIterator *iter = NULL; */
1120 /* TnyHeader *header = NULL; */
1121 /* const gchar *account_name = NULL; */
1122 gboolean result = FALSE;
1123 /* gchar *id = NULL; */
1125 /* g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE); */
1127 /* /\* Get transport account *\/ */
1128 /* acc_store = modest_runtime_get_account_store(); */
1129 /* account_name = modest_window_get_active_account (win); */
1130 /* account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); */
1132 /* /\* Get send queue for current ransport account *\/ */
1133 /* send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); */
1134 /* g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); */
1136 /* if (MODEST_IS_MAIN_WINDOW(win)) { */
1138 /* /\* Get header view to check selected messages *\/ */
1139 /* header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), */
1140 /* MODEST_WIDGET_TYPE_HEADER_VIEW); */
1142 /* /\* Get selected headers *\/ */
1143 /* header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view)); */
1145 /* /\* Get message header *\/ */
1146 /* if (!header_list) return FALSE; */
1147 /* iter = tny_list_create_iterator (header_list); */
1148 /* header = TNY_HEADER (tny_iterator_get_current (iter)); */
1150 /* /\* Get message id *\/ */
1151 /* id = g_strdup(tny_header_get_message_id (header)); */
1153 /* } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { */
1155 /* /\* Get message header *\/ */
1156 /* header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win)); */
1158 /* /\* Get message id *\/ */
1159 /* id = g_strdup(tny_header_get_message_id (header)); */
1162 /* /\* Check if msg id is being processed inside send queue *\/ */
1163 /* result = modest_tny_send_queue_msg_is_being_sent (send_queue, id); */
1167 /* g_object_unref (header); */
1168 /* g_free(header_list); */