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-tny-folder.h"
37 #include <modest-runtime.h>
40 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
41 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique);
42 static gboolean _already_opened_msg (ModestWindow *win);
43 static gboolean _selected_msg_marked_as (ModestWindow *win, TnyHeaderFlags mask, gboolean opposite);
44 static gboolean _selected_folder_not_writeable (ModestMainWindow *win);
45 static gboolean _selected_folder_is_any_of_type (ModestMainWindow *win, TnyFolderType types[], guint ntypes);
46 static gboolean _selected_folder_is_root (ModestMainWindow *win);
47 static gboolean _msg_download_in_progress (ModestMsgViewWindow *win);
51 modest_ui_dimming_rules_on_new_msg (ModestWindow *win, gpointer user_data)
53 gboolean dimmed = FALSE;
55 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
57 /* Check dimmed rule */
59 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
65 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
67 gboolean dimmed = FALSE;
68 GtkWidget *folder_view = NULL;
69 TnyFolderStore *parent_folder = NULL;
71 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
74 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
75 MODEST_WIDGET_TYPE_FOLDER_VIEW);
76 /* Get selected folder as parent of new folder to create */
77 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
81 /* If it's the local account do not dim */
82 if (modest_tny_folder_store_is_virtual_local_folders (parent_folder)) {
84 } else if (TNY_IS_ACCOUNT (parent_folder)) {
85 /* If it's the MMC root folder then dim it */
86 if (!strcmp (tny_account_get_id (TNY_ACCOUNT (parent_folder)), MODEST_MMC_ACCOUNT_ID)) {
89 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (parent_folder));
90 /* If it's POP then dim */
91 dimmed = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
92 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
95 /* TODO: the specs say that only one level of subfolder is allowed, is this true ? */
97 /* Apply folder rules */
98 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
105 modest_ui_dimming_rules_on_rename_folder (ModestWindow *win, gpointer user_data)
107 gboolean dimmed = FALSE;
109 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
111 /* Check dimmed rule */
113 dimmed = _selected_folder_not_writeable (MODEST_MAIN_WINDOW(win));
115 dimmed = _selected_folder_is_root (MODEST_MAIN_WINDOW(win));
121 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
123 gboolean dimmed = FALSE;
125 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
127 /* Check dimmed rule */
129 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE);
135 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
137 gboolean dimmed = FALSE;
138 TnyFolderType types[3];
140 /* main window dimming rules */
141 if (MODEST_IS_MAIN_WINDOW(win)) {
143 types[0] = TNY_FOLDER_TYPE_DRAFTS;
144 types[1] = TNY_FOLDER_TYPE_OUTBOX;
145 types[2] = TNY_FOLDER_TYPE_ROOT;
147 /* Check dimmed rule */
149 dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 3);
152 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
154 /* msg view window dimming rules */
155 } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
157 /* Check dimmed rule */
159 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
167 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
169 gboolean dimmed = FALSE;
171 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
173 /* Check dimmed rule */
174 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
180 modest_ui_dimming_rules_always_dimmed (ModestWindow *win, gpointer user_data)
182 gboolean dimmed = FALSE;
184 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
186 /* Check dimmed rule */
194 modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data)
196 gboolean dimmed = FALSE;
198 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
200 /* Check dimmed rule */
202 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
204 dimmed = _already_opened_msg (win);
210 modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
212 gboolean dimmed = FALSE;
214 /* main window dimming rules */
215 if (MODEST_IS_MAIN_WINDOW(win)) {
216 GtkWidget *header_view;
218 /* Check dimmed rule */
219 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
220 MODEST_WIDGET_TYPE_HEADER_VIEW);
222 /* If the header view does not have the focus then do
223 not apply msg dimming rules because the action will
224 show the folder details that have no dimming
226 if (gtk_widget_is_focus (header_view)) {
228 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE);
231 /* msg view window dimming rules */
234 /* Check dimmed rule */
236 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
243 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
245 gboolean dimmed = FALSE;
246 TnyHeaderFlags flags;
248 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
250 flags = TNY_HEADER_FLAG_SEEN;
252 /* Check dimmed rule */
254 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
256 dimmed = _selected_msg_marked_as (win, flags, FALSE);
262 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
264 gboolean dimmed = FALSE;
265 TnyHeaderFlags flags;
267 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
269 flags = TNY_HEADER_FLAG_SEEN;
271 /* Check dimmed rule */
273 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
275 dimmed = _selected_msg_marked_as (win, flags, TRUE);
281 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
283 gboolean dimmed = FALSE;
285 if (MODEST_IS_MAIN_WINDOW (win))
286 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
288 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
295 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
297 GtkWidget *folder_view = NULL;
298 GtkWidget *header_view = NULL;
299 gboolean dimmed = FALSE;
301 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
303 /* Get the folder view */
304 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
305 MODEST_WIDGET_TYPE_FOLDER_VIEW);
307 /* Get header view */
308 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
309 MODEST_WIDGET_TYPE_HEADER_VIEW);
311 /* Check common diming rules */
313 /* Check diming rules for folder transfer */
314 if (gtk_widget_is_focus (folder_view)) {
316 dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win));
318 /* Check diming rules for msg transfer */
319 else if (gtk_widget_is_focus (header_view)) {
321 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
329 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
331 gboolean dimmed = FALSE;
337 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
339 TnyFolderType types[3];
340 gboolean dimmed = FALSE;
342 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
344 types[0] = TNY_FOLDER_TYPE_DRAFTS;
345 types[1] = TNY_FOLDER_TYPE_OUTBOX;
346 types[2] = TNY_FOLDER_TYPE_SENT;
348 /* Check dimmed rule */
350 dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 3);
356 modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data)
358 TnyFolderType types[5];
359 gboolean dimmed = FALSE;
361 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
363 types[0] = TNY_FOLDER_TYPE_DRAFTS;
364 types[1] = TNY_FOLDER_TYPE_OUTBOX;
365 types[2] = TNY_FOLDER_TYPE_SENT;
366 types[3] = TNY_FOLDER_TYPE_INBOX;
367 types[4] = TNY_FOLDER_TYPE_ROOT;
369 /* Check dimmed rule */
371 dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 5);
377 /* *********************** static utility functions ******************** */
380 _selected_folder_not_writeable (ModestMainWindow *win)
382 GtkWidget *folder_view = NULL;
383 TnyFolderStore *parent_folder = NULL;
384 ModestTnyFolderRules rules;
385 gboolean result = FALSE;
387 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
389 /* Get folder view */
390 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
391 MODEST_WIDGET_TYPE_FOLDER_VIEW);
392 /* If no folder view, always dimmed */
396 /* Get selected folder as parent of new folder to create */
397 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
398 if (!(parent_folder || TNY_IS_FOLDER(parent_folder)))
401 /* Check dimmed rule */
402 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
403 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
406 g_object_unref (parent_folder);
412 _selected_folder_is_root (ModestMainWindow *win)
414 TnyFolderType types[2];
415 gboolean result = FALSE;
417 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
419 types[0] = TNY_FOLDER_TYPE_ROOT;
420 types[1] = TNY_FOLDER_TYPE_INBOX;
422 /* Check folder type */
423 result = _selected_folder_is_any_of_type (win, types, 2);
429 _selected_folder_is_any_of_type (ModestMainWindow *win,
430 TnyFolderType types[],
433 GtkWidget *folder_view = NULL;
434 TnyFolderStore *folder = NULL;
435 gboolean result = FALSE;
437 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
439 /* Get folder view */
440 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
441 MODEST_WIDGET_TYPE_FOLDER_VIEW);
442 /* If no folder view, always dimmed */
446 /* Get selected folder as parent of new folder to create */
447 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
448 if (!(folder || TNY_IS_FOLDER(folder)))
451 /* Check folder type */
452 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
455 g_object_unref (folder);
461 _folder_is_any_of_type (TnyFolder *folder,
462 TnyFolderType types[],
465 TnyFolderType folder_type;
466 gboolean result = FALSE;
469 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
471 /* Get folder type */
472 if (modest_tny_folder_is_local_folder (folder))
473 folder_type = modest_tny_folder_get_local_folder_type (folder);
475 folder_type = modest_tny_folder_guess_folder_type (folder);
477 /* Check foler type */
478 for (i=0; i < ntypes; i++) {
479 result = result || folder_type == types[i];
488 _invalid_msg_selected (ModestMainWindow *win,
491 GtkWidget *header_view = NULL;
492 GtkWidget *folder_view = NULL;
493 TnyList *selected_headers = NULL;
494 gboolean result = FALSE;
496 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
498 /* Get header view to check selected messages */
499 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
500 MODEST_WIDGET_TYPE_HEADER_VIEW);
502 /* Get folder view to check focus */
503 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
504 MODEST_WIDGET_TYPE_FOLDER_VIEW);
506 /* Get selected headers */
507 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
509 /* Check dimmed rule (TODO: check focus on widgets */
510 result = ((selected_headers == NULL) ||
511 (GTK_WIDGET_HAS_FOCUS (folder_view)));
513 result = tny_list_get_length (selected_headers) > 1;
516 if (selected_headers != NULL)
517 g_object_unref (selected_headers);
523 _already_opened_msg (ModestWindow *win)
525 ModestWindow *window = NULL;
526 ModestWindowMgr *mgr = NULL;
527 GtkWidget *header_view = NULL;
528 TnyList *selected_headers = NULL;
529 TnyIterator *iter = NULL;
530 TnyHeader *header = NULL;
531 gboolean result = TRUE;
533 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
535 /* Get header view to check selected messages */
536 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
537 MODEST_WIDGET_TYPE_HEADER_VIEW);
539 /* Get selected headers */
540 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
541 if (selected_headers == NULL)
544 /* Check dimmed rule (TODO: check focus on widgets */
545 mgr = modest_runtime_get_window_mgr ();
546 iter = tny_list_create_iterator (selected_headers);
547 while (!tny_iterator_is_done (iter) && result) {
548 header = TNY_HEADER (tny_iterator_get_current (iter));
549 window = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header));
550 result = result && (window != NULL);
552 g_object_unref (header);
553 tny_iterator_next (iter);
557 if (selected_headers != NULL)
558 g_object_unref (selected_headers);
560 g_object_unref (iter);
566 _selected_msg_marked_as (ModestWindow *win,
570 GtkWidget *header_view = NULL;
571 TnyList *selected_headers = NULL;
572 TnyIterator *iter = NULL;
573 TnyHeader *header = NULL;
574 TnyHeaderFlags flags;
575 gboolean result = FALSE;
577 /* Get header view to check selected messages */
578 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
579 MODEST_WIDGET_TYPE_HEADER_VIEW);
581 /* Get selected headers */
582 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
583 if (selected_headers == NULL)
586 /* Call the function for each header */
587 iter = tny_list_create_iterator (selected_headers);
588 while (!tny_iterator_is_done (iter) && !result) {
589 header = TNY_HEADER (tny_iterator_get_current (iter));
591 flags = tny_header_get_flags (header);
593 result = (flags & mask) == 0;
595 result = (flags & mask) != 0;
597 g_object_unref (header);
598 tny_iterator_next (iter);
602 if (selected_headers != NULL)
603 g_object_unref (selected_headers);
605 g_object_unref (iter);
611 _msg_download_in_progress (ModestMsgViewWindow *win)
613 gboolean result = FALSE;
615 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);