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-debug.h"
38 #include "modest-tny-folder.h"
39 #include "modest-tny-account.h"
40 #include "modest-text-utils.h"
41 #include <widgets/modest-attachments-view.h>
42 #include <modest-runtime.h>
43 #include <tny-simple-list.h>
44 #include <widgets/modest-recpt-editor.h>
45 #include <gtkhtml/gtkhtml.h>
48 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
49 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
50 static gboolean _invalid_attach_selected (ModestWindow *win,
51 gboolean unique, gboolean for_view, gboolean for_remove,
52 ModestDimmingRule *rule);
53 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
54 static gboolean _clipboard_is_empty (ModestWindow *win);
55 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
56 static gboolean _selected_folder_not_writeable (ModestMainWindow *win, gboolean for_paste);
57 static gboolean _selected_folder_not_moveable (ModestMainWindow *win);
58 static gboolean _selected_folder_not_renameable (ModestMainWindow *win);
59 static gboolean _selected_folder_not_deletable (ModestMainWindow *win);
60 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
61 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
62 static gboolean _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win);
63 static gboolean _selected_folder_is_root (ModestMainWindow *win);
64 static gboolean _header_view_is_all_selected (ModestMainWindow *win);
65 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
66 static gboolean _folder_view_has_focus (ModestWindow *win);
67 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
68 static gboolean _msg_download_in_progress (ModestWindow *win);
69 static gboolean _msg_download_completed (ModestMainWindow *win);
70 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
71 static gboolean _sending_in_progress (ModestWindow *win);
72 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
73 static gboolean _transfer_mode_enabled (ModestWindow *win);
74 static gboolean _selected_folder_has_subfolder_with_same_name (ModestWindow *win);
75 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
79 _define_main_window_dimming_state (ModestMainWindow *window)
81 DimmedState *state = NULL;
82 GtkWidget *focused_widget = NULL;
83 GtkWidget *header_view = NULL;
84 GtkTreeModel *model = NULL;
85 TnyList *selected_headers = NULL;
86 TnyIterator *iter = NULL;
87 TnyHeader *header = NULL;
88 ModestCacheMgr *cache_mgr = NULL;
89 GHashTable *send_queue_cache = NULL;
90 ModestTnySendQueue *send_queue = NULL;
91 GSList *send_queues = NULL, *node = NULL;
92 ModestWindowMgr *mgr = NULL;
93 gboolean found = FALSE;
94 gchar *msg_uid = NULL;
96 gboolean all_deleted = TRUE;
97 gboolean all_seen = TRUE;
98 gboolean all_cached = TRUE;
99 gboolean all_has_attach = TRUE;
101 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
104 state = g_slice_new0 (DimmedState);
105 state->n_selected = 0;
106 state->already_opened_msg = 0;
107 state->any_marked_as_deleted = FALSE;
108 state->all_marked_as_deleted = FALSE;
109 state->any_marked_as_seen = FALSE;
110 state->all_marked_as_seen = FALSE;
111 state->any_marked_as_cached = FALSE;
112 state->all_marked_as_cached = FALSE;
113 state->any_has_attachments = FALSE;
114 state->all_has_attachments = FALSE;
115 state->sent_in_progress = FALSE;
116 state->all_selected = FALSE;
118 /* Get focused widget */
119 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
120 if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
123 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
124 header_view = focused_widget;
126 header_view = modest_main_window_get_child_widget (window, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
129 /* Get header view and selected headers */
130 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
131 if (!selected_headers)
134 /* Examine selected headers */
135 iter = tny_list_create_iterator (selected_headers);
136 while (!tny_iterator_is_done (iter)) {
137 header = TNY_HEADER (tny_iterator_get_current (iter));
138 flags = tny_header_get_flags (header);
144 mgr = modest_runtime_get_window_mgr ();
145 if (modest_window_mgr_find_registered_header (mgr, header, NULL))
146 state->already_opened_msg++;
149 /* Mark as deleted */
150 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
151 state->all_marked_as_deleted = all_deleted;
152 if (!state->any_marked_as_deleted)
153 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
156 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
157 state->all_marked_as_seen = all_seen;
158 if (!state->any_marked_as_seen)
159 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
162 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
163 state->all_marked_as_cached = all_cached;
164 if (!state->any_marked_as_cached)
165 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
167 /* Mark has_attachments */
168 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
169 state->all_has_attachments = all_has_attach;
170 if (!state->any_has_attachments)
171 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
173 /* sent in progress */
174 msg_uid = modest_tny_send_queue_get_msg_id (header);
175 if (!state->sent_in_progress) {
176 cache_mgr = modest_runtime_get_cache_mgr ();
177 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
178 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
180 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
182 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
183 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
185 /* Check if msg uid is being processed inside send queue */
186 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
188 state->sent_in_progress = found;
191 tny_iterator_next (iter);
192 g_object_unref (header);
195 /* check if all the headers are selected or not */
196 model = gtk_tree_view_get_model(GTK_TREE_VIEW(header_view));
199 count = gtk_tree_model_iter_n_children(model, NULL);
200 if(state->n_selected == count)
201 state->all_selected = TRUE;
206 g_object_unref(selected_headers);
207 g_object_unref(iter);
208 g_slist_free (send_queues);
214 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
216 DimmedState *state = NULL;
217 TnyHeader *header = NULL;
218 ModestCacheMgr *cache_mgr = NULL;
219 GHashTable *send_queue_cache = NULL;
220 ModestTnySendQueue *send_queue = NULL;
221 GSList *send_queues = NULL, *node = NULL;
222 gboolean found = FALSE;
223 gchar *msg_uid = NULL;
224 TnyHeaderFlags flags;
225 gboolean all_deleted = TRUE;
226 gboolean all_seen = TRUE;
227 gboolean all_cached = TRUE;
228 gboolean all_has_attach = TRUE;
230 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
233 state = g_slice_new0 (DimmedState);
234 state->n_selected = 0;
235 state->already_opened_msg = 0;
236 state->any_marked_as_deleted = FALSE;
237 state->all_marked_as_deleted = FALSE;
238 state->any_marked_as_seen = FALSE;
239 state->all_marked_as_seen = FALSE;
240 state->any_marked_as_cached = FALSE;
241 state->all_marked_as_cached = FALSE;
242 state->any_has_attachments = FALSE;
243 state->all_has_attachments = FALSE;
244 state->sent_in_progress = FALSE;
246 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
249 g_return_val_if_fail (TNY_IS_HEADER(header), state);
250 flags = tny_header_get_flags (header);
255 /* Mark as deleted */
256 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
257 state->all_marked_as_deleted = all_deleted;
258 if (!state->any_marked_as_deleted)
259 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
262 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
263 state->all_marked_as_seen = all_seen;
264 if (!state->any_marked_as_seen)
265 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
268 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
269 state->all_marked_as_cached = all_cached;
270 if (!state->any_marked_as_cached)
271 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
273 /* Mark has_attachments */
274 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
275 state->all_has_attachments = all_has_attach;
276 if (!state->any_has_attachments)
277 state->any_has_attachments = (flags & TNY_HEADER_FLAG_ATTACHMENTS)?1:0;
279 /* sent in progress */
280 msg_uid = modest_tny_send_queue_get_msg_id (header);
281 if (!state->sent_in_progress) {
282 cache_mgr = modest_runtime_get_cache_mgr ();
283 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
284 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
286 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
288 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
289 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
291 /* Check if msg uid is being processed inside send queue */
292 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
294 state->sent_in_progress = found;
299 g_object_unref (header);
300 g_slist_free (send_queues);
307 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
309 DimmedState *state = NULL;
311 g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
313 if (MODEST_IS_MAIN_WINDOW (window))
314 state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
315 else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
316 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
324 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
326 ModestDimmingRule *rule = NULL;
327 gboolean dimmed = FALSE;
329 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
330 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
331 rule = MODEST_DIMMING_RULE (user_data);
333 /* Check dimmed rule */
334 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
336 dimmed = _msg_download_in_progress (win);
338 modest_dimming_rule_set_notification (rule, "");
340 } else if (MODEST_IS_MAIN_WINDOW(win)) {
342 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
345 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
353 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
355 ModestDimmingRule *rule = NULL;
356 GtkWidget *folder_view = NULL;
357 TnyFolderStore *parent_folder = NULL;
358 gboolean dimmed = FALSE;
360 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
361 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
362 rule = MODEST_DIMMING_RULE (user_data);
365 dimmed = _transfer_mode_enabled (win);
367 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
372 /* Get selected folder as parent of new folder to create */
373 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
374 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
375 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
379 if (TNY_IS_ACCOUNT (parent_folder)) {
380 /* If it's the local account then do not dim */
381 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
384 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
385 if (proto_str != NULL) {
386 /* If it's POP then dim */
387 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
388 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
390 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
394 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
396 TnyFolderType types[3];
398 types[0] = TNY_FOLDER_TYPE_DRAFTS;
399 types[1] = TNY_FOLDER_TYPE_OUTBOX;
400 types[2] = TNY_FOLDER_TYPE_SENT;
402 /* Apply folder rules */
404 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), FALSE);
406 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
409 dimmed = _selected_folder_is_any_of_type (win, types, 3);
411 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
415 /* if not the folder is selected then dim */
416 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
417 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
418 if (folder_view && !gtk_widget_is_focus (folder_view))
421 g_object_unref (parent_folder);
427 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
429 ModestDimmingRule *rule = NULL;
430 GtkWidget *folder_view = NULL;
431 GtkWidget *header_view = NULL;
432 gboolean dimmed = FALSE;
434 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
435 rule = MODEST_DIMMING_RULE (user_data);
437 if (MODEST_IS_MAIN_WINDOW (win)) {
438 /* Get the folder view */
439 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
440 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
442 /* Get header view */
443 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
444 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
446 if (header_view && gtk_widget_is_focus (header_view))
447 dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
449 if (folder_view && gtk_widget_is_focus (folder_view))
450 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
452 if (header_view && folder_view &&
453 !gtk_widget_is_focus (header_view) &&
454 !gtk_widget_is_focus (folder_view)) {
456 modest_dimming_rule_set_notification (rule, dgettext("hildon-common-strings", "ckct_ib_nothing_to_delete"));
459 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
468 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
470 ModestDimmingRule *rule = NULL;
471 TnyFolderType types[6];
472 gboolean dimmed = FALSE;
474 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
475 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
476 rule = MODEST_DIMMING_RULE (user_data);
478 types[0] = TNY_FOLDER_TYPE_DRAFTS;
479 types[1] = TNY_FOLDER_TYPE_OUTBOX;
480 types[2] = TNY_FOLDER_TYPE_SENT;
481 types[3] = TNY_FOLDER_TYPE_INBOX;
482 types[4] = TNY_FOLDER_TYPE_ROOT;
483 types[5] = TNY_FOLDER_TYPE_ARCHIVE;
486 /* Check dimmed rule */
488 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
490 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
493 dimmed = _selected_folder_is_any_of_type (win, types, 6);
495 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
498 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
500 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
503 dimmed = _selected_folder_is_MMC_or_POP_root (MODEST_MAIN_WINDOW(win));
505 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
508 dimmed = _transfer_mode_enabled (win);
510 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
517 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
519 ModestDimmingRule *rule = NULL;
520 gboolean dimmed = FALSE;
522 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
523 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
524 rule = MODEST_DIMMING_RULE (user_data);
526 /* Check dimmed rule */
528 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
529 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
533 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
534 modest_dimming_rule_set_notification (rule, _CS("ckdg_ib_nothing_to_sort"));
542 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
544 ModestDimmingRule *rule = NULL;
545 TnyFolderType types[4];
546 gboolean dimmed = FALSE;
548 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
549 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
550 rule = MODEST_DIMMING_RULE (user_data);
552 types[0] = TNY_FOLDER_TYPE_DRAFTS;
553 types[1] = TNY_FOLDER_TYPE_OUTBOX;
554 types[2] = TNY_FOLDER_TYPE_SENT;
555 types[3] = TNY_FOLDER_TYPE_ARCHIVE;
557 /* Check dimmed rule */
559 dimmed = _selected_folder_not_renameable (MODEST_MAIN_WINDOW(win));
561 modest_dimming_rule_set_notification (rule, "");
564 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
566 modest_dimming_rule_set_notification (rule, "");
569 dimmed = _selected_folder_is_any_of_type (win, types, 4);
571 modest_dimming_rule_set_notification (rule, "");
574 dimmed = _transfer_mode_enabled (win);
576 modest_dimming_rule_set_notification (rule, "");
583 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
585 ModestDimmingRule *rule = NULL;
586 gboolean dimmed = FALSE;
587 const DimmedState *state = NULL;
589 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
590 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
591 rule = MODEST_DIMMING_RULE (user_data);
592 state = modest_window_get_dimming_state (win);
594 /* Check dimmed rule */
596 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
599 dimmed = state->any_marked_as_deleted;
601 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
604 dimmed = _selected_msg_sent_in_progress (win);
606 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
613 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
615 ModestDimmingRule *rule = NULL;
616 gboolean dimmed = FALSE;
617 TnyFolderType types[3];
619 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
620 rule = MODEST_DIMMING_RULE (user_data);
622 /* main window dimming rules */
623 if (MODEST_IS_MAIN_WINDOW(win)) {
625 types[0] = TNY_FOLDER_TYPE_DRAFTS;
626 types[1] = TNY_FOLDER_TYPE_OUTBOX;
627 types[2] = TNY_FOLDER_TYPE_ROOT;
629 /* Check dimmed rule */
631 dimmed = _selected_folder_is_any_of_type (win, types, 3);
633 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
636 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
638 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
641 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
643 /* msg view window dimming rules */
644 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
646 /* Check dimmed rule */
648 dimmed = _transfer_mode_enabled (win);
650 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
653 dimmed = _msg_download_in_progress (win);
655 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
664 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
666 ModestDimmingRule *rule = NULL;
667 gboolean dimmed = FALSE;
669 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
670 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
671 rule = MODEST_DIMMING_RULE (user_data);
673 /* Check dimmed rule */
675 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
678 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
680 modest_dimming_rule_set_notification (rule, "");
687 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
689 gboolean dimmed = FALSE;
691 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
693 /* Check dimmed rule */
701 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
703 ModestDimmingRule *rule = NULL;
704 const DimmedState *state = NULL;
705 gboolean dimmed = FALSE;
707 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
708 rule = MODEST_DIMMING_RULE (user_data);
709 state = modest_window_get_dimming_state (win);
711 /* Check dimmed rule */
712 if (MODEST_IS_MAIN_WINDOW (win)) {
714 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
716 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
719 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
722 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
724 gchar *num = NULL, *message = NULL;
726 num = g_strdup_printf ("%d", state->already_opened_msg);
727 message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"), num);
728 modest_dimming_rule_set_notification (rule, message);
735 dimmed = state->any_marked_as_deleted;
737 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
741 dimmed = state->sent_in_progress;
743 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
746 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
748 dimmed = _transfer_mode_enabled (win);
750 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
753 dimmed = state->any_marked_as_deleted;
755 modest_dimming_rule_set_notification (rule, _("mcen_ib_message_already_deleted"));
758 dimmed = state->sent_in_progress;
760 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
763 /* The delete button should be dimmed when viewing an attachment,
764 * but should be enabled when viewing a message from the list,
765 * or when viewing a search result.
768 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
769 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
771 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
781 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
783 ModestDimmingRule *rule = NULL;
784 GtkWidget *header_view = NULL;
785 gboolean dimmed = FALSE;
787 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
788 rule = MODEST_DIMMING_RULE (user_data);
790 /* main window dimming rules */
791 if (MODEST_IS_MAIN_WINDOW(win)) {
793 /* Check dimmed rule */
794 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
795 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
797 /* If the header view has the focus: */
798 if (header_view && gtk_widget_is_focus (header_view)) {
799 /* Check dimmed rule */
801 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
804 /* If the folder view has the focus: */
805 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
806 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
807 if (folder_view && gtk_widget_is_focus (folder_view)) {
808 TnyFolderStore *folder_store
809 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
811 /* Only enable for folders, not accounts,
812 * though the UI spec is not clear about that.
813 * If we enable this for accounts then we must
814 * add code to handle them in modest_ui_actions_on_details(). */
815 if (!TNY_IS_FOLDER(folder_store)) {
817 modest_dimming_rule_set_notification (rule, "");
820 g_object_unref (folder_store);
823 modest_dimming_rule_set_notification (rule, "");
826 dimmed = _msg_download_in_progress (win);
828 modest_dimming_rule_set_notification (rule, "");
835 /* msg view window dimming rules */
838 /* Check dimmed rule */
840 if (MODEST_IS_MSG_VIEW_WINDOW (win))
841 dimmed = _msg_download_in_progress (win);
843 modest_dimming_rule_set_notification (rule, "");
846 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
847 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
850 modest_dimming_rule_set_notification (rule, "");
859 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
861 ModestDimmingRule *rule = NULL;
862 TnyHeaderFlags flags;
863 const DimmedState *state = NULL;
864 gboolean dimmed = FALSE;
866 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
867 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
868 rule = MODEST_DIMMING_RULE (user_data);
869 state = modest_window_get_dimming_state (win);
871 flags = TNY_HEADER_FLAG_SEEN;
873 /* Check dimmed rule */
875 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
878 dimmed = state->all_marked_as_seen;
880 modest_dimming_rule_set_notification (rule, "");
887 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
889 ModestDimmingRule *rule = NULL;
890 TnyHeaderFlags flags;
891 const DimmedState *state = NULL;
892 gboolean dimmed = FALSE;
894 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
895 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
896 rule = MODEST_DIMMING_RULE (user_data);
897 state = modest_window_get_dimming_state (win);
899 flags = TNY_HEADER_FLAG_SEEN;
901 /* Check dimmed rule */
903 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
905 dimmed = !state->any_marked_as_seen;
907 modest_dimming_rule_set_notification (rule, "");
914 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
916 ModestDimmingRule *rule = NULL;
917 gboolean dimmed = FALSE;
919 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
920 rule = MODEST_DIMMING_RULE (user_data);
922 if (MODEST_IS_MAIN_WINDOW (win))
923 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
924 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
925 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
932 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
934 GtkWidget *folder_view = NULL;
935 ModestDimmingRule *rule = NULL;
936 const DimmedState *state = NULL;
937 gboolean dimmed = FALSE;
939 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
940 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
941 rule = MODEST_DIMMING_RULE (user_data);
942 state = modest_window_get_dimming_state (win);
944 /* Get the folder view */
945 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
946 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
949 /* Check diming rules for folders transfer */
950 if (gtk_widget_is_focus (folder_view)) {
951 TnyFolderType types[5];
953 types[0] = TNY_FOLDER_TYPE_DRAFTS;
954 types[1] = TNY_FOLDER_TYPE_OUTBOX;
955 types[2] = TNY_FOLDER_TYPE_SENT;
956 types[3] = TNY_FOLDER_TYPE_ROOT;
957 types[4] = TNY_FOLDER_TYPE_INBOX;
959 /* Apply folder rules */
961 dimmed = _selected_folder_not_moveable (MODEST_MAIN_WINDOW(win));
963 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
966 dimmed = _selected_folder_is_any_of_type (win, types, 5);
968 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
972 /* Check diming rules for messages transfer */
974 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
976 gchar *message = g_strdup_printf(_("emev_bd_unabletomove_items"),
977 state->already_opened_msg);
978 modest_dimming_rule_set_notification (rule, message);
983 if (!gtk_widget_is_focus (folder_view))
984 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
988 dimmed = _selected_msg_sent_in_progress (win);
990 modest_dimming_rule_set_notification (rule, _("sfil_ib_unable_to_move_selected_items"));
997 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
999 ModestDimmingRule *rule = NULL;
1000 gboolean dimmed = FALSE;
1002 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1003 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1004 rule = MODEST_DIMMING_RULE (user_data);
1006 /* Check dimmed rule */
1008 dimmed = _transfer_mode_enabled (win);
1010 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1014 dimmed = _selected_msg_sent_in_progress (win);
1016 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1019 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1020 /* The move_to button should be dimmed when viewing an attachment,
1021 * but should be enabled when viewing a message from the list,
1022 * or when viewing a search result.
1024 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
1025 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1030 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1037 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
1039 ModestDimmingRule *rule = NULL;
1040 gboolean dimmed = FALSE;
1042 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1043 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1044 rule = MODEST_DIMMING_RULE (user_data);
1046 /* Check dimmed rule */
1048 dimmed = _transfer_mode_enabled (win);
1050 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1057 modest_ui_dimming_rules_on_paste (ModestWindow *win, gpointer user_data)
1059 ModestDimmingRule *rule = NULL;
1060 TnyFolderType types[3];
1061 gboolean dimmed = FALSE;
1063 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1064 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1065 rule = MODEST_DIMMING_RULE (user_data);
1067 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1068 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1069 types[2] = TNY_FOLDER_TYPE_SENT;
1071 /* Check dimmed rule */
1073 dimmed = _clipboard_is_empty (win);
1075 modest_dimming_rule_set_notification (rule,
1076 dgettext("hildon-common-strings",
1077 "ecoc_ib_edwin_nothing_to_paste"));
1080 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1082 modest_dimming_rule_set_notification (rule,
1083 dgettext("hildon-common-strings",
1084 "ckct_ib_unable_to_paste_here"));
1087 dimmed = !_folder_view_has_focus (win);
1089 modest_dimming_rule_set_notification (rule,
1090 dgettext("hildon-common-strings",
1091 "ckct_ib_unable_to_paste_here"));
1094 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), TRUE);
1096 modest_dimming_rule_set_notification (rule,
1097 dgettext("hildon-common-strings",
1098 "ckct_ib_unable_to_paste_here"));
1101 dimmed = _selected_folder_is_same_as_source (win);
1103 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1106 dimmed = _selected_folder_has_subfolder_with_same_name (win);
1108 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1116 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1118 ModestDimmingRule *rule = NULL;
1119 gboolean dimmed = FALSE;
1120 GtkWidget *focused = NULL;
1122 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1123 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1124 rule = MODEST_DIMMING_RULE (user_data);
1126 focused = gtk_window_get_focus (GTK_WINDOW (win));
1128 /* Main window dimming rules */
1129 if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
1130 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1132 if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
1133 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1135 if (!dimmed && GTK_IS_ENTRY (focused)) {
1136 const gchar *current_text;
1137 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
1138 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
1141 if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
1142 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1143 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
1146 if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
1152 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1154 ModestDimmingRule *rule = NULL;
1155 gboolean dimmed = FALSE;
1157 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1158 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1159 rule = MODEST_DIMMING_RULE (user_data);
1161 /* Check dimmed rule */
1163 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);
1166 dimmed = _purged_attach_selected (win, FALSE, NULL);
1168 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1176 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1178 ModestDimmingRule *rule = NULL;
1179 gboolean dimmed = FALSE;
1181 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1182 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1183 rule = MODEST_DIMMING_RULE (user_data);
1185 /* Check dimmed rule */
1187 dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1190 dimmed = _purged_attach_selected (win, FALSE, NULL);
1192 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1200 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1202 ModestDimmingRule *rule = NULL;
1203 const DimmedState *state = NULL;
1204 gboolean dimmed = FALSE;
1206 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1207 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1208 rule = MODEST_DIMMING_RULE (user_data);
1209 state = modest_window_get_dimming_state (win);
1211 /* Check in main window if there's only one message selected */
1212 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1213 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1216 /* Check in view window if there's any attachment selected */
1217 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1218 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1220 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1225 dimmed = _selected_msg_sent_in_progress (win);
1227 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1231 /* cannot purge in editable drafts nor pop folders */
1233 dimmed = _invalid_folder_for_purge (win, rule);
1236 /* Check if the selected message in main window has attachments */
1237 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1238 dimmed = !(state->any_has_attachments);
1240 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1243 /* Check if all attachments are already purged */
1245 dimmed = _purged_attach_selected (win, TRUE, rule);
1248 /* Check if the message is already downloaded */
1249 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1250 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1252 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1260 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1262 ModestDimmingRule *rule = NULL;
1263 gboolean dimmed = FALSE;
1265 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1266 rule = MODEST_DIMMING_RULE (user_data);
1268 /* Check dimmed rule */
1269 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1270 dimmed = _clipboard_is_empty (win);
1272 modest_dimming_rule_set_notification (rule, "");
1275 if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1276 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
1283 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
1285 ModestDimmingRule *rule = NULL;
1286 gboolean dimmed = FALSE;
1288 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1289 rule = MODEST_DIMMING_RULE (user_data);
1291 /* Check dimmed rule */
1292 if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1293 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
1300 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1302 ModestDimmingRule *rule = NULL;
1303 const DimmedState *state = NULL;
1304 gboolean dimmed = FALSE;
1306 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1307 rule = MODEST_DIMMING_RULE (user_data);
1308 state = modest_window_get_dimming_state (win);
1310 /* Check common dimming rules */
1312 dimmed = _invalid_clipboard_selected (win, rule);
1315 /* Check window specific dimming rules */
1316 if (MODEST_IS_MAIN_WINDOW (win)) {
1317 /* Get focused widget */
1318 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1320 if (MODEST_IS_HEADER_VIEW (focused)) {
1322 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1324 modest_dimming_rule_set_notification (rule, "");
1327 dimmed = _selected_msg_sent_in_progress (win);
1329 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1332 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1334 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1337 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1338 TnyFolderType types[3];
1340 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1341 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1342 types[2] = TNY_FOLDER_TYPE_SENT;
1344 /* Apply folder rules */
1346 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
1348 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_items"));
1351 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1353 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1356 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1358 modest_dimming_rule_set_notification (rule, _("emev_bd_unabletomove_itemsr"));
1367 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1369 ModestDimmingRule *rule = NULL;
1370 const DimmedState *state = NULL;
1371 gboolean dimmed = FALSE;
1373 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1374 rule = MODEST_DIMMING_RULE (user_data);
1375 state = modest_window_get_dimming_state (win);
1377 /* Check common dimming rules */
1379 dimmed = _invalid_clipboard_selected (win, rule);
1382 /* Check window specific dimming rules */
1383 if (MODEST_IS_MAIN_WINDOW (win)) {
1384 /* Get focused widget */
1385 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1387 if (MODEST_IS_HEADER_VIEW (focused)) {
1389 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1391 modest_dimming_rule_set_notification (rule, "");
1394 dimmed = _selected_msg_sent_in_progress (win);
1396 modest_dimming_rule_set_notification (rule, _(""));
1399 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1401 modest_dimming_rule_set_notification (rule, _(""));
1404 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1405 TnyFolderType types[3];
1407 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1408 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1409 types[2] = TNY_FOLDER_TYPE_SENT;
1412 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1414 modest_dimming_rule_set_notification (rule, _(""));
1417 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1419 modest_dimming_rule_set_notification (rule, _(""));
1428 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
1430 ModestDimmingRule *rule = NULL;
1431 const DimmedState *state = NULL;
1432 gboolean dimmed = FALSE;
1434 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1435 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1436 rule = MODEST_DIMMING_RULE (user_data);
1437 state = modest_window_get_dimming_state (win);
1440 /* Check common dimming rules */
1442 ModestMsgEditFormat format;
1443 format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1445 dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
1447 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
1452 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1453 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1455 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1457 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1465 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
1467 ModestDimmingRule *rule = NULL;
1468 const DimmedState *state = NULL;
1469 gboolean dimmed = FALSE;
1471 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1472 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1473 rule = MODEST_DIMMING_RULE (user_data);
1474 state = modest_window_get_dimming_state (win);
1478 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1479 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1481 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1483 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1491 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1493 ModestDimmingRule *rule = NULL;
1494 const DimmedState *state = NULL;
1495 gboolean dimmed = FALSE;
1496 GtkWidget *focused = NULL;
1498 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1499 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1500 rule = MODEST_DIMMING_RULE (user_data);
1501 state = modest_window_get_dimming_state (win);
1503 focused = gtk_window_get_focus (GTK_WINDOW (win));
1506 dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1510 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1514 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1515 dimmed = modest_email_clipboard_cleared (e_clipboard) &&
1516 (modest_msg_edit_window_get_clipboard_text(MODEST_MSG_EDIT_WINDOW (win)) == NULL) &&
1517 !gtk_clipboard_wait_is_text_available(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
1524 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1526 ModestDimmingRule *rule = NULL;
1527 const DimmedState *state = NULL;
1528 gboolean dimmed = FALSE;
1530 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1531 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1532 rule = MODEST_DIMMING_RULE (user_data);
1533 state = modest_window_get_dimming_state (win);
1536 GList *selected_attachments = NULL;
1537 gint n_att_selected = 0;
1538 GtkWidget *attachments_view;
1539 attachments_view = modest_msg_edit_window_get_child_widget (
1540 MODEST_MSG_EDIT_WINDOW (win),
1541 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1543 selected_attachments = modest_attachments_view_get_selection (
1544 MODEST_ATTACHMENTS_VIEW (attachments_view));
1545 n_att_selected = g_list_length (selected_attachments);
1546 g_list_free (selected_attachments);
1548 dimmed = (n_att_selected != 1);
1555 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1557 ModestDimmingRule *rule = NULL;
1558 const DimmedState *state = NULL;
1559 gboolean dimmed = FALSE;
1561 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1562 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1563 rule = MODEST_DIMMING_RULE (user_data);
1564 state = modest_window_get_dimming_state (win);
1567 GtkWidget *subject_field, *body_field;
1568 GtkTextBuffer *body_buffer;
1569 const gchar *subject = NULL;
1570 body_field = modest_msg_edit_window_get_child_widget (
1571 MODEST_MSG_EDIT_WINDOW (win),
1572 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1573 subject_field = modest_msg_edit_window_get_child_widget (
1574 MODEST_MSG_EDIT_WINDOW (win),
1575 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT);
1576 body_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (body_field));
1577 subject = gtk_entry_get_text (GTK_ENTRY (subject_field));
1579 dimmed = ((subject == NULL || subject[0] == '\0')
1580 || (gtk_text_buffer_get_char_count(body_buffer) == 0));
1582 modest_dimming_rule_set_notification (rule, _("mcen_ib_subject_or_body_not_modified"));
1586 GtkWidget *to_field, *cc_field, *bcc_field;
1587 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1588 cc_field = modest_msg_edit_window_get_child_widget (
1589 MODEST_MSG_EDIT_WINDOW (win),
1590 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1591 to_field = modest_msg_edit_window_get_child_widget (
1592 MODEST_MSG_EDIT_WINDOW (win),
1593 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1594 bcc_field = modest_msg_edit_window_get_child_widget (
1595 MODEST_MSG_EDIT_WINDOW (win),
1596 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1597 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1598 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1599 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1601 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1602 gtk_text_buffer_get_char_count (cc_buffer) +
1603 gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1605 modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1612 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1614 ModestDimmingRule *rule = NULL;
1615 gboolean dimmed = FALSE;
1617 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1618 rule = MODEST_DIMMING_RULE (user_data);
1620 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1622 /* Check dimmed rule */
1624 dimmed = _transfer_mode_enabled (win);
1626 modest_dimming_rule_set_notification (
1627 rule, _("mail_ib_notavailable_downloading"));
1630 dimmed = modest_msg_view_window_first_message_selected (
1631 MODEST_MSG_VIEW_WINDOW(win));
1632 modest_dimming_rule_set_notification (rule, NULL);
1639 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1641 ModestDimmingRule *rule = NULL;
1642 gboolean dimmed = FALSE;
1644 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1645 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1646 rule = MODEST_DIMMING_RULE (user_data);
1648 /* Check dimmed rule */
1650 dimmed = _transfer_mode_enabled (win);
1652 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1655 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1656 modest_dimming_rule_set_notification (rule, NULL);
1664 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1666 const gboolean dimmed =
1667 !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1674 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1676 ModestDimmingRule *rule = NULL;
1677 TnyFolderType types[1];
1678 const DimmedState *state = NULL;
1679 gboolean dimmed = FALSE;
1681 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1682 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1683 rule = MODEST_DIMMING_RULE (user_data);
1684 state = modest_window_get_dimming_state (win);
1686 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1688 /* Check dimmed rules */
1690 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1692 modest_dimming_rule_set_notification (rule, "");
1695 dimmed = !_sending_in_progress (win);
1697 modest_dimming_rule_set_notification (rule, "");
1704 modest_ui_dimming_rules_on_csm_cancel_sending (ModestWindow *win, gpointer user_data)
1706 ModestDimmingRule *rule = NULL;
1707 TnyFolderType types[1];
1708 const DimmedState *state = NULL;
1709 gboolean dimmed = FALSE;
1711 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1712 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1713 rule = MODEST_DIMMING_RULE (user_data);
1714 state = modest_window_get_dimming_state (win);
1716 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1718 /* Check dimmed rules */
1720 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1722 modest_dimming_rule_set_notification (rule, "");
1725 dimmed = !_sending_in_progress (win);
1727 modest_dimming_rule_set_notification (rule, "");
1734 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1736 ModestDimmingRule *rule = NULL;
1737 gboolean dimmed = FALSE;
1739 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1740 rule = MODEST_DIMMING_RULE (user_data);
1742 /* Check dimmed rule */
1744 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
1747 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1754 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
1756 ModestDimmingRule *rule = NULL;
1757 gboolean dimmed = FALSE;
1759 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1760 rule = MODEST_DIMMING_RULE (user_data);
1762 /* Check dimmed rule */
1764 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
1765 if (g_slist_length (account_names) <= 1)
1768 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
1770 modest_account_mgr_free_account_names (account_names);
1777 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
1779 ModestDimmingRule *rule = NULL;
1780 gboolean dimmed = FALSE;
1781 GtkWidget *focused = NULL;
1783 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1784 rule = MODEST_DIMMING_RULE (user_data);
1785 focused = gtk_window_get_focus (GTK_WINDOW (win));
1790 gchar *selection = NULL;
1791 if (GTK_IS_TEXT_VIEW (focused)) {
1792 GtkTextIter start, end;
1793 GtkTextBuffer *buffer = NULL;
1794 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1795 if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
1796 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1798 } else if (GTK_IS_LABEL (focused)) {
1800 if (gtk_label_get_selection_bounds (GTK_LABEL (focused), &start, &end)) {
1801 const gchar *start_offset;
1802 start_offset = gtk_label_get_text (GTK_LABEL (focused));
1803 start_offset = g_utf8_offset_to_pointer (start_offset, start);
1804 selection = g_new0 (gchar, end - start + 1);
1805 g_utf8_strncpy (selection, start_offset, end - start);
1808 gboolean do_check = TRUE;
1809 GtkClipboard *clipboard;
1810 if (GTK_IS_HTML (focused)) {
1813 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
1814 do_check = !((sel == NULL) || (sel[0] == '\0'));
1817 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1818 selection = gtk_clipboard_wait_for_text (clipboard);
1823 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
1829 /* *********************** static utility functions ******************** */
1833 _selected_folder_not_writeable (ModestMainWindow *win,
1836 GtkWidget *folder_view = NULL;
1837 TnyFolderStore *parent_folder = NULL;
1838 ModestEmailClipboard *clipboard = NULL;
1839 ModestTnyFolderRules rules;
1840 gboolean is_local_acc = FALSE;
1841 gboolean xfer_folders = FALSE;
1842 gboolean result = FALSE;
1844 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1846 /* Get folder view */
1847 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1848 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1849 /* If no folder view, always dimmed */
1853 /* Get selected folder as parent of new folder to create */
1854 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1855 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1856 /* If it's the local account and its transfering folders, then do not dim */
1857 if (TNY_IS_ACCOUNT (parent_folder)) {
1858 is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
1860 clipboard = modest_runtime_get_email_clipboard ();
1861 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
1866 result = !(is_local_acc && xfer_folders);
1868 result = !is_local_acc;
1872 /* Check dimmed rule */
1873 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1874 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
1878 if (parent_folder != NULL)
1879 g_object_unref (parent_folder);
1885 _selected_folder_not_deletable (ModestMainWindow *win)
1887 GtkWidget *folder_view = NULL;
1888 TnyFolderStore *parent_folder = NULL;
1889 ModestTnyFolderRules rules;
1890 gboolean result = FALSE;
1892 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1894 /* Get folder view */
1895 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1896 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1897 /* If no folder view, always dimmed */
1901 /* Get selected folder as parent of new folder to create */
1902 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1903 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1908 /* Check dimmed rule */
1909 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1910 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
1914 if (parent_folder != NULL)
1915 g_object_unref (parent_folder);
1921 _selected_folder_not_moveable (ModestMainWindow *win)
1923 GtkWidget *folder_view = NULL;
1924 TnyFolderStore *parent_folder = NULL;
1925 ModestTnyFolderRules rules;
1926 gboolean result = FALSE;
1928 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1930 /* Get folder view */
1931 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1932 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1933 /* If no folder view, always dimmed */
1937 /* Get selected folder as parent of new folder to create */
1938 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1939 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1944 /* Check dimmed rule */
1945 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1946 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
1950 if (parent_folder != NULL)
1951 g_object_unref (parent_folder);
1957 _selected_folder_not_renameable (ModestMainWindow *win)
1959 GtkWidget *folder_view = NULL;
1960 TnyFolderStore *parent_folder = NULL;
1961 ModestTnyFolderRules rules;
1962 gboolean result = FALSE;
1964 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1966 /* Get folder view */
1967 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1968 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1969 /* If no folder view, always dimmed */
1973 /* Get selected folder as parent of new folder to create */
1974 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1975 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
1980 /* Check dimmed rule */
1981 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
1982 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
1986 if (parent_folder != NULL)
1987 g_object_unref (parent_folder);
1993 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
1995 TnyFolderType types[2];
1996 gboolean result = FALSE;
1998 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2000 types[0] = TNY_FOLDER_TYPE_ROOT;
2001 types[1] = TNY_FOLDER_TYPE_INBOX;
2003 /* Check folder type */
2004 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2006 /* Check pop and MMC accounts */
2008 result = _selected_folder_is_MMC_or_POP_root (win);
2016 _selected_folder_is_root (ModestMainWindow *win)
2018 TnyFolderType types[1];
2019 gboolean result = FALSE;
2021 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2023 /* All accounts are root items: */
2024 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2025 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2027 gboolean is_account = FALSE;
2028 TnyFolderStore *folder_store =
2029 modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2031 is_account = TNY_IS_ACCOUNT (folder_store);
2032 g_object_unref (folder_store);
2033 folder_store = NULL;
2040 /* Try something more precise: */
2041 types[0] = TNY_FOLDER_TYPE_ROOT;
2043 /* Check folder type */
2044 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2046 /* Check pop and MMC accounts */
2048 result = _selected_folder_is_MMC_or_POP_root (win);
2055 _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
2057 GtkWidget *folder_view = NULL;
2058 TnyFolderStore *parent_folder = NULL;
2059 gboolean result = FALSE;
2061 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2062 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2066 /* Get selected folder as parent of new folder to create */
2067 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2071 if (TNY_IS_ACCOUNT (parent_folder)) {
2072 /* If it's the local account then do not dim */
2073 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
2076 /* If it's the MMC root folder then dim it */
2077 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
2080 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
2081 /* If it's POP then dim */
2082 result = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2083 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
2087 g_object_unref (parent_folder);
2093 _header_view_is_all_selected (ModestMainWindow *win)
2095 const DimmedState *state = NULL;
2097 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2099 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2101 return state->all_selected;
2105 _selected_folder_is_empty (ModestMainWindow *win)
2107 GtkWidget *folder_view = NULL;
2108 TnyFolderStore *folder = NULL;
2109 gboolean result = FALSE;
2111 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2113 /* Get folder view */
2114 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2115 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2116 /* If no folder view, always dimmed */
2120 /* Get selected folder as parent of new folder to create */
2121 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2122 if (!(folder && TNY_IS_FOLDER(folder))) {
2124 g_object_unref (folder);
2128 /* Check folder type */
2129 result = tny_folder_get_all_count (TNY_FOLDER (folder)) == 0;
2132 g_object_unref (folder);
2138 _folder_view_has_focus (ModestWindow *win)
2140 GtkWidget *folder_view = NULL;
2142 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2144 /* Get folder view */
2145 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2146 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2150 if (gtk_widget_is_focus(folder_view))
2157 _selected_folder_is_same_as_source (ModestWindow *win)
2159 ModestEmailClipboard *clipboard = NULL;
2160 GtkWidget *folder_view = NULL;
2161 TnyFolderStore *folder = NULL;
2162 gboolean result = FALSE;
2164 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2166 /* Get folder view */
2167 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2168 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2172 /* Get selected folder as destination folder */
2173 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2174 if (!(folder && TNY_IS_FOLDER(folder))) {
2179 /* Check clipboard is cleared */
2180 clipboard = modest_runtime_get_email_clipboard ();
2181 if (modest_email_clipboard_cleared (clipboard)) {
2186 /* Check source folder */
2187 result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2191 g_object_unref (folder);
2197 _selected_folder_is_any_of_type (ModestWindow *win,
2198 TnyFolderType types[],
2201 GtkWidget *folder_view = NULL;
2202 TnyFolderStore *folder = NULL;
2203 TnyFolderType folder_type;
2205 gboolean result = FALSE;
2207 /*Get current folder */
2208 if (MODEST_IS_MAIN_WINDOW(win)) {
2210 /* Get folder view */
2211 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2212 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2213 /* If no folder view, always dimmed */
2217 /* Get selected folder as parent of new folder to create */
2218 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2220 if (!(folder && TNY_IS_FOLDER(folder))) {
2222 g_object_unref (folder);
2226 /* Check folder type */
2227 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2229 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2230 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2231 for (i=0; i < ntypes; i++) {
2232 result = result || folder_type == types[i];
2238 g_object_unref (folder);
2244 _folder_is_any_of_type (TnyFolder *folder,
2245 TnyFolderType types[],
2248 TnyFolderType folder_type;
2249 gboolean result = FALSE;
2252 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2254 /* Get folder type */
2255 folder_type = modest_tny_folder_guess_folder_type (folder);
2256 if (folder_type == TNY_FOLDER_TYPE_INVALID)
2257 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2259 /* Check foler type */
2260 for (i=0; i < ntypes; i++) {
2261 result = result || folder_type == types[i];
2268 _clipboard_is_empty (ModestWindow *win)
2270 gboolean result = FALSE;
2272 if (MODEST_IS_MAIN_WINDOW (win)) {
2273 ModestEmailClipboard *clipboard = NULL;
2274 clipboard = modest_runtime_get_email_clipboard ();
2275 if (modest_email_clipboard_cleared (clipboard))
2283 _invalid_clipboard_selected (ModestWindow *win,
2284 ModestDimmingRule *rule)
2286 const DimmedState *state = NULL;
2287 gboolean result = FALSE;
2288 GtkWidget *focused = NULL;
2290 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2291 state = modest_window_get_dimming_state (win);
2292 /* Get focuesed widget */
2293 focused = gtk_window_get_focus (GTK_WINDOW (win));
2295 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2296 gboolean has_selection = FALSE;
2297 if (GTK_IS_TEXT_VIEW (focused)) {
2298 GtkTextBuffer *buffer = NULL;
2299 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2300 has_selection = gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (buffer));
2301 } else if (GTK_IS_EDITABLE (focused)) {
2302 has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2304 result = !has_selection;
2305 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2307 MODEST_DEBUG_BLOCK (g_message ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2308 if (GTK_IS_LABEL (focused) &&
2309 !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2311 } else if (GTK_IS_TEXT_VIEW (focused)) {
2312 GtkTextBuffer *buffer;
2313 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2314 result = !gtk_text_buffer_get_has_selection (buffer);
2315 } else if (GTK_IS_HTML (focused)) {
2318 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2319 result = ((sel == NULL) || (sel[0] == '\0'));
2320 } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2323 GtkClipboard *clipboard;
2326 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2327 /* Get clipboard selection*/
2328 selection = gtk_clipboard_wait_for_text (clipboard);
2330 result = (selection == NULL);
2338 modest_dimming_rule_set_notification (rule, "");
2341 else if (MODEST_IS_MAIN_WINDOW (win)) {
2343 result = state->n_selected == 0;
2345 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2353 _invalid_attach_selected (ModestWindow *win,
2356 gboolean for_remove,
2357 ModestDimmingRule *rule)
2359 GList *attachments, *node;
2361 TnyHeaderFlags flags;
2362 gboolean nested_attachments = FALSE;
2363 gboolean selected_messages = FALSE;
2364 const DimmedState *state = NULL;
2365 gboolean result = FALSE;
2367 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2368 state = modest_window_get_dimming_state (win);
2370 if (MODEST_IS_MAIN_WINDOW (win)) {
2371 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2373 result = !state->any_has_attachments;
2375 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2377 /* Get selected atachments */
2378 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2379 n_selected = g_list_length (attachments);
2384 result = n_selected != 1;
2387 result = n_selected < 1;
2390 /* Check attached type (view operation not required) */
2391 if (!result && !for_view) {
2392 for (node = attachments; node != NULL && !result; node = g_list_next (node)) {
2393 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
2394 TnyList *nested_list = tny_simple_list_new ();
2395 if (!for_remove && TNY_IS_MSG (mime_part)) {
2396 selected_messages = TRUE;
2399 tny_mime_part_get_parts (mime_part, nested_list);
2400 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2401 nested_attachments = TRUE;
2404 g_object_unref (nested_list);
2408 /* Set notifications */
2409 if (result && rule != NULL) {
2410 if (selected_messages) {
2411 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2412 } else if (nested_attachments) {
2413 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2414 } else if (n_selected == 0) {
2415 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2416 } else if (unique) {
2417 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2422 g_list_free (attachments);
2429 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule)
2431 GList *attachments = NULL, *node;
2433 gint n_attachments = 0;
2434 gboolean result = FALSE;
2436 /* This should check if _all_ the attachments are already purged. If only some
2437 * of them are purged, then it does not cause dim as there's a confirmation dialog
2438 * for removing only local attachments */
2440 /* Get selected atachments */
2441 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2442 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2443 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2444 /* If we're in main window, we won't know if there are already purged attachments */
2448 if (attachments == NULL)
2451 for (node = attachments; node != NULL; node = g_list_next (node)) {
2452 TnyMimePart *mime_part = TNY_MIME_PART (node->data);
2453 if (tny_mime_part_is_purged (mime_part)) {
2460 g_list_free (attachments);
2463 result = (purged == n_attachments);
2465 result = (purged > 0);
2467 /* This string no longer exists, refer to NB#75415 for more info
2468 if (result && (rule != NULL))
2469 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2476 _invalid_msg_selected (ModestMainWindow *win,
2478 ModestDimmingRule *rule)
2480 GtkWidget *folder_view = NULL;
2481 const DimmedState *state = NULL;
2482 gboolean result = FALSE;
2484 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2485 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2486 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2488 /* Get folder view to check focus */
2489 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2490 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2492 /* Check dimmed rule (TODO: check focus on widgets */
2494 result = ((state->n_selected == 0 ) ||
2495 (gtk_widget_is_focus (folder_view)));
2497 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2499 if (!result && unique) {
2500 result = state->n_selected > 1;
2502 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2510 _msg_download_in_progress (ModestWindow *win)
2512 gboolean result = FALSE;
2514 g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2516 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2517 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2519 else if (MODEST_IS_MAIN_WINDOW (win)) {
2520 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2527 _msg_download_completed (ModestMainWindow *win)
2529 const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2530 return state->any_marked_as_cached;
2534 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2536 GSList **send_queues = (GSList **) userdata;
2537 *send_queues = g_slist_prepend (*send_queues, value);
2541 _selected_msg_sent_in_progress (ModestWindow *win)
2543 const DimmedState *state = modest_window_get_dimming_state (win);
2544 return state->sent_in_progress;
2549 _sending_in_progress (ModestWindow *win)
2551 GHashTable *send_queue_cache = NULL;
2552 ModestCacheMgr *cache_mgr = NULL;
2553 ModestTnySendQueue *send_queue = NULL;
2554 GSList *send_queues = NULL, *node = NULL;
2555 gboolean result = FALSE;
2557 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (win), FALSE);
2559 /* Get send queue */
2560 cache_mgr = modest_runtime_get_cache_mgr ();
2561 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
2562 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
2564 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
2566 for (node = send_queues; node != NULL && !result; node = g_slist_next (node)) {
2567 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
2569 /* Check if send operation is in progress */
2570 result = modest_tny_send_queue_sending_in_progress (send_queue);
2577 _invalid_folder_for_purge (ModestWindow *win,
2578 ModestDimmingRule *rule)
2580 TnyFolder *folder = NULL;
2581 TnyAccount *account = NULL;
2582 gboolean result = FALSE;
2584 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2586 /* Get folder and account of message */
2587 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2588 g_return_val_if_fail(msg != NULL, TRUE);
2589 folder = tny_msg_get_folder (msg);
2590 g_object_unref (msg);
2591 if (folder == NULL) {
2592 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
2595 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2596 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2597 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2600 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
2601 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2604 g_return_val_if_reached (FALSE);
2606 account = modest_tny_folder_get_account (folder);
2607 if (account == NULL) goto frees;
2610 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2611 TnyFolderType types[2];
2612 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2613 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2615 if (_selected_folder_is_any_of_type (win, types, 2)) {
2617 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_editable_msg"));
2622 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2623 /* If it's POP then dim */
2624 if (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2625 MODEST_PROTOCOL_STORE_POP) {
2626 GList *attachments = NULL;
2627 gint n_selected = 0;
2630 /* TODO: This check is here to prevent a gwarning, but this looks like a logic error.
2632 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2633 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2634 n_selected = g_list_length (attachments);
2635 g_list_free (attachments);
2638 modest_dimming_rule_set_notification (rule,
2639 ngettext ("mail_ib_unable_to_pure_attach_pop_mail_singular",
2640 "mail_ib_unable_to_pure_attach_pop_mail_plural",
2647 g_object_unref (folder);
2648 if (account != NULL)
2649 g_object_unref (account);
2655 _transfer_mode_enabled (ModestWindow *win)
2657 gboolean result = FALSE;
2660 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2661 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2662 } else if (MODEST_IS_MAIN_WINDOW(win)) {
2663 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2665 g_warning("_transfer_mode_enabled called with wrong window type");
2672 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2674 GtkWidget *folder_view = NULL;
2675 TnyFolderStore *folder = NULL;
2676 ModestEmailClipboard *clipboard = NULL;
2677 const gchar *folder_name = NULL;
2678 gboolean result = FALSE;
2680 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2682 /*Get current parent folder */
2683 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2684 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2685 /* If no folder view, always dimmed */
2686 if (!folder_view) return FALSE;
2688 /* Get selected folder as parent of new folder to create */
2689 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2690 if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
2692 /* get modest clipboard and source folder */
2693 clipboard = modest_runtime_get_email_clipboard ();
2694 folder_name = modest_email_clipboard_get_folder_name (clipboard);
2695 if (folder_name == NULL) goto frees;
2697 /* Check source subfolders names */
2698 result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
2704 g_object_unref (folder);
2711 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win,
2714 ModestDimmingRule *rule = NULL;
2715 gboolean dimmed = FALSE;
2717 g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2718 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2719 rule = MODEST_DIMMING_RULE (user_data);
2721 /* Check dimmed rule */
2723 dimmed = !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
2730 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
2733 g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
2735 ModestMsgEditFormat format =
2736 modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
2738 return (format != MODEST_MSG_EDIT_FORMAT_HTML);