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-ui-actions.h"
37 #include "modest-account-mgr-helpers.h"
38 #include "modest-dimming-rule.h"
39 #include "modest-debug.h"
40 #include "modest-tny-folder.h"
41 #include "modest-tny-account.h"
42 #include "modest-tny-msg.h"
43 #include "modest-tny-mime-part.h"
44 #include "modest-text-utils.h"
45 #include "widgets/modest-folder-view.h"
46 #include "modest-address-book.h"
47 #include <widgets/modest-attachments-view.h>
48 #include <modest-runtime.h>
49 #include <tny-simple-list.h>
50 #include <widgets/modest-recpt-editor.h>
51 #include <gtkhtml/gtkhtml.h>
52 #include <modest-runtime.h>
53 #ifdef MODEST_TOOLKIT_HILDON2
54 #include <modest-header-window.h>
55 #include <modest-folder-window.h>
59 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
60 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique, ModestDimmingRule *rule);
61 static gboolean _invalid_attach_selected (ModestWindow *win,
62 gboolean unique, gboolean for_view, gboolean for_remove,
63 ModestDimmingRule *rule);
64 static gboolean _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule);
65 static gboolean _clipboard_is_empty (ModestWindow *win);
66 static gboolean _invalid_clipboard_selected (ModestWindow *win, ModestDimmingRule *rule);
67 static gboolean _selected_folder_not_writeable (ModestMainWindow *win, gboolean for_paste);
68 static gboolean _selected_folder_not_moveable (ModestMainWindow *win);
69 static gboolean _selected_folder_not_renameable (ModestMainWindow *win);
70 static gboolean _selected_folder_not_deletable (ModestMainWindow *win);
71 static gboolean _selected_folder_is_any_of_type (ModestWindow *win, TnyFolderType types[], guint ntypes);
72 static gboolean _selected_folder_is_root_or_inbox (ModestMainWindow *win);
73 static gboolean _selected_folder_is_root (ModestMainWindow *win);
74 static gboolean _header_view_is_all_selected (ModestMainWindow *win);
75 static gboolean _selected_folder_is_empty (ModestMainWindow *win);
76 static gboolean _folder_view_has_focus (ModestWindow *win);
77 static gboolean _selected_folder_is_same_as_source (ModestWindow *win);
78 static gboolean _msg_download_in_progress (ModestWindow *win);
79 static gboolean _msg_download_completed (ModestMainWindow *win);
80 static gboolean _selected_msg_sent_in_progress (ModestWindow *win);
81 static gboolean _invalid_folder_for_purge (ModestWindow *win, ModestDimmingRule *rule);
82 static gboolean _transfer_mode_enabled (ModestWindow *win);
83 static gboolean _selected_folder_has_subfolder_with_same_name (ModestWindow *win);
84 static void fill_list_of_caches (gpointer key, gpointer value, gpointer userdata);
85 static gboolean _send_receive_in_progress (ModestWindow *win);
86 static gboolean _msgs_send_in_progress (void);
87 static gboolean _all_msgs_in_sending_status (ModestHeaderView *header_view) G_GNUC_UNUSED;
90 _define_main_window_dimming_state (ModestMainWindow *window)
92 DimmedState *state = NULL;
93 GtkWidget *focused_widget = NULL;
94 GtkWidget *header_view = NULL;
95 GtkTreeModel *model = NULL;
96 TnyList *selected_headers = NULL;
97 TnyIterator *iter = NULL;
98 TnyHeader *header = NULL;
99 ModestCacheMgr *cache_mgr = NULL;
100 GHashTable *send_queue_cache = NULL;
101 ModestTnySendQueue *send_queue = NULL;
102 GSList *send_queues = NULL, *node = NULL;
103 ModestWindowMgr *mgr = NULL;
104 gboolean found = FALSE;
105 gchar *msg_uid = NULL;
106 TnyHeaderFlags flags;
107 gboolean all_deleted = TRUE;
108 gboolean all_seen = TRUE;
109 gboolean all_cached = TRUE;
110 gboolean all_has_attach = TRUE;
111 TnyFolder *folder = NULL;
113 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(window), NULL);
116 state = g_slice_new0 (DimmedState);
117 state->n_selected = 0;
118 state->already_opened_msg = 0;
119 state->any_marked_as_deleted = FALSE;
120 state->all_marked_as_deleted = FALSE;
121 state->any_marked_as_seen = FALSE;
122 state->all_marked_as_seen = FALSE;
123 state->any_marked_as_cached = FALSE;
124 state->all_marked_as_cached = FALSE;
125 state->any_has_attachments = FALSE;
126 state->all_has_attachments = FALSE;
127 state->sent_in_progress = FALSE;
128 state->all_selected = FALSE;
130 /* Get focused widget */
131 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
132 if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
135 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
136 header_view = focused_widget;
138 header_view = modest_main_window_get_child_widget (window, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
141 /* Get header view and selected headers */
142 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
143 if (!selected_headers)
146 /* Examine selected headers */
147 iter = tny_list_create_iterator (selected_headers);
148 while (!tny_iterator_is_done (iter)) {
149 header = TNY_HEADER (tny_iterator_get_current (iter));
150 flags = tny_header_get_flags (header);
156 mgr = modest_runtime_get_window_mgr ();
157 if (modest_window_mgr_find_registered_header (mgr, header, NULL))
158 state->already_opened_msg++;
161 /* Mark as deleted */
162 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
163 state->all_marked_as_deleted = all_deleted;
164 if (!state->any_marked_as_deleted)
165 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
168 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
169 state->all_marked_as_seen = all_seen;
170 if (!state->any_marked_as_seen)
171 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
174 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
175 state->all_marked_as_cached = all_cached;
176 if (!state->any_marked_as_cached)
177 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
179 /* Mark has_attachments */
180 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
181 state->all_has_attachments = all_has_attach;
182 if (!state->any_has_attachments)
183 state->any_has_attachments = flags & TNY_HEADER_FLAG_ATTACHMENTS;
185 /* sent in progress */
186 folder = tny_header_get_folder (header);
188 if (modest_tny_folder_guess_folder_type (folder) == TNY_FOLDER_TYPE_OUTBOX) {
189 msg_uid = modest_tny_send_queue_get_msg_id (header);
190 if (!state->sent_in_progress) {
191 cache_mgr = modest_runtime_get_cache_mgr ();
192 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
193 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
195 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
197 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
198 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
200 /* Check if msg uid is being processed inside send queue */
201 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
203 state->sent_in_progress = found;
206 g_object_unref (folder);
208 tny_iterator_next (iter);
209 g_object_unref (header);
212 /* check if all the headers are selected or not */
213 model = gtk_tree_view_get_model(GTK_TREE_VIEW(header_view));
216 count = gtk_tree_model_iter_n_children(model, NULL);
217 if(state->n_selected == count)
218 state->all_selected = TRUE;
223 g_object_unref(selected_headers);
224 g_object_unref(iter);
225 g_slist_free (send_queues);
231 _define_msg_view_window_dimming_state (ModestMsgViewWindow *window)
233 DimmedState *state = NULL;
234 TnyHeader *header = NULL;
235 ModestCacheMgr *cache_mgr = NULL;
236 GHashTable *send_queue_cache = NULL;
237 ModestTnySendQueue *send_queue = NULL;
238 GSList *send_queues = NULL, *node = NULL;
239 gboolean found = FALSE;
240 gchar *msg_uid = NULL;
241 TnyHeaderFlags flags;
242 gboolean all_deleted = TRUE;
243 gboolean all_seen = TRUE;
244 gboolean all_cached = TRUE;
245 gboolean all_has_attach = TRUE;
247 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(window), NULL);
250 state = g_slice_new0 (DimmedState);
251 state->n_selected = 0;
252 state->already_opened_msg = 0;
253 state->any_marked_as_deleted = FALSE;
254 state->all_marked_as_deleted = FALSE;
255 state->any_marked_as_seen = FALSE;
256 state->all_marked_as_seen = FALSE;
257 state->any_marked_as_cached = FALSE;
258 state->all_marked_as_cached = FALSE;
259 state->any_has_attachments = FALSE;
260 state->all_has_attachments = FALSE;
261 state->sent_in_progress = FALSE;
263 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(window));
266 g_return_val_if_fail (TNY_IS_HEADER(header), state);
267 flags = tny_header_get_flags (header);
272 /* Mark as deleted */
273 all_deleted = all_deleted && (flags & TNY_HEADER_FLAG_DELETED);
274 state->all_marked_as_deleted = all_deleted;
275 if (!state->any_marked_as_deleted)
276 state->any_marked_as_deleted = flags & TNY_HEADER_FLAG_DELETED;
279 all_seen = all_seen && (flags & TNY_HEADER_FLAG_SEEN);
280 state->all_marked_as_seen = all_seen;
281 if (!state->any_marked_as_seen)
282 state->any_marked_as_seen = flags & TNY_HEADER_FLAG_SEEN;
285 all_cached = all_cached && (flags & TNY_HEADER_FLAG_CACHED);
286 state->all_marked_as_cached = all_cached;
287 if (!state->any_marked_as_cached)
288 state->any_marked_as_cached = flags & TNY_HEADER_FLAG_CACHED;
290 /* Mark has_attachments */
291 all_has_attach = all_has_attach && (flags & TNY_HEADER_FLAG_ATTACHMENTS);
292 state->all_has_attachments = all_has_attach;
293 if (!state->any_has_attachments)
294 state->any_has_attachments = (flags & TNY_HEADER_FLAG_ATTACHMENTS)?1:0;
296 /* sent in progress */
297 msg_uid = modest_tny_send_queue_get_msg_id (header);
298 if (!state->sent_in_progress) {
299 cache_mgr = modest_runtime_get_cache_mgr ();
300 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
301 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
303 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
305 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
306 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
308 /* Check if msg uid is being processed inside send queue */
309 found = modest_tny_send_queue_msg_is_being_sent (send_queue, msg_uid);
311 state->sent_in_progress = found;
316 g_object_unref (header);
317 g_slist_free (send_queues);
324 modest_ui_dimming_rules_define_dimming_state (ModestWindow *window)
326 DimmedState *state = NULL;
328 g_return_val_if_fail (MODEST_IS_WINDOW(window), NULL);
330 if (MODEST_IS_MAIN_WINDOW (window))
331 state = _define_main_window_dimming_state (MODEST_MAIN_WINDOW(window));
332 else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
333 state = _define_msg_view_window_dimming_state (MODEST_MSG_VIEW_WINDOW(window));
340 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
342 ModestDimmingRule *rule = NULL;
343 gboolean dimmed = FALSE;
345 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
346 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
347 rule = MODEST_DIMMING_RULE (user_data);
349 /* Check dimmed rule */
350 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
351 #ifndef MODEST_TOOLKIT_HILDON2
352 dimmed = _msg_download_in_progress (win);
354 modest_dimming_rule_set_notification (rule, "");
356 } else if (MODEST_IS_MAIN_WINDOW(win)) {
357 dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
360 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
367 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
369 ModestDimmingRule *rule = NULL;
370 GtkWidget *folder_view = NULL;
371 TnyFolderStore *parent_folder = NULL;
372 gboolean dimmed = FALSE;
374 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
375 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
376 rule = MODEST_DIMMING_RULE (user_data);
378 dimmed = _transfer_mode_enabled (win);
380 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
384 /* Get selected folder as parent of new folder to create */
385 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
386 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
387 if (!folder_view) /* folder view may not have been created yet */
390 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
394 if (TNY_IS_ACCOUNT (parent_folder)) {
395 /* If it's the local account then do not dim */
396 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
399 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (parent_folder));
400 if (protocol_type != MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
401 ModestProtocolRegistry *protocol_registry;
403 protocol_registry = modest_runtime_get_protocol_registry ();
404 /* If account does not support folders (pop) then dim */
405 dimmed = (!modest_protocol_registry_protocol_type_has_tag (protocol_registry, protocol_type,
406 MODEST_PROTOCOL_REGISTRY_STORE_HAS_FOLDERS));
408 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
412 TnyFolderType types[3];
414 types[0] = TNY_FOLDER_TYPE_DRAFTS;
415 types[1] = TNY_FOLDER_TYPE_OUTBOX;
416 types[2] = TNY_FOLDER_TYPE_SENT;
418 /* Apply folder rules */
420 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), FALSE);
422 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
425 dimmed = _selected_folder_is_any_of_type (win, types, 3);
427 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_create_error"));
431 /* if not the folder is selected then dim */
432 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
433 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
434 if (folder_view && !gtk_widget_is_focus (folder_view))
437 g_object_unref (parent_folder);
443 modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
445 ModestDimmingRule *rule = NULL;
446 GtkWidget *folder_view = NULL;
447 GtkWidget *header_view = NULL;
448 gboolean dimmed = FALSE;
450 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
451 rule = MODEST_DIMMING_RULE (user_data);
453 if (MODEST_IS_MAIN_WINDOW (win)) {
454 /* Get the folder view */
455 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
456 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
458 /* Get header view */
459 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
460 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
462 if (header_view && gtk_widget_is_focus (header_view))
463 dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
465 if (folder_view && gtk_widget_is_focus (folder_view))
466 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
468 if (header_view && folder_view &&
469 !gtk_widget_is_focus (header_view) &&
470 !gtk_widget_is_focus (folder_view)) {
472 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
475 #ifdef MODEST_TOOLKIT_HILDON2
476 } else if (MODEST_IS_FOLDER_WINDOW (win)) {
477 dimmed = modest_ui_dimming_rules_on_folder_window_delete (win, user_data);
478 } else if (MODEST_IS_HEADER_WINDOW (win)) {
481 dimmed = _transfer_mode_enabled (win);
484 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
487 GtkWidget *header_view;
490 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
491 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
493 dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
494 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
497 (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
498 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
500 g_object_unref (folder);
506 dimmed = modest_ui_dimming_rules_on_delete_folder (win, rule);
515 modest_ui_dimming_rules_on_delete_folder (ModestWindow *win, gpointer user_data)
517 ModestDimmingRule *rule = NULL;
518 TnyFolderType types[6];
519 gboolean dimmed = FALSE;
521 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
522 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
523 rule = MODEST_DIMMING_RULE (user_data);
525 types[0] = TNY_FOLDER_TYPE_DRAFTS;
526 types[1] = TNY_FOLDER_TYPE_OUTBOX;
527 types[2] = TNY_FOLDER_TYPE_SENT;
528 types[3] = TNY_FOLDER_TYPE_INBOX;
529 types[4] = TNY_FOLDER_TYPE_ROOT;
530 types[5] = TNY_FOLDER_TYPE_ARCHIVE;
533 /* Check dimmed rule */
534 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
536 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
538 dimmed = _selected_folder_is_any_of_type (win, types, 6);
540 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
543 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
545 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_delete_error"));
548 dimmed = _transfer_mode_enabled (win);
550 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
557 modest_ui_dimming_rules_on_sort (ModestWindow *win, gpointer user_data)
559 ModestDimmingRule *rule = NULL;
560 gboolean dimmed = FALSE;
562 #ifdef MODEST_TOOLKIT_HILDON2
563 if (MODEST_IS_HEADER_WINDOW (win)) {
568 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
569 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
570 rule = MODEST_DIMMING_RULE (user_data);
572 /* Check dimmed rule */
573 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
576 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
583 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
585 ModestDimmingRule *rule = NULL;
586 TnyFolderType types[4];
587 gboolean dimmed = FALSE;
589 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
590 rule = MODEST_DIMMING_RULE (user_data);
592 types[0] = TNY_FOLDER_TYPE_DRAFTS;
593 types[1] = TNY_FOLDER_TYPE_OUTBOX;
594 types[2] = TNY_FOLDER_TYPE_SENT;
595 types[3] = TNY_FOLDER_TYPE_ARCHIVE;
597 /* Check dimmed rule */
598 if (MODEST_IS_MAIN_WINDOW (win)) {
599 dimmed = _selected_folder_not_renameable (MODEST_MAIN_WINDOW(win));
601 modest_dimming_rule_set_notification (rule, "");
603 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
605 modest_dimming_rule_set_notification (rule, "");
609 #ifdef MODEST_TOOLKIT_HILDON2
610 if (MODEST_IS_FOLDER_WINDOW (win)) {
611 ModestFolderView *folder_view;
612 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
613 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
614 MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE);
619 dimmed = _selected_folder_is_any_of_type (win, types, 4);
621 modest_dimming_rule_set_notification (rule, "");
628 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
630 ModestDimmingRule *rule = NULL;
631 gboolean dimmed = FALSE;
632 const DimmedState *state = NULL;
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);
637 state = modest_window_get_dimming_state (win);
639 /* Check dimmed rule */
640 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
642 dimmed = state->any_marked_as_deleted;
644 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
645 modest_dimming_rule_set_notification (rule, msg);
650 dimmed = _selected_msg_sent_in_progress (win);
652 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_open_while_sent"));
659 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
661 ModestDimmingRule *rule = NULL;
662 gboolean dimmed = FALSE;
663 TnyFolderType types[3];
665 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
666 rule = MODEST_DIMMING_RULE (user_data);
668 types[0] = TNY_FOLDER_TYPE_DRAFTS;
669 types[1] = TNY_FOLDER_TYPE_OUTBOX;
670 types[2] = TNY_FOLDER_TYPE_ROOT;
672 /* Check dimmed rule */
673 dimmed = _selected_folder_is_any_of_type (win, types, 3);
675 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
677 /* main window dimming rules */
678 if (MODEST_IS_MAIN_WINDOW(win)) {
681 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
683 modest_dimming_rule_set_notification (rule, _("mcen_ib_nothing_to_reply"));
686 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, rule);
688 /* msg view window dimming rules */
689 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
691 /* This could happen if we load the msg view window with a
692 preview before loading the full message */
693 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
697 g_object_unref (msg);
701 dimmed = _transfer_mode_enabled (win);
703 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
706 dimmed = _msg_download_in_progress (win);
708 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_reply"));
717 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
719 ModestDimmingRule *rule = NULL;
720 gboolean dimmed = FALSE;
722 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
723 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
724 rule = MODEST_DIMMING_RULE (user_data);
726 /* Check dimmed rule */
727 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
729 dimmed = _msg_download_completed (MODEST_MAIN_WINDOW(win));
731 modest_dimming_rule_set_notification (rule, "");
738 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
740 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
746 _message_already_sent (ModestMsgViewWindow *view_window)
750 gboolean already_sent = FALSE;
752 header = modest_msg_view_window_get_header (view_window);
754 folder = tny_header_get_folder (header);
756 if (modest_tny_folder_guess_folder_type (folder) ==
757 TNY_FOLDER_TYPE_OUTBOX) {
758 ModestTnySendQueueStatus status =
759 modest_tny_all_send_queues_get_msg_status (header);
760 if (status == MODEST_TNY_SEND_QUEUE_UNKNOWN ||
761 status == MODEST_TNY_SEND_QUEUE_SENDING)
764 g_object_unref (folder);
766 g_object_unref (header);
773 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
775 ModestDimmingRule *rule = NULL;
776 const DimmedState *state = NULL;
777 gboolean dimmed = FALSE;
779 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
780 rule = MODEST_DIMMING_RULE (user_data);
781 state = modest_window_get_dimming_state (win);
783 /* If we're in transfer mode then do not allow to delete messages */
784 dimmed = _transfer_mode_enabled (win);
786 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
790 /* Check dimmed rule */
791 if (MODEST_IS_MAIN_WINDOW (win)) {
792 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
794 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_nothing_to_delete"));
796 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
799 dimmed = state->sent_in_progress;
801 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
804 dimmed = state->any_marked_as_deleted;
806 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
807 modest_dimming_rule_set_notification (rule, msg);
812 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
814 gchar *message = NULL;
816 message = g_strdup_printf(_("mcen_nc_unable_to_delete_n_messages"),
817 state->already_opened_msg);
818 modest_dimming_rule_set_notification (rule, message);
824 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
825 /* This could happen if we load the msg view window with a
826 preview before loading the full message */
827 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
831 g_object_unref (msg);
835 dimmed = state->any_marked_as_deleted;
837 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
838 modest_dimming_rule_set_notification (rule, msg);
843 dimmed = state->sent_in_progress;
845 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
848 /* This could happen if we're viewing a message of the
849 outbox that has been already sent */
851 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
853 /* The delete button should be dimmed when viewing an attachment,
854 * but should be enabled when viewing a message from the list,
855 * or when viewing a search result.
858 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
859 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW(win));
861 modest_dimming_rule_set_notification (rule, _CS("ckct_ib_unable_to_delete"));
871 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
873 ModestDimmingRule *rule = NULL;
874 GtkWidget *header_view = NULL;
875 gboolean dimmed = FALSE;
877 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
878 rule = MODEST_DIMMING_RULE (user_data);
880 /* main window dimming rules */
881 if (MODEST_IS_MAIN_WINDOW(win)) {
883 /* Check dimmed rule */
884 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
885 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
887 /* If the header view has the focus: */
888 if (header_view && gtk_widget_is_focus (header_view)) {
889 /* Check dimmed rule */
891 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data);
894 /* If the folder view has the focus: */
895 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
896 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
897 if (folder_view && gtk_widget_is_focus (folder_view)) {
898 TnyFolderStore *folder_store
899 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
901 /* Only enable for folders, not accounts,
902 * though the UI spec is not clear about that.
903 * If we enable this for accounts then we must
904 * add code to handle them in modest_ui_actions_on_details(). */
905 if (!TNY_IS_FOLDER(folder_store)) {
907 modest_dimming_rule_set_notification (rule, "");
910 g_object_unref (folder_store);
913 modest_dimming_rule_set_notification (rule, "");
916 dimmed = _msg_download_in_progress (win);
918 modest_dimming_rule_set_notification (rule, "");
926 /* msg view window dimming rules */
928 /* Check dimmed rule */
929 if (MODEST_IS_MSG_VIEW_WINDOW (win))
930 dimmed = _msg_download_in_progress (win);
932 modest_dimming_rule_set_notification (rule, "");
933 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
934 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
935 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
938 modest_dimming_rule_set_notification (rule, "");
946 modest_ui_dimming_rules_on_fetch_images (ModestWindow *win, gpointer user_data)
948 gboolean dimmed = FALSE;
950 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
952 dimmed = !modest_msg_view_window_has_blocked_external_images (MODEST_MSG_VIEW_WINDOW (win));
959 modest_ui_dimming_rules_on_mark_as_read_msg_in_view (ModestWindow *win, gpointer user_data)
961 ModestDimmingRule *rule = NULL;
963 TnyHeaderFlags flags;
964 gboolean dimmed = FALSE;
967 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
968 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
969 rule = MODEST_DIMMING_RULE (user_data);
971 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
976 /* If the viewer is showing a message sent as attachment */
978 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
981 flags = tny_header_get_flags (header);
982 if (flags & TNY_HEADER_FLAG_SEEN)
987 g_object_unref (header);
993 modest_ui_dimming_rules_on_mark_as_unread_msg_in_view (ModestWindow *win, gpointer user_data)
995 ModestDimmingRule *rule = NULL;
997 TnyHeaderFlags flags;
998 gboolean dimmed = FALSE;
1001 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1002 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1003 rule = MODEST_DIMMING_RULE (user_data);
1005 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
1010 /* If the viewer is showing a message sent as attachment */
1012 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1015 flags = tny_header_get_flags (header);
1016 if (!(flags & TNY_HEADER_FLAG_SEEN))
1021 g_object_unref (header);
1026 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
1028 ModestDimmingRule *rule = NULL;
1029 TnyHeaderFlags flags;
1030 const DimmedState *state = NULL;
1031 gboolean dimmed = FALSE;
1033 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1034 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1035 rule = MODEST_DIMMING_RULE (user_data);
1036 state = modest_window_get_dimming_state (win);
1038 flags = TNY_HEADER_FLAG_SEEN;
1040 /* Check dimmed rule */
1041 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1043 dimmed = state->all_marked_as_seen;
1045 modest_dimming_rule_set_notification (rule, "");
1052 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
1054 ModestDimmingRule *rule = NULL;
1055 TnyHeaderFlags flags;
1056 const DimmedState *state = NULL;
1057 gboolean dimmed = FALSE;
1059 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1060 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1061 rule = MODEST_DIMMING_RULE (user_data);
1062 state = modest_window_get_dimming_state (win);
1064 flags = TNY_HEADER_FLAG_SEEN;
1066 /* Check dimmed rule */
1067 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1069 dimmed = !state->any_marked_as_seen;
1071 modest_dimming_rule_set_notification (rule, "");
1078 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
1080 ModestDimmingRule *rule = NULL;
1081 gboolean dimmed = FALSE;
1083 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1084 rule = MODEST_DIMMING_RULE (user_data);
1086 if (MODEST_IS_MAIN_WINDOW (win))
1087 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
1088 #ifdef MODEST_TOOLKIT_HILDON2
1089 else if (MODEST_IS_HEADER_WINDOW (win))
1090 dimmed = modest_ui_dimming_rules_on_header_window_move_to (win, user_data);
1091 else if (MODEST_IS_FOLDER_WINDOW (win))
1092 dimmed = modest_ui_dimming_rules_on_folder_window_move_to (win, user_data);
1094 else if (MODEST_IS_MSG_VIEW_WINDOW (win))
1095 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
1102 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
1104 GtkWidget *folder_view = NULL;
1105 ModestDimmingRule *rule = NULL;
1106 const DimmedState *state = NULL;
1107 gboolean dimmed = FALSE;
1109 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
1110 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1111 rule = MODEST_DIMMING_RULE (user_data);
1112 state = modest_window_get_dimming_state (win);
1114 /* Get the folder view */
1115 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
1116 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
1119 /* Check diming rules for folders transfer */
1120 if (folder_view && gtk_widget_is_focus (folder_view)) {
1121 TnyFolderType types[5];
1123 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1124 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1125 types[2] = TNY_FOLDER_TYPE_SENT;
1126 types[3] = TNY_FOLDER_TYPE_ROOT;
1127 types[4] = TNY_FOLDER_TYPE_INBOX;
1129 /* Apply folder rules */
1130 dimmed = _selected_folder_not_moveable (MODEST_MAIN_WINDOW(win));
1132 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1134 dimmed = _selected_folder_is_any_of_type (win, types, 5);
1136 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1140 /* Check diming rules for messages transfer */
1142 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1144 gchar *message = g_strdup_printf(_("emev_nc_unabletomove_items"),
1145 state->already_opened_msg);
1146 modest_dimming_rule_set_notification (rule, message);
1151 if (!(folder_view && gtk_widget_is_focus (folder_view)))
1152 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE, user_data);
1156 dimmed = _selected_msg_sent_in_progress (win);
1158 modest_dimming_rule_set_notification (rule, _("sfil_ib_unable_to_move_selected_items"));
1165 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
1167 ModestDimmingRule *rule = NULL;
1168 gboolean dimmed = FALSE;
1170 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1171 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1172 rule = MODEST_DIMMING_RULE (user_data);
1174 /* This could happen if we load the msg view window with a
1175 preview before loading the full message */
1176 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1180 g_object_unref (msg);
1183 /* Check dimmed rule */
1185 dimmed = _transfer_mode_enabled (win);
1187 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1189 dimmed = modest_window_get_dimming_state (win)->any_marked_as_deleted;
1191 gchar *msg = modest_ui_actions_get_msg_already_deleted_error_msg (win);
1192 modest_dimming_rule_set_notification (rule, msg);
1198 dimmed = _selected_msg_sent_in_progress (win);
1200 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1203 /* This could happen if we're viewing a message of the outbox
1204 that has been already sent */
1206 dimmed = _message_already_sent (MODEST_MSG_VIEW_WINDOW(win));
1209 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1210 /* The move_to button should be dimmed when viewing an attachment,
1211 * but should be enabled when viewing a message from the list,
1212 * or when viewing a search result.
1214 if (!modest_msg_view_window_is_search_result (MODEST_MSG_VIEW_WINDOW(win))) {
1215 dimmed = !modest_msg_view_window_has_headers_model (MODEST_MSG_VIEW_WINDOW (win));
1220 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_item"));
1226 #ifdef MODEST_TOOLKIT_HILDON2
1230 modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data)
1232 ModestDimmingRule *rule = NULL;
1233 gboolean dimmed = FALSE;
1235 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1236 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1237 rule = MODEST_DIMMING_RULE (user_data);
1239 /* This could happen if we load the msg view window with a
1240 preview before loading the full message */
1241 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1242 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1246 g_object_unref (msg);
1250 /* Check dimmed rule */
1251 dimmed = _transfer_mode_enabled (win);
1253 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1259 modest_ui_dimming_rules_on_paste (ModestWindow *win, gpointer user_data)
1261 ModestDimmingRule *rule = NULL;
1262 TnyFolderType types[3];
1263 gboolean dimmed = FALSE;
1265 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1266 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1267 rule = MODEST_DIMMING_RULE (user_data);
1269 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1270 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1271 types[2] = TNY_FOLDER_TYPE_SENT;
1273 /* Check dimmed rule */
1274 dimmed = _clipboard_is_empty (win);
1276 modest_dimming_rule_set_notification (rule,
1277 _CS("ecoc_ib_edwin_nothing_to_paste"));
1279 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1281 modest_dimming_rule_set_notification (rule,
1282 _CS("ckct_ib_unable_to_paste_here"));
1285 dimmed = !_folder_view_has_focus (win);
1287 modest_dimming_rule_set_notification (rule,
1288 _CS("ckct_ib_unable_to_paste_here"));
1291 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win), TRUE);
1293 modest_dimming_rule_set_notification (rule,
1294 _CS("ckct_ib_unable_to_paste_here"));
1297 dimmed = _selected_folder_is_same_as_source (win);
1299 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1302 dimmed = _selected_folder_has_subfolder_with_same_name (win);
1304 modest_dimming_rule_set_notification (rule, _("mail_in_ui_folder_copy_target_error"));
1312 modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
1314 ModestDimmingRule *rule = NULL;
1315 gboolean dimmed = FALSE;
1316 GtkWidget *focused = NULL;
1318 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1319 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1320 rule = MODEST_DIMMING_RULE (user_data);
1322 focused = gtk_window_get_focus (GTK_WINDOW (win));
1324 /* Main window dimming rules */
1325 if (MODEST_IS_MAIN_WINDOW (win))
1326 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1328 if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
1329 dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
1331 if (!dimmed && GTK_IS_ENTRY (focused)) {
1332 const gchar *current_text;
1333 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
1334 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
1337 if (!dimmed && GTK_IS_TEXT_VIEW (focused)) {
1338 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
1339 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
1342 if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
1348 modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointer user_data)
1350 ModestDimmingRule *rule = NULL;
1351 gboolean dimmed = FALSE;
1353 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1354 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1355 rule = MODEST_DIMMING_RULE (user_data);
1357 /* Check dimmed rule */
1358 dimmed = _invalid_attach_selected (win, TRUE, TRUE, FALSE, rule);
1361 dimmed = _purged_attach_selected (win, FALSE, NULL);
1363 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1370 #ifdef MODEST_TOOLKIT_HILDON2
1372 _not_valid_attachments (ModestWindow *win, gboolean save_not_remove)
1375 TnyList *attachments;
1376 gboolean result = FALSE;
1378 /* Get atachments */
1379 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
1380 n_attachments = tny_list_get_length (attachments);
1384 result = n_attachments < 1;
1387 /* Check attached type (view operation not required) */
1392 iter = tny_list_create_iterator (attachments);
1393 while (!tny_iterator_is_done (iter)) {
1394 gboolean is_valid = TRUE;
1395 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
1396 TnyList *nested_list = tny_simple_list_new ();
1397 tny_mime_part_get_parts (mime_part, nested_list);
1399 if (tny_mime_part_is_purged (mime_part)) {
1403 if (is_valid && modest_tny_mime_part_is_msg (mime_part)) {
1405 window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1407 if (save_not_remove && (TnyMimePart *) window_msg != mime_part) {
1410 g_object_unref (window_msg);
1412 if (is_valid && save_not_remove && tny_list_get_length (nested_list) > 0) {
1416 g_object_unref (nested_list);
1417 g_object_unref (mime_part);
1418 tny_iterator_next (iter);
1423 g_object_unref (iter);
1424 result = (n_valid == 0);
1426 g_object_unref (attachments);
1433 modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data)
1435 ModestDimmingRule *rule = NULL;
1436 gboolean dimmed = FALSE;
1438 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1439 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1440 rule = MODEST_DIMMING_RULE (user_data);
1442 /* Check dimmed rule */
1444 #ifdef MODEST_TOOLKIT_HILDON2
1445 dimmed = _not_valid_attachments (win, TRUE);
1447 dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
1450 dimmed = _purged_attach_selected (win, TRUE, NULL);
1452 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1460 modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
1462 ModestDimmingRule *rule = NULL;
1463 const DimmedState *state = NULL;
1464 gboolean dimmed = FALSE;
1466 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
1467 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1468 rule = MODEST_DIMMING_RULE (user_data);
1469 state = modest_window_get_dimming_state (win);
1471 /* Check in main window if there's only one message selected */
1472 if (MODEST_IS_MAIN_WINDOW (win)) {
1473 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
1476 /* Check in view window if there's any attachment selected */
1477 if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
1478 dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
1480 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
1485 dimmed = _selected_msg_sent_in_progress (win);
1487 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1491 /* cannot purge in editable drafts nor pop folders */
1493 dimmed = _invalid_folder_for_purge (win, rule);
1495 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1498 /* Check if the selected message in main window has attachments */
1499 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1500 dimmed = !(state->any_has_attachments);
1502 modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
1505 /* Check if all attachments are already purged */
1507 dimmed = _purged_attach_selected (win, TRUE, rule);
1510 /* Check if the message is already downloaded */
1511 if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
1512 dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
1514 modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
1521 modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
1523 ModestDimmingRule *rule = NULL;
1524 gboolean dimmed = FALSE;
1526 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1527 rule = MODEST_DIMMING_RULE (user_data);
1529 /* Check dimmed rule */
1530 if (MODEST_IS_MAIN_WINDOW (win)) {
1531 dimmed = _clipboard_is_empty (win);
1533 modest_dimming_rule_set_notification (rule, "");
1536 if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
1537 dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
1544 modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
1546 ModestDimmingRule *rule = NULL;
1547 gboolean dimmed = FALSE;
1549 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1550 rule = MODEST_DIMMING_RULE (user_data);
1552 /* Check dimmed rule */
1553 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
1554 dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
1561 modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data)
1563 ModestDimmingRule *rule = NULL;
1564 const DimmedState *state = NULL;
1565 gboolean dimmed = FALSE;
1567 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1568 rule = MODEST_DIMMING_RULE (user_data);
1569 state = modest_window_get_dimming_state (win);
1571 /* Check common dimming rules */
1572 dimmed = _invalid_clipboard_selected (win, rule);
1574 /* Check window specific dimming rules */
1575 if (MODEST_IS_MAIN_WINDOW (win)) {
1576 /* Get focused widget */
1577 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1579 if (MODEST_IS_HEADER_VIEW (focused)) {
1581 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1583 modest_dimming_rule_set_notification (rule, "");
1586 dimmed = _selected_msg_sent_in_progress (win);
1588 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1591 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1593 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
1596 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1597 TnyFolderType types[3];
1599 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1600 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1601 types[2] = TNY_FOLDER_TYPE_SENT;
1603 /* Apply folder rules */
1605 dimmed = _selected_folder_not_deletable (MODEST_MAIN_WINDOW(win));
1607 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1610 dimmed = _selected_folder_is_root_or_inbox (MODEST_MAIN_WINDOW(win));
1612 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1615 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1617 modest_dimming_rule_set_notification (rule, _("emev_nc_unabletomove_items"));
1626 modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
1628 ModestDimmingRule *rule = NULL;
1629 const DimmedState *state = NULL;
1630 gboolean dimmed = FALSE;
1632 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1633 rule = MODEST_DIMMING_RULE (user_data);
1634 state = modest_window_get_dimming_state (win);
1636 /* Check common dimming rules */
1637 dimmed = _invalid_clipboard_selected (win, rule);
1639 /* Check window specific dimming rules */
1640 if (MODEST_IS_MAIN_WINDOW (win)) {
1641 /* Get focused widget */
1642 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (win));
1644 if (MODEST_IS_HEADER_VIEW (focused)) {
1646 dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
1648 modest_dimming_rule_set_notification (rule, "");
1651 dimmed = _selected_msg_sent_in_progress (win);
1653 modest_dimming_rule_set_notification (rule, _(""));
1656 dimmed = (state->already_opened_msg > 0) ? TRUE : FALSE;
1658 modest_dimming_rule_set_notification (rule, _(""));
1661 else if (MODEST_IS_FOLDER_VIEW (focused)) {
1662 TnyFolderType types[3];
1664 types[0] = TNY_FOLDER_TYPE_DRAFTS;
1665 types[1] = TNY_FOLDER_TYPE_OUTBOX;
1666 types[2] = TNY_FOLDER_TYPE_SENT;
1669 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
1671 modest_dimming_rule_set_notification (rule, _(""));
1674 dimmed = _selected_folder_is_any_of_type (win, types, 3);
1676 modest_dimming_rule_set_notification (rule, _(""));
1685 modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
1687 ModestDimmingRule *rule = NULL;
1688 const DimmedState *state = NULL;
1689 gboolean dimmed = FALSE;
1691 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1692 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1693 rule = MODEST_DIMMING_RULE (user_data);
1694 state = modest_window_get_dimming_state (win);
1697 /* Check common dimming rules */
1698 ModestMsgEditFormat format;
1699 format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
1701 dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
1703 modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
1707 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1708 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1710 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1712 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1720 modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
1722 ModestDimmingRule *rule = NULL;
1723 const DimmedState *state = NULL;
1724 gboolean dimmed = FALSE;
1726 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1727 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1728 rule = MODEST_DIMMING_RULE (user_data);
1729 state = modest_window_get_dimming_state (win);
1732 body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
1733 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1735 dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
1737 modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
1743 modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
1745 ModestDimmingRule *rule = NULL;
1746 const DimmedState *state = NULL;
1747 gboolean dimmed = FALSE;
1748 GtkWidget *focused = NULL;
1750 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1751 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1752 rule = MODEST_DIMMING_RULE (user_data);
1753 state = modest_window_get_dimming_state (win);
1755 focused = gtk_window_get_focus (GTK_WINDOW (win));
1757 dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
1760 dimmed = GTK_IS_TOGGLE_BUTTON (focused);
1764 ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
1765 const gchar *clipboard_text = modest_msg_edit_window_get_clipboard_text (MODEST_MSG_EDIT_WINDOW (win));
1767 dimmed = modest_email_clipboard_cleared (e_clipboard) &&
1768 ((clipboard_text == NULL) || (clipboard_text[0] == '\0'));
1775 modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
1777 ModestDimmingRule *rule = NULL;
1778 const DimmedState *state = NULL;
1779 gboolean dimmed = FALSE;
1780 TnyList *selected_attachments = NULL;
1781 gint n_att_selected = 0;
1782 GtkWidget *attachments_view;
1784 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1785 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1786 rule = MODEST_DIMMING_RULE (user_data);
1787 state = modest_window_get_dimming_state (win);
1789 attachments_view = modest_msg_edit_window_get_child_widget (
1790 MODEST_MSG_EDIT_WINDOW (win),
1791 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
1793 #ifdef MODEST_TOOLKIT_HILDON2
1794 selected_attachments = modest_attachments_view_get_attachments (
1795 MODEST_ATTACHMENTS_VIEW (attachments_view));
1797 selected_attachments = modest_attachments_view_get_selection (
1798 MODEST_ATTACHMENTS_VIEW (attachments_view));
1800 n_att_selected = tny_list_get_length (selected_attachments);
1801 g_object_unref (selected_attachments);
1803 dimmed = (n_att_selected < 1);
1809 modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
1811 ModestDimmingRule *rule = NULL;
1812 const DimmedState *state = NULL;
1813 gboolean dimmed = FALSE;
1814 GtkWidget *subject_field, *body_field;
1815 const gchar *subject = NULL;
1817 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1818 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
1819 rule = MODEST_DIMMING_RULE (user_data);
1820 state = modest_window_get_dimming_state (win);
1822 body_field = modest_msg_edit_window_get_child_widget (
1823 MODEST_MSG_EDIT_WINDOW (win),
1824 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
1825 subject_field = modest_msg_edit_window_get_child_widget (
1826 MODEST_MSG_EDIT_WINDOW (win),
1827 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT);
1828 subject = gtk_entry_get_text (GTK_ENTRY (subject_field));
1830 dimmed = (subject == NULL || subject[0] == '\0');
1832 modest_dimming_rule_set_notification (rule, _("mcen_ib_subject_not_modified"));
1835 GtkWidget *to_field, *cc_field, *bcc_field;
1836 GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
1837 cc_field = modest_msg_edit_window_get_child_widget (
1838 MODEST_MSG_EDIT_WINDOW (win),
1839 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
1840 to_field = modest_msg_edit_window_get_child_widget (
1841 MODEST_MSG_EDIT_WINDOW (win),
1842 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
1843 bcc_field = modest_msg_edit_window_get_child_widget (
1844 MODEST_MSG_EDIT_WINDOW (win),
1845 MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
1846 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
1847 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
1848 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
1850 dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
1851 gtk_text_buffer_get_char_count (cc_buffer) +
1852 gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
1854 modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
1861 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
1863 ModestDimmingRule *rule = NULL;
1864 gboolean dimmed = FALSE;
1866 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1867 rule = MODEST_DIMMING_RULE (user_data);
1869 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1871 /* Check dimmed rule */
1872 dimmed = _transfer_mode_enabled (win);
1874 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1877 dimmed = modest_msg_view_window_first_message_selected (
1878 MODEST_MSG_VIEW_WINDOW(win));
1879 modest_dimming_rule_set_notification (rule, NULL);
1886 modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
1888 ModestDimmingRule *rule = NULL;
1889 gboolean dimmed = FALSE;
1891 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
1892 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1893 rule = MODEST_DIMMING_RULE (user_data);
1895 /* Check dimmed rule */
1896 dimmed = _transfer_mode_enabled (win);
1898 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
1901 dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
1902 modest_dimming_rule_set_notification (rule, NULL);
1910 modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
1913 ModestAccountMgr *mgr;
1915 mgr = modest_runtime_get_account_mgr();
1916 dimmed = !modest_account_mgr_has_accounts(mgr, TRUE);
1918 /* Dimm it if we only have metaaccounts */
1920 ModestProtocolRegistry *reg = modest_runtime_get_protocol_registry ();
1921 GSList *account_names = modest_account_mgr_account_names (mgr, TRUE);
1923 if (account_names) {
1924 ModestProtocolType store_protocol;
1925 gboolean found = FALSE;
1926 GSList *iter = account_names;
1927 const gchar *tag = MODEST_PROTOCOL_REGISTRY_MULTI_MAILBOX_PROVIDER_PROTOCOLS;
1929 while (iter && !found) {
1930 gchar* account_name;
1932 account_name = (gchar *) iter->data;
1933 store_protocol = modest_account_mgr_get_store_protocol (mgr, account_name);
1935 if (!modest_protocol_registry_protocol_type_has_tag (reg, store_protocol, tag))
1938 iter = g_slist_next (iter);
1940 modest_account_mgr_free_account_names (account_names);
1949 modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
1951 ModestDimmingRule *rule = NULL;
1952 TnyFolderType types[1];
1953 const DimmedState *state = NULL;
1954 gboolean dimmed = FALSE;
1956 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
1957 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1958 rule = MODEST_DIMMING_RULE (user_data);
1959 state = modest_window_get_dimming_state (win);
1961 types[0] = TNY_FOLDER_TYPE_OUTBOX;
1963 /* Check dimmed rules */
1964 dimmed = !_selected_folder_is_any_of_type (win, types, 1);
1966 modest_dimming_rule_set_notification (rule, "");
1968 dimmed = !state->sent_in_progress;
1970 modest_dimming_rule_set_notification (rule, "");
1977 modest_ui_dimming_rules_on_cancel_sending_all (ModestWindow *win, gpointer user_data)
1979 /* We dim if no msg send is in progress (and then cancelling send all has no
1981 return !_msgs_send_in_progress ();
1985 modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data)
1987 ModestDimmingRule *rule = NULL;
1988 gboolean dimmed = FALSE;
1989 ModestAccountMgr *mgr;
1990 const gchar* account_name;
1992 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
1993 rule = MODEST_DIMMING_RULE (user_data);
1994 mgr = modest_runtime_get_account_mgr();
1996 /* Check dimmed rule */
1997 account_name = modest_window_get_active_account (win);
2000 dimmed = modest_account_mgr_account_is_busy (mgr, account_name);
2005 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
2011 modest_ui_dimming_rules_on_send_receive_all (ModestWindow *win, gpointer user_data)
2013 ModestDimmingRule *rule = NULL;
2014 gboolean dimmed = FALSE;
2016 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2017 rule = MODEST_DIMMING_RULE (user_data);
2019 /* Check dimmed rule */
2020 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
2021 if (g_slist_length (account_names) < 1)
2024 modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
2026 modest_account_mgr_free_account_names (account_names);
2029 dimmed = _send_receive_in_progress (win);
2035 #ifdef MODEST_TOOLKIT_HILDON2
2037 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
2040 GSList *recipients, *node;
2041 gboolean has_recipients_to_add;
2043 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2044 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);
2046 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2048 /* Message is loaded asynchronously, so this could happen */
2050 #ifdef MODEST_TOOLKIT_HILDON2
2053 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
2057 recipients = modest_tny_msg_header_get_all_recipients_list (header);
2058 g_object_unref (header);
2063 recipients = modest_tny_msg_get_all_recipients_list (msg);
2064 g_object_unref (msg);
2067 has_recipients_to_add = FALSE;
2068 for (node = recipients; node != NULL; node = g_slist_next (node)) {
2069 if (!modest_address_book_has_address ((const gchar *) node->data)) {
2070 has_recipients_to_add = TRUE;
2075 g_slist_foreach (recipients, (GFunc) g_free, NULL);
2076 g_slist_free (recipients);
2078 return !has_recipients_to_add;
2082 modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data)
2084 ModestDimmingRule *rule = NULL;
2085 gboolean dimmed = FALSE;
2086 GtkWidget *focused = NULL;
2088 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
2089 rule = MODEST_DIMMING_RULE (user_data);
2090 focused = gtk_window_get_focus (GTK_WINDOW (win));
2095 gchar *selection = NULL;
2096 if (GTK_IS_TEXT_VIEW (focused)) {
2097 GtkTextIter start, end;
2098 GtkTextBuffer *buffer = NULL;
2099 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2100 if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) {
2101 selection = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
2103 } else if (GTK_IS_LABEL (focused)) {
2104 selection = modest_text_utils_label_get_selection (GTK_LABEL (focused));
2106 gboolean do_check = TRUE;
2107 GtkClipboard *clipboard;
2108 if (GTK_IS_HTML (focused)) {
2111 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2112 do_check = !((sel == NULL) || (sel[0] == '\0'));
2113 } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2117 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2118 selection = gtk_clipboard_wait_for_text (clipboard);
2123 dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
2130 /* *********************** static utility functions ******************** */
2134 _selected_folder_not_writeable (ModestMainWindow *win,
2137 GtkWidget *folder_view = NULL;
2138 TnyFolderStore *parent_folder = NULL;
2139 ModestEmailClipboard *clipboard = NULL;
2140 ModestTnyFolderRules rules;
2141 gboolean is_local_acc = FALSE;
2142 gboolean xfer_folders = FALSE;
2143 gboolean result = FALSE;
2145 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2147 /* Get folder view */
2148 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2149 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2150 /* If no folder view, always dimmed */
2154 /* Get selected folder as parent of new folder to create */
2155 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2156 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2157 /* If it's the local account and its transfering folders, then do not dim */
2158 if (TNY_IS_ACCOUNT (parent_folder)) {
2159 is_local_acc = modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder));
2161 clipboard = modest_runtime_get_email_clipboard ();
2162 xfer_folders = modest_email_clipboard_folder_copied (clipboard);
2167 result = !(is_local_acc && xfer_folders);
2169 result = !is_local_acc;
2173 /* Check dimmed rule */
2174 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2175 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
2179 if (parent_folder != NULL)
2180 g_object_unref (parent_folder);
2186 _selected_folder_not_deletable (ModestMainWindow *win)
2188 GtkWidget *folder_view = NULL;
2189 TnyFolderStore *parent_folder = NULL;
2190 ModestTnyFolderRules rules;
2191 gboolean result = FALSE;
2193 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2195 /* Get folder view */
2196 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2197 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2198 /* If no folder view, always dimmed */
2202 /* Get selected folder as parent of new folder to create */
2203 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2204 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2209 /* Check dimmed rule */
2210 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2211 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE;
2215 if (parent_folder != NULL)
2216 g_object_unref (parent_folder);
2222 _selected_folder_not_moveable (ModestMainWindow *win)
2224 GtkWidget *folder_view = NULL;
2225 TnyFolderStore *parent_folder = NULL;
2226 ModestTnyFolderRules rules;
2227 gboolean result = FALSE;
2229 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2231 /* Get folder view */
2232 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2233 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2234 /* If no folder view, always dimmed */
2238 /* Get selected folder as parent of new folder to create */
2239 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2240 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2245 /* Check dimmed rule */
2246 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2247 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE;
2251 if (parent_folder != NULL)
2252 g_object_unref (parent_folder);
2258 _selected_folder_not_renameable (ModestMainWindow *win)
2260 GtkWidget *folder_view = NULL;
2261 TnyFolderStore *parent_folder = NULL;
2262 ModestTnyFolderRules rules;
2263 gboolean result = FALSE;
2265 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2267 /* Get folder view */
2268 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2269 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2270 /* If no folder view, always dimmed */
2274 /* Get selected folder as parent of new folder to create */
2275 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2276 if (!(parent_folder && TNY_IS_FOLDER(parent_folder))) {
2281 /* Check dimmed rule */
2282 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
2283 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_RENAMEABLE;
2287 if (parent_folder != NULL)
2288 g_object_unref (parent_folder);
2294 _selected_folder_is_root_or_inbox (ModestMainWindow *win)
2296 TnyFolderType types[2];
2297 gboolean result = FALSE;
2299 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2301 types[0] = TNY_FOLDER_TYPE_ROOT;
2302 types[1] = TNY_FOLDER_TYPE_INBOX;
2304 /* Check folder type */
2305 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 2);
2307 /* Check pop and MMC accounts */
2309 result = _selected_folder_is_root (win);
2317 _selected_folder_is_root (ModestMainWindow *win)
2319 TnyFolderType types[1];
2320 gboolean result = FALSE;
2322 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2324 /* All accounts are root items: */
2325 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2326 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2328 gboolean is_account = FALSE;
2329 TnyFolderStore *folder_store =
2330 modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2332 is_account = TNY_IS_ACCOUNT (folder_store);
2334 g_object_unref (folder_store);
2335 folder_store = NULL;
2342 /* Try something more precise: */
2343 types[0] = TNY_FOLDER_TYPE_ROOT;
2345 /* Check folder type */
2346 result = _selected_folder_is_any_of_type (MODEST_WINDOW(win), types, 1);
2352 _header_view_is_all_selected (ModestMainWindow *win)
2354 const DimmedState *state = NULL;
2356 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2358 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2360 return state->all_selected;
2364 _selected_folder_is_empty (ModestMainWindow *win)
2366 GtkWidget *folder_view = NULL, *header_view = NULL;
2367 TnyFolderStore *folder = NULL;
2368 gboolean result = FALSE;
2370 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2372 /* Get folder view */
2373 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2374 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2376 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2377 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2379 /* If no folder view, always dimmed */
2380 if (!folder_view || !header_view)
2383 /* Get selected folder as parent of new folder to create */
2384 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2385 if (!(folder && TNY_IS_FOLDER(folder))) {
2387 g_object_unref (folder);
2391 /* Check folder type */
2392 if (modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)) ||
2393 tny_folder_get_all_count (TNY_FOLDER (folder)) == 0)
2397 g_object_unref (folder);
2403 _folder_view_has_focus (ModestWindow *win)
2405 GtkWidget *folder_view = NULL;
2407 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2409 /* Get folder view */
2410 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2411 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2415 if (gtk_widget_is_focus(folder_view))
2422 _selected_folder_is_same_as_source (ModestWindow *win)
2424 ModestEmailClipboard *clipboard = NULL;
2425 GtkWidget *folder_view = NULL;
2426 TnyFolderStore *folder = NULL;
2427 gboolean result = FALSE;
2429 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2431 /* Get folder view */
2432 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2433 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2437 /* Get selected folder as destination folder */
2438 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2439 if (!(folder && TNY_IS_FOLDER(folder))) {
2444 /* Check clipboard is cleared */
2445 clipboard = modest_runtime_get_email_clipboard ();
2446 if (modest_email_clipboard_cleared (clipboard)) {
2451 /* Check source folder */
2452 result = modest_email_clipboard_check_source_folder (clipboard, TNY_FOLDER (folder));
2456 g_object_unref (folder);
2462 _selected_folder_is_any_of_type (ModestWindow *win,
2463 TnyFolderType types[],
2466 GtkWidget *folder_view = NULL;
2467 TnyFolderStore *folder = NULL;
2468 TnyFolderType folder_type;
2470 gboolean result = FALSE;
2472 /*Get current folder */
2473 if (MODEST_IS_MAIN_WINDOW(win)) {
2475 /* Get folder view */
2476 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2477 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2478 /* If no folder view, always dimmed */
2482 /* Get selected folder as parent of new folder to create */
2483 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2485 if (!(folder && TNY_IS_FOLDER(folder))) {
2487 g_object_unref (folder);
2491 /* Check folder type */
2492 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
2494 else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2495 folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (win));
2496 for (i=0; i < ntypes; i++) {
2497 result = result || folder_type == types[i];
2504 g_object_unref (folder);
2510 _folder_is_any_of_type (TnyFolder *folder,
2511 TnyFolderType types[],
2514 TnyFolderType folder_type;
2515 gboolean result = FALSE;
2518 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
2520 /* Get folder type */
2521 folder_type = modest_tny_folder_guess_folder_type (folder);
2522 if (folder_type == TNY_FOLDER_TYPE_INVALID)
2523 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
2525 /* Check foler type */
2526 for (i=0; i < ntypes; i++) {
2527 result = result || folder_type == types[i];
2534 _clipboard_is_empty (ModestWindow *win)
2536 gboolean result = FALSE;
2538 if (MODEST_IS_MAIN_WINDOW (win)) {
2539 ModestEmailClipboard *clipboard = NULL;
2540 clipboard = modest_runtime_get_email_clipboard ();
2541 if (modest_email_clipboard_cleared (clipboard))
2549 _invalid_clipboard_selected (ModestWindow *win,
2550 ModestDimmingRule *rule)
2552 const DimmedState *state = NULL;
2553 gboolean result = FALSE;
2554 GtkWidget *focused = NULL;
2556 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2557 state = modest_window_get_dimming_state (win);
2558 /* Get focuesed widget */
2559 focused = gtk_window_get_focus (GTK_WINDOW (win));
2561 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
2562 gboolean has_selection = FALSE;
2563 if (GTK_IS_TEXT_VIEW (focused)) {
2564 GtkTextBuffer *buffer = NULL;
2565 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2566 has_selection = modest_text_utils_buffer_selection_is_valid (buffer);
2567 } else if (GTK_IS_EDITABLE (focused)) {
2568 has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
2570 result = !has_selection;
2571 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2573 MODEST_DEBUG_BLOCK (g_message ("FOCUSED %s", g_type_name (G_TYPE_FROM_INSTANCE (focused))););
2574 if (GTK_IS_LABEL (focused) &&
2575 !gtk_label_get_selection_bounds (GTK_LABEL (focused), NULL, NULL)) {
2577 } else if (GTK_IS_TEXT_VIEW (focused)) {
2578 GtkTextBuffer *buffer;
2579 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2580 result = !gtk_text_buffer_get_has_selection (buffer);
2581 } else if (GTK_IS_HTML (focused)) {
2584 sel = gtk_html_get_selection_html (GTK_HTML (focused), &len);
2585 result = ((sel == NULL) || (sel[0] == '\0'));
2586 } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2589 GtkClipboard *clipboard;
2592 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
2593 /* Get clipboard selection*/
2594 selection = gtk_clipboard_wait_for_text (clipboard);
2596 result = (selection == NULL);
2604 modest_dimming_rule_set_notification (rule, "");
2607 else if (MODEST_IS_MAIN_WINDOW (win)) {
2609 result = state->n_selected == 0;
2611 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2619 _invalid_attach_selected (ModestWindow *win,
2622 gboolean for_remove,
2623 ModestDimmingRule *rule)
2625 TnyList *attachments;
2627 TnyHeaderFlags flags;
2628 gboolean nested_attachments = FALSE;
2629 gboolean selected_messages = FALSE;
2630 const DimmedState *state = NULL;
2631 gboolean result = FALSE;
2633 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
2634 state = modest_window_get_dimming_state (win);
2636 if (MODEST_IS_MAIN_WINDOW (win)) {
2637 flags = TNY_HEADER_FLAG_ATTACHMENTS;
2639 result = !state->any_has_attachments;
2641 else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2643 /* Get selected atachments */
2644 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2645 n_selected = tny_list_get_length (attachments);
2650 result = n_selected != 1;
2653 result = n_selected < 1;
2656 /* Check attached type (view operation not required) */
2657 if (!result && !for_view) {
2659 iter = tny_list_create_iterator (attachments);
2660 while (!tny_iterator_is_done (iter) && !result) {
2661 #ifdef MODEST_TOOLKIT_HILDON2
2662 gboolean not_selectable = FALSE;
2664 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2665 TnyList *nested_list = tny_simple_list_new ();
2666 tny_mime_part_get_parts (mime_part, nested_list);
2668 if (!for_remove && modest_tny_mime_part_is_msg (mime_part)) {
2670 window_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2671 if ((TnyMimePart *) window_msg != mime_part) {
2672 selected_messages = TRUE;
2673 #ifdef MODEST_TOOLKIT_HILDON2
2674 not_selectable = TRUE;
2679 g_object_unref (window_msg);
2681 if (!for_remove && tny_list_get_length (nested_list) > 0) {
2682 nested_attachments = TRUE;
2683 #ifdef MODEST_TOOLKIT_HILDON2
2684 not_selectable = TRUE;
2689 #ifdef MODEST_TOOLKIT_HILDON2
2693 g_object_unref (nested_list);
2694 g_object_unref (mime_part);
2695 tny_iterator_next (iter);
2697 g_object_unref (iter);
2700 /* No valid attachment available */
2701 if (n_selected == 0)
2704 /* Set notifications */
2705 if (result && rule != NULL) {
2706 if (selected_messages) {
2707 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_save_attach_mail"));
2708 } else if (nested_attachments) {
2709 modest_dimming_rule_set_notification (rule, _("FIXME:unable to save attachments with nested elements"));
2710 } else if (n_selected == 0) {
2711 modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
2712 } else if (unique) {
2713 modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_display_more"));
2718 g_object_unref (attachments);
2725 _purged_attach_selected (ModestWindow *win, gboolean all, ModestDimmingRule *rule)
2727 TnyList *attachments = NULL;
2730 gint n_attachments = 0;
2731 gboolean result = FALSE;
2733 /* This should check if _all_ the attachments are already purged. If only some
2734 * of them are purged, then it does not cause dim as there's a confirmation dialog
2735 * for removing only local attachments */
2737 /* Get selected atachments */
2738 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2739 attachments = modest_msg_view_window_get_attachments (MODEST_MSG_VIEW_WINDOW(win));
2740 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2741 /* If we're in main window, we won't know if there are already purged attachments */
2745 if (attachments == NULL)
2748 if (tny_list_get_length (attachments) == 0) {
2749 g_object_unref (attachments);
2753 iter = tny_list_create_iterator (attachments);
2754 while (!tny_iterator_is_done (iter)) {
2755 TnyMimePart *mime_part = TNY_MIME_PART (tny_iterator_get_current (iter));
2756 if (tny_mime_part_is_purged (mime_part)) {
2760 g_object_unref (mime_part);
2761 tny_iterator_next (iter);
2763 g_object_unref (iter);
2766 g_object_unref (attachments);
2769 result = (purged == n_attachments);
2771 result = (purged > 0);
2773 /* This string no longer exists, refer to NB#75415 for more info
2774 if (result && (rule != NULL))
2775 modest_dimming_rule_set_notification (rule, _("mail_ib_attachment_already_purged"));
2782 _invalid_msg_selected (ModestMainWindow *win,
2784 ModestDimmingRule *rule)
2786 GtkWidget *folder_view = NULL;
2787 const DimmedState *state = NULL;
2788 gboolean result = FALSE;
2790 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
2791 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), FALSE);
2792 state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2794 /* Get folder view to check focus */
2795 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2796 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2798 /* Check dimmed rule (TODO: check focus on widgets */
2800 result = ((state->n_selected == 0 ) ||
2801 (gtk_widget_is_focus (folder_view)));
2803 modest_dimming_rule_set_notification (rule, _("mcen_ib_no_message_selected"));
2805 if (!result && unique) {
2806 result = state->n_selected > 1;
2808 modest_dimming_rule_set_notification (rule, _("mcen_ib_select_one_message"));
2816 _msg_download_in_progress (ModestWindow *win)
2818 gboolean result = FALSE;
2820 g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
2822 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2823 result = modest_msg_view_window_toolbar_on_transfer_mode (MODEST_MSG_VIEW_WINDOW(win));
2825 else if (MODEST_IS_MAIN_WINDOW (win)) {
2826 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(win));
2833 _msg_download_completed (ModestMainWindow *win)
2835 const DimmedState *state = modest_window_get_dimming_state (MODEST_WINDOW(win));
2836 return state->any_marked_as_cached;
2840 fill_list_of_caches (gpointer key, gpointer value, gpointer userdata)
2842 GSList **send_queues = (GSList **) userdata;
2843 *send_queues = g_slist_prepend (*send_queues, value);
2847 _selected_msg_sent_in_progress (ModestWindow *win)
2849 const DimmedState *state = modest_window_get_dimming_state (win);
2850 return state->sent_in_progress;
2855 _invalid_folder_for_purge (ModestWindow *win,
2856 ModestDimmingRule *rule)
2858 TnyFolder *folder = NULL;
2859 TnyAccount *account = NULL;
2860 gboolean result = FALSE;
2862 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2864 /* Get folder and account of message */
2865 TnyMsg *msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2866 g_return_val_if_fail(msg != NULL, TRUE);
2867 folder = tny_msg_get_folder (msg);
2868 g_object_unref (msg);
2869 if (folder == NULL) {
2873 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2874 GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2875 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2878 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2879 /* Could be a folder store */
2880 if (folder == NULL || ! TNY_IS_FOLDER (folder))
2883 g_return_val_if_reached (FALSE);
2885 account = modest_tny_folder_get_account (folder);
2886 if (account == NULL) goto frees;
2889 if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (account))) {
2890 TnyFolderType types[2];
2891 types[0] = TNY_FOLDER_TYPE_DRAFTS;
2892 types[1] = TNY_FOLDER_TYPE_OUTBOX;
2894 if (_selected_folder_is_any_of_type (win, types, 2)) {
2898 ModestProtocolType protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (account));
2899 /* If it's a remote folder then dim */
2900 if (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
2902 MODEST_PROTOCOL_REGISTRY_REMOTE_STORE_PROTOCOLS)) {
2909 g_object_unref (folder);
2910 if (account != NULL)
2911 g_object_unref (account);
2917 _transfer_mode_enabled (ModestWindow *win)
2919 gboolean result = FALSE;
2922 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
2923 result = modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (win));
2924 } else if (MODEST_IS_MAIN_WINDOW(win)) {
2925 result = modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW (win));
2926 #ifdef MODEST_TOOLKIT_HILDON2
2927 } else if (MODEST_IS_FOLDER_WINDOW (win)) {
2928 result = modest_folder_window_transfer_mode_enabled (MODEST_FOLDER_WINDOW (win));
2929 } else if (MODEST_IS_HEADER_WINDOW (win)) {
2930 result = modest_header_window_transfer_mode_enabled (MODEST_HEADER_WINDOW (win));
2933 g_warning("_transfer_mode_enabled called with wrong window type");
2940 _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
2942 GtkWidget *folder_view = NULL;
2943 TnyFolderStore *folder = NULL;
2944 ModestEmailClipboard *clipboard = NULL;
2945 const gchar *folder_name = NULL;
2946 gboolean result = FALSE;
2948 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
2950 /*Get current parent folder */
2951 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
2952 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2953 /* If no folder view, always dimmed */
2954 if (!folder_view) return FALSE;
2956 /* Get selected folder as parent of new folder to create */
2957 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2958 if (!(folder && TNY_IS_FOLDER(folder))) goto frees;
2960 /* get modest clipboard and source folder */
2961 clipboard = modest_runtime_get_email_clipboard ();
2962 folder_name = modest_email_clipboard_get_folder_name (clipboard);
2963 if (folder_name == NULL) goto frees;
2965 /* Check source subfolders names */
2966 result = modest_tny_folder_has_subfolder_with_name (folder, folder_name,
2972 g_object_unref (folder);
2979 _all_msgs_in_sending_status (ModestHeaderView *header_view)
2981 GtkTreeModel *model;
2983 gboolean all_sending = TRUE;
2985 model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
2986 if (gtk_tree_model_get_iter_first (model, &iter)) {
2990 gtk_tree_model_get (model, &iter,
2991 TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
2996 if (modest_tny_all_send_queues_get_msg_status (header) !=
2997 MODEST_TNY_SEND_QUEUE_SENDING)
2998 all_sending = FALSE;
2999 g_object_unref (header);
3002 } while (all_sending && gtk_tree_model_iter_next (model, &iter));
3008 modest_ui_dimming_rules_on_save_to_drafts (ModestWindow *win,
3011 ModestDimmingRule *rule = NULL;
3013 g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3014 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3015 rule = MODEST_DIMMING_RULE (user_data);
3017 /* Check dimmed rule */
3018 return !modest_msg_edit_window_is_modified (MODEST_MSG_EDIT_WINDOW (win));
3022 modest_ui_dimming_rules_on_insert_image (ModestWindow *win,
3025 g_return_val_if_fail (MODEST_MSG_EDIT_WINDOW (win), FALSE);
3027 ModestMsgEditFormat format =
3028 modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
3030 return (format != MODEST_MSG_EDIT_FORMAT_HTML);
3034 _send_receive_in_progress (ModestWindow *win)
3036 ModestMailOperationQueue *queue;
3037 GSList *op_list, *node;
3038 gboolean found_send_receive;
3040 queue = modest_runtime_get_mail_operation_queue ();
3041 op_list = modest_mail_operation_queue_get_by_source (queue, G_OBJECT (win));
3043 found_send_receive = FALSE;
3044 for (node = op_list; node != NULL; node = g_slist_next (node)) {
3045 ModestMailOperation *op;
3047 op = (ModestMailOperation *) node->data;
3048 if (modest_mail_operation_get_type_operation (op) == MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) {
3049 found_send_receive = TRUE;
3055 g_slist_foreach (op_list, (GFunc) g_object_unref, NULL);
3056 g_slist_free (op_list);
3059 return found_send_receive;
3063 _msgs_send_in_progress (void)
3065 ModestCacheMgr *cache_mgr;
3066 GHashTable *send_queue_cache;
3067 ModestTnySendQueue *send_queue;
3068 GSList *send_queues = NULL, *node = NULL;
3069 gboolean found = FALSE;
3071 cache_mgr = modest_runtime_get_cache_mgr ();
3072 send_queue_cache = modest_cache_mgr_get_cache (cache_mgr,
3073 MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE);
3075 g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues);
3077 for (node = send_queues; node != NULL && !found; node = g_slist_next (node)) {
3078 send_queue = MODEST_TNY_SEND_QUEUE (node->data);
3080 /* Check if msg uid is being processed inside send queue */
3081 if (modest_tny_send_queue_sending_in_progress (send_queue)) {
3087 g_slist_free (send_queues);
3092 /*****************************************************************************/
3093 /********************** HILDON2 only dimming rules ***************************/
3094 /*****************************************************************************/
3096 #ifdef MODEST_TOOLKIT_HILDON2
3098 modest_ui_dimming_rules_on_header_window_move_to (ModestWindow *win, gpointer user_data)
3100 ModestDimmingRule *rule = NULL;
3101 gboolean dimmed = FALSE;
3103 g_return_val_if_fail (MODEST_IS_HEADER_WINDOW(win), FALSE);
3104 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3105 rule = MODEST_DIMMING_RULE (user_data);
3107 /* Check dimmed rule */
3108 dimmed = _transfer_mode_enabled (win);
3110 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3113 GtkWidget *header_view;
3116 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
3117 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
3119 dimmed = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0) ||
3120 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view));
3123 (tny_folder_get_folder_type (TNY_FOLDER (folder)) == TNY_FOLDER_TYPE_OUTBOX)) {
3124 dimmed = _all_msgs_in_sending_status (MODEST_HEADER_VIEW (header_view));;
3126 g_object_unref (folder);
3134 modest_ui_dimming_rules_on_folder_window_move_to (ModestWindow *win, gpointer user_data)
3136 ModestDimmingRule *rule = NULL;
3137 gboolean dimmed = FALSE;
3139 g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3140 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3141 rule = MODEST_DIMMING_RULE (user_data);
3143 /* Check dimmed rule */
3144 dimmed = _transfer_mode_enabled (win);
3146 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3148 if (MODEST_IS_FOLDER_WINDOW (win)) {
3149 ModestFolderView *folder_view;
3150 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3151 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3152 MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE);
3156 dimmed = _transfer_mode_enabled (win);
3158 modest_dimming_rule_set_notification (rule, "");
3165 modest_ui_dimming_rules_on_folder_window_delete (ModestWindow *win, gpointer user_data)
3167 ModestDimmingRule *rule = NULL;
3168 gboolean dimmed = FALSE;
3170 g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW(win), FALSE);
3171 g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
3172 rule = MODEST_DIMMING_RULE (user_data);
3174 /* Check dimmed rule */
3175 dimmed = _transfer_mode_enabled (win);
3177 modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
3179 if (MODEST_IS_FOLDER_WINDOW (win)) {
3180 ModestFolderView *folder_view;
3181 folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (win));
3182 dimmed = !modest_folder_view_any_folder_fulfils_rules (folder_view,
3183 MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE);
3187 dimmed = _transfer_mode_enabled (win);
3189 modest_dimming_rule_set_notification (rule, "");
3196 modest_ui_dimming_rules_on_edit_accounts (ModestWindow *win, gpointer user_data)
3198 return !modest_account_mgr_has_accounts (modest_runtime_get_account_mgr (), TRUE);