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 "modest-text-utils.h"
39 #include <widgets/modest-attachments-view.h>
40 #include <modest-runtime.h>
41 #include <tny-simple-list.h>
44 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
45 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
46 static gboolean _invalid_attach_selected (ModestWindow *win, gboolean unique, gboolean for_view, ModestDimmingRule *rule);
47 static gboolean _purged_attach_selected (ModestWindow *win);
48 static gboolean _clipboard_is_empty (ModestWindow *win);
49 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
50 static gboolean _already_opened_msg (ModestWindow *win, guint *n_messages);
51 static gboolean _selected_msg_marked_as (ModestWindow *win, TnyHeaderFlags mask, gboolean opposite);
52 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
53 static gboolean _selected_folder_is_snd_level (ModestMainWindow *win);
54 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
55 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
56 static gboolean _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win);
57 static gboolean _selected_folder_is_root (ModestMainWindow *win);
58 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
59 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
60 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
61 static gboolean _msg_download_completed (ModestMainWindow *win);
62 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
63 static gboolean _sending_in_progress (ModestWindow *win);
64 static gboolean _marked_as_deleted (ModestWindow *win);
65 static gboolean _invalid_attachment_for_purge (ModestWindow *win, ModestDimmingRule *rule);
69 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
71 ModestDimmingRule *rule = NULL;
72 gboolean dimmed = FALSE;
74 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
75 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
76 rule = MODEST_DIMMING_RULE (user_data);
78 /* Check dimmed rule */
80 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
82 modest_dimming_rule_set_notification (rule, "");
89 modest_ui_dimming_rules_on_csm_new_folder (ModestWindow *win, gpointer user_data)
91 ModestDimmingRule *rule = NULL;
92 gboolean dimmed = FALSE;
94 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
95 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
96 rule = MODEST_DIMMING_RULE (user_data);
98 /* Check common new folder menu item dimming rules */
99 dimmed = modest_ui_dimming_rules_on_new_folder (win, user_data);
101 /* Check CSM specific dimming rules */
103 dimmed = _selected_folder_is_snd_level (MODEST_MAIN_WINDOW(win));
105 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
112 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
114 ModestDimmingRule *rule = NULL;
115 GtkWidget *folder_view = NULL;
116 TnyFolderStore *parent_folder = NULL;
117 gboolean dimmed = FALSE;
119 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
120 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
121 rule = MODEST_DIMMING_RULE (user_data);
123 /* Get selected folder as parent of new folder to create */
124 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
125 MODEST_WIDGET_TYPE_FOLDER_VIEW);
126 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
130 if (TNY_IS_ACCOUNT (parent_folder)) {
131 /* If it's the local account then do not dim */
132 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
135 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
136 /* If it's POP then dim */
137 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
138 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
140 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
143 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
145 TnyFolderType types[3];
147 types[0] = TNY_FOLDER_TYPE_DRAFTS;
148 types[1] = TNY_FOLDER_TYPE_OUTBOX;
149 types[2] = TNY_FOLDER_TYPE_SENT;
151 /* Apply folder rules */
153 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
155 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
158 dimmed = _selected_folder_is_any_of_type (win, types, 3);
160 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
163 g_object_unref (parent_folder);
169 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
171 ModestDimmingRule *rule = NULL;
172 TnyFolderType types[5];
173 gboolean dimmed = FALSE;
175 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
176 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
177 rule = MODEST_DIMMING_RULE (user_data);
179 types[0] = TNY_FOLDER_TYPE_DRAFTS;
180 types[1] = TNY_FOLDER_TYPE_OUTBOX;
181 types[2] = TNY_FOLDER_TYPE_SENT;
182 types[3] = TNY_FOLDER_TYPE_INBOX;
183 types[4] = TNY_FOLDER_TYPE_ROOT;
186 /* Check dimmed rule */
188 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
190 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
193 dimmed = _selected_folder_is_any_of_type (win, types, 5);
195 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
198 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
200 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
203 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
205 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
212 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
214 ModestDimmingRule *rule = NULL;
215 gboolean dimmed = FALSE;
217 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
218 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
219 rule = MODEST_DIMMING_RULE (user_data);
221 /* Check dimmed rule */
223 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
225 modest_dimming_rule_set_notification (rule, "");
233 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
235 ModestDimmingRule *rule = NULL;
236 TnyFolderType types[3];
237 gboolean dimmed = FALSE;
239 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
240 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
241 rule = MODEST_DIMMING_RULE (user_data);
243 types[0] = TNY_FOLDER_TYPE_DRAFTS;
244 types[1] = TNY_FOLDER_TYPE_OUTBOX;
245 types[2] = TNY_FOLDER_TYPE_SENT;
247 /* Check dimmed rule */
249 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
251 modest_dimming_rule_set_notification (rule, "");
254 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
256 modest_dimming_rule_set_notification (rule, "");
259 dimmed = _selected_folder_is_any_of_type (win, types, 3);
261 modest_dimming_rule_set_notification (rule, "");
268 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
270 ModestDimmingRule *rule = NULL;
271 gboolean dimmed = FALSE;
273 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
274 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
275 rule = MODEST_DIMMING_RULE (user_data);
277 /* Check dimmed rule */
279 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
282 dimmed = _selected_msg_sent_in_progress (win);
284 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
291 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
293 ModestDimmingRule *rule = NULL;
294 gboolean dimmed = FALSE;
295 TnyFolderType types[3];
297 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
298 rule = MODEST_DIMMING_RULE (user_data);
300 /* main window dimming rules */
301 if (MODEST_IS_MAIN_WINDOW(win)) {
303 types[0] = TNY_FOLDER_TYPE_DRAFTS;
304 types[1] = TNY_FOLDER_TYPE_OUTBOX;
305 types[2] = TNY_FOLDER_TYPE_ROOT;
307 /* Check dimmed rule */
309 dimmed = _selected_folder_is_any_of_type (win, types, 3);
311 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
314 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
316 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
319 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
321 /* msg view window dimming rules */
322 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
324 /* Check dimmed rule */
326 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
328 modest_dimming_rule_set_notification (rule, "");
337 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
339 ModestDimmingRule *rule = NULL;
340 gboolean dimmed = FALSE;
342 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
343 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
344 rule = MODEST_DIMMING_RULE (user_data);
346 /* Check dimmed rule */
348 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
351 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
353 modest_dimming_rule_set_notification (rule, "");
360 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
362 gboolean dimmed = FALSE;
364 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
366 /* Check dimmed rule */
374 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
376 ModestDimmingRule *rule = NULL;
377 guint n_messages = 0;
378 gboolean dimmed = FALSE;
380 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
381 rule = MODEST_DIMMING_RULE (user_data);
383 /* Check dimmed rule */
384 if (MODEST_IS_MAIN_WINDOW (win)) {
386 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
388 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
391 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
394 dimmed = _already_opened_msg (win, &n_messages);
396 gchar *num = g_strdup_printf ("%d", n_messages);
397 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
398 /* modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); */
399 modest_dimming_rule_set_notification (rule, message);
405 dimmed = _marked_as_deleted (win);
407 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
410 dimmed = _selected_msg_sent_in_progress (win);
412 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
415 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
417 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
419 gchar *num = g_strdup("1");
420 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
421 /* modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); */
422 modest_dimming_rule_set_notification (rule, message);
433 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
435 ModestDimmingRule *rule = NULL;
436 GtkWidget *header_view = NULL;
437 gboolean dimmed = FALSE;
439 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
440 rule = MODEST_DIMMING_RULE (user_data);
442 /* main window dimming rules */
443 if (MODEST_IS_MAIN_WINDOW(win)) {
445 /* Check dimmed rule */
446 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
447 MODEST_WIDGET_TYPE_HEADER_VIEW);
449 /* If the header view has the focus: */
450 if (header_view && gtk_widget_is_focus (header_view)) {
451 /* Check dimmed rule */
453 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
456 /* If the folder view has the focus: */
457 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
458 MODEST_WIDGET_TYPE_FOLDER_VIEW);
459 if (folder_view && gtk_widget_is_focus (folder_view)) {
460 TnyFolderStore *folder_store
461 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
463 /* Only enable for folders, not accounts,
464 * though the UI spec is not clear about that.
465 * If we enable this for accounts then we must
466 * add code to handle them in modest_ui_actions_on_details(). */
467 if (!TNY_IS_FOLDER(folder_store)) {
469 modest_dimming_rule_set_notification (rule, "");
472 g_object_unref (folder_store);
478 /* msg view window dimming rules */
481 /* Check dimmed rule */
483 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
485 modest_dimming_rule_set_notification (rule, "");
494 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
496 ModestDimmingRule *rule = NULL;
497 TnyHeaderFlags flags;
498 gboolean dimmed = FALSE;
500 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
501 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
502 rule = MODEST_DIMMING_RULE (user_data);
504 flags = TNY_HEADER_FLAG_SEEN;
506 /* Check dimmed rule */
508 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
511 dimmed = _selected_msg_marked_as (win, flags, FALSE);
513 modest_dimming_rule_set_notification (rule, "");
520 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
522 ModestDimmingRule *rule = NULL;
523 TnyHeaderFlags flags;
524 gboolean dimmed = FALSE;
526 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
527 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
528 rule = MODEST_DIMMING_RULE (user_data);
530 flags = TNY_HEADER_FLAG_SEEN;
532 /* Check dimmed rule */
534 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
536 dimmed = _selected_msg_marked_as (win, flags, TRUE);
538 modest_dimming_rule_set_notification (rule, "");
545 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
547 ModestDimmingRule *rule = NULL;
548 gboolean dimmed = FALSE;
550 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
551 rule = MODEST_DIMMING_RULE (user_data);
553 if (MODEST_IS_MAIN_WINDOW (win))
554 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
555 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
556 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
563 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
565 GtkWidget *folder_view = NULL;
566 GtkWidget *header_view = NULL;
567 ModestDimmingRule *rule = NULL;
568 gboolean dimmed = FALSE;
570 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
571 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
572 rule = MODEST_DIMMING_RULE (user_data);
574 /* Get the folder view */
575 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
576 MODEST_WIDGET_TYPE_FOLDER_VIEW);
578 /* Get header view */
579 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
580 MODEST_WIDGET_TYPE_HEADER_VIEW);
582 /* Check diming rules for folders and messages transfer */
584 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
592 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
594 ModestDimmingRule *rule = NULL;
595 gboolean dimmed = FALSE;
597 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
598 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
599 rule = MODEST_DIMMING_RULE (user_data);
601 /* Check dimmed rule */
603 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
605 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
613 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
615 ModestDimmingRule *rule = NULL;
616 TnyFolderType types[3];
617 gboolean dimmed = FALSE;
619 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
620 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
621 rule = MODEST_DIMMING_RULE (user_data);
623 types[0] = TNY_FOLDER_TYPE_DRAFTS;
624 types[1] = TNY_FOLDER_TYPE_OUTBOX;
625 types[2] = TNY_FOLDER_TYPE_SENT;
627 /* Check dimmed rule */
629 dimmed = _clipboard_is_empty (win);
631 modest_dimming_rule_set_notification (rule, "");
634 dimmed = _selected_folder_is_any_of_type (win, types, 3);
636 modest_dimming_rule_set_notification (rule, _("ckct_ib_unable_to_paste_here"));
639 dimmed = _selected_folder_is_same_as_source (win);
641 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
649 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
651 ModestDimmingRule *rule = NULL;
652 gboolean dimmed = FALSE;
654 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
655 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
656 rule = MODEST_DIMMING_RULE (user_data);
658 /* Check dimmed rule */
660 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
662 modest_dimming_rule_set_notification (rule, "");
669 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
671 ModestDimmingRule *rule = NULL;
672 gboolean dimmed = FALSE;
674 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
675 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
676 rule = MODEST_DIMMING_RULE (user_data);
678 /* Check dimmed rule */
680 dimmed = _invalid_attach_selected (win, TRUE, TRUE, rule);
686 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
688 ModestDimmingRule *rule = NULL;
689 gboolean dimmed = FALSE;
691 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
692 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
693 rule = MODEST_DIMMING_RULE (user_data);
695 /* Check dimmed rule */
697 dimmed = _invalid_attach_selected (win, FALSE, FALSE, rule);
703 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
705 ModestDimmingRule *rule = NULL;
706 gboolean dimmed = FALSE;
708 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
709 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
710 rule = MODEST_DIMMING_RULE (user_data);
712 /* Check dimmed rule */
714 dimmed = _purged_attach_selected (win);
716 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
720 dimmed = _invalid_attachment_for_purge (win, rule);
728 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
730 ModestDimmingRule *rule = NULL;
731 gboolean dimmed = FALSE;
733 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
734 rule = MODEST_DIMMING_RULE (user_data);
736 /* Check dimmed rule */
738 dimmed = _clipboard_is_empty (win);
740 modest_dimming_rule_set_notification (rule, "");
747 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
749 ModestDimmingRule *rule = NULL;
750 gboolean dimmed = FALSE;
752 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
753 rule = MODEST_DIMMING_RULE (user_data);
755 /* Check common dimming rules */
757 dimmed = _invalid_clipboard_selected (win, rule);
760 /* Check window specific dimming rules */
761 if (MODEST_IS_MAIN_WINDOW (win)) {
763 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
765 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete"));
768 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
770 modest_dimming_rule_set_notification (rule, "");
773 dimmed = _selected_msg_sent_in_progress (win);
775 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
783 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
785 ModestDimmingRule *rule = NULL;
786 gboolean dimmed = FALSE;
788 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
789 rule = MODEST_DIMMING_RULE (user_data);
791 /* Check common dimming rules */
793 dimmed = _invalid_clipboard_selected (win, rule);
796 /* Check window specific dimming rules */
797 if (MODEST_IS_MAIN_WINDOW (win)) {
799 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
801 modest_dimming_rule_set_notification (rule, "");
804 dimmed = _selected_msg_sent_in_progress (win);
806 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
814 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
816 ModestDimmingRule *rule = NULL;
817 gboolean dimmed = FALSE;
819 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
820 rule = MODEST_DIMMING_RULE (user_data);
822 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
824 /* Check dimmed rule */
826 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
828 modest_dimming_rule_set_notification (rule, "");
835 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
837 ModestDimmingRule *rule = NULL;
838 gboolean dimmed = FALSE;
840 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
841 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
842 rule = MODEST_DIMMING_RULE (user_data);
844 /* Check dimmed rule */
846 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW(win));
848 modest_dimming_rule_set_notification (rule, "");
856 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
858 const gboolean dimmed =
859 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
866 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
868 gboolean dimmed = FALSE;
870 /* Check dimmed rule */
872 dimmed = !_sending_in_progress (win);
878 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
880 ModestDimmingRule *rule = NULL;
881 gboolean dimmed = FALSE;
883 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
884 rule = MODEST_DIMMING_RULE (user_data);
886 /* Check dimmed rule */
888 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
891 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
898 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
900 ModestDimmingRule *rule = NULL;
901 gboolean dimmed = FALSE;
903 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
904 rule = MODEST_DIMMING_RULE (user_data);
906 /* Check dimmed rule */
908 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
909 gchar *selection = NULL;
910 selection = gtk_clipboard_wait_for_text (clipboard);
912 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection)));
918 /* *********************** static utility functions ******************** */
921 _marked_as_deleted (ModestWindow *win)
923 gboolean result = FALSE;
924 TnyHeaderFlags flags;
926 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
928 flags = TNY_HEADER_FLAG_DELETED;
930 /* Check dimmed rule */
931 result = _selected_msg_marked_as (win, flags, FALSE);
937 _selected_folder_not_writeable (ModestMainWindow *win)
939 GtkWidget *folder_view = NULL;
940 TnyFolderStore *parent_folder = NULL;
941 ModestTnyFolderRules rules;
942 gboolean result = FALSE;
944 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
946 /* Get folder view */
947 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
948 MODEST_WIDGET_TYPE_FOLDER_VIEW);
949 /* If no folder view, always dimmed */
953 /* Get selected folder as parent of new folder to create */
954 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
955 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
957 g_object_unref (parent_folder);
961 /* Check dimmed rule */
962 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
963 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
966 g_object_unref (parent_folder);
972 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
974 TnyFolderType types[2];
975 gboolean result = FALSE;
977 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
979 types[0] = TNY_FOLDER_TYPE_ROOT;
980 types[1] = TNY_FOLDER_TYPE_INBOX;
982 /* Check folder type */
983 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
985 /* Check pop and MMC accounts */
987 result = _selected_folder_is_MMC_or_POP_root (win);
995 _selected_folder_is_root (ModestMainWindow *win)
997 TnyFolderType types[1];
998 gboolean result = FALSE;
1000 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1002 types[0] = TNY_FOLDER_TYPE_ROOT;
1004 /* Check folder type */
1005 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1007 /* Check pop and MMC accounts */
1009 result = _selected_folder_is_MMC_or_POP_root (win);
1016 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1018 GtkWidget *folder_view = NULL;
1019 TnyFolderStore *parent_folder = NULL;
1020 gboolean result = FALSE;
1022 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1023 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1024 /* Get selected folder as parent of new folder to create */
1025 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1029 if (TNY_IS_ACCOUNT (parent_folder)) {
1030 /* If it's the local account then do not dim */
1031 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1034 /* If it's the MMC root folder then dim it */
1035 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1038 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1039 /* If it's POP then dim */
1040 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
1041 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1045 g_object_unref (parent_folder);
1054 _selected_folder_is_empty (ModestMainWindow *win)
1056 GtkWidget *folder_view = NULL;
1057 TnyFolderStore *folder = NULL;
1058 gboolean result = FALSE;
1060 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1062 /* Get folder view */
1063 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1064 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1065 /* If no folder view, always dimmed */
1069 /* Get selected folder as parent of new folder to create */
1070 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1071 if (!(folder && TNY_IS_FOLDER(folder))) {
1073 g_object_unref (folder);
1077 /* Check folder type */
1078 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
1081 g_object_unref (folder);
1087 _selected_folder_is_same_as_source (ModestWindow *win)
1089 ModestEmailClipboard *clipboard = NULL;
1090 GtkWidget *folder_view = NULL;
1091 TnyFolderStore *folder = NULL;
1092 gboolean result = FALSE;
1094 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1096 /* Get folder view */
1097 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1098 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1102 /* Get selected folder as destination folder */
1103 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1104 if (!(folder && TNY_IS_FOLDER(folder))) {
1109 /* Check clipboard is cleared */
1110 clipboard = modest_runtime_get_email_clipboard ();
1111 if (modest_email_clipboard_cleared (clipboard)) {
1116 /* Check source folder */
1117 result = modest_email_clipboard_check_source_folder (clipboard,
1118 (const TnyFolder *) folder);
1122 g_object_unref (folder);
1128 _selected_folder_is_any_of_type (ModestWindow *win,
1129 TnyFolderType types[],
1132 GtkWidget *folder_view = NULL;
1133 TnyFolderStore *folder = NULL;
1134 TnyFolderType folder_type;
1136 gboolean result = FALSE;
1138 /*Get curent folder */
1139 if (MODEST_IS_MAIN_WINDOW(win)) {
1141 /* Get folder view */
1142 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1143 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1144 /* If no folder view, always dimmed */
1148 /* Get selected folder as parent of new folder to create */
1149 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1151 if (!(folder && TNY_IS_FOLDER(folder))) {
1153 g_object_unref (folder);
1157 /* Check folder type */
1158 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
1160 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1161 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1162 for (i=0; i < ntypes; i++) {
1163 result = result || folder_type == types[i];
1169 g_object_unref (folder);
1175 _folder_is_any_of_type (TnyFolder *folder,
1176 TnyFolderType types[],
1179 TnyFolderType folder_type;
1180 gboolean result = FALSE;
1183 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
1185 /* Get folder type */
1186 if (modest_tny_folder_is_local_folder (folder))
1187 folder_type = modest_tny_folder_get_local_folder_type (folder);
1189 folder_type = modest_tny_folder_guess_folder_type (folder);
1191 /* Check foler type */
1192 for (i=0; i < ntypes; i++) {
1193 result = result || folder_type == types[i];
1200 _selected_folder_is_snd_level (ModestMainWindow *win)
1202 GtkWidget *folder_view = NULL;
1203 GtkTreeSelection *sel = NULL;
1204 GtkTreeModel *model = NULL;
1205 GtkTreePath *path = NULL;
1207 TnyFolderStore *folder = NULL;
1208 gboolean result = FALSE;
1210 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1212 /*Get curent folder */
1213 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1214 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1215 /* If no folder view, always dimmed */
1219 /* Get selected folder as parent of new folder to create */
1220 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1221 if (!(folder && TNY_IS_FOLDER(folder))) {
1225 /* Check folder level */
1226 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(folder_view));
1227 if (!gtk_tree_selection_get_selected (sel, &model, &iter))
1229 path = gtk_tree_model_get_path (model, &iter);
1230 result = gtk_tree_path_get_depth (path) > 2;
1234 g_object_unref (folder);
1236 gtk_tree_path_free (path);
1243 _clipboard_is_empty (ModestWindow *win)
1245 gboolean result = FALSE;
1247 if (MODEST_IS_MAIN_WINDOW (win)) {
1248 ModestEmailClipboard *clipboard = NULL;
1249 clipboard = modest_runtime_get_email_clipboard ();
1250 if (modest_email_clipboard_cleared (clipboard))
1258 _invalid_clipboard_selected (ModestWindow *win,
1259 ModestDimmingRule *rule)
1261 gboolean result = FALSE;
1263 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1264 GtkClipboard *clipboard = NULL;
1265 gchar *selection = NULL;
1266 GtkWidget *focused = NULL;
1268 /* Get clipboard selection*/
1269 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1270 selection = gtk_clipboard_wait_for_text (clipboard);
1272 /* Get focuesed widget */
1273 focused = gtk_window_get_focus (GTK_WINDOW (win));
1276 result = ((selection == NULL) ||
1277 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
1280 modest_dimming_rule_set_notification (rule, _(""));
1282 else if (MODEST_IS_MAIN_WINDOW (win)) {
1283 GtkWidget *header_view = NULL;
1285 /* Get header view to check selected messages */
1286 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1287 MODEST_WIDGET_TYPE_HEADER_VIEW);
1290 result = !modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view));
1292 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1300 _invalid_attach_selected (ModestWindow *win,
1303 ModestDimmingRule *rule)
1305 GList *attachments, *node;
1307 TnyHeaderFlags flags;
1308 gboolean nested_attachments = FALSE;
1309 gboolean selected_messages = FALSE;
1310 gboolean result = FALSE;
1312 if (MODEST_IS_MAIN_WINDOW (win)) {
1313 flags = TNY_HEADER_FLAG_ATTACHMENTS;
1315 result = _selected_msg_marked_as (win, flags, TRUE);
1317 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1319 /* Get selected atachments */
1320 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1321 n_selected = g_list_length (attachments);
1326 result = n_selected != 1;
1329 result = n_selected < 1;
1332 /* Check attached type (view operation not required) */
1333 if (!result && !for_view) {
1334 for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
1335 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1336 TnyList *nested_list = tny_simple_list_new ();
1337 if (TNY_IS_MSG (mime_part)) {
1338 selected_messages = TRUE;
1341 tny_mime_part_get_parts (mime_part, nested_list);
1342 if (tny_list_get_length (nested_list) > 0) {
1343 nested_attachments = TRUE;
1346 g_object_unref (nested_list);
1350 /* Set notifications */
1351 if (result && rule != NULL) {
1352 if (selected_messages) {
1353 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1354 } else if (nested_attachments) {
1355 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1356 } else if (n_selected == 0) {
1357 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1358 } else if (unique) {
1359 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1364 g_list_free (attachments);
1371 _purged_attach_selected (ModestWindow *win)
1373 GList *attachments, *node;
1375 gboolean result = FALSE;
1377 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1379 /* Get selected atachments */
1380 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1381 n_selected = g_list_length (attachments);
1383 for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
1384 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1385 if (tny_mime_part_is_purged (mime_part)) {
1392 g_list_free (attachments);
1399 _invalid_msg_selected (ModestMainWindow *win,
1401 ModestDimmingRule *rule)
1403 GtkWidget *header_view = NULL;
1404 GtkWidget *folder_view = NULL;
1405 gboolean selected_headers = FALSE;
1406 gboolean result = FALSE;
1408 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1409 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
1411 /* Get header view to check selected messages */
1412 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1413 MODEST_WIDGET_TYPE_HEADER_VIEW);
1415 /* Get folder view to check focus */
1416 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1417 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1419 /* Get selected headers */
1420 selected_headers = modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view));
1422 /* Check dimmed rule (TODO: check focus on widgets */
1424 result = ((!selected_headers) ||
1425 (gtk_widget_is_focus (folder_view)));
1427 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1429 if (!result && unique) {
1430 result = modest_header_view_count_selected_headers (MODEST_HEADER_VIEW(header_view)) > 1;
1432 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1439 _already_opened_msg (ModestWindow *win,
1442 ModestWindow *window = NULL;
1443 ModestWindowMgr *mgr = NULL;
1444 GtkWidget *header_view = NULL;
1445 TnyList *selected_headers = NULL;
1446 TnyIterator *iter = NULL;
1447 TnyHeader *header = NULL;
1448 gboolean result = TRUE;
1450 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1452 /* Get header view to check selected messages */
1453 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1454 MODEST_WIDGET_TYPE_HEADER_VIEW);
1457 /* Check no selection */
1458 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1461 /* Get selected headers */
1462 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1463 if (selected_headers == NULL)
1466 *n_messages = tny_list_get_length (selected_headers);
1468 /* Check dimmed rule (TODO: check focus on widgets */
1469 mgr = modest_runtime_get_window_mgr ();
1470 iter = tny_list_create_iterator (selected_headers);
1471 while (!tny_iterator_is_done (iter) && result) {
1472 header = TNY_HEADER (tny_iterator_get_current (iter));
1473 window = modest_window_mgr_find_window_by_header (mgr, header);
1474 result = result && (window != NULL);
1476 g_object_unref (header);
1477 tny_iterator_next (iter);
1481 if (selected_headers != NULL)
1482 g_object_unref (selected_headers);
1484 g_object_unref (iter);
1490 _selected_msg_marked_as (ModestWindow *win,
1491 TnyHeaderFlags mask,
1494 GtkWidget *header_view = NULL;
1495 TnyList *selected_headers = NULL;
1496 TnyIterator *iter = NULL;
1497 TnyHeader *header = NULL;
1498 TnyHeaderFlags flags;
1499 gboolean result = FALSE;
1501 /* Get header view to check selected messages */
1502 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1503 MODEST_WIDGET_TYPE_HEADER_VIEW);
1505 /* Check no selection */
1506 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1509 /* Get selected headers */
1510 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1511 if (selected_headers == NULL)
1514 /* Call the function for each header */
1515 iter = tny_list_create_iterator (selected_headers);
1516 while (!tny_iterator_is_done (iter) && !result) {
1517 header = TNY_HEADER (tny_iterator_get_current (iter));
1519 flags = tny_header_get_flags (header);
1521 result = (flags & mask) == 0;
1523 result = (flags & mask) != 0;
1525 g_object_unref (header);
1526 tny_iterator_next (iter);
1530 if (selected_headers != NULL)
1531 g_object_unref (selected_headers);
1533 g_object_unref (iter);
1539 _msg_download_in_progress (ModestMsgViewWindow *win)
1541 gboolean result = FALSE;
1543 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1545 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1551 _msg_download_completed (ModestMainWindow *win)
1553 GtkWidget *header_view = NULL;
1554 TnyList *selected_headers = NULL;
1555 TnyIterator *iter = NULL;
1556 TnyHeader *header = NULL;
1557 TnyHeaderFlags flags;
1558 gboolean result = FALSE;
1560 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1563 /* Get header view to check selected messages */
1564 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1565 MODEST_WIDGET_TYPE_HEADER_VIEW);
1567 /* Check no selection */
1568 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1571 /* Get selected headers */
1572 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1573 if (selected_headers == NULL)
1576 /* Check dimmed rule */
1578 iter = tny_list_create_iterator (selected_headers);
1579 while (!tny_iterator_is_done (iter) && result) {
1580 header = TNY_HEADER (tny_iterator_get_current (iter));
1582 flags = tny_header_get_flags (header);
1583 /* TODO: is this the right flag?, it seems that some
1584 headers that have been previously downloaded do not
1586 result = (flags & TNY_HEADER_FLAG_CACHED);
1588 g_object_unref (header);
1589 tny_iterator_next (iter);
1592 g_object_unref (iter);
1598 _selected_msg_sent_in_progress (ModestWindow *win)
1600 ModestTnySendQueue *send_queue = NULL;
1601 GtkWidget *header_view = NULL;
1602 ModestTnyAccountStore *acc_store = NULL;
1603 TnyAccount *account = NULL;
1604 TnyList *header_list = NULL;
1605 TnyIterator *iter = NULL;
1606 TnyHeader *header = NULL;
1607 const gchar *account_name = NULL;
1608 gboolean result = FALSE;
1611 /* Get transport account */
1612 acc_store = modest_runtime_get_account_store();
1613 account_name = modest_window_get_active_account (win);
1615 /* If no account defined, this action must be always dimmed */
1616 if (account_name == NULL) return FALSE;
1617 account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1618 if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1620 /* Get send queue for current ransport account */
1621 send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1622 g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1624 if (MODEST_IS_MAIN_WINDOW(win)) {
1626 /* Get header view to check selected messages */
1627 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1628 MODEST_WIDGET_TYPE_HEADER_VIEW);
1630 /* Check no selection */
1631 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1634 /* Get selected headers */
1635 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1637 /* Get message header */
1638 if (!header_list) return FALSE;
1639 iter = tny_list_create_iterator (header_list);
1640 header = TNY_HEADER (tny_iterator_get_current (iter));
1642 /* Get message id */
1643 id = g_strdup(tny_header_get_message_id (header));
1645 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1647 /* Get message header */
1648 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
1650 /* Get message id */
1651 id = g_strdup(tny_header_get_message_id (header));
1654 /* Check if msg id is being processed inside send queue */
1655 result = modest_tny_send_queue_msg_is_being_sent (send_queue, id);
1659 g_object_unref (header);
1660 g_object_unref(header_list);
1661 g_object_unref(iter);
1668 _sending_in_progress (ModestWindow *win)
1670 ModestTnySendQueue *send_queue = NULL;
1671 ModestTnyAccountStore *acc_store = NULL;
1672 TnyAccount *account = NULL;
1673 const gchar *account_name = NULL;
1674 gboolean result = FALSE;
1676 /* Get transport account */
1677 acc_store = modest_runtime_get_account_store();
1678 account_name = modest_window_get_active_account (win);
1680 /* If no account defined, this action must be always dimmed */
1681 if (account_name == NULL) return FALSE;
1682 account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name);
1683 if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE;
1685 /* Get send queue for current ransport account */
1686 send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account));
1687 g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE);
1689 /* Check if send queue is perfimring any send operation */
1690 result = modest_tny_send_queue_sending_in_progress (send_queue);
1696 _invalid_attachment_for_purge (ModestWindow *win,
1697 ModestDimmingRule *rule)
1700 TnyFolder *folder = NULL;
1701 TnyAccount *account = NULL;
1702 gboolean result = FALSE;
1704 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1706 /* Get folder and account of message */
1707 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1708 g_return_val_if_fail(msg != NULL, TRUE);
1709 folder = tny_msg_get_folder (msg);
1710 if (folder == NULL) {
1711 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1714 account = modest_tny_folder_get_account (folder);
1715 if (account == NULL) goto frees;
1718 if (!modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
1719 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
1720 /* If it's POP then dim */
1721 if (modest_protocol_info_get_transport_store_protocol (proto_str) ==
1722 MODEST_PROTOCOL_STORE_POP) {
1726 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1727 n_selected = g_list_length (attachments);
1728 g_list_free (attachments);
1730 modest_dimming_rule_set_notification (rule,
1731 ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
1732 "mail_ib_unable_to_pure_attach_pop_mail_plural",
1740 g_object_unref (msg);
1742 g_object_unref (folder);
1743 if (account != NULL)
1744 g_object_unref (account);