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-tny-account.h"
39 #include "modest-text-utils.h"
40 #include <widgets/modest-attachments-view.h>
41 #include <modest-runtime.h>
42 #include <tny-simple-list.h>
45 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
46 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
47 static gboolean _invalid_attach_selected (ModestWindow *win,
48 gboolean unique, gboolean for_view, gboolean for_remove,
49 ModestDimmingRule *rule);
50 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
51 static gboolean _clipboard_is_empty (ModestWindow *win);
52 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
53 static gboolean _already_opened_msg (ModestWindow *win, guint *n_messages);
54 static gboolean _selected_msg_marked_as (ModestMainWindow *win, TnyHeaderFlags mask, gboolean opposite, gboolean all);
55 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
56 static gboolean _selected_folder_is_snd_level (ModestMainWindow *win);
57 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
58 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
59 static gboolean _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win);
60 static gboolean _selected_folder_is_root (ModestMainWindow *win);
61 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
62 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
63 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
64 static gboolean _msg_download_completed (ModestMainWindow *win);
65 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
66 static gboolean _sending_in_progress (ModestWindow *win);
67 static gboolean _message_is_marked_as_deleted (ModestMsgViewWindow *win);
68 static gboolean _selected_message_is_marked_as_deleted (ModestMainWindow *win);
69 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
70 static gboolean _transfer_mode_enabled (ModestWindow *win);
74 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
76 ModestDimmingRule *rule = NULL;
77 gboolean dimmed = FALSE;
79 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
80 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
81 rule = MODEST_DIMMING_RULE (user_data);
83 /* Check dimmed rule */
85 if (MODEST_IS_MSG_VIEW_WINDOW (win))
86 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
88 modest_dimming_rule_set_notification (rule, "");
95 modest_ui_dimming_rules_on_csm_new_folder (ModestWindow *win, gpointer user_data)
97 ModestDimmingRule *rule = NULL;
98 gboolean dimmed = FALSE;
100 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
101 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
102 rule = MODEST_DIMMING_RULE (user_data);
104 /* Check common new folder menu item dimming rules */
105 dimmed = modest_ui_dimming_rules_on_new_folder (win, user_data);
107 /* Check CSM specific dimming rules */
109 dimmed = _selected_folder_is_snd_level (MODEST_MAIN_WINDOW(win));
111 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
118 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
120 ModestDimmingRule *rule = NULL;
121 GtkWidget *folder_view = NULL;
122 TnyFolderStore *parent_folder = NULL;
123 gboolean dimmed = FALSE;
125 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
126 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
127 rule = MODEST_DIMMING_RULE (user_data);
129 /* Get selected folder as parent of new folder to create */
130 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
131 MODEST_WIDGET_TYPE_FOLDER_VIEW);
132 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
136 if (TNY_IS_ACCOUNT (parent_folder)) {
137 /* If it's the local account then do not dim */
138 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
141 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
142 /* If it's POP then dim */
143 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
144 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
146 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
149 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
151 TnyFolderType types[3];
153 types[0] = TNY_FOLDER_TYPE_DRAFTS;
154 types[1] = TNY_FOLDER_TYPE_OUTBOX;
155 types[2] = TNY_FOLDER_TYPE_SENT;
157 /* Apply folder rules */
159 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
161 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
164 dimmed = _selected_folder_is_any_of_type (win, types, 3);
166 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
169 g_object_unref (parent_folder);
175 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
177 ModestDimmingRule *rule = NULL;
178 GtkWidget *folder_view = NULL;
179 GtkWidget *header_view = NULL;
180 gboolean dimmed = FALSE;
182 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
183 rule = MODEST_DIMMING_RULE (user_data);
185 if (MODEST_IS_MAIN_WINDOW (win)) {
186 /* Get the folder view */
187 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
188 MODEST_WIDGET_TYPE_FOLDER_VIEW);
190 /* Get header view */
191 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
192 MODEST_WIDGET_TYPE_HEADER_VIEW);
194 if (header_view && gtk_widget_is_focus (header_view))
195 dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
197 if (folder_view && gtk_widget_is_focus (folder_view))
198 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
200 if (header_view && folder_view &&
201 !gtk_widget_is_focus (header_view) &&
202 !gtk_widget_is_focus (folder_view)) {
204 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));
207 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
216 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
218 ModestDimmingRule *rule = NULL;
219 TnyFolderType types[6];
220 gboolean dimmed = FALSE;
222 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
223 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
224 rule = MODEST_DIMMING_RULE (user_data);
226 types[0] = TNY_FOLDER_TYPE_DRAFTS;
227 types[1] = TNY_FOLDER_TYPE_OUTBOX;
228 types[2] = TNY_FOLDER_TYPE_SENT;
229 types[3] = TNY_FOLDER_TYPE_INBOX;
230 types[4] = TNY_FOLDER_TYPE_ROOT;
231 types[5] = TNY_FOLDER_TYPE_ARCHIVE;
234 /* Check dimmed rule */
236 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
238 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
241 dimmed = _selected_folder_is_any_of_type (win, types, 6);
243 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
246 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
248 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
251 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
253 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
260 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
262 ModestDimmingRule *rule = NULL;
263 gboolean dimmed = FALSE;
265 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
266 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
267 rule = MODEST_DIMMING_RULE (user_data);
269 /* Check dimmed rule */
271 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
272 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
276 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
277 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
285 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
287 ModestDimmingRule *rule = NULL;
288 TnyFolderType types[4];
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 types[0] = TNY_FOLDER_TYPE_DRAFTS;
296 types[1] = TNY_FOLDER_TYPE_OUTBOX;
297 types[2] = TNY_FOLDER_TYPE_SENT;
298 types[3] = TNY_FOLDER_TYPE_ARCHIVE;
300 /* Check dimmed rule */
302 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
304 modest_dimming_rule_set_notification (rule, "");
307 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
309 modest_dimming_rule_set_notification (rule, "");
312 dimmed = _selected_folder_is_any_of_type (win, types, 4);
314 modest_dimming_rule_set_notification (rule, "");
321 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
323 ModestDimmingRule *rule = NULL;
324 gboolean dimmed = FALSE;
326 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
327 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
328 rule = MODEST_DIMMING_RULE (user_data);
330 /* Check dimmed rule */
332 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
335 dimmed = _selected_message_is_marked_as_deleted (MODEST_MAIN_WINDOW (win));
337 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
340 dimmed = _selected_msg_sent_in_progress (win);
342 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
349 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
351 ModestDimmingRule *rule = NULL;
352 gboolean dimmed = FALSE;
353 TnyFolderType types[3];
355 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
356 rule = MODEST_DIMMING_RULE (user_data);
358 /* main window dimming rules */
359 if (MODEST_IS_MAIN_WINDOW(win)) {
361 types[0] = TNY_FOLDER_TYPE_DRAFTS;
362 types[1] = TNY_FOLDER_TYPE_OUTBOX;
363 types[2] = TNY_FOLDER_TYPE_ROOT;
365 /* Check dimmed rule */
367 dimmed = _selected_folder_is_any_of_type (win, types, 3);
369 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
372 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
374 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
377 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
379 /* msg view window dimming rules */
380 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
382 /* Check dimmed rule */
384 dimmed = _transfer_mode_enabled (win);
386 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
389 if (MODEST_IS_MSG_VIEW_WINDOW (win))
390 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
392 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
401 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
403 ModestDimmingRule *rule = NULL;
404 gboolean dimmed = FALSE;
406 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
407 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
408 rule = MODEST_DIMMING_RULE (user_data);
410 /* Check dimmed rule */
412 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
415 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
417 modest_dimming_rule_set_notification (rule, "");
424 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
426 gboolean dimmed = FALSE;
428 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
430 /* Check dimmed rule */
438 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
440 ModestDimmingRule *rule = NULL;
441 guint n_messages = 0;
442 gboolean dimmed = FALSE;
444 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
445 rule = MODEST_DIMMING_RULE (user_data);
447 /* Check dimmed rule */
448 if (MODEST_IS_MAIN_WINDOW (win)) {
450 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
452 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
455 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
458 dimmed = _already_opened_msg (win, &n_messages);
460 gchar *num = g_strdup_printf ("%d", n_messages);
461 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
462 /* modest_dimming_rule_set_notification (rule, _("mcen_nc_unable_to_delete_n_messages")); */
463 modest_dimming_rule_set_notification (rule, message);
469 dimmed = _selected_message_is_marked_as_deleted (MODEST_MAIN_WINDOW (win));
471 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
475 dimmed = _selected_msg_sent_in_progress (win);
477 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
480 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
482 dimmed = _transfer_mode_enabled (win);
484 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
487 dimmed = _message_is_marked_as_deleted (MODEST_MSG_VIEW_WINDOW (win));
489 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
492 /* Commented out, because deletion should be possible even when
493 * the message window has no header view model, which will be the
494 * case when it is not the selected message in the header view.
498 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
500 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
510 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
512 ModestDimmingRule *rule = NULL;
513 GtkWidget *header_view = NULL;
514 gboolean dimmed = FALSE;
516 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
517 rule = MODEST_DIMMING_RULE (user_data);
519 /* main window dimming rules */
520 if (MODEST_IS_MAIN_WINDOW(win)) {
522 /* Check dimmed rule */
523 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
524 MODEST_WIDGET_TYPE_HEADER_VIEW);
526 /* If the header view has the focus: */
527 if (header_view && gtk_widget_is_focus (header_view)) {
528 /* Check dimmed rule */
530 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
533 /* If the folder view has the focus: */
534 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
535 MODEST_WIDGET_TYPE_FOLDER_VIEW);
536 if (folder_view && gtk_widget_is_focus (folder_view)) {
537 TnyFolderStore *folder_store
538 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
540 /* Only enable for folders, not accounts,
541 * though the UI spec is not clear about that.
542 * If we enable this for accounts then we must
543 * add code to handle them in modest_ui_actions_on_details(). */
544 if (!TNY_IS_FOLDER(folder_store)) {
546 modest_dimming_rule_set_notification (rule, "");
549 g_object_unref (folder_store);
555 /* msg view window dimming rules */
558 /* Check dimmed rule */
560 if (MODEST_IS_MSG_VIEW_WINDOW (win))
561 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
563 modest_dimming_rule_set_notification (rule, "");
572 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
574 ModestDimmingRule *rule = NULL;
575 TnyHeaderFlags flags;
576 gboolean dimmed = FALSE;
578 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
579 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
580 rule = MODEST_DIMMING_RULE (user_data);
582 flags = TNY_HEADER_FLAG_SEEN;
584 /* Check dimmed rule */
586 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
589 dimmed = _selected_msg_marked_as (MODEST_MAIN_WINDOW(win), flags, FALSE, TRUE);
591 modest_dimming_rule_set_notification (rule, "");
598 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
600 ModestDimmingRule *rule = NULL;
601 TnyHeaderFlags flags;
602 gboolean dimmed = FALSE;
604 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
605 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
606 rule = MODEST_DIMMING_RULE (user_data);
608 flags = TNY_HEADER_FLAG_SEEN;
610 /* Check dimmed rule */
612 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
614 dimmed = _selected_msg_marked_as (MODEST_MAIN_WINDOW(win), flags, TRUE, TRUE);
616 modest_dimming_rule_set_notification (rule, "");
623 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
625 ModestDimmingRule *rule = NULL;
626 gboolean dimmed = FALSE;
628 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
629 rule = MODEST_DIMMING_RULE (user_data);
631 if (MODEST_IS_MAIN_WINDOW (win))
632 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
633 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
634 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
641 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
643 GtkWidget *folder_view = NULL;
644 GtkWidget *header_view = NULL;
645 ModestDimmingRule *rule = NULL;
646 guint n_messages = 0;
647 gboolean dimmed = FALSE;
649 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
650 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
651 rule = MODEST_DIMMING_RULE (user_data);
653 /* Get the folder view */
654 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
655 MODEST_WIDGET_TYPE_FOLDER_VIEW);
657 /* Get header view */
658 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
659 MODEST_WIDGET_TYPE_HEADER_VIEW);
661 /* Check diming rules for folders and messages transfer */
663 dimmed = _already_opened_msg (win, &n_messages);
665 gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"), n_messages);
666 modest_dimming_rule_set_notification (rule, message);
671 if (!gtk_widget_is_focus (folder_view))
672 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
680 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
682 ModestDimmingRule *rule = NULL;
683 gboolean dimmed = FALSE;
685 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
686 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
687 rule = MODEST_DIMMING_RULE (user_data);
689 /* Check dimmed rule */
691 dimmed = _transfer_mode_enabled (win);
693 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
696 if (MODEST_IS_MSG_VIEW_WINDOW (win))
697 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
699 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
706 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
708 ModestDimmingRule *rule = NULL;
709 gboolean dimmed = FALSE;
711 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
712 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
713 rule = MODEST_DIMMING_RULE (user_data);
715 /* Check dimmed rule */
717 dimmed = _transfer_mode_enabled (win);
719 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
726 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
728 ModestDimmingRule *rule = NULL;
729 TnyFolderType types[3];
730 gboolean dimmed = FALSE;
732 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
733 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
734 rule = MODEST_DIMMING_RULE (user_data);
736 types[0] = TNY_FOLDER_TYPE_DRAFTS;
737 types[1] = TNY_FOLDER_TYPE_OUTBOX;
738 types[2] = TNY_FOLDER_TYPE_SENT;
740 /* Check dimmed rule */
742 dimmed = _clipboard_is_empty (win);
744 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ecoc_ib_edwin_nothing_to_paste"));
747 dimmed = _selected_folder_is_any_of_type (win, types, 3);
749 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
752 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
754 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
758 dimmed = _selected_folder_is_same_as_source (win);
760 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
768 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
770 ModestDimmingRule *rule = NULL;
771 gboolean dimmed = FALSE;
773 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
774 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
775 rule = MODEST_DIMMING_RULE (user_data);
777 /* Check dimmed rule */
779 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
781 modest_dimming_rule_set_notification (rule, "");
788 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
790 ModestDimmingRule *rule = NULL;
791 gboolean dimmed = FALSE;
793 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
794 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
795 rule = MODEST_DIMMING_RULE (user_data);
797 /* Check dimmed rule */
799 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);
802 dimmed = _purged_attach_selected (win, FALSE, NULL);
804 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
812 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
814 ModestDimmingRule *rule = NULL;
815 gboolean dimmed = FALSE;
817 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
818 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
819 rule = MODEST_DIMMING_RULE (user_data);
821 /* Check dimmed rule */
823 dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
826 dimmed = _purged_attach_selected (win, FALSE, NULL);
828 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
836 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
838 ModestDimmingRule *rule = NULL;
839 gboolean dimmed = FALSE;
841 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
842 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
843 rule = MODEST_DIMMING_RULE (user_data);
845 /* Check in main window if there's only one message selected */
846 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
847 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
850 /* Check in view window if there's any attachment selected */
851 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
852 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
854 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
857 /* cannot purge in editable drafts nor pop folders */
859 dimmed = _invalid_folder_for_purge (win, rule);
862 /* Check if the selected message in main window has attachments */
863 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
864 dimmed = _selected_msg_marked_as (MODEST_MAIN_WINDOW(win), TNY_HEADER_FLAG_ATTACHMENTS, TRUE, FALSE);
866 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
869 /* Check if all attachments are already purged */
871 dimmed = _purged_attach_selected (win, TRUE, rule);
874 /* Check if the message is already downloaded */
875 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
876 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
878 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
886 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
888 ModestDimmingRule *rule = NULL;
889 gboolean dimmed = FALSE;
891 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
892 rule = MODEST_DIMMING_RULE (user_data);
894 /* Check dimmed rule */
896 dimmed = _clipboard_is_empty (win);
898 modest_dimming_rule_set_notification (rule, "");
905 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
907 ModestDimmingRule *rule = NULL;
908 gboolean dimmed = FALSE;
910 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
911 rule = MODEST_DIMMING_RULE (user_data);
913 /* Check common dimming rules */
915 dimmed = _invalid_clipboard_selected (win, rule);
918 /* Check window specific dimming rules */
919 if (MODEST_IS_MAIN_WINDOW (win)) {
921 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
923 modest_dimming_rule_set_notification (rule, "");
926 dimmed = _selected_msg_sent_in_progress (win);
928 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
936 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
938 ModestDimmingRule *rule = NULL;
939 gboolean dimmed = FALSE;
941 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
942 rule = MODEST_DIMMING_RULE (user_data);
944 /* Check common dimming rules */
946 dimmed = _invalid_clipboard_selected (win, rule);
949 /* Check window specific dimming rules */
950 if (MODEST_IS_MAIN_WINDOW (win)) {
952 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
954 modest_dimming_rule_set_notification (rule, "");
957 dimmed = _selected_msg_sent_in_progress (win);
959 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
967 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
969 ModestDimmingRule *rule = NULL;
970 gboolean dimmed = FALSE;
972 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
973 rule = MODEST_DIMMING_RULE (user_data);
975 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
977 /* Check dimmed rule */
979 dimmed = _transfer_mode_enabled (win);
981 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
984 if (MODEST_IS_MSG_VIEW_WINDOW (win))
985 dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
986 modest_dimming_rule_set_notification (rule, NULL);
993 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
995 ModestDimmingRule *rule = NULL;
996 gboolean dimmed = FALSE;
998 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
999 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1000 rule = MODEST_DIMMING_RULE (user_data);
1002 /* Check dimmed rule */
1004 dimmed = _transfer_mode_enabled (win);
1006 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1009 if (MODEST_IS_MSG_VIEW_WINDOW (win))
1010 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1011 modest_dimming_rule_set_notification (rule, NULL);
1019 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1021 const gboolean dimmed =
1022 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1029 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1031 ModestDimmingRule *rule = NULL;
1032 TnyFolderType types[1];
1033 guint n_messages = 0;
1034 gboolean dimmed = FALSE;
1036 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1037 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1038 rule = MODEST_DIMMING_RULE (user_data);
1040 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1042 /* Check dimmed rules */
1044 dimmed = _already_opened_msg (win, &n_messages);
1046 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_cancel_send"));
1049 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1051 modest_dimming_rule_set_notification (rule, "");
1054 dimmed = !_sending_in_progress (win);
1056 modest_dimming_rule_set_notification (rule, "");
1063 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1065 ModestDimmingRule *rule = NULL;
1066 gboolean dimmed = FALSE;
1068 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1069 rule = MODEST_DIMMING_RULE (user_data);
1071 /* Check dimmed rule */
1073 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1076 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1083 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1085 ModestDimmingRule *rule = NULL;
1086 gboolean dimmed = FALSE;
1088 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1089 rule = MODEST_DIMMING_RULE (user_data);
1091 /* Check dimmed rule */
1093 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1094 gchar *selection = NULL;
1095 selection = gtk_clipboard_wait_for_text (clipboard);
1097 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1103 /* *********************** static utility functions ******************** */
1105 /* Returns whether the selected message is marked as deleted. */
1107 _message_is_marked_as_deleted (ModestMsgViewWindow *win)
1109 g_return_val_if_fail (win, FALSE);
1110 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1112 TnyHeader* header = modest_msg_view_window_get_header (win);
1116 return (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED);
1121 /* Returns whether the selected message is marked as deleted.
1122 * @param win The main window, or NULL if you want this function
1123 * to discover the main window itself, which is marginally less
1126 _selected_message_is_marked_as_deleted (ModestMainWindow *win)
1128 gboolean result = FALSE;
1129 TnyHeaderFlags flags;
1131 flags = TNY_HEADER_FLAG_DELETED;
1133 /* Check dimmed rule */
1134 result = _selected_msg_marked_as (win, flags, FALSE, FALSE);
1140 _selected_folder_not_writeable (ModestMainWindow *win)
1142 GtkWidget *folder_view = NULL;
1143 TnyFolderStore *parent_folder = NULL;
1144 ModestTnyFolderRules rules;
1145 gboolean result = FALSE;
1147 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1149 /* Get folder view */
1150 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1151 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1152 /* If no folder view, always dimmed */
1156 /* Get selected folder as parent of new folder to create */
1157 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1158 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1160 g_object_unref (parent_folder);
1164 /* Check dimmed rule */
1165 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1166 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1169 g_object_unref (parent_folder);
1175 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1177 TnyFolderType types[2];
1178 gboolean result = FALSE;
1180 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1182 types[0] = TNY_FOLDER_TYPE_ROOT;
1183 types[1] = TNY_FOLDER_TYPE_INBOX;
1185 /* Check folder type */
1186 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
1188 /* Check pop and MMC accounts */
1190 result = _selected_folder_is_MMC_or_POP_root (win);
1198 _selected_folder_is_root (ModestMainWindow *win)
1200 TnyFolderType types[1];
1201 gboolean result = FALSE;
1203 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1205 /* All accounts are root items: */
1206 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1207 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1209 gboolean is_account = FALSE;
1210 TnyFolderStore *folder_store =
1211 modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1213 is_account = TNY_IS_ACCOUNT (folder_store);
1214 g_object_unref (folder_store);
1215 folder_store = NULL;
1222 /* Try something more precise: */
1223 types[0] = TNY_FOLDER_TYPE_ROOT;
1225 /* Check folder type */
1226 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1228 /* Check pop and MMC accounts */
1230 result = _selected_folder_is_MMC_or_POP_root (win);
1237 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1239 GtkWidget *folder_view = NULL;
1240 TnyFolderStore *parent_folder = NULL;
1241 gboolean result = FALSE;
1243 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1244 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1245 /* Get selected folder as parent of new folder to create */
1246 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1250 if (TNY_IS_ACCOUNT (parent_folder)) {
1251 /* If it's the local account then do not dim */
1252 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1255 /* If it's the MMC root folder then dim it */
1256 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1259 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1260 /* If it's POP then dim */
1261 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
1262 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1266 g_object_unref (parent_folder);
1273 _selected_folder_is_empty (ModestMainWindow *win)
1275 GtkWidget *folder_view = NULL;
1276 TnyFolderStore *folder = NULL;
1277 gboolean result = FALSE;
1279 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1281 /* Get folder view */
1282 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1283 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1284 /* If no folder view, always dimmed */
1288 /* Get selected folder as parent of new folder to create */
1289 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1290 if (!(folder && TNY_IS_FOLDER(folder))) {
1292 g_object_unref (folder);
1296 /* Check folder type */
1297 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
1300 g_object_unref (folder);
1306 _selected_folder_is_same_as_source (ModestWindow *win)
1308 ModestEmailClipboard *clipboard = NULL;
1309 GtkWidget *folder_view = NULL;
1310 TnyFolderStore *folder = NULL;
1311 gboolean result = FALSE;
1313 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1315 /* Get folder view */
1316 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1317 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1321 /* Get selected folder as destination folder */
1322 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1323 if (!(folder && TNY_IS_FOLDER(folder))) {
1328 /* Check clipboard is cleared */
1329 clipboard = modest_runtime_get_email_clipboard ();
1330 if (modest_email_clipboard_cleared (clipboard)) {
1335 /* Check source folder */
1336 result = modest_email_clipboard_check_source_folder (clipboard,
1337 (const TnyFolder *) folder);
1341 g_object_unref (folder);
1347 _selected_folder_is_any_of_type (ModestWindow *win,
1348 TnyFolderType types[],
1351 GtkWidget *folder_view = NULL;
1352 TnyFolderStore *folder = NULL;
1353 TnyFolderType folder_type;
1355 gboolean result = FALSE;
1357 /*Get current folder */
1358 if (MODEST_IS_MAIN_WINDOW(win)) {
1360 /* Get folder view */
1361 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1362 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1363 /* If no folder view, always dimmed */
1367 /* Get selected folder as parent of new folder to create */
1368 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1370 if (!(folder && TNY_IS_FOLDER(folder))) {
1372 g_object_unref (folder);
1376 /* Check folder type */
1377 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
1379 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1380 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1381 for (i=0; i < ntypes; i++) {
1382 result = result || folder_type == types[i];
1388 g_object_unref (folder);
1394 _folder_is_any_of_type (TnyFolder *folder,
1395 TnyFolderType types[],
1398 TnyFolderType folder_type;
1399 gboolean result = FALSE;
1402 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
1404 /* Get folder type */
1405 folder_type = modest_tny_folder_guess_folder_type (folder);
1407 /* Check foler type */
1408 for (i=0; i < ntypes; i++) {
1409 result = result || folder_type == types[i];
1416 _selected_folder_is_snd_level (ModestMainWindow *win)
1418 GtkWidget *folder_view = NULL;
1419 GtkTreeSelection *sel = NULL;
1420 GtkTreeModel *model = NULL;
1421 GtkTreePath *path = NULL;
1423 TnyFolderStore *folder = NULL;
1424 gboolean result = FALSE;
1426 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1428 /*Get curent folder */
1429 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1430 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1431 /* If no folder view, always dimmed */
1435 /* Get selected folder as parent of new folder to create */
1436 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1437 if (!(folder && TNY_IS_FOLDER(folder))) {
1441 /* Check folder level */
1442 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(folder_view));
1443 if (!gtk_tree_selection_get_selected (sel, &model, &iter))
1445 path = gtk_tree_model_get_path (model, &iter);
1446 result = gtk_tree_path_get_depth (path) > 2;
1450 g_object_unref (folder);
1452 gtk_tree_path_free (path);
1459 _clipboard_is_empty (ModestWindow *win)
1461 gboolean result = FALSE;
1463 if (MODEST_IS_MAIN_WINDOW (win)) {
1464 ModestEmailClipboard *clipboard = NULL;
1465 clipboard = modest_runtime_get_email_clipboard ();
1466 if (modest_email_clipboard_cleared (clipboard))
1474 _invalid_clipboard_selected (ModestWindow *win,
1475 ModestDimmingRule *rule)
1477 gboolean result = FALSE;
1479 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1480 GtkClipboard *clipboard = NULL;
1481 gchar *selection = NULL;
1482 GtkWidget *focused = NULL;
1484 /* Get clipboard selection*/
1485 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1486 selection = gtk_clipboard_wait_for_text (clipboard);
1488 /* Get focuesed widget */
1489 focused = gtk_window_get_focus (GTK_WINDOW (win));
1492 result = ((selection == NULL) ||
1493 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
1496 modest_dimming_rule_set_notification (rule, "");
1498 else if (MODEST_IS_MAIN_WINDOW (win)) {
1499 GtkWidget *header_view = NULL;
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);
1506 result = !modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view));
1508 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1516 _invalid_attach_selected (ModestWindow *win,
1519 gboolean for_remove,
1520 ModestDimmingRule *rule)
1522 GList *attachments, *node;
1524 TnyHeaderFlags flags;
1525 gboolean nested_attachments = FALSE;
1526 gboolean selected_messages = FALSE;
1527 gboolean result = FALSE;
1529 if (MODEST_IS_MAIN_WINDOW (win)) {
1530 flags = TNY_HEADER_FLAG_ATTACHMENTS;
1532 result = _selected_msg_marked_as (MODEST_MAIN_WINDOW (win), flags, TRUE, FALSE);
1534 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1536 /* Get selected atachments */
1537 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1538 n_selected = g_list_length (attachments);
1543 result = n_selected != 1;
1546 result = n_selected < 1;
1549 /* Check attached type (view operation not required) */
1550 if (!result && !for_view) {
1551 for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
1552 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1553 TnyList *nested_list = tny_simple_list_new ();
1554 if (!for_remove && TNY_IS_MSG (mime_part)) {
1555 selected_messages = TRUE;
1558 tny_mime_part_get_parts (mime_part, nested_list);
1559 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1560 nested_attachments = TRUE;
1563 g_object_unref (nested_list);
1567 /* Set notifications */
1568 if (result && rule != NULL) {
1569 if (selected_messages) {
1570 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1571 } else if (nested_attachments) {
1572 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1573 } else if (n_selected == 0) {
1574 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1575 } else if (unique) {
1576 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1581 g_list_free (attachments);
1588 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule)
1590 GList *attachments = NULL, *node;
1592 gint n_attachments = 0;
1593 gboolean result = FALSE;
1595 /* This should check if _all_ the attachments are already purged. If only some
1596 * of them are purged, then it does not cause dim as there's a confirmation dialog
1597 * for removing only local attachments */
1599 /* Get selected atachments */
1600 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1601 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1602 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1603 /* If we're in main window, we won't know if there are already purged attachments */
1607 if (attachments == NULL)
1610 for (node = attachments; node != NULL; node = g_list_next (node)) {
1611 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1612 if (tny_mime_part_is_purged (mime_part)) {
1619 g_list_free (attachments);
1622 result = (purged == n_attachments);
1624 result = (purged > 0);
1626 if (result && (rule != NULL))
1627 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1633 _invalid_msg_selected (ModestMainWindow *win,
1635 ModestDimmingRule *rule)
1637 GtkWidget *header_view = NULL;
1638 GtkWidget *folder_view = NULL;
1639 gboolean selected_headers = FALSE;
1640 gboolean result = FALSE;
1642 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1643 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
1645 /* Get header view to check selected messages */
1646 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1647 MODEST_WIDGET_TYPE_HEADER_VIEW);
1649 /* Get folder view to check focus */
1650 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1651 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1653 /* Get selected headers */
1654 selected_headers = modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view));
1656 /* Check dimmed rule (TODO: check focus on widgets */
1658 result = ((!selected_headers) ||
1659 (gtk_widget_is_focus (folder_view)));
1661 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1663 if (!result && unique) {
1664 result = modest_header_view_count_selected_headers (MODEST_HEADER_VIEW(header_view)) > 1;
1666 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1673 _already_opened_msg (ModestWindow *win,
1676 //ModestWindow *window = NULL;
1677 ModestWindowMgr *mgr = NULL;
1678 GtkWidget *header_view = NULL;
1679 TnyList *selected_headers = NULL;
1680 TnyIterator *iter = NULL;
1681 TnyHeader *header = NULL;
1684 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1686 /* Get header view to check selected messages */
1687 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1688 MODEST_WIDGET_TYPE_HEADER_VIEW);
1691 /* Check no selection */
1692 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1695 /* Get selected headers */
1696 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1697 if (selected_headers == NULL)
1700 *n_messages = tny_list_get_length (selected_headers);
1702 /* Check dimmed rule (TODO: check focus on widgets */
1703 mgr = modest_runtime_get_window_mgr ();
1704 iter = tny_list_create_iterator (selected_headers);
1706 while (!tny_iterator_is_done (iter)) {
1707 header = TNY_HEADER (tny_iterator_get_current (iter));
1709 found = modest_window_mgr_find_registered_header (mgr,header, NULL);
1711 g_object_unref (header);
1714 tny_iterator_next (iter);
1721 if (selected_headers != NULL)
1722 g_object_unref (selected_headers);
1724 g_object_unref (iter);
1729 /* Returns whether the selected message has these flags.
1730 * @win: The main window, or NULL if you want this function
1731 * to discover the main window itself.
1734 _selected_msg_marked_as (ModestMainWindow *win,
1735 TnyHeaderFlags mask,
1739 ModestMainWindow *main_window = NULL;
1740 GtkWidget *header_view = NULL;
1741 TnyList *selected_headers = NULL;
1742 TnyIterator *iter = NULL;
1743 TnyHeader *header = NULL;
1744 TnyHeaderFlags flags = 0;
1745 gboolean result = TRUE;
1747 /* The caller can supply the main window if it knows it,
1748 * to save time, or we can get it here: */
1749 if (win && MODEST_IS_MAIN_WINDOW (win))
1752 main_window = MODEST_MAIN_WINDOW (
1753 modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
1756 /* TODO: Javi, what about if the main window does not
1757 exist?. Adding some code to avoid CRITICALs */
1761 /* Get header view to check selected messages */
1762 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(main_window),
1763 MODEST_WIDGET_TYPE_HEADER_VIEW);
1765 /* Check no selection */
1766 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1769 /* Get selected headers */
1770 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1771 if (selected_headers == NULL)
1774 /* Call the function for each header */
1775 iter = tny_list_create_iterator (selected_headers);
1776 while (!tny_iterator_is_done (iter) && result) {
1777 header = TNY_HEADER (tny_iterator_get_current (iter));
1779 flags = tny_header_get_flags (header);
1781 result = (flags & mask) == 0;
1783 result = (flags & mask) != 0;
1785 g_object_unref (header);
1788 tny_iterator_next (iter);
1792 result = result && tny_iterator_is_done (iter);
1795 if (selected_headers != NULL)
1796 g_object_unref (selected_headers);
1798 g_object_unref (iter);
1804 _msg_download_in_progress (ModestMsgViewWindow *win)
1806 gboolean result = FALSE;
1808 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1810 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1816 _msg_download_completed (ModestMainWindow *win)
1818 GtkWidget *header_view = NULL;
1819 TnyList *selected_headers = NULL;
1820 TnyIterator *iter = NULL;
1821 TnyHeader *header = NULL;
1822 TnyHeaderFlags flags = 0;
1823 gboolean result = FALSE;
1825 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1828 /* Get header view to check selected messages */
1829 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1830 MODEST_WIDGET_TYPE_HEADER_VIEW);
1832 /* Check no selection */
1833 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1836 /* Get selected headers */
1837 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1838 if (selected_headers == NULL)
1841 /* Check dimmed rule */
1843 iter = tny_list_create_iterator (selected_headers);
1844 while (!tny_iterator_is_done (iter) && result) {
1845 header = TNY_HEADER (tny_iterator_get_current (iter));
1847 flags = tny_header_get_flags (header);
1848 /* TODO: is this the right flag?, it seems that some
1849 headers that have been previously downloaded do not
1851 result = (flags & TNY_HEADER_FLAG_CACHED);
1853 g_object_unref (header);
1856 tny_iterator_next (iter);
1859 g_object_unref (iter);
1865 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
1867 GSList **send_queues = (GSList **) userdata;
1868 *send_queues = g_slist_prepend (*send_queues, value);
1872 _selected_msg_sent_in_progress (ModestWindow *win)
1874 ModestCacheMgr *cache_mgr;
1875 GHashTable *send_queue_cache;
1876 GSList *send_queues = NULL, *node;
1877 ModestTnySendQueue *send_queue = NULL;
1878 GtkWidget *header_view = NULL;
1879 TnyList *header_list = NULL;
1880 TnyIterator *iter = NULL;
1881 TnyHeader *header = NULL;
1882 gboolean result = FALSE;
1883 gchar *msg_uid = NULL;
1886 if (MODEST_IS_MAIN_WINDOW(win)) {
1888 /* Get header view to check selected messages */
1889 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1890 MODEST_WIDGET_TYPE_HEADER_VIEW);
1892 /* Check no selection */
1893 if (!modest_header_view_has_selected_headers (MODEST_HEADER_VIEW(header_view)))
1896 /* Get selected headers */
1897 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
1899 /* Get message header */
1900 if (!header_list) return FALSE;
1901 iter = tny_list_create_iterator (header_list);
1902 header = TNY_HEADER (tny_iterator_get_current (iter));
1904 /* Get message uid */
1905 msg_uid = modest_tny_send_queue_get_msg_id (header);
1906 g_object_unref (header);
1909 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1911 /* Get message header */
1912 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
1914 /* Get message uid */
1915 msg_uid = modest_tny_send_queue_get_msg_id (header);
1916 g_object_unref (header);
1920 /* Search on send queues cache */
1921 cache_mgr = modest_runtime_get_cache_mgr ();
1922 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
1923 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
1925 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
1927 for (node = send_queues; node != NULL && !result; node = g_slist_next (node)) {
1928 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
1930 /* Check if msg uid is being processed inside send queue */
1931 result = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
1937 g_object_unref(header_list);
1938 g_object_unref(iter);
1939 g_slist_free (send_queues);
1946 _sending_in_progress (ModestWindow *win)
1948 gboolean result = FALSE;
1950 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1952 /* Check if send operation is in progress */
1953 result = modest_main_window_send_receive_in_progress (MODEST_MAIN_WINDOW (win));
1959 _invalid_folder_for_purge (ModestWindow *win,
1960 ModestDimmingRule *rule)
1963 TnyFolder *folder = NULL;
1964 TnyAccount *account = NULL;
1965 gboolean result = FALSE;
1967 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1969 /* Get folder and account of message */
1970 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1971 g_return_val_if_fail(msg != NULL, TRUE);
1972 folder = tny_msg_get_folder (msg);
1973 if (folder == NULL) {
1974 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1977 g_object_unref (msg);
1978 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1979 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1980 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1983 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
1984 if (folder == NULL || ! TNY_IS_FOLDER (folder))
1987 g_return_val_if_reached (FALSE);
1989 account = modest_tny_folder_get_account (folder);
1990 if (account == NULL) goto frees;
1993 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
1994 TnyFolderType types[2];
1995 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1996 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1998 if (_selected_folder_is_any_of_type (win, types, 2)) {
2000 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
2002 /* We're currently disabling purge in any local store */
2004 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2007 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2008 /* If it's POP then dim */
2009 if (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2010 MODEST_PROTOCOL_STORE_POP) {
2011 GList *attachments = NULL;
2012 gint n_selected = 0;
2015 /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
2017 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2018 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2019 n_selected = g_list_length (attachments);
2020 g_list_free (attachments);
2023 modest_dimming_rule_set_notification (rule,
2024 ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
2025 "mail_ib_unable_to_pure_attach_pop_mail_plural",
2032 g_object_unref (folder);
2033 if (account != NULL)
2034 g_object_unref (account);
2040 _transfer_mode_enabled (ModestWindow *win)
2042 gboolean result = FALSE;
2044 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
2047 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));