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 (
96 TNY_ACCOUNT (parent_folder)))
99 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
100 /* If it's POP then dim */
101 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
102 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
105 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
107 TnyFolderType types[3];
109 types[0] = TNY_FOLDER_TYPE_DRAFTS;
110 types[1] = TNY_FOLDER_TYPE_OUTBOX;
111 types[2] = TNY_FOLDER_TYPE_SENT;
113 /* Apply folder rules */
115 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
117 dimmed = _selected_folder_is_any_of_type (win, types, 3);
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_MAIN_WINDOW (win), FALSE);
292 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
293 rule = MODEST_DIMMING_RULE (user_data);
295 /* Check dimmed rule */
296 if (MODEST_IS_MAIN_WINDOW (win)) {
298 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
300 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_del"));
303 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
305 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
308 dimmed = _already_opened_msg (win);
310 modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages"));
313 dimmed = _marked_as_deleted (win);
315 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
318 dimmed = _selected_msg_sent_in_progress (win);
320 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
323 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
325 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
333 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
335 gboolean dimmed = FALSE;
336 GtkWidget *header_view = NULL;
338 /* main window dimming rules */
339 if (MODEST_IS_MAIN_WINDOW(win)) {
341 /* Check dimmed rule */
342 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
343 MODEST_WIDGET_TYPE_HEADER_VIEW);
345 /* If the header view does not have the focus then do
346 not apply msg dimming rules because the action will
347 show the folder details that have no dimming
349 if (gtk_widget_is_focus (header_view)) {
350 /* Check dimmed rule */
352 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
355 /* msg view window dimming rules */
358 /* Check dimmed rule */
360 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
368 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
370 gboolean dimmed = FALSE;
371 TnyHeaderFlags flags;
373 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
375 flags = TNY_HEADER_FLAG_SEEN;
377 /* Check dimmed rule */
379 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
381 dimmed = _selected_msg_marked_as (win, flags, FALSE);
387 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
389 gboolean dimmed = FALSE;
390 TnyHeaderFlags flags;
392 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
394 flags = TNY_HEADER_FLAG_SEEN;
396 /* Check dimmed rule */
398 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
400 dimmed = _selected_msg_marked_as (win, flags, TRUE);
406 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
408 gboolean dimmed = FALSE;
410 if (MODEST_IS_MAIN_WINDOW (win))
411 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
412 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
413 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
420 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
422 GtkWidget *folder_view = NULL;
423 GtkWidget *header_view = NULL;
424 gboolean dimmed = FALSE;
426 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
428 /* Get the folder view */
429 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
430 MODEST_WIDGET_TYPE_FOLDER_VIEW);
432 /* Get header view */
433 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
434 MODEST_WIDGET_TYPE_HEADER_VIEW);
436 /* Check common diming rules */
438 /* Check diming rules for folder transfer */
439 if (gtk_widget_is_focus (folder_view)) {
441 dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win));
443 /* Check diming rules for msg transfer */
444 else if (gtk_widget_is_focus (header_view)) {
446 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
454 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
456 gboolean dimmed = FALSE;
458 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
460 /* Check dimmed rule */
462 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
468 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
470 TnyFolderType types[3];
471 gboolean dimmed = FALSE;
473 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
475 types[0] = TNY_FOLDER_TYPE_DRAFTS;
476 types[1] = TNY_FOLDER_TYPE_OUTBOX;
477 types[2] = TNY_FOLDER_TYPE_SENT;
479 /* Check dimmed rule */
481 dimmed = _selected_folder_is_any_of_type (win, types, 3);
487 modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data)
489 TnyFolderType types[5];
490 gboolean dimmed = FALSE;
492 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
494 types[0] = TNY_FOLDER_TYPE_DRAFTS;
495 types[1] = TNY_FOLDER_TYPE_OUTBOX;
496 types[2] = TNY_FOLDER_TYPE_SENT;
497 types[3] = TNY_FOLDER_TYPE_INBOX;
498 types[4] = TNY_FOLDER_TYPE_ROOT;
500 /* Check dimmed rule */
502 dimmed = _selected_folder_is_any_of_type (win, types, 5);
508 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
510 gboolean dimmed = FALSE;
512 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
514 /* Check dimmed rule */
516 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
522 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
524 ModestDimmingRule *rule = NULL;
525 gboolean dimmed = FALSE;
527 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
528 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
529 rule = MODEST_DIMMING_RULE (user_data);
531 /* Check dimmed rule */
533 dimmed = _invalid_attach_selected (win, TRUE, rule);
539 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
541 ModestDimmingRule *rule = NULL;
542 gboolean dimmed = FALSE;
544 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
545 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
546 rule = MODEST_DIMMING_RULE (user_data);
548 /* Check dimmed rule */
550 dimmed = _invalid_attach_selected (win, FALSE, rule);
556 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
558 ModestDimmingRule *rule = NULL;
559 gboolean dimmed = FALSE;
561 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
562 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
563 rule = MODEST_DIMMING_RULE (user_data);
565 /* Check dimmed rule */
567 dimmed = _invalid_attach_selected (win, FALSE, NULL);
568 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
575 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
577 gboolean dimmed = FALSE;
579 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
581 /* Check dimmed rule */
583 dimmed = _invalid_clipboard_selected (MODEST_MSG_VIEW_WINDOW(win));
589 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
591 gboolean dimmed = FALSE;
593 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
595 /* Check dimmed rule */
597 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
603 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
605 gboolean dimmed = FALSE;
607 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
609 /* Check dimmed rule */
611 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
618 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
620 const gboolean dimmed =
621 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
628 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
630 gboolean dimmed = FALSE;
632 /* Check dimmed rule */
634 dimmed = !_sending_in_progress (win);
640 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
642 ModestDimmingRule *rule = NULL;
643 gboolean dimmed = FALSE;
645 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
646 rule = MODEST_DIMMING_RULE (user_data);
648 /* Check dimmed rule */
650 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
652 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
658 /* *********************** static utility functions ******************** */
661 _marked_as_deleted (ModestWindow *win)
663 gboolean result = FALSE;
664 TnyHeaderFlags flags;
666 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
668 flags = TNY_HEADER_FLAG_DELETED;
670 /* Check dimmed rule */
671 result = _selected_msg_marked_as (win, flags, FALSE);
677 _selected_folder_not_writeable (ModestMainWindow *win)
679 GtkWidget *folder_view = NULL;
680 TnyFolderStore *parent_folder = NULL;
681 ModestTnyFolderRules rules;
682 gboolean result = FALSE;
684 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
686 /* Get folder view */
687 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
688 MODEST_WIDGET_TYPE_FOLDER_VIEW);
689 /* If no folder view, always dimmed */
693 /* Get selected folder as parent of new folder to create */
694 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
695 if (!(parent_folder && TNY_IS_FOLDER(parent_folder)))
698 /* Check dimmed rule */
699 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
700 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
703 g_object_unref (parent_folder);
709 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
711 TnyFolderType types[2];
712 gboolean result = FALSE;
714 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
716 types[0] = TNY_FOLDER_TYPE_ROOT;
717 types[1] = TNY_FOLDER_TYPE_INBOX;
719 /* Check folder type */
720 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
722 /* Check pop and MMC accounts */
724 result = _selected_folder_is_MMC_or_POP_root (win);
732 _selected_folder_is_root (ModestMainWindow *win)
734 TnyFolderType types[1];
735 gboolean result = FALSE;
737 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
739 types[0] = TNY_FOLDER_TYPE_ROOT;
741 /* Check folder type */
742 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
744 /* Check pop and MMC accounts */
746 result = _selected_folder_is_MMC_or_POP_root (win);
753 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
755 GtkWidget *folder_view = NULL;
756 TnyFolderStore *parent_folder = NULL;
757 gboolean result = FALSE;
759 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
760 MODEST_WIDGET_TYPE_FOLDER_VIEW);
761 /* Get selected folder as parent of new folder to create */
762 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
766 if (TNY_IS_ACCOUNT (parent_folder)) {
767 /* If it's the local account then do not dim */
768 if (modest_tny_account_is_virtual_local_folders (
769 TNY_ACCOUNT (parent_folder)))
772 /* If it's the MMC root folder then dim it */
773 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
776 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
777 /* If it's POP then dim */
778 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
779 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
791 _selected_folder_is_empty (ModestMainWindow *win)
793 GtkWidget *folder_view = NULL;
794 TnyFolderStore *folder = NULL;
795 gboolean result = FALSE;
797 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
799 /* Get folder view */
800 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
801 MODEST_WIDGET_TYPE_FOLDER_VIEW);
802 /* If no folder view, always dimmed */
806 /* Get selected folder as parent of new folder to create */
807 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
808 if (!(folder && TNY_IS_FOLDER(folder)))
811 /* Check folder type */
812 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
815 g_object_unref (folder);
821 _selected_folder_is_any_of_type (ModestWindow *win,
822 TnyFolderType types[],
825 GtkWidget *folder_view = NULL;
826 TnyFolderStore *folder = NULL;
827 TnyFolderType folder_type;
829 gboolean result = FALSE;
831 /*Get curent folder */
832 if (MODEST_IS_MAIN_WINDOW(win)) {
834 /* Get folder view */
835 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
836 MODEST_WIDGET_TYPE_FOLDER_VIEW);
837 /* If no folder view, always dimmed */
841 /* Get selected folder as parent of new folder to create */
842 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
844 if (!(folder && TNY_IS_FOLDER(folder)))
847 /* Check folder type */
848 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
850 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
851 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
852 for (i=0; i < ntypes; i++) {
853 result = result || folder_type == types[i];
859 g_object_unref (folder);
865 _folder_is_any_of_type (TnyFolder *folder,
866 TnyFolderType types[],
869 TnyFolderType folder_type;
870 gboolean result = FALSE;
873 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
875 /* Get folder type */
876 if (modest_tny_folder_is_local_folder (folder))
877 folder_type = modest_tny_folder_get_local_folder_type (folder);
879 folder_type = modest_tny_folder_guess_folder_type (folder);
881 /* Check foler type */
882 for (i=0; i < ntypes; i++) {
883 result = result || folder_type == types[i];
892 _invalid_clipboard_selected (ModestMsgViewWindow *win)
894 GtkClipboard *clipboard = NULL;
895 gchar *selection = NULL;
896 GtkWidget *focused = NULL;
897 gboolean result = FALSE;
899 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), TRUE);
901 /* Get clipboard selection*/
902 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
903 selection = gtk_clipboard_wait_for_text (clipboard);
905 /* Get focuesed widget */
906 focused = gtk_window_get_focus (GTK_WINDOW (win));
909 result = ((selection == NULL) ||
910 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
916 _invalid_attach_selected (ModestWindow *win,
918 ModestDimmingRule *rule)
920 GList *attachments, *node;
922 TnyHeaderFlags flags;
923 gboolean nested_attachments = FALSE;
924 gboolean selected_messages = FALSE;
925 gboolean result = FALSE;
927 if (MODEST_IS_MAIN_WINDOW (win)) {
928 flags = TNY_HEADER_FLAG_ATTACHMENTS;
930 result = _selected_msg_marked_as (win, flags, TRUE);
933 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
935 /* Get selected atachments */
936 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
937 n_selected = g_list_length (attachments);
938 for (node = attachments; node != NULL; node = g_list_next (node)) {
939 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
940 TnyList *nested_list = tny_simple_list_new ();
941 if (!tny_mime_part_is_attachment (mime_part)) {
942 selected_messages = TRUE;
945 tny_mime_part_get_parts (mime_part, nested_list);
946 if (tny_list_get_length (nested_list) > 0)
947 nested_attachments = TRUE;
948 g_object_unref (nested_list);
953 result = n_selected != 1;
956 result = n_selected == 1;
958 /* Set notifications */
959 if (!result && rule != NULL) {
960 if (selected_messages) {
961 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
962 } else if (nested_attachments) {
963 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
964 } else if (n_selected == 0) {
965 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
970 g_list_free (attachments);
977 _invalid_msg_selected (ModestMainWindow *win,
979 ModestDimmingRule *rule)
981 GtkWidget *header_view = NULL;
982 GtkWidget *folder_view = NULL;
983 TnyList *selected_headers = NULL;
984 gboolean result = FALSE;
986 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
987 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
989 /* Get header view to check selected messages */
990 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
991 MODEST_WIDGET_TYPE_HEADER_VIEW);
993 /* Get folder view to check focus */
994 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
995 MODEST_WIDGET_TYPE_FOLDER_VIEW);
997 /* Get selected headers */
998 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1000 /* Check dimmed rule (TODO: check focus on widgets */
1002 result = (selected_headers == NULL);
1003 /* result = ((selected_headers == NULL) || */
1004 /* (GTK_WIDGET_HAS_FOCUS (folder_view))); */
1006 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1008 if (!result && unique) {
1009 result = tny_list_get_length (selected_headers) > 1;
1011 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1015 if (selected_headers != NULL)
1016 g_object_unref (selected_headers);
1022 _already_opened_msg (ModestWindow *win)
1024 ModestWindow *window = NULL;
1025 ModestWindowMgr *mgr = NULL;
1026 GtkWidget *header_view = NULL;
1027 TnyList *selected_headers = NULL;
1028 TnyIterator *iter = NULL;
1029 TnyHeader *header = NULL;
1030 gboolean result = TRUE;
1032 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1034 /* Get header view to check selected messages */
1035 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1036 MODEST_WIDGET_TYPE_HEADER_VIEW);
1038 /* Get selected headers */
1039 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1040 if (selected_headers == NULL)
1043 /* Check dimmed rule (TODO: check focus on widgets */
1044 mgr = modest_runtime_get_window_mgr ();
1045 iter = tny_list_create_iterator (selected_headers);
1046 while (!tny_iterator_is_done (iter) && result) {
1047 header = TNY_HEADER (tny_iterator_get_current (iter));
1048 window = modest_window_mgr_find_window_by_header (mgr, header);
1049 result = result && (window != NULL);
1051 g_object_unref (header);
1052 tny_iterator_next (iter);
1056 if (selected_headers != NULL)
1057 g_object_unref (selected_headers);
1059 g_object_unref (iter);
1065 _selected_msg_marked_as (ModestWindow *win,
1066 TnyHeaderFlags mask,
1069 GtkWidget *header_view = NULL;
1070 TnyList *selected_headers = NULL;
1071 TnyIterator *iter = NULL;
1072 TnyHeader *header = NULL;
1073 TnyHeaderFlags flags;
1074 gboolean result = FALSE;
1076 /* Get header view to check selected messages */
1077 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1078 MODEST_WIDGET_TYPE_HEADER_VIEW);
1080 /* Get selected headers */
1081 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1082 if (selected_headers == NULL)
1085 /* Call the function for each header */
1086 iter = tny_list_create_iterator (selected_headers);
1087 while (!tny_iterator_is_done (iter) && !result) {
1088 header = TNY_HEADER (tny_iterator_get_current (iter));
1090 flags = tny_header_get_flags (header);
1092 result = (flags & mask) == 0;
1094 result = (flags & mask) != 0;
1096 g_object_unref (header);
1097 tny_iterator_next (iter);
1101 if (selected_headers != NULL)
1102 g_object_unref (selected_headers);
1104 g_object_unref (iter);
1110 _msg_download_in_progress (ModestMsgViewWindow *win)
1112 gboolean result = FALSE;
1114 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1116 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1122 _msg_download_completed (ModestMainWindow *win)
1124 GtkWidget *header_view = NULL;
1125 TnyList *selected_headers = NULL;
1126 TnyIterator *iter = NULL;
1127 TnyHeader *header = NULL;
1128 TnyHeaderFlags flags;
1129 gboolean result = FALSE;
1131 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1134 /* Get header view to check selected messages */
1135 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1136 MODEST_WIDGET_TYPE_HEADER_VIEW);
1138 /* Get selected headers */
1139 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1140 if (selected_headers == NULL)
1143 /* Check dimmed rule */
1145 iter = tny_list_create_iterator (selected_headers);
1146 while (!tny_iterator_is_done (iter) && result) {
1147 header = TNY_HEADER (tny_iterator_get_current (iter));
1149 flags = tny_header_get_flags (header);
1150 /* TODO: is this the right flag?, it seems that some
1151 headers that have been previously downloaded do not
1153 result = (flags & TNY_HEADER_FLAG_CACHED);
1155 g_object_unref (header);
1156 tny_iterator_next (iter);
1159 g_object_unref (iter);
1165 _selected_msg_sent_in_progress (ModestWindow *win)
1167 ModestTnySendQueue *send_queue = NULL;
1168 GtkWidget *header_view = NULL;
1169 ModestTnyAccountStore *acc_store = NULL;
1170 TnyAccount *account = NULL;
1171 TnyList *header_list = NULL;
1172 TnyIterator *iter = NULL;
1173 TnyHeader *header = NULL;
1174 const gchar *account_name = NULL;
1175 gboolean result = FALSE;
1178 /* Get transport account */
1179 acc_store = modest_runtime_get_account_store();
1180 account_name = modest_window_get_active_account (win);
1182 /* If no account defined, this action must be always dimmed */
1183 if (account_name == NULL) return FALSE;
1184 account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1185 if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1187 /* Get send queue for current ransport account */
1188 send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1189 g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1191 if (MODEST_IS_MAIN_WINDOW(win)) {
1193 /* Get header view to check selected messages */
1194 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1195 MODEST_WIDGET_TYPE_HEADER_VIEW);
1197 /* Get selected headers */
1198 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1200 /* Get message header */
1201 if (!header_list) return FALSE;
1202 iter = tny_list_create_iterator (header_list);
1203 header = TNY_HEADER (tny_iterator_get_current (iter));
1205 /* Get message id */
1206 id = g_strdup(tny_header_get_message_id (header));
1208 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1210 /* Get message header */
1211 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
1213 /* Get message id */
1214 id = g_strdup(tny_header_get_message_id (header));
1217 /* Check if msg id is being processed inside send queue */
1218 result = modest_tny_send_queue_msg_is_being_sent (send_queue, id);
1222 g_object_unref (header);
1223 g_free(header_list);
1231 _sending_in_progress (ModestWindow *win)
1233 ModestTnySendQueue *send_queue = NULL;
1234 ModestTnyAccountStore *acc_store = NULL;
1235 TnyAccount *account = NULL;
1236 const gchar *account_name = NULL;
1237 gboolean result = FALSE;
1239 /* Get transport account */
1240 acc_store = modest_runtime_get_account_store();
1241 account_name = modest_window_get_active_account (win);
1243 /* If no account defined, this action must be always dimmed */
1244 if (account_name == NULL) return FALSE;
1245 account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1246 if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1248 /* Get send queue for current ransport account */
1249 send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1250 g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1252 /* Check if send queue is perfimring any send operation */
1253 result = modest_tny_send_queue_sending_in_progress (send_queue);