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_MMC_or_POP_root (ModestMainWindow *win);
53 static gboolean _selected_folder_is_root (ModestMainWindow *win);
54 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
55 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
56 static gboolean _msg_download_completed (ModestMainWindow *win);
57 static gboolean _msg_sent_in_progress (ModestWindow *win);
58 static gboolean _marked_as_deleted (ModestWindow *win);
62 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
64 gboolean dimmed = FALSE;
66 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
68 /* Check dimmed rule */
70 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
76 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
78 gboolean dimmed = FALSE;
79 GtkWidget *folder_view = NULL;
80 TnyFolderStore *parent_folder = NULL;
82 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
85 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
86 MODEST_WIDGET_TYPE_FOLDER_VIEW);
87 /* Get selected folder as parent of new folder to create */
88 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
92 if (TNY_IS_ACCOUNT (parent_folder)) {
93 /* If it's the local account then do not dim */
94 if (modest_tny_account_is_virtual_local_folders (
95 TNY_ACCOUNT (parent_folder)))
98 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
99 /* If it's POP then dim */
100 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
101 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
104 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
106 TnyFolderType types[3];
108 types[0] = TNY_FOLDER_TYPE_DRAFTS;
109 types[1] = TNY_FOLDER_TYPE_OUTBOX;
110 types[2] = TNY_FOLDER_TYPE_SENT;
112 /* Apply folder rules */
114 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
116 dimmed = _selected_folder_is_any_of_type (win, types, 3);
123 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
125 gboolean dimmed = FALSE;
126 TnyFolderType types[3];
128 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
130 types[0] = TNY_FOLDER_TYPE_DRAFTS;
131 types[1] = TNY_FOLDER_TYPE_OUTBOX;
132 types[2] = TNY_FOLDER_TYPE_SENT;
134 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
136 /* Check dimmed rule */
138 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
140 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
142 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
144 dimmed = _selected_folder_is_any_of_type (win, types, 3);
150 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
152 gboolean dimmed = FALSE;
154 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
156 /* Check dimmed rule */
158 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
165 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
167 gboolean dimmed = FALSE;
168 TnyFolderType types[3];
170 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
172 types[0] = TNY_FOLDER_TYPE_DRAFTS;
173 types[1] = TNY_FOLDER_TYPE_OUTBOX;
174 types[2] = TNY_FOLDER_TYPE_SENT;
176 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
178 /* Check dimmed rule */
180 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
182 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
184 dimmed = _selected_folder_is_any_of_type (win, types, 3);
190 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
192 ModestDimmingRule *rule = NULL;
193 gboolean dimmed = FALSE;
195 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
196 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
197 rule = MODEST_DIMMING_RULE (user_data);
199 /* Check dimmed rule */
201 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
203 dimmed = _msg_sent_in_progress (win);
205 modest_dimming_rule_set_notification (rule, _("TEST"));
212 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
214 ModestDimmingRule *rule = NULL;
215 gboolean dimmed = FALSE;
216 TnyFolderType types[3];
218 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
219 rule = MODEST_DIMMING_RULE (user_data);
221 /* main window dimming rules */
222 if (MODEST_IS_MAIN_WINDOW(win)) {
224 types[0] = TNY_FOLDER_TYPE_DRAFTS;
225 types[1] = TNY_FOLDER_TYPE_OUTBOX;
226 types[2] = TNY_FOLDER_TYPE_ROOT;
228 /* Check dimmed rule */
230 dimmed = _selected_folder_is_any_of_type (win, types, 3);
232 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
235 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
237 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
240 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
242 /* msg view window dimming rules */
243 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
245 /* Check dimmed rule */
247 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
255 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
257 gboolean dimmed = FALSE;
259 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
261 /* Check dimmed rule */
263 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
265 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
271 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
273 gboolean dimmed = FALSE;
275 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
277 /* Check dimmed rule */
285 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
287 ModestDimmingRule *rule = NULL;
288 gboolean dimmed = FALSE;
290 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
291 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
292 rule = MODEST_DIMMING_RULE (user_data);
294 /* Check dimmed rule */
295 if (MODEST_IS_MAIN_WINDOW (win)) {
297 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
299 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_del"));
302 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
304 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
307 dimmed = _already_opened_msg (win);
309 modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages"));
312 dimmed = _marked_as_deleted (win);
314 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
317 dimmed = _msg_sent_in_progress (win);
319 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
322 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
324 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
332 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
334 gboolean dimmed = FALSE;
335 GtkWidget *header_view = NULL;
337 /* main window dimming rules */
338 if (MODEST_IS_MAIN_WINDOW(win)) {
340 /* Check dimmed rule */
341 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
342 MODEST_WIDGET_TYPE_HEADER_VIEW);
344 /* If the header view does not have the focus then do
345 not apply msg dimming rules because the action will
346 show the folder details that have no dimming
348 if (gtk_widget_is_focus (header_view)) {
349 /* Check dimmed rule */
351 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
354 /* msg view window dimming rules */
357 /* Check dimmed rule */
359 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
367 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
369 gboolean dimmed = FALSE;
370 TnyHeaderFlags flags;
372 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
374 flags = TNY_HEADER_FLAG_SEEN;
376 /* Check dimmed rule */
378 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
380 dimmed = _selected_msg_marked_as (win, flags, FALSE);
386 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
388 gboolean dimmed = FALSE;
389 TnyHeaderFlags flags;
391 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
393 flags = TNY_HEADER_FLAG_SEEN;
395 /* Check dimmed rule */
397 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
399 dimmed = _selected_msg_marked_as (win, flags, TRUE);
405 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
407 gboolean dimmed = FALSE;
409 if (MODEST_IS_MAIN_WINDOW (win))
410 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
411 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
412 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
419 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
421 GtkWidget *folder_view = NULL;
422 GtkWidget *header_view = NULL;
423 gboolean dimmed = FALSE;
425 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
427 /* Get the folder view */
428 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
429 MODEST_WIDGET_TYPE_FOLDER_VIEW);
431 /* Get header view */
432 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
433 MODEST_WIDGET_TYPE_HEADER_VIEW);
435 /* Check common diming rules */
437 /* Check diming rules for folder transfer */
438 if (gtk_widget_is_focus (folder_view)) {
440 dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win));
442 /* Check diming rules for msg transfer */
443 else if (gtk_widget_is_focus (header_view)) {
445 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
453 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
455 gboolean dimmed = FALSE;
457 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
459 /* Check dimmed rule */
461 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
467 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
469 TnyFolderType types[3];
470 gboolean dimmed = FALSE;
472 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
474 types[0] = TNY_FOLDER_TYPE_DRAFTS;
475 types[1] = TNY_FOLDER_TYPE_OUTBOX;
476 types[2] = TNY_FOLDER_TYPE_SENT;
478 /* Check dimmed rule */
480 dimmed = _selected_folder_is_any_of_type (win, types, 3);
486 modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data)
488 TnyFolderType types[5];
489 gboolean dimmed = FALSE;
491 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
493 types[0] = TNY_FOLDER_TYPE_DRAFTS;
494 types[1] = TNY_FOLDER_TYPE_OUTBOX;
495 types[2] = TNY_FOLDER_TYPE_SENT;
496 types[3] = TNY_FOLDER_TYPE_INBOX;
497 types[4] = TNY_FOLDER_TYPE_ROOT;
499 /* Check dimmed rule */
501 dimmed = _selected_folder_is_any_of_type (win, types, 5);
507 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
509 gboolean dimmed = FALSE;
511 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
513 /* Check dimmed rule */
515 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
521 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
523 ModestDimmingRule *rule = NULL;
524 gboolean dimmed = FALSE;
526 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
527 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
528 rule = MODEST_DIMMING_RULE (user_data);
530 /* Check dimmed rule */
532 dimmed = _invalid_attach_selected (win, TRUE, rule);
538 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
540 ModestDimmingRule *rule = NULL;
541 gboolean dimmed = FALSE;
543 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
544 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
545 rule = MODEST_DIMMING_RULE (user_data);
547 /* Check dimmed rule */
549 dimmed = _invalid_attach_selected (win, FALSE, rule);
555 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
557 ModestDimmingRule *rule = NULL;
558 gboolean dimmed = FALSE;
560 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
561 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
562 rule = MODEST_DIMMING_RULE (user_data);
564 /* Check dimmed rule */
566 dimmed = _invalid_attach_selected (win, FALSE, NULL);
567 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
574 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
576 gboolean dimmed = FALSE;
578 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
580 /* Check dimmed rule */
582 dimmed = _invalid_clipboard_selected (MODEST_MSG_VIEW_WINDOW(win));
588 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
590 gboolean dimmed = FALSE;
592 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
594 /* Check dimmed rule */
596 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
602 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
604 gboolean dimmed = FALSE;
606 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
608 /* Check dimmed rule */
610 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
616 gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
618 const gboolean dimmed =
619 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
626 /* *********************** static utility functions ******************** */
629 _marked_as_deleted (ModestWindow *win)
631 gboolean result = FALSE;
632 TnyHeaderFlags flags;
634 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
636 flags = TNY_HEADER_FLAG_DELETED;
638 /* Check dimmed rule */
639 result = _selected_msg_marked_as (win, flags, FALSE);
645 _selected_folder_not_writeable (ModestMainWindow *win)
647 GtkWidget *folder_view = NULL;
648 TnyFolderStore *parent_folder = NULL;
649 ModestTnyFolderRules rules;
650 gboolean result = FALSE;
652 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
654 /* Get folder view */
655 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
656 MODEST_WIDGET_TYPE_FOLDER_VIEW);
657 /* If no folder view, always dimmed */
661 /* Get selected folder as parent of new folder to create */
662 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
663 if (!(parent_folder && TNY_IS_FOLDER(parent_folder)))
666 /* Check dimmed rule */
667 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
668 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
671 g_object_unref (parent_folder);
677 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
679 TnyFolderType types[2];
680 gboolean result = FALSE;
682 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
684 types[0] = TNY_FOLDER_TYPE_ROOT;
685 types[1] = TNY_FOLDER_TYPE_INBOX;
687 /* Check folder type */
688 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
690 /* Check pop and MMC accounts */
692 result = _selected_folder_is_MMC_or_POP_root (win);
700 _selected_folder_is_root (ModestMainWindow *win)
702 TnyFolderType types[1];
703 gboolean result = FALSE;
705 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
707 types[0] = TNY_FOLDER_TYPE_ROOT;
709 /* Check folder type */
710 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
712 /* Check pop and MMC accounts */
714 result = _selected_folder_is_MMC_or_POP_root (win);
721 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
723 GtkWidget *folder_view = NULL;
724 TnyFolderStore *parent_folder = NULL;
725 gboolean result = FALSE;
727 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
728 MODEST_WIDGET_TYPE_FOLDER_VIEW);
729 /* Get selected folder as parent of new folder to create */
730 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
734 if (TNY_IS_ACCOUNT (parent_folder)) {
735 /* If it's the local account then do not dim */
736 if (modest_tny_account_is_virtual_local_folders (
737 TNY_ACCOUNT (parent_folder)))
740 /* If it's the MMC root folder then dim it */
741 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
744 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
745 /* If it's POP then dim */
746 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
747 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
759 _selected_folder_is_empty (ModestMainWindow *win)
761 GtkWidget *folder_view = NULL;
762 TnyFolderStore *folder = NULL;
763 gboolean result = FALSE;
765 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
767 /* Get folder view */
768 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
769 MODEST_WIDGET_TYPE_FOLDER_VIEW);
770 /* If no folder view, always dimmed */
774 /* Get selected folder as parent of new folder to create */
775 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
776 if (!(folder && TNY_IS_FOLDER(folder)))
779 /* Check folder type */
780 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
783 g_object_unref (folder);
789 _selected_folder_is_any_of_type (ModestWindow *win,
790 TnyFolderType types[],
793 GtkWidget *folder_view = NULL;
794 TnyFolderStore *folder = NULL;
795 TnyFolderType folder_type;
797 gboolean result = FALSE;
799 /*Get curent folder */
800 if (MODEST_IS_MAIN_WINDOW(win)) {
802 /* Get folder view */
803 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
804 MODEST_WIDGET_TYPE_FOLDER_VIEW);
805 /* If no folder view, always dimmed */
809 /* Get selected folder as parent of new folder to create */
810 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
812 if (!(folder && TNY_IS_FOLDER(folder)))
815 /* Check folder type */
816 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
818 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
819 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
820 for (i=0; i < ntypes; i++) {
821 result = result || folder_type == types[i];
827 g_object_unref (folder);
833 _folder_is_any_of_type (TnyFolder *folder,
834 TnyFolderType types[],
837 TnyFolderType folder_type;
838 gboolean result = FALSE;
841 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
843 /* Get folder type */
844 if (modest_tny_folder_is_local_folder (folder))
845 folder_type = modest_tny_folder_get_local_folder_type (folder);
847 folder_type = modest_tny_folder_guess_folder_type (folder);
849 /* Check foler type */
850 for (i=0; i < ntypes; i++) {
851 result = result || folder_type == types[i];
860 _invalid_clipboard_selected (ModestMsgViewWindow *win)
862 GtkClipboard *clipboard = NULL;
863 gchar *selection = NULL;
864 GtkWidget *focused = NULL;
865 gboolean result = FALSE;
867 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE);
869 /* Get clipboard selection*/
870 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
871 selection = gtk_clipboard_wait_for_text (clipboard);
873 /* Get focuesed widget */
874 focused = gtk_window_get_focus (GTK_WINDOW (win));
877 result = ((selection == NULL) ||
878 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
884 _invalid_attach_selected (ModestWindow *win,
886 ModestDimmingRule *rule)
888 GList *attachments, *node;
890 TnyHeaderFlags flags;
891 gboolean nested_attachments = FALSE;
892 gboolean selected_messages = FALSE;
893 gboolean result = FALSE;
895 if (MODEST_IS_MAIN_WINDOW (win)) {
896 flags = TNY_HEADER_FLAG_ATTACHMENTS;
898 result = _selected_msg_marked_as (win, flags, TRUE);
901 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
903 /* Get selected atachments */
904 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
905 n_selected = g_list_length (attachments);
906 for (node = attachments; node != NULL; node = g_list_next (node)) {
907 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
908 TnyList *nested_list = tny_simple_list_new ();
909 if (!tny_mime_part_is_attachment (mime_part)) {
910 selected_messages = TRUE;
913 tny_mime_part_get_parts (mime_part, nested_list);
914 if (tny_list_get_length (nested_list) > 0)
915 nested_attachments = TRUE;
916 g_object_unref (nested_list);
921 result = n_selected != 1;
924 result = n_selected == 1;
926 /* Set notifications */
927 if (!result && rule != NULL) {
928 if (selected_messages) {
929 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
930 } else if (nested_attachments) {
931 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
932 } else if (n_selected == 0) {
933 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
938 g_list_free (attachments);
945 _invalid_msg_selected (ModestMainWindow *win,
947 ModestDimmingRule *rule)
949 GtkWidget *header_view = NULL;
950 GtkWidget *folder_view = NULL;
951 TnyList *selected_headers = NULL;
952 gboolean result = FALSE;
954 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
955 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
957 /* Get header view to check selected messages */
958 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
959 MODEST_WIDGET_TYPE_HEADER_VIEW);
961 /* Get folder view to check focus */
962 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
963 MODEST_WIDGET_TYPE_FOLDER_VIEW);
965 /* Get selected headers */
966 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
968 /* Check dimmed rule (TODO: check focus on widgets */
970 result = (selected_headers == NULL);
971 /* result = ((selected_headers == NULL) || */
972 /* (GTK_WIDGET_HAS_FOCUS (folder_view))); */
974 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
976 if (!result && unique) {
977 result = tny_list_get_length (selected_headers) > 1;
979 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
983 if (selected_headers != NULL)
984 g_object_unref (selected_headers);
990 _already_opened_msg (ModestWindow *win)
992 ModestWindow *window = NULL;
993 ModestWindowMgr *mgr = NULL;
994 GtkWidget *header_view = NULL;
995 TnyList *selected_headers = NULL;
996 TnyIterator *iter = NULL;
997 TnyHeader *header = NULL;
998 gboolean result = TRUE;
1000 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1002 /* Get header view to check selected messages */
1003 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1004 MODEST_WIDGET_TYPE_HEADER_VIEW);
1006 /* Get selected headers */
1007 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1008 if (selected_headers == NULL)
1011 /* Check dimmed rule (TODO: check focus on widgets */
1012 mgr = modest_runtime_get_window_mgr ();
1013 iter = tny_list_create_iterator (selected_headers);
1014 while (!tny_iterator_is_done (iter) && result) {
1015 header = TNY_HEADER (tny_iterator_get_current (iter));
1016 window = modest_window_mgr_find_window_by_header (mgr, header);
1017 result = result && (window != NULL);
1019 g_object_unref (header);
1020 tny_iterator_next (iter);
1024 if (selected_headers != NULL)
1025 g_object_unref (selected_headers);
1027 g_object_unref (iter);
1033 _selected_msg_marked_as (ModestWindow *win,
1034 TnyHeaderFlags mask,
1037 GtkWidget *header_view = NULL;
1038 TnyList *selected_headers = NULL;
1039 TnyIterator *iter = NULL;
1040 TnyHeader *header = NULL;
1041 TnyHeaderFlags flags;
1042 gboolean result = FALSE;
1044 /* Get header view to check selected messages */
1045 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1046 MODEST_WIDGET_TYPE_HEADER_VIEW);
1048 /* Get selected headers */
1049 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1050 if (selected_headers == NULL)
1053 /* Call the function for each header */
1054 iter = tny_list_create_iterator (selected_headers);
1055 while (!tny_iterator_is_done (iter) && !result) {
1056 header = TNY_HEADER (tny_iterator_get_current (iter));
1058 flags = tny_header_get_flags (header);
1060 result = (flags & mask) == 0;
1062 result = (flags & mask) != 0;
1064 g_object_unref (header);
1065 tny_iterator_next (iter);
1069 if (selected_headers != NULL)
1070 g_object_unref (selected_headers);
1072 g_object_unref (iter);
1078 _msg_download_in_progress (ModestMsgViewWindow *win)
1080 gboolean result = FALSE;
1082 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1084 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1090 _msg_download_completed (ModestMainWindow *win)
1092 GtkWidget *header_view = NULL;
1093 TnyList *selected_headers = NULL;
1094 TnyIterator *iter = NULL;
1095 TnyHeader *header = NULL;
1096 TnyHeaderFlags flags;
1097 gboolean result = FALSE;
1099 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1102 /* Get header view to check selected messages */
1103 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1104 MODEST_WIDGET_TYPE_HEADER_VIEW);
1106 /* Get selected headers */
1107 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1108 if (selected_headers == NULL)
1111 /* Check dimmed rule */
1113 iter = tny_list_create_iterator (selected_headers);
1114 while (!tny_iterator_is_done (iter) && result) {
1115 header = TNY_HEADER (tny_iterator_get_current (iter));
1117 flags = tny_header_get_flags (header);
1118 /* TODO: is this the right flag?, it seems that some
1119 headers that have been previously downloaded do not
1121 result = (flags & TNY_HEADER_FLAG_CACHED);
1123 g_object_unref (header);
1124 tny_iterator_next (iter);
1127 g_object_unref (iter);
1133 _msg_sent_in_progress (ModestWindow *win)
1135 /* ModestTnySendQueue *send_queue = NULL; */
1136 /* GtkWidget *header_view = NULL; */
1137 /* ModestTnyAccountStore *acc_store = NULL; */
1138 /* TnyAccount *account = NULL; */
1139 /* TnyList *header_list = NULL; */
1140 /* TnyIterator *iter = NULL; */
1141 /* TnyHeader *header = NULL; */
1142 /* const gchar *account_name = NULL; */
1143 gboolean result = FALSE;
1144 /* gchar *id = NULL; */
1146 /* g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE); */
1148 /* /\* Get transport account *\/ */
1149 /* acc_store = modest_runtime_get_account_store(); */
1150 /* account_name = modest_window_get_active_account (win); */
1151 /* account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); */
1153 /* /\* Get send queue for current ransport account *\/ */
1154 /* send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); */
1155 /* g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); */
1157 /* if (MODEST_IS_MAIN_WINDOW(win)) { */
1159 /* /\* Get header view to check selected messages *\/ */
1160 /* header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), */
1161 /* MODEST_WIDGET_TYPE_HEADER_VIEW); */
1163 /* /\* Get selected headers *\/ */
1164 /* header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view)); */
1166 /* /\* Get message header *\/ */
1167 /* if (!header_list) return FALSE; */
1168 /* iter = tny_list_create_iterator (header_list); */
1169 /* header = TNY_HEADER (tny_iterator_get_current (iter)); */
1171 /* /\* Get message id *\/ */
1172 /* id = g_strdup(tny_header_get_message_id (header)); */
1174 /* } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { */
1176 /* /\* Get message header *\/ */
1177 /* header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win)); */
1179 /* /\* Get message id *\/ */
1180 /* id = g_strdup(tny_header_get_message_id (header)); */
1183 /* /\* Check if msg id is being processed inside send queue *\/ */
1184 /* result = modest_tny_send_queue_msg_is_being_sent (send_queue, id); */
1188 /* g_object_unref (header); */
1189 /* g_free(header_list); */