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 _selected_folder_not_writeable (ModestMainWindow *win, gboolean for_paste);
54 static gboolean _selected_folder_not_moveable (ModestMainWindow *win);
55 static gboolean _selected_folder_not_renameable (ModestMainWindow *win);
56 static gboolean _selected_folder_not_deletable (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 _header_view_is_all_selected (ModestMainWindow *win);
62 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
63 static gboolean _folder_view_has_focus (ModestWindow *win);
64 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
65 static gboolean _msg_download_in_progress (ModestWindow *win);
66 static gboolean _msg_download_completed (ModestMainWindow *win);
67 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
68 static gboolean _sending_in_progress (ModestWindow *win);
69 static gboolean _send_receive_in_progress (ModestWindow *win);
70 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
71 static gboolean _transfer_mode_enabled (ModestWindow *win);
72 static gboolean _selected_folder_has_subfolder_with_same_name (ModestWindow *win);
73 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
77 _define_main_window_dimming_state (ModestMainWindow *window)
79 DimmedState *state = NULL;
80 GtkWidget *focused_widget = NULL;
81 GtkWidget *header_view = NULL;
82 GtkTreeModel *model = NULL;
83 TnyList *selected_headers = NULL;
84 TnyIterator *iter = NULL;
85 TnyHeader *header = NULL;
86 ModestCacheMgr *cache_mgr = NULL;
87 GHashTable *send_queue_cache = NULL;
88 ModestTnySendQueue *send_queue = NULL;
89 GSList *send_queues = NULL, *node = NULL;
90 ModestWindowMgr *mgr = NULL;
91 gboolean found = FALSE;
92 gchar *msg_uid = NULL;
94 gboolean all_deleted = TRUE;
95 gboolean all_seen = TRUE;
96 gboolean all_cached = TRUE;
97 gboolean all_has_attach = TRUE;
99 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
102 state = g_slice_new0 (DimmedState);
103 state->n_selected = 0;
104 state->already_opened_msg = FALSE;
105 state->any_marked_as_deleted = FALSE;
106 state->all_marked_as_deleted = FALSE;
107 state->any_marked_as_seen = FALSE;
108 state->all_marked_as_seen = FALSE;
109 state->any_marked_as_cached = FALSE;
110 state->all_marked_as_cached = FALSE;
111 state->any_has_attachments = FALSE;
112 state->all_has_attachments = FALSE;
113 state->sent_in_progress = FALSE;
114 state->all_selected = FALSE;
116 /* Get focused widget */
117 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
118 if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
121 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
122 header_view = focused_widget;
124 header_view = modest_main_window_get_child_widget (window, MODEST_WIDGET_TYPE_HEADER_VIEW);
127 /* Get header view and selected headers */
128 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
129 if (!selected_headers)
132 /* Examine selected headers */
133 iter = tny_list_create_iterator (selected_headers);
134 while (!tny_iterator_is_done (iter)) {
135 header = TNY_HEADER (tny_iterator_get_current (iter));
136 flags = tny_header_get_flags (header);
142 mgr = modest_runtime_get_window_mgr ();
143 if (!state->already_opened_msg)
144 state->already_opened_msg = modest_window_mgr_find_registered_header (mgr, header, NULL);
147 /* Mark as deleted */
148 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
149 state->all_marked_as_deleted = all_deleted;
150 if (!state->any_marked_as_deleted)
151 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
154 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
155 state->all_marked_as_seen = all_seen;
156 if (!state->any_marked_as_seen)
157 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
160 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
161 state->all_marked_as_cached = all_cached;
162 if (!state->any_marked_as_cached)
163 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
165 /* Mark has_attachments */
166 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
167 state->all_has_attachments = all_has_attach;
168 if (!state->any_has_attachments)
169 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
171 /* sent in progress */
172 msg_uid = modest_tny_send_queue_get_msg_id (header);
173 if (!state->sent_in_progress) {
174 cache_mgr = modest_runtime_get_cache_mgr ();
175 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
176 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
178 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
180 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
181 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
183 /* Check if msg uid is being processed inside send queue */
184 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
186 state->sent_in_progress = found;
189 tny_iterator_next (iter);
190 g_object_unref (header);
193 /* check if all the headers are selected or not */
194 model = gtk_tree_view_get_model(GTK_TREE_VIEW(header_view));
197 count = gtk_tree_model_iter_n_children(model, NULL);
198 if(state->n_selected == count != 0)
199 state->all_selected = TRUE;
204 g_object_unref(selected_headers);
205 g_object_unref(iter);
206 g_slist_free (send_queues);
212 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
214 DimmedState *state = NULL;
215 TnyHeader *header = NULL;
216 ModestCacheMgr *cache_mgr = NULL;
217 GHashTable *send_queue_cache = NULL;
218 ModestTnySendQueue *send_queue = NULL;
219 GSList *send_queues = NULL, *node = NULL;
220 gboolean found = FALSE;
221 gchar *msg_uid = NULL;
222 TnyHeaderFlags flags;
223 gboolean all_deleted = TRUE;
224 gboolean all_seen = TRUE;
225 gboolean all_cached = TRUE;
226 gboolean all_has_attach = TRUE;
228 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
231 state = g_slice_new0 (DimmedState);
232 state->n_selected = 0;
233 state->already_opened_msg = FALSE;
234 state->any_marked_as_deleted = FALSE;
235 state->all_marked_as_deleted = FALSE;
236 state->any_marked_as_seen = FALSE;
237 state->all_marked_as_seen = FALSE;
238 state->any_marked_as_cached = FALSE;
239 state->all_marked_as_cached = FALSE;
240 state->any_has_attachments = FALSE;
241 state->all_has_attachments = FALSE;
242 state->sent_in_progress = FALSE;
244 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
245 g_return_val_if_fail (TNY_IS_HEADER(header), state);
246 flags = tny_header_get_flags (header);
251 /* Mark as deleted */
252 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
253 state->all_marked_as_deleted = all_deleted;
254 if (!state->any_marked_as_deleted)
255 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
258 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
259 state->all_marked_as_seen = all_seen;
260 if (!state->any_marked_as_seen)
261 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
264 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
265 state->all_marked_as_cached = all_cached;
266 if (!state->any_marked_as_cached)
267 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
269 /* Mark has_attachments */
270 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
271 state->all_has_attachments = all_has_attach;
272 if (!state->any_has_attachments)
273 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
275 /* sent in progress */
276 msg_uid = modest_tny_send_queue_get_msg_id (header);
277 if (!state->sent_in_progress) {
278 cache_mgr = modest_runtime_get_cache_mgr ();
279 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
280 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
282 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
284 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
285 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
287 /* Check if msg uid is being processed inside send queue */
288 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
290 state->sent_in_progress = found;
295 g_object_unref (header);
296 g_slist_free (send_queues);
303 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
305 DimmedState *state = NULL;
307 g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
309 if (MODEST_IS_MAIN_WINDOW (window))
310 state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
311 else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
312 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
320 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
322 ModestDimmingRule *rule = NULL;
323 gboolean dimmed = FALSE;
325 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
326 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
327 rule = MODEST_DIMMING_RULE (user_data);
329 /* Check dimmed rule */
330 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
332 dimmed = _msg_download_in_progress (win);
334 modest_dimming_rule_set_notification (rule, "");
336 } else if (MODEST_IS_MAIN_WINDOW(win)) {
338 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
341 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
349 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
351 ModestDimmingRule *rule = NULL;
352 GtkWidget *folder_view = NULL;
353 TnyFolderStore *parent_folder = NULL;
354 gboolean dimmed = FALSE;
356 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
357 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
358 rule = MODEST_DIMMING_RULE (user_data);
360 /* Get selected folder as parent of new folder to create */
361 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
362 MODEST_WIDGET_TYPE_FOLDER_VIEW);
363 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
367 if (TNY_IS_ACCOUNT (parent_folder)) {
368 /* If it's the local account then do not dim */
369 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
372 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
373 if (proto_str != NULL) {
374 /* If it's POP then dim */
375 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
376 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
378 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
382 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
384 TnyFolderType types[3];
386 types[0] = TNY_FOLDER_TYPE_DRAFTS;
387 types[1] = TNY_FOLDER_TYPE_OUTBOX;
388 types[2] = TNY_FOLDER_TYPE_SENT;
390 /* Apply folder rules */
392 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), FALSE);
394 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
397 dimmed = _selected_folder_is_any_of_type (win, types, 3);
399 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
403 /* if not the folder is selected then dim */
404 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
405 MODEST_WIDGET_TYPE_FOLDER_VIEW);
406 if (folder_view && !gtk_widget_is_focus (folder_view))
409 g_object_unref (parent_folder);
415 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
417 ModestDimmingRule *rule = NULL;
418 GtkWidget *folder_view = NULL;
419 GtkWidget *header_view = NULL;
420 gboolean dimmed = FALSE;
422 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
423 rule = MODEST_DIMMING_RULE (user_data);
425 if (MODEST_IS_MAIN_WINDOW (win)) {
426 /* Get the folder view */
427 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
428 MODEST_WIDGET_TYPE_FOLDER_VIEW);
430 /* Get header view */
431 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
432 MODEST_WIDGET_TYPE_HEADER_VIEW);
434 if (header_view && gtk_widget_is_focus (header_view))
435 dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
437 if (folder_view && gtk_widget_is_focus (folder_view))
438 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
440 if (header_view && folder_view &&
441 !gtk_widget_is_focus (header_view) &&
442 !gtk_widget_is_focus (folder_view)) {
444 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));
447 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
456 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
458 ModestDimmingRule *rule = NULL;
459 TnyFolderType types[6];
460 gboolean dimmed = FALSE;
462 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
463 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
464 rule = MODEST_DIMMING_RULE (user_data);
466 types[0] = TNY_FOLDER_TYPE_DRAFTS;
467 types[1] = TNY_FOLDER_TYPE_OUTBOX;
468 types[2] = TNY_FOLDER_TYPE_SENT;
469 types[3] = TNY_FOLDER_TYPE_INBOX;
470 types[4] = TNY_FOLDER_TYPE_ROOT;
471 types[5] = TNY_FOLDER_TYPE_ARCHIVE;
474 /* Check dimmed rule */
476 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
478 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
481 dimmed = _selected_folder_is_any_of_type (win, types, 6);
483 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
486 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
488 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
491 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
493 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
496 dimmed = _transfer_mode_enabled (win);
498 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
505 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
507 ModestDimmingRule *rule = NULL;
508 gboolean dimmed = FALSE;
510 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
511 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
512 rule = MODEST_DIMMING_RULE (user_data);
514 /* Check dimmed rule */
516 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
517 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
521 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
522 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
530 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
532 ModestDimmingRule *rule = NULL;
533 TnyFolderType types[4];
534 gboolean dimmed = FALSE;
536 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
537 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
538 rule = MODEST_DIMMING_RULE (user_data);
540 types[0] = TNY_FOLDER_TYPE_DRAFTS;
541 types[1] = TNY_FOLDER_TYPE_OUTBOX;
542 types[2] = TNY_FOLDER_TYPE_SENT;
543 types[3] = TNY_FOLDER_TYPE_ARCHIVE;
545 /* Check dimmed rule */
547 dimmed = _selected_folder_not_renameable (MODEST_MAIN_WINDOW(win));
549 modest_dimming_rule_set_notification (rule, "");
552 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
554 modest_dimming_rule_set_notification (rule, "");
557 dimmed = _selected_folder_is_any_of_type (win, types, 4);
559 modest_dimming_rule_set_notification (rule, "");
566 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
568 ModestDimmingRule *rule = NULL;
569 gboolean dimmed = FALSE;
570 const DimmedState *state = NULL;
572 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
573 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
574 rule = MODEST_DIMMING_RULE (user_data);
575 state = modest_window_get_dimming_state (win);
577 /* Check dimmed rule */
579 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
582 dimmed = state->any_marked_as_deleted;
584 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
587 dimmed = _selected_msg_sent_in_progress (win);
589 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
596 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
598 ModestDimmingRule *rule = NULL;
599 gboolean dimmed = FALSE;
600 TnyFolderType types[3];
602 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
603 rule = MODEST_DIMMING_RULE (user_data);
605 /* main window dimming rules */
606 if (MODEST_IS_MAIN_WINDOW(win)) {
608 types[0] = TNY_FOLDER_TYPE_DRAFTS;
609 types[1] = TNY_FOLDER_TYPE_OUTBOX;
610 types[2] = TNY_FOLDER_TYPE_ROOT;
612 /* Check dimmed rule */
614 dimmed = _selected_folder_is_any_of_type (win, types, 3);
616 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
619 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
621 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
624 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
626 /* msg view window dimming rules */
627 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
629 /* Check dimmed rule */
631 dimmed = _transfer_mode_enabled (win);
633 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
636 dimmed = _msg_download_in_progress (win);
638 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
647 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
649 ModestDimmingRule *rule = NULL;
650 gboolean dimmed = FALSE;
652 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
653 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
654 rule = MODEST_DIMMING_RULE (user_data);
656 /* Check dimmed rule */
658 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
661 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
663 modest_dimming_rule_set_notification (rule, "");
670 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
672 gboolean dimmed = FALSE;
674 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
676 /* Check dimmed rule */
684 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
686 ModestDimmingRule *rule = NULL;
687 guint n_messages = 0;
688 const DimmedState *state = NULL;
689 gboolean dimmed = FALSE;
691 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
692 rule = MODEST_DIMMING_RULE (user_data);
693 state = modest_window_get_dimming_state (win);
695 /* Check dimmed rule */
696 if (MODEST_IS_MAIN_WINDOW (win)) {
698 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
700 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
703 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
706 dimmed = state->already_opened_msg;
707 n_messages = state->n_selected;
709 gchar *num = g_strdup_printf ("%d", n_messages);
710 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
711 modest_dimming_rule_set_notification (rule, message);
718 dimmed = state->any_marked_as_deleted;
720 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
724 dimmed = state->sent_in_progress;
726 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
729 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
731 dimmed = _transfer_mode_enabled (win);
733 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
736 dimmed = state->any_marked_as_deleted;
738 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
741 /* The delete button should be dimmed when viewing an attachment,
742 * but should be enabled when viewing a message from the list,
743 * or when viewing a search result.
746 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
747 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
749 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
759 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
761 ModestDimmingRule *rule = NULL;
762 GtkWidget *header_view = NULL;
763 gboolean dimmed = FALSE;
765 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
766 rule = MODEST_DIMMING_RULE (user_data);
768 /* main window dimming rules */
769 if (MODEST_IS_MAIN_WINDOW(win)) {
771 /* Check dimmed rule */
772 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
773 MODEST_WIDGET_TYPE_HEADER_VIEW);
775 /* If the header view has the focus: */
776 if (header_view && gtk_widget_is_focus (header_view)) {
777 /* Check dimmed rule */
779 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
782 /* If the folder view has the focus: */
783 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
784 MODEST_WIDGET_TYPE_FOLDER_VIEW);
785 if (folder_view && gtk_widget_is_focus (folder_view)) {
786 TnyFolderStore *folder_store
787 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
789 /* Only enable for folders, not accounts,
790 * though the UI spec is not clear about that.
791 * If we enable this for accounts then we must
792 * add code to handle them in modest_ui_actions_on_details(). */
793 if (!TNY_IS_FOLDER(folder_store)) {
795 modest_dimming_rule_set_notification (rule, "");
798 g_object_unref (folder_store);
801 dimmed = _msg_download_in_progress (win);
803 modest_dimming_rule_set_notification (rule, "");
810 /* msg view window dimming rules */
813 /* Check dimmed rule */
815 if (MODEST_IS_MSG_VIEW_WINDOW (win))
816 dimmed = _msg_download_in_progress (win);
818 modest_dimming_rule_set_notification (rule, "");
827 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
829 ModestDimmingRule *rule = NULL;
830 TnyHeaderFlags flags;
831 const DimmedState *state = NULL;
832 gboolean dimmed = FALSE;
834 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
835 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
836 rule = MODEST_DIMMING_RULE (user_data);
837 state = modest_window_get_dimming_state (win);
839 flags = TNY_HEADER_FLAG_SEEN;
841 /* Check dimmed rule */
843 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
846 dimmed = state->all_marked_as_seen;
848 modest_dimming_rule_set_notification (rule, "");
855 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
857 ModestDimmingRule *rule = NULL;
858 TnyHeaderFlags flags;
859 const DimmedState *state = NULL;
860 gboolean dimmed = FALSE;
862 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
863 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
864 rule = MODEST_DIMMING_RULE (user_data);
865 state = modest_window_get_dimming_state (win);
867 flags = TNY_HEADER_FLAG_SEEN;
869 /* Check dimmed rule */
871 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
873 dimmed = !state->any_marked_as_seen;
875 modest_dimming_rule_set_notification (rule, "");
882 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
884 ModestDimmingRule *rule = NULL;
885 gboolean dimmed = FALSE;
887 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
888 rule = MODEST_DIMMING_RULE (user_data);
890 if (MODEST_IS_MAIN_WINDOW (win))
891 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
892 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
893 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
900 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
902 GtkWidget *folder_view = NULL;
903 ModestDimmingRule *rule = NULL;
904 guint n_messages = 0;
905 const DimmedState *state = NULL;
906 gboolean dimmed = FALSE;
908 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
909 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
910 rule = MODEST_DIMMING_RULE (user_data);
911 state = modest_window_get_dimming_state (win);
913 /* Get the folder view */
914 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
915 MODEST_WIDGET_TYPE_FOLDER_VIEW);
918 /* Check diming rules for folders transfer */
919 if (gtk_widget_is_focus (folder_view)) {
920 TnyFolderType types[5];
922 types[0] = TNY_FOLDER_TYPE_DRAFTS;
923 types[1] = TNY_FOLDER_TYPE_OUTBOX;
924 types[2] = TNY_FOLDER_TYPE_SENT;
925 types[3] = TNY_FOLDER_TYPE_ROOT;
926 types[4] = TNY_FOLDER_TYPE_INBOX;
928 /* Apply folder rules */
930 dimmed = _selected_folder_not_moveable (MODEST_MAIN_WINDOW(win));
932 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
935 dimmed = _selected_folder_is_any_of_type (win, types, 5);
937 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
941 /* Check diming rules for messages transfer */
943 dimmed = state->already_opened_msg;
944 n_messages = state->n_selected;
946 gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"), n_messages);
947 modest_dimming_rule_set_notification (rule, message);
952 if (!gtk_widget_is_focus (folder_view))
953 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
957 dimmed = _selected_msg_sent_in_progress (win);
959 modest_dimming_rule_set_notification (rule, _("sfil_ib_unable_to_move_selected_items"));
966 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
968 ModestDimmingRule *rule = NULL;
969 gboolean dimmed = FALSE;
971 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
972 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
973 rule = MODEST_DIMMING_RULE (user_data);
975 /* Check dimmed rule */
977 dimmed = _transfer_mode_enabled (win);
979 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
983 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
984 /* The move_to button should be dimmed when viewing an attachment,
985 * but should be enabled when viewing a message from the list,
986 * or when viewing a search result.
988 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
989 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
994 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
1001 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
1003 ModestDimmingRule *rule = NULL;
1004 gboolean dimmed = FALSE;
1006 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1007 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1008 rule = MODEST_DIMMING_RULE (user_data);
1010 /* Check dimmed rule */
1012 dimmed = _transfer_mode_enabled (win);
1014 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1021 modest_ui_dimming_rules_on_paste (ModestWindow *win, gpointer user_data)
1023 ModestDimmingRule *rule = NULL;
1024 TnyFolderType types[3];
1025 gboolean dimmed = FALSE;
1027 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1028 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1029 rule = MODEST_DIMMING_RULE (user_data);
1031 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1032 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1033 types[2] = TNY_FOLDER_TYPE_SENT;
1035 /* Check dimmed rule */
1037 dimmed = _clipboard_is_empty (win);
1039 modest_dimming_rule_set_notification (rule,
1040 dgettext("hildon-common-strings",
1041 "ecoc_ib_edwin_nothing_to_paste"));
1044 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1046 modest_dimming_rule_set_notification (rule,
1047 dgettext("hildon-common-strings",
1048 "ckct_ib_unable_to_paste_here"));
1051 dimmed = !_folder_view_has_focus (win);
1053 modest_dimming_rule_set_notification (rule,
1054 dgettext("hildon-common-strings",
1055 "ckct_ib_unable_to_paste_here"));
1058 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), TRUE);
1060 modest_dimming_rule_set_notification (rule,
1061 dgettext("hildon-common-strings",
1062 "ckct_ib_unable_to_paste_here"));
1065 dimmed = _selected_folder_is_same_as_source (win);
1067 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
1070 dimmed = _selected_folder_has_subfolder_with_same_name (win);
1072 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
1080 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1082 ModestDimmingRule *rule = NULL;
1083 gboolean dimmed = FALSE;
1085 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1086 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1087 rule = MODEST_DIMMING_RULE (user_data);
1089 /* Check dimmed rule */
1091 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1094 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1097 modest_dimming_rule_set_notification (rule, "");
1103 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1105 ModestDimmingRule *rule = NULL;
1106 gboolean dimmed = FALSE;
1108 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1109 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1110 rule = MODEST_DIMMING_RULE (user_data);
1112 /* Check dimmed rule */
1114 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);
1117 dimmed = _purged_attach_selected (win, FALSE, NULL);
1119 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1127 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1129 ModestDimmingRule *rule = NULL;
1130 gboolean dimmed = FALSE;
1132 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1133 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1134 rule = MODEST_DIMMING_RULE (user_data);
1136 /* Check dimmed rule */
1138 dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1141 dimmed = _purged_attach_selected (win, FALSE, NULL);
1143 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1151 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1153 ModestDimmingRule *rule = NULL;
1154 const DimmedState *state = NULL;
1155 gboolean dimmed = FALSE;
1157 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1158 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1159 rule = MODEST_DIMMING_RULE (user_data);
1160 state = modest_window_get_dimming_state (win);
1162 /* Check in main window if there's only one message selected */
1163 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1164 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1167 /* Check in view window if there's any attachment selected */
1168 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1169 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1171 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1174 /* cannot purge in editable drafts nor pop folders */
1176 dimmed = _invalid_folder_for_purge (win, rule);
1179 /* Check if the selected message in main window has attachments */
1180 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1181 dimmed = state->any_has_attachments;
1183 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1186 /* Check if all attachments are already purged */
1188 dimmed = _purged_attach_selected (win, TRUE, rule);
1191 /* Check if the message is already downloaded */
1192 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1193 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1195 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1203 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1205 ModestDimmingRule *rule = NULL;
1206 gboolean dimmed = FALSE;
1208 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1209 rule = MODEST_DIMMING_RULE (user_data);
1211 /* Check dimmed rule */
1213 dimmed = _clipboard_is_empty (win);
1215 modest_dimming_rule_set_notification (rule, "");
1222 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1224 ModestDimmingRule *rule = NULL;
1225 const DimmedState *state = NULL;
1226 gboolean dimmed = FALSE;
1228 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1229 rule = MODEST_DIMMING_RULE (user_data);
1230 state = modest_window_get_dimming_state (win);
1232 /* Check common dimming rules */
1234 dimmed = _invalid_clipboard_selected (win, rule);
1237 /* Check window specific dimming rules */
1238 if (MODEST_IS_MAIN_WINDOW (win)) {
1239 /* Get focused widget */
1240 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1242 if (MODEST_IS_HEADER_VIEW (focused)) {
1244 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1246 modest_dimming_rule_set_notification (rule, "");
1249 dimmed = _selected_msg_sent_in_progress (win);
1251 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1254 dimmed = state->already_opened_msg;
1256 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1259 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1260 TnyFolderType types[3];
1262 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1263 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1264 types[2] = TNY_FOLDER_TYPE_SENT;
1266 /* Apply folder rules */
1268 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
1270 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
1273 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1275 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1278 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1280 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1289 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1291 ModestDimmingRule *rule = NULL;
1292 const DimmedState *state = NULL;
1293 gboolean dimmed = FALSE;
1295 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1296 rule = MODEST_DIMMING_RULE (user_data);
1297 state = modest_window_get_dimming_state (win);
1299 /* Check common dimming rules */
1301 dimmed = _invalid_clipboard_selected (win, rule);
1304 /* Check window specific dimming rules */
1305 if (MODEST_IS_MAIN_WINDOW (win)) {
1306 /* Get focused widget */
1307 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1309 if (MODEST_IS_HEADER_VIEW (focused)) {
1311 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1313 modest_dimming_rule_set_notification (rule, "");
1316 dimmed = _selected_msg_sent_in_progress (win);
1318 modest_dimming_rule_set_notification (rule, _(""));
1321 dimmed = state->already_opened_msg;
1323 modest_dimming_rule_set_notification (rule, _(""));
1326 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1327 TnyFolderType types[3];
1329 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1330 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1331 types[2] = TNY_FOLDER_TYPE_SENT;
1334 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1336 modest_dimming_rule_set_notification (rule, _(""));
1339 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1341 modest_dimming_rule_set_notification (rule, _(""));
1350 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1352 ModestDimmingRule *rule = NULL;
1353 gboolean dimmed = FALSE;
1355 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1356 rule = MODEST_DIMMING_RULE (user_data);
1358 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1360 /* Check dimmed rule */
1362 dimmed = _transfer_mode_enabled (win);
1364 modest_dimming_rule_set_notification (
1365 rule, _("mail_ib_notavailable_downloading"));
1368 dimmed = modest_msg_view_window_first_message_selected (
1369 MODEST_MSG_VIEW_WINDOW(win));
1370 modest_dimming_rule_set_notification (rule, NULL);
1377 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1379 ModestDimmingRule *rule = NULL;
1380 gboolean dimmed = FALSE;
1382 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1383 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1384 rule = MODEST_DIMMING_RULE (user_data);
1386 /* Check dimmed rule */
1388 dimmed = _transfer_mode_enabled (win);
1390 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1393 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1394 modest_dimming_rule_set_notification (rule, NULL);
1402 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1404 const gboolean dimmed =
1405 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1412 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1414 ModestDimmingRule *rule = NULL;
1415 TnyFolderType types[1];
1416 const DimmedState *state = NULL;
1417 gboolean dimmed = FALSE;
1419 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1420 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1421 rule = MODEST_DIMMING_RULE (user_data);
1422 state = modest_window_get_dimming_state (win);
1424 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1426 /* Check dimmed rules */
1428 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1430 modest_dimming_rule_set_notification (rule, "");
1433 dimmed = !_sending_in_progress (win);
1435 modest_dimming_rule_set_notification (rule, "");
1442 modest_ui_dimming_rules_on_csm_cancel_sending (ModestWindow *win, gpointer user_data)
1444 ModestDimmingRule *rule = NULL;
1445 TnyFolderType types[1];
1446 const DimmedState *state = NULL;
1447 gboolean dimmed = FALSE;
1449 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1450 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1451 rule = MODEST_DIMMING_RULE (user_data);
1452 state = modest_window_get_dimming_state (win);
1454 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1456 /* Check dimmed rules */
1458 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1460 modest_dimming_rule_set_notification (rule, "");
1463 dimmed = !_send_receive_in_progress (win);
1465 modest_dimming_rule_set_notification (rule, "");
1472 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1474 ModestDimmingRule *rule = NULL;
1475 gboolean dimmed = FALSE;
1477 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1478 rule = MODEST_DIMMING_RULE (user_data);
1480 /* Check dimmed rule */
1482 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1485 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1492 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1494 ModestDimmingRule *rule = NULL;
1495 gboolean dimmed = FALSE;
1497 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1498 rule = MODEST_DIMMING_RULE (user_data);
1500 /* Check dimmed rule */
1502 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1503 gchar *selection = NULL;
1504 selection = gtk_clipboard_wait_for_text (clipboard);
1506 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1512 /* *********************** static utility functions ******************** */
1516 _selected_folder_not_writeable (ModestMainWindow *win,
1519 GtkWidget *folder_view = NULL;
1520 TnyFolderStore *parent_folder = NULL;
1521 ModestEmailClipboard *clipboard = NULL;
1522 ModestTnyFolderRules rules;
1523 gboolean is_local_acc = FALSE;
1524 gboolean xfer_folders = FALSE;
1525 gboolean result = FALSE;
1527 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1529 /* Get folder view */
1530 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1531 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1532 /* If no folder view, always dimmed */
1536 /* Get selected folder as parent of new folder to create */
1537 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1538 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1539 /* If it's the local account and its transfering folders, then do not dim */
1540 if (TNY_IS_ACCOUNT (parent_folder)) {
1541 is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
1543 clipboard = modest_runtime_get_email_clipboard ();
1544 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
1549 result = !(is_local_acc && xfer_folders);
1551 result = !is_local_acc;
1555 /* Check dimmed rule */
1556 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1557 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1561 if (parent_folder != NULL)
1562 g_object_unref (parent_folder);
1568 _selected_folder_not_deletable (ModestMainWindow *win)
1570 GtkWidget *folder_view = NULL;
1571 TnyFolderStore *parent_folder = NULL;
1572 ModestTnyFolderRules rules;
1573 gboolean result = FALSE;
1575 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1577 /* Get folder view */
1578 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1579 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1580 /* If no folder view, always dimmed */
1584 /* Get selected folder as parent of new folder to create */
1585 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1586 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1591 /* Check dimmed rule */
1592 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1593 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
1597 if (parent_folder != NULL)
1598 g_object_unref (parent_folder);
1604 _selected_folder_not_moveable (ModestMainWindow *win)
1606 GtkWidget *folder_view = NULL;
1607 TnyFolderStore *parent_folder = NULL;
1608 ModestTnyFolderRules rules;
1609 gboolean result = FALSE;
1611 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1613 /* Get folder view */
1614 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1615 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1616 /* If no folder view, always dimmed */
1620 /* Get selected folder as parent of new folder to create */
1621 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1622 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1627 /* Check dimmed rule */
1628 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1629 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
1633 if (parent_folder != NULL)
1634 g_object_unref (parent_folder);
1640 _selected_folder_not_renameable (ModestMainWindow *win)
1642 GtkWidget *folder_view = NULL;
1643 TnyFolderStore *parent_folder = NULL;
1644 ModestTnyFolderRules rules;
1645 gboolean result = FALSE;
1647 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1649 /* Get folder view */
1650 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1651 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1652 /* If no folder view, always dimmed */
1656 /* Get selected folder as parent of new folder to create */
1657 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1658 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1663 /* Check dimmed rule */
1664 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1665 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
1669 if (parent_folder != NULL)
1670 g_object_unref (parent_folder);
1676 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1678 TnyFolderType types[2];
1679 gboolean result = FALSE;
1681 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1683 types[0] = TNY_FOLDER_TYPE_ROOT;
1684 types[1] = TNY_FOLDER_TYPE_INBOX;
1686 /* Check folder type */
1687 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
1689 /* Check pop and MMC accounts */
1691 result = _selected_folder_is_MMC_or_POP_root (win);
1699 _selected_folder_is_root (ModestMainWindow *win)
1701 TnyFolderType types[1];
1702 gboolean result = FALSE;
1704 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1706 /* All accounts are root items: */
1707 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1708 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1710 gboolean is_account = FALSE;
1711 TnyFolderStore *folder_store =
1712 modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1714 is_account = TNY_IS_ACCOUNT (folder_store);
1715 g_object_unref (folder_store);
1716 folder_store = NULL;
1723 /* Try something more precise: */
1724 types[0] = TNY_FOLDER_TYPE_ROOT;
1726 /* Check folder type */
1727 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1729 /* Check pop and MMC accounts */
1731 result = _selected_folder_is_MMC_or_POP_root (win);
1738 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1740 GtkWidget *folder_view = NULL;
1741 TnyFolderStore *parent_folder = NULL;
1742 gboolean result = FALSE;
1744 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1745 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1749 /* Get selected folder as parent of new folder to create */
1750 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1754 if (TNY_IS_ACCOUNT (parent_folder)) {
1755 /* If it's the local account then do not dim */
1756 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1759 /* If it's the MMC root folder then dim it */
1760 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1763 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1764 /* If it's POP then dim */
1765 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
1766 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1770 g_object_unref (parent_folder);
1776 _header_view_is_all_selected (ModestMainWindow *win)
1778 const DimmedState *state = NULL;
1780 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1782 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
1784 return state->all_selected;
1788 _selected_folder_is_empty (ModestMainWindow *win)
1790 GtkWidget *folder_view = NULL;
1791 TnyFolderStore *folder = NULL;
1792 gboolean result = FALSE;
1794 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1796 /* Get folder view */
1797 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1798 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1799 /* If no folder view, always dimmed */
1803 /* Get selected folder as parent of new folder to create */
1804 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1805 if (!(folder && TNY_IS_FOLDER(folder))) {
1807 g_object_unref (folder);
1811 /* Check folder type */
1812 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
1815 g_object_unref (folder);
1821 _folder_view_has_focus (ModestWindow *win)
1823 GtkWidget *folder_view = NULL;
1825 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1827 /* Get folder view */
1828 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1829 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1833 if (gtk_widget_is_focus(folder_view))
1840 _selected_folder_is_same_as_source (ModestWindow *win)
1842 ModestEmailClipboard *clipboard = NULL;
1843 GtkWidget *folder_view = NULL;
1844 TnyFolderStore *folder = NULL;
1845 gboolean result = FALSE;
1847 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1849 /* Get folder view */
1850 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1851 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1855 /* Get selected folder as destination folder */
1856 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1857 if (!(folder && TNY_IS_FOLDER(folder))) {
1862 /* Check clipboard is cleared */
1863 clipboard = modest_runtime_get_email_clipboard ();
1864 if (modest_email_clipboard_cleared (clipboard)) {
1869 /* Check source folder */
1870 result = modest_email_clipboard_check_source_folder (clipboard,
1871 (const TnyFolder *) folder);
1875 g_object_unref (folder);
1881 _selected_folder_is_any_of_type (ModestWindow *win,
1882 TnyFolderType types[],
1885 GtkWidget *folder_view = NULL;
1886 TnyFolderStore *folder = NULL;
1887 TnyFolderType folder_type;
1889 gboolean result = FALSE;
1891 /*Get current folder */
1892 if (MODEST_IS_MAIN_WINDOW(win)) {
1894 /* Get folder view */
1895 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1896 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1897 /* If no folder view, always dimmed */
1901 /* Get selected folder as parent of new folder to create */
1902 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1904 if (!(folder && TNY_IS_FOLDER(folder))) {
1906 g_object_unref (folder);
1910 /* Check folder type */
1911 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
1913 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1914 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1915 for (i=0; i < ntypes; i++) {
1916 result = result || folder_type == types[i];
1922 g_object_unref (folder);
1928 _folder_is_any_of_type (TnyFolder *folder,
1929 TnyFolderType types[],
1932 TnyFolderType folder_type;
1933 gboolean result = FALSE;
1936 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
1938 /* Get folder type */
1939 folder_type = modest_tny_folder_guess_folder_type (folder);
1941 /* Check foler type */
1942 for (i=0; i < ntypes; i++) {
1943 result = result || folder_type == types[i];
1950 _clipboard_is_empty (ModestWindow *win)
1952 gboolean result = FALSE;
1954 if (MODEST_IS_MAIN_WINDOW (win)) {
1955 ModestEmailClipboard *clipboard = NULL;
1956 clipboard = modest_runtime_get_email_clipboard ();
1957 if (modest_email_clipboard_cleared (clipboard))
1965 _invalid_clipboard_selected (ModestWindow *win,
1966 ModestDimmingRule *rule)
1968 const DimmedState *state = NULL;
1969 gboolean result = FALSE;
1971 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1972 state = modest_window_get_dimming_state (win);
1974 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1975 GtkClipboard *clipboard = NULL;
1976 gchar *selection = NULL;
1977 GtkWidget *focused = NULL;
1979 /* Get clipboard selection*/
1980 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1981 selection = gtk_clipboard_wait_for_text (clipboard);
1983 /* Get focuesed widget */
1984 focused = gtk_window_get_focus (GTK_WINDOW (win));
1987 result = ((selection == NULL) ||
1988 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
1991 modest_dimming_rule_set_notification (rule, "");
1993 if (selection != NULL)
1996 else if (MODEST_IS_MAIN_WINDOW (win)) {
1998 result = state->n_selected == 0;
2000 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2008 _invalid_attach_selected (ModestWindow *win,
2011 gboolean for_remove,
2012 ModestDimmingRule *rule)
2014 GList *attachments, *node;
2016 TnyHeaderFlags flags;
2017 gboolean nested_attachments = FALSE;
2018 gboolean selected_messages = FALSE;
2019 const DimmedState *state = NULL;
2020 gboolean result = FALSE;
2022 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2023 state = modest_window_get_dimming_state (win);
2025 if (MODEST_IS_MAIN_WINDOW (win)) {
2026 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2028 result = !state->any_has_attachments;
2030 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2032 /* Get selected atachments */
2033 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2034 n_selected = g_list_length (attachments);
2039 result = n_selected != 1;
2042 result = n_selected < 1;
2045 /* Check attached type (view operation not required) */
2046 if (!result && !for_view) {
2047 for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
2048 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
2049 TnyList *nested_list = tny_simple_list_new ();
2050 if (!for_remove && TNY_IS_MSG (mime_part)) {
2051 selected_messages = TRUE;
2054 tny_mime_part_get_parts (mime_part, nested_list);
2055 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2056 nested_attachments = TRUE;
2059 g_object_unref (nested_list);
2063 /* Set notifications */
2064 if (result && rule != NULL) {
2065 if (selected_messages) {
2066 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2067 } else if (nested_attachments) {
2068 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2069 } else if (n_selected == 0) {
2070 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2071 } else if (unique) {
2072 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2077 g_list_free (attachments);
2084 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule)
2086 GList *attachments = NULL, *node;
2088 gint n_attachments = 0;
2089 gboolean result = FALSE;
2091 /* This should check if _all_ the attachments are already purged. If only some
2092 * of them are purged, then it does not cause dim as there's a confirmation dialog
2093 * for removing only local attachments */
2095 /* Get selected atachments */
2096 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2097 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2098 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2099 /* If we're in main window, we won't know if there are already purged attachments */
2103 if (attachments == NULL)
2106 for (node = attachments; node != NULL; node = g_list_next (node)) {
2107 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
2108 if (tny_mime_part_is_purged (mime_part)) {
2115 g_list_free (attachments);
2118 result = (purged == n_attachments);
2120 result = (purged > 0);
2122 if (result && (rule != NULL))
2123 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2129 _invalid_msg_selected (ModestMainWindow *win,
2131 ModestDimmingRule *rule)
2133 GtkWidget *folder_view = NULL;
2134 const DimmedState *state = NULL;
2135 gboolean result = FALSE;
2137 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2138 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2139 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2141 /* Get folder view to check focus */
2142 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2143 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2145 /* Check dimmed rule (TODO: check focus on widgets */
2147 result = ((state->n_selected == 0 ) ||
2148 (gtk_widget_is_focus (folder_view)));
2150 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2152 if (!result && unique) {
2153 result = state->n_selected > 1;
2155 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2163 _msg_download_in_progress (ModestWindow *win)
2165 gboolean result = FALSE;
2167 g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2169 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2170 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2172 else if (MODEST_IS_MAIN_WINDOW (win)) {
2173 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2180 _msg_download_completed (ModestMainWindow *win)
2182 const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2183 return state->any_marked_as_cached;
2187 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2189 GSList **send_queues = (GSList **) userdata;
2190 *send_queues = g_slist_prepend (*send_queues, value);
2194 _selected_msg_sent_in_progress (ModestWindow *win)
2196 const DimmedState *state = modest_window_get_dimming_state (win);
2197 return state->sent_in_progress;
2202 _sending_in_progress (ModestWindow *win)
2204 GHashTable *send_queue_cache = NULL;
2205 ModestCacheMgr *cache_mgr = NULL;
2206 ModestTnySendQueue *send_queue = NULL;
2207 GSList *send_queues = NULL, *node = NULL;
2208 gboolean result = FALSE;
2210 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
2212 /* Get send queue */
2213 cache_mgr = modest_runtime_get_cache_mgr ();
2214 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
2215 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
2217 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
2219 for (node = send_queues; node != NULL && !result; node = g_slist_next (node)) {
2220 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
2222 /* Check if send operation is in progress */
2223 result = modest_tny_send_queue_sending_in_progress (send_queue);
2230 _send_receive_in_progress (ModestWindow *win)
2232 gboolean result = FALSE;
2234 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
2236 /* Check if send operation is in progress */
2237 result = modest_main_window_send_receive_in_progress (MODEST_MAIN_WINDOW (win));
2243 _invalid_folder_for_purge (ModestWindow *win,
2244 ModestDimmingRule *rule)
2247 TnyFolder *folder = NULL;
2248 TnyAccount *account = NULL;
2249 gboolean result = FALSE;
2251 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2253 /* Get folder and account of message */
2254 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2255 g_return_val_if_fail(msg != NULL, TRUE);
2256 folder = tny_msg_get_folder (msg);
2257 if (folder == NULL) {
2258 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2261 g_object_unref (msg);
2262 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2263 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2264 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2267 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
2268 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2271 g_return_val_if_reached (FALSE);
2273 account = modest_tny_folder_get_account (folder);
2274 if (account == NULL) goto frees;
2277 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2278 TnyFolderType types[2];
2279 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2280 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2282 if (_selected_folder_is_any_of_type (win, types, 2)) {
2284 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
2286 /* We're currently disabling purge in any local store */
2288 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2291 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2292 /* If it's POP then dim */
2293 if (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2294 MODEST_PROTOCOL_STORE_POP) {
2295 GList *attachments = NULL;
2296 gint n_selected = 0;
2299 /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
2301 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2302 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2303 n_selected = g_list_length (attachments);
2304 g_list_free (attachments);
2307 modest_dimming_rule_set_notification (rule,
2308 ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
2309 "mail_ib_unable_to_pure_attach_pop_mail_plural",
2316 g_object_unref (folder);
2317 if (account != NULL)
2318 g_object_unref (account);
2324 _transfer_mode_enabled (ModestWindow *win)
2326 gboolean result = FALSE;
2329 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2330 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2331 } else if (MODEST_IS_MAIN_WINDOW(win)) {
2332 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2334 g_warning("_transfer_mode_enabled called with wrong window type");
2341 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2343 GtkWidget *folder_view = NULL;
2344 TnyFolderStore *folder = NULL;
2345 ModestEmailClipboard *clipboard = NULL;
2346 const gchar *folder_name = NULL;
2347 gboolean result = FALSE;
2349 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2351 /*Get current parent folder */
2352 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2353 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2354 /* If no folder view, always dimmed */
2355 if (!folder_view) return FALSE;
2357 /* Get selected folder as parent of new folder to create */
2358 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2359 if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
2361 /* get modest clipboard and source folder */
2362 clipboard = modest_runtime_get_email_clipboard ();
2363 folder_name = modest_email_clipboard_get_folder_name (clipboard);
2364 if (folder_name == NULL) goto frees;
2366 /* Check source subfolders names */
2367 result = modest_tny_folder_has_subfolder_with_name (folder, folder_name);
2373 g_object_unref (folder);