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_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
57 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
58 static gboolean _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win);
59 static gboolean _selected_folder_is_root (ModestMainWindow *win);
60 static gboolean _header_view_is_all_selected (ModestMainWindow *win);
61 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
62 static gboolean _folder_view_has_focus (ModestWindow *win);
63 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
64 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
65 static gboolean _msg_download_completed (ModestMainWindow *win);
66 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
67 static gboolean _sending_in_progress (ModestWindow *win);
68 /* static gboolean _message_is_marked_as_deleted (ModestMsgViewWindow *win); */
69 /* static gboolean _selected_message_is_marked_as_deleted (ModestMainWindow *win); */
70 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
71 static gboolean _transfer_mode_enabled (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_MSG_VIEW_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 */
331 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
333 modest_dimming_rule_set_notification (rule, "");
340 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
342 ModestDimmingRule *rule = NULL;
343 GtkWidget *folder_view = NULL;
344 TnyFolderStore *parent_folder = NULL;
345 gboolean dimmed = FALSE;
347 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
348 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
349 rule = MODEST_DIMMING_RULE (user_data);
351 /* Get selected folder as parent of new folder to create */
352 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
353 MODEST_WIDGET_TYPE_FOLDER_VIEW);
354 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
358 if (TNY_IS_ACCOUNT (parent_folder)) {
359 /* If it's the local account then do not dim */
360 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
363 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
364 /* If it's POP then dim */
365 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
366 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
368 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
371 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
373 TnyFolderType types[3];
375 types[0] = TNY_FOLDER_TYPE_DRAFTS;
376 types[1] = TNY_FOLDER_TYPE_OUTBOX;
377 types[2] = TNY_FOLDER_TYPE_SENT;
379 /* Apply folder rules */
381 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
383 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
386 dimmed = _selected_folder_is_any_of_type (win, types, 3);
388 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
391 g_object_unref (parent_folder);
397 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
399 ModestDimmingRule *rule = NULL;
400 GtkWidget *folder_view = NULL;
401 GtkWidget *header_view = NULL;
402 gboolean dimmed = FALSE;
404 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
405 rule = MODEST_DIMMING_RULE (user_data);
407 if (MODEST_IS_MAIN_WINDOW (win)) {
408 /* Get the folder view */
409 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
410 MODEST_WIDGET_TYPE_FOLDER_VIEW);
412 /* Get header view */
413 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
414 MODEST_WIDGET_TYPE_HEADER_VIEW);
416 if (header_view && gtk_widget_is_focus (header_view))
417 dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
419 if (folder_view && gtk_widget_is_focus (folder_view))
420 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
422 if (header_view && folder_view &&
423 !gtk_widget_is_focus (header_view) &&
424 !gtk_widget_is_focus (folder_view)) {
426 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));
429 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
438 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
440 ModestDimmingRule *rule = NULL;
441 TnyFolderType types[6];
442 gboolean dimmed = FALSE;
444 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
445 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
446 rule = MODEST_DIMMING_RULE (user_data);
448 types[0] = TNY_FOLDER_TYPE_DRAFTS;
449 types[1] = TNY_FOLDER_TYPE_OUTBOX;
450 types[2] = TNY_FOLDER_TYPE_SENT;
451 types[3] = TNY_FOLDER_TYPE_INBOX;
452 types[4] = TNY_FOLDER_TYPE_ROOT;
453 types[5] = TNY_FOLDER_TYPE_ARCHIVE;
456 /* Check dimmed rule */
458 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
460 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
463 dimmed = _selected_folder_is_any_of_type (win, types, 6);
465 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
468 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
470 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
473 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
475 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
478 dimmed = _transfer_mode_enabled (win);
480 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
487 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
489 ModestDimmingRule *rule = NULL;
490 gboolean dimmed = FALSE;
492 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
493 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
494 rule = MODEST_DIMMING_RULE (user_data);
496 /* Check dimmed rule */
498 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
499 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
503 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
504 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
512 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
514 ModestDimmingRule *rule = NULL;
515 TnyFolderType types[4];
516 gboolean dimmed = FALSE;
518 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
519 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
520 rule = MODEST_DIMMING_RULE (user_data);
522 types[0] = TNY_FOLDER_TYPE_DRAFTS;
523 types[1] = TNY_FOLDER_TYPE_OUTBOX;
524 types[2] = TNY_FOLDER_TYPE_SENT;
525 types[3] = TNY_FOLDER_TYPE_ARCHIVE;
527 /* Check dimmed rule */
529 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
531 modest_dimming_rule_set_notification (rule, "");
534 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
536 modest_dimming_rule_set_notification (rule, "");
539 dimmed = _selected_folder_is_any_of_type (win, types, 4);
541 modest_dimming_rule_set_notification (rule, "");
548 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
550 ModestDimmingRule *rule = NULL;
551 gboolean dimmed = FALSE;
552 const DimmedState *state = NULL;
554 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
555 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
556 rule = MODEST_DIMMING_RULE (user_data);
557 state = modest_window_get_dimming_state (win);
559 /* Check dimmed rule */
561 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
564 dimmed = state->any_marked_as_deleted;
566 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
569 dimmed = _selected_msg_sent_in_progress (win);
571 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
578 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
580 ModestDimmingRule *rule = NULL;
581 gboolean dimmed = FALSE;
582 TnyFolderType types[3];
584 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
585 rule = MODEST_DIMMING_RULE (user_data);
587 /* main window dimming rules */
588 if (MODEST_IS_MAIN_WINDOW(win)) {
590 types[0] = TNY_FOLDER_TYPE_DRAFTS;
591 types[1] = TNY_FOLDER_TYPE_OUTBOX;
592 types[2] = TNY_FOLDER_TYPE_ROOT;
594 /* Check dimmed rule */
596 dimmed = _selected_folder_is_any_of_type (win, types, 3);
598 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
601 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
603 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
606 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
608 /* msg view window dimming rules */
609 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
611 /* Check dimmed rule */
613 dimmed = _transfer_mode_enabled (win);
615 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
618 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
620 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
629 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
631 ModestDimmingRule *rule = NULL;
632 gboolean dimmed = FALSE;
634 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
635 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
636 rule = MODEST_DIMMING_RULE (user_data);
638 /* Check dimmed rule */
640 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
643 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
645 modest_dimming_rule_set_notification (rule, "");
652 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
654 gboolean dimmed = FALSE;
656 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
658 /* Check dimmed rule */
666 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
668 ModestDimmingRule *rule = NULL;
669 guint n_messages = 0;
670 const DimmedState *state = NULL;
671 gboolean dimmed = FALSE;
673 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
674 rule = MODEST_DIMMING_RULE (user_data);
675 state = modest_window_get_dimming_state (win);
677 /* Check dimmed rule */
678 if (MODEST_IS_MAIN_WINDOW (win)) {
680 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
682 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
685 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
688 dimmed = state->already_opened_msg;
689 n_messages = state->n_selected;
691 gchar *num = g_strdup_printf ("%d", n_messages);
692 gchar *message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
693 modest_dimming_rule_set_notification (rule, message);
700 dimmed = state->any_marked_as_deleted;
702 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
706 dimmed = state->sent_in_progress;
708 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
711 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
713 dimmed = _transfer_mode_enabled (win);
715 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
718 dimmed = state->any_marked_as_deleted;
720 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
723 /* The delete button should be dimmed when viewing an attachment,
724 * but should be enabled when viewing a message from the list,
725 * or when viewing a search result.
728 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
729 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
731 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
741 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
743 ModestDimmingRule *rule = NULL;
744 GtkWidget *header_view = NULL;
745 gboolean dimmed = FALSE;
747 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
748 rule = MODEST_DIMMING_RULE (user_data);
750 /* main window dimming rules */
751 if (MODEST_IS_MAIN_WINDOW(win)) {
753 /* Check dimmed rule */
754 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
755 MODEST_WIDGET_TYPE_HEADER_VIEW);
757 /* If the header view has the focus: */
758 if (header_view && gtk_widget_is_focus (header_view)) {
759 /* Check dimmed rule */
761 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
764 /* If the folder view has the focus: */
765 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
766 MODEST_WIDGET_TYPE_FOLDER_VIEW);
767 if (folder_view && gtk_widget_is_focus (folder_view)) {
768 TnyFolderStore *folder_store
769 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
771 /* Only enable for folders, not accounts,
772 * though the UI spec is not clear about that.
773 * If we enable this for accounts then we must
774 * add code to handle them in modest_ui_actions_on_details(). */
775 if (!TNY_IS_FOLDER(folder_store)) {
777 modest_dimming_rule_set_notification (rule, "");
780 g_object_unref (folder_store);
786 /* msg view window dimming rules */
789 /* Check dimmed rule */
791 if (MODEST_IS_MSG_VIEW_WINDOW (win))
792 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW (win));
794 modest_dimming_rule_set_notification (rule, "");
803 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
805 ModestDimmingRule *rule = NULL;
806 TnyHeaderFlags flags;
807 const DimmedState *state = NULL;
808 gboolean dimmed = FALSE;
810 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
811 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
812 rule = MODEST_DIMMING_RULE (user_data);
813 state = modest_window_get_dimming_state (win);
815 flags = TNY_HEADER_FLAG_SEEN;
817 /* Check dimmed rule */
819 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
822 dimmed = state->all_marked_as_seen;
824 modest_dimming_rule_set_notification (rule, "");
831 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
833 ModestDimmingRule *rule = NULL;
834 TnyHeaderFlags flags;
835 const DimmedState *state = NULL;
836 gboolean dimmed = FALSE;
838 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
839 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
840 rule = MODEST_DIMMING_RULE (user_data);
841 state = modest_window_get_dimming_state (win);
843 flags = TNY_HEADER_FLAG_SEEN;
845 /* Check dimmed rule */
847 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
849 dimmed = !state->any_marked_as_seen;
851 modest_dimming_rule_set_notification (rule, "");
858 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
860 ModestDimmingRule *rule = NULL;
861 gboolean dimmed = FALSE;
863 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
864 rule = MODEST_DIMMING_RULE (user_data);
866 if (MODEST_IS_MAIN_WINDOW (win))
867 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
868 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
869 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
876 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
878 GtkWidget *folder_view = NULL;
879 ModestDimmingRule *rule = NULL;
880 guint n_messages = 0;
881 const DimmedState *state = NULL;
882 gboolean dimmed = FALSE;
884 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
885 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
886 rule = MODEST_DIMMING_RULE (user_data);
887 state = modest_window_get_dimming_state (win);
889 /* Get the folder view */
890 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
891 MODEST_WIDGET_TYPE_FOLDER_VIEW);
894 /* Check diming rules for folders transfer */
895 if (gtk_widget_is_focus (folder_view)) {
896 TnyFolderType types[5];
898 types[0] = TNY_FOLDER_TYPE_DRAFTS;
899 types[1] = TNY_FOLDER_TYPE_OUTBOX;
900 types[2] = TNY_FOLDER_TYPE_SENT;
901 types[3] = TNY_FOLDER_TYPE_ROOT;
902 types[4] = TNY_FOLDER_TYPE_INBOX;
904 /* Apply folder rules */
906 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
908 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
911 dimmed = _selected_folder_is_any_of_type (win, types, 5);
913 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
917 /* Check diming rules for messages transfer */
919 dimmed = state->already_opened_msg;
920 n_messages = state->n_selected;
922 gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"), n_messages);
923 modest_dimming_rule_set_notification (rule, message);
928 if (!gtk_widget_is_focus (folder_view))
929 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
937 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
939 ModestDimmingRule *rule = NULL;
940 gboolean dimmed = FALSE;
942 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
943 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
944 rule = MODEST_DIMMING_RULE (user_data);
946 /* Check dimmed rule */
948 dimmed = _transfer_mode_enabled (win);
950 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
954 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
955 /* The move_to button should be dimmed when viewing an attachment,
956 * but should be enabled when viewing a message from the list,
957 * or when viewing a search result.
959 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
960 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
965 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_move_mail_attachment"));
972 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
974 ModestDimmingRule *rule = NULL;
975 gboolean dimmed = FALSE;
977 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
978 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
979 rule = MODEST_DIMMING_RULE (user_data);
981 /* Check dimmed rule */
983 dimmed = _transfer_mode_enabled (win);
985 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
992 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
994 ModestDimmingRule *rule = NULL;
995 TnyFolderType types[3];
996 gboolean dimmed = FALSE;
998 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
999 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1000 rule = MODEST_DIMMING_RULE (user_data);
1002 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1003 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1004 types[2] = TNY_FOLDER_TYPE_SENT;
1006 /* Check dimmed rule */
1008 dimmed = _clipboard_is_empty (win);
1010 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ecoc_ib_edwin_nothing_to_paste"));
1013 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1015 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
1018 dimmed = !_folder_view_has_focus (win);
1020 modest_dimming_rule_set_notification (rule,
1021 dgettext("hildon-common-strings",
1022 "ckct_ib_unable_to_paste_here"));
1025 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
1027 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
1031 dimmed = _selected_folder_is_same_as_source (win);
1033 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_copy_samefolder"));
1041 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1043 ModestDimmingRule *rule = NULL;
1044 gboolean dimmed = FALSE;
1046 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1047 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1048 rule = MODEST_DIMMING_RULE (user_data);
1050 /* Check dimmed rule */
1052 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1055 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1058 modest_dimming_rule_set_notification (rule, "");
1064 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1066 ModestDimmingRule *rule = NULL;
1067 gboolean dimmed = FALSE;
1069 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1070 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1071 rule = MODEST_DIMMING_RULE (user_data);
1073 /* Check dimmed rule */
1075 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);
1078 dimmed = _purged_attach_selected (win, FALSE, NULL);
1080 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1088 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1090 ModestDimmingRule *rule = NULL;
1091 gboolean dimmed = FALSE;
1093 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1094 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1095 rule = MODEST_DIMMING_RULE (user_data);
1097 /* Check dimmed rule */
1099 dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1102 dimmed = _purged_attach_selected (win, FALSE, NULL);
1104 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1112 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1114 ModestDimmingRule *rule = NULL;
1115 const DimmedState *state = NULL;
1116 gboolean dimmed = FALSE;
1118 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1119 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1120 rule = MODEST_DIMMING_RULE (user_data);
1121 state = modest_window_get_dimming_state (win);
1123 /* Check in main window if there's only one message selected */
1124 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1125 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1128 /* Check in view window if there's any attachment selected */
1129 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1130 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1132 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1135 /* cannot purge in editable drafts nor pop folders */
1137 dimmed = _invalid_folder_for_purge (win, rule);
1140 /* Check if the selected message in main window has attachments */
1141 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1142 dimmed = state->any_has_attachments;
1144 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1147 /* Check if all attachments are already purged */
1149 dimmed = _purged_attach_selected (win, TRUE, rule);
1152 /* Check if the message is already downloaded */
1153 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1154 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1156 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1164 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1166 ModestDimmingRule *rule = NULL;
1167 gboolean dimmed = FALSE;
1169 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1170 rule = MODEST_DIMMING_RULE (user_data);
1172 /* Check dimmed rule */
1174 dimmed = _clipboard_is_empty (win);
1176 modest_dimming_rule_set_notification (rule, "");
1183 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1185 ModestDimmingRule *rule = NULL;
1186 gboolean dimmed = FALSE;
1188 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1189 rule = MODEST_DIMMING_RULE (user_data);
1191 /* Check common dimming rules */
1193 dimmed = _invalid_clipboard_selected (win, rule);
1196 /* Check window specific dimming rules */
1197 if (MODEST_IS_MAIN_WINDOW (win)) {
1198 /* Get focused widget */
1199 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1201 if (MODEST_IS_HEADER_VIEW (focused)) {
1203 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1205 modest_dimming_rule_set_notification (rule, "");
1208 dimmed = _selected_msg_sent_in_progress (win);
1210 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1213 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1214 TnyFolderType types[3];
1216 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1217 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1218 types[2] = TNY_FOLDER_TYPE_SENT;
1220 /* Apply folder rules */
1222 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
1224 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
1227 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1229 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1232 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1234 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1243 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1245 ModestDimmingRule *rule = NULL;
1246 gboolean dimmed = FALSE;
1248 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1249 rule = MODEST_DIMMING_RULE (user_data);
1251 /* Check common dimming rules */
1253 dimmed = _invalid_clipboard_selected (win, rule);
1256 /* Check window specific dimming rules */
1257 if (MODEST_IS_MAIN_WINDOW (win)) {
1258 /* Get focused widget */
1259 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1261 if (MODEST_IS_HEADER_VIEW (focused)) {
1263 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1265 modest_dimming_rule_set_notification (rule, "");
1268 dimmed = _selected_msg_sent_in_progress (win);
1270 modest_dimming_rule_set_notification (rule, _(""));
1273 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1275 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1277 modest_dimming_rule_set_notification (rule, _(""));
1286 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1288 ModestDimmingRule *rule = NULL;
1289 gboolean dimmed = FALSE;
1291 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1292 rule = MODEST_DIMMING_RULE (user_data);
1294 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1296 /* Check dimmed rule */
1298 dimmed = _transfer_mode_enabled (win);
1300 modest_dimming_rule_set_notification (
1301 rule, _("mail_ib_notavailable_downloading"));
1304 dimmed = modest_msg_view_window_first_message_selected (
1305 MODEST_MSG_VIEW_WINDOW(win));
1306 modest_dimming_rule_set_notification (rule, NULL);
1313 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1315 ModestDimmingRule *rule = NULL;
1316 gboolean dimmed = FALSE;
1318 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1319 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1320 rule = MODEST_DIMMING_RULE (user_data);
1322 /* Check dimmed rule */
1324 dimmed = _transfer_mode_enabled (win);
1326 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1329 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1330 modest_dimming_rule_set_notification (rule, NULL);
1338 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1340 const gboolean dimmed =
1341 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1348 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1350 ModestDimmingRule *rule = NULL;
1351 TnyFolderType types[1];
1352 guint n_messages = 0;
1353 const DimmedState *state = NULL;
1354 gboolean dimmed = FALSE;
1356 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1357 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1358 rule = MODEST_DIMMING_RULE (user_data);
1359 state = modest_window_get_dimming_state (win);
1361 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1363 /* Check dimmed rules */
1365 dimmed = state->already_opened_msg;
1366 n_messages = state->n_selected;
1368 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_cancel_send"));
1371 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1373 modest_dimming_rule_set_notification (rule, "");
1376 dimmed = !_sending_in_progress (win);
1378 modest_dimming_rule_set_notification (rule, "");
1385 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1387 ModestDimmingRule *rule = NULL;
1388 gboolean dimmed = FALSE;
1390 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1391 rule = MODEST_DIMMING_RULE (user_data);
1393 /* Check dimmed rule */
1395 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1398 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1405 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1407 ModestDimmingRule *rule = NULL;
1408 gboolean dimmed = FALSE;
1410 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1411 rule = MODEST_DIMMING_RULE (user_data);
1413 /* Check dimmed rule */
1415 GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1416 gchar *selection = NULL;
1417 selection = gtk_clipboard_wait_for_text (clipboard);
1419 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1425 /* *********************** static utility functions ******************** */
1429 _selected_folder_not_writeable (ModestMainWindow *win)
1431 GtkWidget *folder_view = NULL;
1432 TnyFolderStore *parent_folder = NULL;
1433 ModestTnyFolderRules rules;
1434 gboolean result = FALSE;
1436 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1438 /* Get folder view */
1439 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1440 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1441 /* If no folder view, always dimmed */
1445 /* Get selected folder as parent of new folder to create */
1446 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1447 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1449 g_object_unref (parent_folder);
1453 /* Check dimmed rule */
1454 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1455 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1458 g_object_unref (parent_folder);
1464 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1466 TnyFolderType types[2];
1467 gboolean result = FALSE;
1469 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1471 types[0] = TNY_FOLDER_TYPE_ROOT;
1472 types[1] = TNY_FOLDER_TYPE_INBOX;
1474 /* Check folder type */
1475 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
1477 /* Check pop and MMC accounts */
1479 result = _selected_folder_is_MMC_or_POP_root (win);
1487 _selected_folder_is_root (ModestMainWindow *win)
1489 TnyFolderType types[1];
1490 gboolean result = FALSE;
1492 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1494 /* All accounts are root items: */
1495 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1496 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1498 gboolean is_account = FALSE;
1499 TnyFolderStore *folder_store =
1500 modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1502 is_account = TNY_IS_ACCOUNT (folder_store);
1503 g_object_unref (folder_store);
1504 folder_store = NULL;
1511 /* Try something more precise: */
1512 types[0] = TNY_FOLDER_TYPE_ROOT;
1514 /* Check folder type */
1515 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
1517 /* Check pop and MMC accounts */
1519 result = _selected_folder_is_MMC_or_POP_root (win);
1526 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
1528 GtkWidget *folder_view = NULL;
1529 TnyFolderStore *parent_folder = NULL;
1530 gboolean result = FALSE;
1532 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1533 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1537 /* Get selected folder as parent of new folder to create */
1538 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1542 if (TNY_IS_ACCOUNT (parent_folder)) {
1543 /* If it's the local account then do not dim */
1544 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
1547 /* If it's the MMC root folder then dim it */
1548 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
1551 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
1552 /* If it's POP then dim */
1553 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
1554 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
1558 g_object_unref (parent_folder);
1564 _header_view_is_all_selected (ModestMainWindow *win)
1566 const DimmedState *state = NULL;
1568 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1570 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
1572 return state->all_selected;
1576 _selected_folder_is_empty (ModestMainWindow *win)
1578 GtkWidget *folder_view = NULL;
1579 TnyFolderStore *folder = NULL;
1580 gboolean result = FALSE;
1582 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1584 /* Get folder view */
1585 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1586 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1587 /* If no folder view, always dimmed */
1591 /* Get selected folder as parent of new folder to create */
1592 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1593 if (!(folder && TNY_IS_FOLDER(folder))) {
1595 g_object_unref (folder);
1599 /* Check folder type */
1600 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
1603 g_object_unref (folder);
1609 _folder_view_has_focus (ModestWindow *win)
1611 GtkWidget *folder_view = NULL;
1613 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1615 /* Get folder view */
1616 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1617 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1621 if (gtk_widget_is_focus(folder_view))
1628 _selected_folder_is_same_as_source (ModestWindow *win)
1630 ModestEmailClipboard *clipboard = NULL;
1631 GtkWidget *folder_view = NULL;
1632 TnyFolderStore *folder = NULL;
1633 gboolean result = FALSE;
1635 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1637 /* Get folder view */
1638 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1639 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1643 /* Get selected folder as destination folder */
1644 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1645 if (!(folder && TNY_IS_FOLDER(folder))) {
1650 /* Check clipboard is cleared */
1651 clipboard = modest_runtime_get_email_clipboard ();
1652 if (modest_email_clipboard_cleared (clipboard)) {
1657 /* Check source folder */
1658 result = modest_email_clipboard_check_source_folder (clipboard,
1659 (const TnyFolder *) folder);
1663 g_object_unref (folder);
1669 _selected_folder_is_any_of_type (ModestWindow *win,
1670 TnyFolderType types[],
1673 GtkWidget *folder_view = NULL;
1674 TnyFolderStore *folder = NULL;
1675 TnyFolderType folder_type;
1677 gboolean result = FALSE;
1679 /*Get current folder */
1680 if (MODEST_IS_MAIN_WINDOW(win)) {
1682 /* Get folder view */
1683 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1684 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1685 /* If no folder view, always dimmed */
1689 /* Get selected folder as parent of new folder to create */
1690 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1692 if (!(folder && TNY_IS_FOLDER(folder))) {
1694 g_object_unref (folder);
1698 /* Check folder type */
1699 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
1701 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1702 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
1703 for (i=0; i < ntypes; i++) {
1704 result = result || folder_type == types[i];
1710 g_object_unref (folder);
1716 _folder_is_any_of_type (TnyFolder *folder,
1717 TnyFolderType types[],
1720 TnyFolderType folder_type;
1721 gboolean result = FALSE;
1724 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
1726 /* Get folder type */
1727 folder_type = modest_tny_folder_guess_folder_type (folder);
1729 /* Check foler type */
1730 for (i=0; i < ntypes; i++) {
1731 result = result || folder_type == types[i];
1738 _clipboard_is_empty (ModestWindow *win)
1740 gboolean result = FALSE;
1742 if (MODEST_IS_MAIN_WINDOW (win)) {
1743 ModestEmailClipboard *clipboard = NULL;
1744 clipboard = modest_runtime_get_email_clipboard ();
1745 if (modest_email_clipboard_cleared (clipboard))
1753 _invalid_clipboard_selected (ModestWindow *win,
1754 ModestDimmingRule *rule)
1756 const DimmedState *state = NULL;
1757 gboolean result = FALSE;
1759 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1760 state = modest_window_get_dimming_state (win);
1762 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1763 GtkClipboard *clipboard = NULL;
1764 gchar *selection = NULL;
1765 GtkWidget *focused = NULL;
1767 /* Get clipboard selection*/
1768 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1769 selection = gtk_clipboard_wait_for_text (clipboard);
1771 /* Get focuesed widget */
1772 focused = gtk_window_get_focus (GTK_WINDOW (win));
1775 result = ((selection == NULL) ||
1776 (MODEST_IS_ATTACHMENTS_VIEW (focused)));
1779 modest_dimming_rule_set_notification (rule, "");
1781 if (selection != NULL)
1784 else if (MODEST_IS_MAIN_WINDOW (win)) {
1786 result = state->n_selected == 0;
1788 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1796 _invalid_attach_selected (ModestWindow *win,
1799 gboolean for_remove,
1800 ModestDimmingRule *rule)
1802 GList *attachments, *node;
1804 TnyHeaderFlags flags;
1805 gboolean nested_attachments = FALSE;
1806 gboolean selected_messages = FALSE;
1807 const DimmedState *state = NULL;
1808 gboolean result = FALSE;
1810 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1811 state = modest_window_get_dimming_state (win);
1813 if (MODEST_IS_MAIN_WINDOW (win)) {
1814 flags = TNY_HEADER_FLAG_ATTACHMENTS;
1816 result = !state->any_has_attachments;
1818 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1820 /* Get selected atachments */
1821 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1822 n_selected = g_list_length (attachments);
1827 result = n_selected != 1;
1830 result = n_selected < 1;
1833 /* Check attached type (view operation not required) */
1834 if (!result && !for_view) {
1835 for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
1836 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1837 TnyList *nested_list = tny_simple_list_new ();
1838 if (!for_remove && TNY_IS_MSG (mime_part)) {
1839 selected_messages = TRUE;
1842 tny_mime_part_get_parts (mime_part, nested_list);
1843 if (!for_remove && tny_list_get_length (nested_list) > 0) {
1844 nested_attachments = TRUE;
1847 g_object_unref (nested_list);
1851 /* Set notifications */
1852 if (result && rule != NULL) {
1853 if (selected_messages) {
1854 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
1855 } else if (nested_attachments) {
1856 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
1857 } else if (n_selected == 0) {
1858 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1859 } else if (unique) {
1860 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
1865 g_list_free (attachments);
1872 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule)
1874 GList *attachments = NULL, *node;
1876 gint n_attachments = 0;
1877 gboolean result = FALSE;
1879 /* This should check if _all_ the attachments are already purged. If only some
1880 * of them are purged, then it does not cause dim as there's a confirmation dialog
1881 * for removing only local attachments */
1883 /* Get selected atachments */
1884 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1885 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1886 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1887 /* If we're in main window, we won't know if there are already purged attachments */
1891 if (attachments == NULL)
1894 for (node = attachments; node != NULL; node = g_list_next (node)) {
1895 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
1896 if (tny_mime_part_is_purged (mime_part)) {
1903 g_list_free (attachments);
1906 result = (purged == n_attachments);
1908 result = (purged > 0);
1910 if (result && (rule != NULL))
1911 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
1917 _invalid_msg_selected (ModestMainWindow *win,
1919 ModestDimmingRule *rule)
1921 GtkWidget *folder_view = NULL;
1922 const DimmedState *state = NULL;
1923 gboolean result = FALSE;
1925 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1926 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
1927 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
1929 /* Get folder view to check focus */
1930 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1931 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1933 /* Check dimmed rule (TODO: check focus on widgets */
1935 result = ((state->n_selected == 0 ) ||
1936 (gtk_widget_is_focus (folder_view)));
1938 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
1940 if (!result && unique) {
1941 result = state->n_selected > 1;
1943 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
1951 _msg_download_in_progress (ModestMsgViewWindow *win)
1953 gboolean result = FALSE;
1955 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
1957 result = modest_msg_view_window_toolbar_on_transfer_mode (win);
1963 _msg_download_completed (ModestMainWindow *win)
1965 const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
1966 return state->any_marked_as_cached;
1970 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
1972 GSList **send_queues = (GSList **) userdata;
1973 *send_queues = g_slist_prepend (*send_queues, value);
1977 _selected_msg_sent_in_progress (ModestWindow *win)
1979 const DimmedState *state = modest_window_get_dimming_state (win);
1980 return state->sent_in_progress;
1985 _sending_in_progress (ModestWindow *win)
1987 gboolean result = FALSE;
1989 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
1991 /* Check if send operation is in progress */
1992 result = modest_main_window_send_receive_in_progress (MODEST_MAIN_WINDOW (win));
1998 _invalid_folder_for_purge (ModestWindow *win,
1999 ModestDimmingRule *rule)
2002 TnyFolder *folder = NULL;
2003 TnyAccount *account = NULL;
2004 gboolean result = FALSE;
2006 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2008 /* Get folder and account of message */
2009 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2010 g_return_val_if_fail(msg != NULL, TRUE);
2011 folder = tny_msg_get_folder (msg);
2012 if (folder == NULL) {
2013 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2016 g_object_unref (msg);
2017 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2018 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2019 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2022 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
2023 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2026 g_return_val_if_reached (FALSE);
2028 account = modest_tny_folder_get_account (folder);
2029 if (account == NULL) goto frees;
2032 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2033 TnyFolderType types[2];
2034 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2035 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2037 if (_selected_folder_is_any_of_type (win, types, 2)) {
2039 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
2041 /* We're currently disabling purge in any local store */
2043 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2046 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2047 /* If it's POP then dim */
2048 if (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2049 MODEST_PROTOCOL_STORE_POP) {
2050 GList *attachments = NULL;
2051 gint n_selected = 0;
2054 /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
2056 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2057 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2058 n_selected = g_list_length (attachments);
2059 g_list_free (attachments);
2062 modest_dimming_rule_set_notification (rule,
2063 ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
2064 "mail_ib_unable_to_pure_attach_pop_mail_plural",
2071 g_object_unref (folder);
2072 if (account != NULL)
2073 g_object_unref (account);
2079 _transfer_mode_enabled (ModestWindow *win)
2081 gboolean result = FALSE;
2084 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2085 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2086 } else if (MODEST_IS_MAIN_WINDOW(win)) {
2087 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2089 g_warning("_transfer_mode_enabled called with wrong window type");