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 _selected_msg_sent_in_progress (ModestWindow *win);
58 static gboolean _sending_in_progress (ModestWindow *win);
59 static gboolean _marked_as_deleted (ModestWindow *win);
63 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
65 gboolean dimmed = FALSE;
67 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
69 /* Check dimmed rule */
71 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
77 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
79 gboolean dimmed = FALSE;
80 GtkWidget *folder_view = NULL;
81 TnyFolderStore *parent_folder = NULL;
83 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
86 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
87 MODEST_WIDGET_TYPE_FOLDER_VIEW);
88 /* Get selected folder as parent of new folder to create */
89 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
93 if (TNY_IS_ACCOUNT (parent_folder)) {
94 /* If it's the local account then do not dim */
95 if (modest_tny_account_is_virtual_local_folders (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);
118 g_object_unref (parent_folder);
124 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
126 gboolean dimmed = FALSE;
127 TnyFolderType types[3];
129 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
131 types[0] = TNY_FOLDER_TYPE_DRAFTS;
132 types[1] = TNY_FOLDER_TYPE_OUTBOX;
133 types[2] = TNY_FOLDER_TYPE_SENT;
135 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
137 /* Check dimmed rule */
139 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
141 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
143 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
145 dimmed = _selected_folder_is_any_of_type (win, types, 3);
151 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
153 gboolean dimmed = FALSE;
155 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
157 /* Check dimmed rule */
159 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
166 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
168 gboolean dimmed = FALSE;
169 TnyFolderType types[3];
171 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
173 types[0] = TNY_FOLDER_TYPE_DRAFTS;
174 types[1] = TNY_FOLDER_TYPE_OUTBOX;
175 types[2] = TNY_FOLDER_TYPE_SENT;
177 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
179 /* Check dimmed rule */
181 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
183 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
185 dimmed = _selected_folder_is_any_of_type (win, types, 3);
191 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
193 ModestDimmingRule *rule = NULL;
194 gboolean dimmed = FALSE;
196 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
197 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
198 rule = MODEST_DIMMING_RULE (user_data);
200 /* Check dimmed rule */
202 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
204 dimmed = _selected_msg_sent_in_progress (win);
206 modest_dimming_rule_set_notification (rule, _("TEST"));
213 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
215 ModestDimmingRule *rule = NULL;
216 gboolean dimmed = FALSE;
217 TnyFolderType types[3];
219 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
220 rule = MODEST_DIMMING_RULE (user_data);
222 /* main window dimming rules */
223 if (MODEST_IS_MAIN_WINDOW(win)) {
225 types[0] = TNY_FOLDER_TYPE_DRAFTS;
226 types[1] = TNY_FOLDER_TYPE_OUTBOX;
227 types[2] = TNY_FOLDER_TYPE_ROOT;
229 /* Check dimmed rule */
231 dimmed = _selected_folder_is_any_of_type (win, types, 3);
233 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
236 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
238 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
241 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
243 /* msg view window dimming rules */
244 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
246 /* Check dimmed rule */
248 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
256 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
258 gboolean dimmed = FALSE;
260 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
262 /* Check dimmed rule */
264 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
266 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
272 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
274 gboolean dimmed = FALSE;
276 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
278 /* Check dimmed rule */
286 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
288 ModestDimmingRule *rule = NULL;
289 gboolean dimmed = 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 = _selected_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));
617 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
619 const gboolean dimmed =
620 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
627 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
629 gboolean dimmed = FALSE;
631 /* Check dimmed rule */
633 dimmed = !_sending_in_progress (win);
639 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
641 ModestDimmingRule *rule = NULL;
642 gboolean dimmed = FALSE;
644 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
645 rule = MODEST_DIMMING_RULE (user_data);
647 /* Check dimmed rule */
649 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
651 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
657 /* *********************** static utility functions ******************** */
660 _marked_as_deleted (ModestWindow *win)
662 gboolean result = FALSE;
663 TnyHeaderFlags flags;
665 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
667 flags = TNY_HEADER_FLAG_DELETED;
669 /* Check dimmed rule */
670 result = _selected_msg_marked_as (win, flags, FALSE);
676 _selected_folder_not_writeable (ModestMainWindow *win)
678 GtkWidget *folder_view = NULL;
679 TnyFolderStore *parent_folder = NULL;
680 ModestTnyFolderRules rules;
681 gboolean result = FALSE;
683 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
685 /* Get folder view */
686 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
687 MODEST_WIDGET_TYPE_FOLDER_VIEW);
688 /* If no folder view, always dimmed */
692 /* Get selected folder as parent of new folder to create */
693 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
694 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
696 g_object_unref (parent_folder);
700 /* Check dimmed rule */
701 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
702 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
705 g_object_unref (parent_folder);
711 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
713 TnyFolderType types[2];
714 gboolean result = FALSE;
716 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
718 types[0] = TNY_FOLDER_TYPE_ROOT;
719 types[1] = TNY_FOLDER_TYPE_INBOX;
721 /* Check folder type */
722 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
724 /* Check pop and MMC accounts */
726 result = _selected_folder_is_MMC_or_POP_root (win);
734 _selected_folder_is_root (ModestMainWindow *win)
736 TnyFolderType types[1];
737 gboolean result = FALSE;
739 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
741 types[0] = TNY_FOLDER_TYPE_ROOT;
743 /* Check folder type */
744 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
746 /* Check pop and MMC accounts */
748 result = _selected_folder_is_MMC_or_POP_root (win);
755 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
757 GtkWidget *folder_view = NULL;
758 TnyFolderStore *parent_folder = NULL;
759 gboolean result = FALSE;
761 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
762 MODEST_WIDGET_TYPE_FOLDER_VIEW);
763 /* Get selected folder as parent of new folder to create */
764 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
768 if (TNY_IS_ACCOUNT (parent_folder)) {
769 /* If it's the local account then do not dim */
770 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
773 /* If it's the MMC root folder then dim it */
774 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
777 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
778 /* If it's POP then dim */
779 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
780 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
784 g_object_unref (parent_folder);
793 _selected_folder_is_empty (ModestMainWindow *win)
795 GtkWidget *folder_view = NULL;
796 TnyFolderStore *folder = NULL;
797 gboolean result = FALSE;
799 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
801 /* Get folder view */
802 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
803 MODEST_WIDGET_TYPE_FOLDER_VIEW);
804 /* If no folder view, always dimmed */
808 /* Get selected folder as parent of new folder to create */
809 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
810 if (!(folder && TNY_IS_FOLDER(folder))) {
812 g_object_unref (folder);
816 /* Check folder type */
817 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
820 g_object_unref (folder);
826 _selected_folder_is_any_of_type (ModestWindow *win,
827 TnyFolderType types[],
830 GtkWidget *folder_view = NULL;
831 TnyFolderStore *folder = NULL;
832 TnyFolderType folder_type;
834 gboolean result = FALSE;
836 /*Get curent folder */
837 if (MODEST_IS_MAIN_WINDOW(win)) {
839 /* Get folder view */
840 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
841 MODEST_WIDGET_TYPE_FOLDER_VIEW);
842 /* If no folder view, always dimmed */
846 /* Get selected folder as parent of new folder to create */
847 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
849 if (!(folder && TNY_IS_FOLDER(folder))) {
851 g_object_unref (folder);
855 /* Check folder type */
856 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
858 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
859 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
860 for (i=0; i < ntypes; i++) {
861 result = result || folder_type == types[i];
867 g_object_unref (folder);
873 _folder_is_any_of_type (TnyFolder *folder,
874 TnyFolderType types[],
877 TnyFolderType folder_type;
878 gboolean result = FALSE;
881 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
883 /* Get folder type */
884 if (modest_tny_folder_is_local_folder (folder))
885 folder_type = modest_tny_folder_get_local_folder_type (folder);
887 folder_type = modest_tny_folder_guess_folder_type (folder);
889 /* Check foler type */
890 for (i=0; i < ntypes; i++) {
891 result = result || folder_type == types[i];
900 _invalid_clipboard_selected (ModestMsgViewWindow *win)
902 GtkClipboard *clipboard = NULL;
903 gchar *selection = NULL;
904 GtkWidget *focused = NULL;
905 gboolean result = FALSE;
907 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE);
909 /* Get clipboard selection*/
910 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
911 selection = gtk_clipboard_wait_for_text (clipboard);
913 /* Get focuesed widget */
914 focused = gtk_window_get_focus (GTK_WINDOW (win));
917 result = ((selection == NULL) ||
918 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
924 _invalid_attach_selected (ModestWindow *win,
926 ModestDimmingRule *rule)
928 GList *attachments, *node;
930 TnyHeaderFlags flags;
931 gboolean nested_attachments = FALSE;
932 gboolean selected_messages = FALSE;
933 gboolean result = FALSE;
935 if (MODEST_IS_MAIN_WINDOW (win)) {
936 flags = TNY_HEADER_FLAG_ATTACHMENTS;
938 result = _selected_msg_marked_as (win, flags, TRUE);
941 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
943 /* Get selected atachments */
944 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
945 n_selected = g_list_length (attachments);
946 for (node = attachments; node != NULL; node = g_list_next (node)) {
947 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
948 TnyList *nested_list = tny_simple_list_new ();
949 if (!tny_mime_part_is_attachment (mime_part)) {
950 selected_messages = TRUE;
953 tny_mime_part_get_parts (mime_part, nested_list);
954 if (tny_list_get_length (nested_list) > 0)
955 nested_attachments = TRUE;
956 g_object_unref (nested_list);
961 result = n_selected != 1;
964 result = n_selected < 1;
966 /* Set notifications */
967 if (!result && rule != NULL) {
968 if (selected_messages) {
969 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
970 } else if (nested_attachments) {
971 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
972 } else if (n_selected == 0) {
973 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
978 g_list_free (attachments);
985 _invalid_msg_selected (ModestMainWindow *win,
987 ModestDimmingRule *rule)
989 GtkWidget *header_view = NULL;
990 GtkWidget *folder_view = NULL;
991 TnyList *selected_headers = NULL;
992 gboolean result = FALSE;
994 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
995 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
997 /* Get header view to check selected messages */
998 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
999 MODEST_WIDGET_TYPE_HEADER_VIEW);
1001 /* Get folder view to check focus */
1002 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1003 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1005 /* Get selected headers */
1006 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1008 /* Check dimmed rule (TODO: check focus on widgets */
1010 result = (selected_headers == NULL);
1011 /* result = ((selected_headers == NULL) || */
1012 /* (GTK_WIDGET_HAS_FOCUS (folder_view))); */
1014 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1016 if (!result && unique) {
1017 result = tny_list_get_length (selected_headers) > 1;
1019 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1023 if (selected_headers != NULL)
1024 g_object_unref (selected_headers);
1030 _already_opened_msg (ModestWindow *win)
1032 ModestWindow *window = NULL;
1033 ModestWindowMgr *mgr = NULL;
1034 GtkWidget *header_view = NULL;
1035 TnyList *selected_headers = NULL;
1036 TnyIterator *iter = NULL;
1037 TnyHeader *header = NULL;
1038 gboolean result = TRUE;
1040 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1042 /* Get header view to check selected messages */
1043 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1044 MODEST_WIDGET_TYPE_HEADER_VIEW);
1046 /* Get selected headers */
1047 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1048 if (selected_headers == NULL)
1051 /* Check dimmed rule (TODO: check focus on widgets */
1052 mgr = modest_runtime_get_window_mgr ();
1053 iter = tny_list_create_iterator (selected_headers);
1054 while (!tny_iterator_is_done (iter) && result) {
1055 header = TNY_HEADER (tny_iterator_get_current (iter));
1056 window = modest_window_mgr_find_window_by_header (mgr, header);
1057 result = result && (window != NULL);
1059 g_object_unref (header);
1060 tny_iterator_next (iter);
1064 if (selected_headers != NULL)
1065 g_object_unref (selected_headers);
1067 g_object_unref (iter);
1073 _selected_msg_marked_as (ModestWindow *win,
1074 TnyHeaderFlags mask,
1077 GtkWidget *header_view = NULL;
1078 TnyList *selected_headers = NULL;
1079 TnyIterator *iter = NULL;
1080 TnyHeader *header = NULL;
1081 TnyHeaderFlags flags;
1082 gboolean result = FALSE;
1084 /* Get header view to check selected messages */
1085 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1086 MODEST_WIDGET_TYPE_HEADER_VIEW);
1088 /* Get selected headers */
1089 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1090 if (selected_headers == NULL)
1093 /* Call the function for each header */
1094 iter = tny_list_create_iterator (selected_headers);
1095 while (!tny_iterator_is_done (iter) && !result) {
1096 header = TNY_HEADER (tny_iterator_get_current (iter));
1098 flags = tny_header_get_flags (header);
1100 result = (flags & mask) == 0;
1102 result = (flags & mask) != 0;
1104 g_object_unref (header);
1105 tny_iterator_next (iter);
1109 if (selected_headers != NULL)
1110 g_object_unref (selected_headers);
1112 g_object_unref (iter);
1118 _msg_download_in_progress (ModestMsgViewWindow *win)
1120 gboolean result = FALSE;
1122 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1124 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1130 _msg_download_completed (ModestMainWindow *win)
1132 GtkWidget *header_view = NULL;
1133 TnyList *selected_headers = NULL;
1134 TnyIterator *iter = NULL;
1135 TnyHeader *header = NULL;
1136 TnyHeaderFlags flags;
1137 gboolean result = FALSE;
1139 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1142 /* Get header view to check selected messages */
1143 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1144 MODEST_WIDGET_TYPE_HEADER_VIEW);
1146 /* Get selected headers */
1147 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1148 if (selected_headers == NULL)
1151 /* Check dimmed rule */
1153 iter = tny_list_create_iterator (selected_headers);
1154 while (!tny_iterator_is_done (iter) && result) {
1155 header = TNY_HEADER (tny_iterator_get_current (iter));
1157 flags = tny_header_get_flags (header);
1158 /* TODO: is this the right flag?, it seems that some
1159 headers that have been previously downloaded do not
1161 result = (flags & TNY_HEADER_FLAG_CACHED);
1163 g_object_unref (header);
1164 tny_iterator_next (iter);
1167 g_object_unref (iter);
1173 _selected_msg_sent_in_progress (ModestWindow *win)
1175 ModestTnySendQueue *send_queue = NULL;
1176 GtkWidget *header_view = NULL;
1177 ModestTnyAccountStore *acc_store = NULL;
1178 TnyAccount *account = NULL;
1179 TnyList *header_list = NULL;
1180 TnyIterator *iter = NULL;
1181 TnyHeader *header = NULL;
1182 const gchar *account_name = NULL;
1183 gboolean result = FALSE;
1186 /* Get transport account */
1187 acc_store = modest_runtime_get_account_store();
1188 account_name = modest_window_get_active_account (win);
1190 /* If no account defined, this action must be always dimmed */
1191 if (account_name == NULL) return FALSE;
1192 account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1193 if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1195 /* Get send queue for current ransport account */
1196 send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1197 g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1199 if (MODEST_IS_MAIN_WINDOW(win)) {
1201 /* Get header view to check selected messages */
1202 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1203 MODEST_WIDGET_TYPE_HEADER_VIEW);
1205 /* Get selected headers */
1206 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1208 /* Get message header */
1209 if (!header_list) return FALSE;
1210 iter = tny_list_create_iterator (header_list);
1211 header = TNY_HEADER (tny_iterator_get_current (iter));
1213 /* Get message id */
1214 id = g_strdup(tny_header_get_message_id (header));
1216 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1218 /* Get message header */
1219 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
1221 /* Get message id */
1222 id = g_strdup(tny_header_get_message_id (header));
1225 /* Check if msg id is being processed inside send queue */
1226 result = (modest_tny_send_queue_get_msg_status (send_queue, tny_header_get_message_id(header)) == MODEST_TNY_SEND_QUEUE_SENDING);
1230 g_object_unref (header);
1231 g_object_unref(header_list);
1232 g_object_unref(iter);
1239 _sending_in_progress (ModestWindow *win)
1241 ModestTnySendQueue *send_queue = NULL;
1242 ModestTnyAccountStore *acc_store = NULL;
1243 TnyAccount *account = NULL;
1244 const gchar *account_name = NULL;
1245 gboolean result = FALSE;
1247 /* Get transport account */
1248 acc_store = modest_runtime_get_account_store();
1249 account_name = modest_window_get_active_account (win);
1251 /* If no account defined, this action must be always dimmed */
1252 if (account_name == NULL) return FALSE;
1253 account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1254 if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1256 /* Get send queue for current ransport account */
1257 send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1258 g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1260 /* Check if send queue is perfimring any send operation */
1261 result = modest_tny_send_queue_sending_in_progress (send_queue);