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_msg (ModestWindow *win, gpointer user_data)
212 gboolean dimmed = FALSE;
214 /* main window dimming rules */
215 if (MODEST_IS_MAIN_WINDOW(win)) {
217 /* Check dimmed rule */
219 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE);
221 /* msg view window dimming rules */
224 /* Check dimmed rule */
226 dimmed = _msg_download_in_progress (MODEST_MSG_VIEW_WINDOW(win));
233 modest_ui_dimming_rules_on_mark_as_read_msg (ModestWindow *win, gpointer user_data)
235 gboolean dimmed = FALSE;
236 TnyHeaderFlags flags;
238 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
240 flags = TNY_HEADER_FLAG_SEEN;
242 /* Check dimmed rule */
244 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
246 dimmed = _selected_msg_marked_as (win, flags, FALSE);
252 modest_ui_dimming_rules_on_mark_as_unread_msg (ModestWindow *win, gpointer user_data)
254 gboolean dimmed = FALSE;
255 TnyHeaderFlags flags;
257 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
259 flags = TNY_HEADER_FLAG_SEEN;
261 /* Check dimmed rule */
263 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
265 dimmed = _selected_msg_marked_as (win, flags, TRUE);
271 modest_ui_dimming_rules_on_move_to (ModestWindow *win, gpointer user_data)
273 gboolean dimmed = FALSE;
275 if (MODEST_IS_MAIN_WINDOW (win))
276 dimmed = modest_ui_dimming_rules_on_main_window_move_to (win, user_data);
278 dimmed = modest_ui_dimming_rules_on_view_window_move_to (win, user_data);
285 modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user_data)
287 GtkWidget *folder_view = NULL;
288 GtkWidget *header_view = NULL;
289 gboolean dimmed = FALSE;
291 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), TRUE);
293 /* Get the folder view */
294 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
295 MODEST_WIDGET_TYPE_FOLDER_VIEW);
297 /* Get header view */
298 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
299 MODEST_WIDGET_TYPE_HEADER_VIEW);
301 /* Check common diming rules */
303 /* Check diming rules for folder transfer */
304 if (gtk_widget_is_focus (folder_view)) {
306 dimmed = _selected_folder_not_writeable(MODEST_MAIN_WINDOW(win));
308 /* Check diming rules for msg transfer */
309 else if (gtk_widget_is_focus (header_view)) {
311 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
319 modest_ui_dimming_rules_on_view_window_move_to (ModestWindow *win, gpointer user_data)
321 gboolean dimmed = FALSE;
327 modest_ui_dimming_rules_on_paste_msgs (ModestWindow *win, gpointer user_data)
329 TnyFolderType types[3];
330 gboolean dimmed = FALSE;
332 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
334 types[0] = TNY_FOLDER_TYPE_DRAFTS;
335 types[1] = TNY_FOLDER_TYPE_OUTBOX;
336 types[2] = TNY_FOLDER_TYPE_SENT;
338 /* Check dimmed rule */
340 dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 3);
346 modest_ui_dimming_rules_on_delete_msgs (ModestWindow *win, gpointer user_data)
348 TnyFolderType types[5];
349 gboolean dimmed = FALSE;
351 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
353 types[0] = TNY_FOLDER_TYPE_DRAFTS;
354 types[1] = TNY_FOLDER_TYPE_OUTBOX;
355 types[2] = TNY_FOLDER_TYPE_SENT;
356 types[3] = TNY_FOLDER_TYPE_INBOX;
357 types[4] = TNY_FOLDER_TYPE_ROOT;
359 /* Check dimmed rule */
361 dimmed = _selected_folder_is_any_of_type (MODEST_MAIN_WINDOW(win), types, 5);
367 /* *********************** static utility functions ******************** */
370 _selected_folder_not_writeable (ModestMainWindow *win)
372 GtkWidget *folder_view = NULL;
373 TnyFolderStore *parent_folder = NULL;
374 ModestTnyFolderRules rules;
375 gboolean result = FALSE;
377 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
379 /* Get folder view */
380 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
381 MODEST_WIDGET_TYPE_FOLDER_VIEW);
382 /* If no folder view, always dimmed */
386 /* Get selected folder as parent of new folder to create */
387 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
388 if (!(parent_folder || TNY_IS_FOLDER(parent_folder)))
391 /* Check dimmed rule */
392 rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
393 result = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
396 g_object_unref (parent_folder);
402 _selected_folder_is_root (ModestMainWindow *win)
404 TnyFolderType types[2];
405 gboolean result = FALSE;
407 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
409 types[0] = TNY_FOLDER_TYPE_ROOT;
410 types[1] = TNY_FOLDER_TYPE_INBOX;
412 /* Check folder type */
413 result = _selected_folder_is_any_of_type (win, types, 2);
419 _selected_folder_is_any_of_type (ModestMainWindow *win,
420 TnyFolderType types[],
423 GtkWidget *folder_view = NULL;
424 TnyFolderStore *folder = NULL;
425 gboolean result = FALSE;
427 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
429 /* Get folder view */
430 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
431 MODEST_WIDGET_TYPE_FOLDER_VIEW);
432 /* If no folder view, always dimmed */
436 /* Get selected folder as parent of new folder to create */
437 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
438 if (!(folder || TNY_IS_FOLDER(folder)))
441 /* Check folder type */
442 result = _folder_is_any_of_type (TNY_FOLDER(folder), types, ntypes);
445 g_object_unref (folder);
451 _folder_is_any_of_type (TnyFolder *folder,
452 TnyFolderType types[],
455 TnyFolderType folder_type;
456 gboolean result = FALSE;
459 g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
461 /* Get folder type */
462 if (modest_tny_folder_is_local_folder (folder))
463 folder_type = modest_tny_folder_get_local_folder_type (folder);
465 folder_type = modest_tny_folder_guess_folder_type (folder);
467 /* Check foler type */
468 for (i=0; i < ntypes; i++) {
469 result = result || folder_type == types[i];
478 _invalid_msg_selected (ModestMainWindow *win,
481 GtkWidget *header_view = NULL;
482 GtkWidget *folder_view = NULL;
483 TnyList *selected_headers = NULL;
484 gboolean result = FALSE;
486 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
488 /* Get header view to check selected messages */
489 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
490 MODEST_WIDGET_TYPE_HEADER_VIEW);
492 /* Get folder view to check focus */
493 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
494 MODEST_WIDGET_TYPE_FOLDER_VIEW);
496 /* Get selected headers */
497 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
499 /* Check dimmed rule (TODO: check focus on widgets */
500 result = ((selected_headers == NULL) ||
501 (GTK_WIDGET_HAS_FOCUS (folder_view)));
503 result = tny_list_get_length (selected_headers) > 1;
506 if (selected_headers != NULL)
507 g_object_unref (selected_headers);
513 _already_opened_msg (ModestWindow *win)
515 ModestWindow *window = NULL;
516 ModestWindowMgr *mgr = NULL;
517 GtkWidget *header_view = NULL;
518 TnyList *selected_headers = NULL;
519 TnyIterator *iter = NULL;
520 TnyHeader *header = NULL;
521 gboolean result = TRUE;
523 g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
525 /* Get header view to check selected messages */
526 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
527 MODEST_WIDGET_TYPE_HEADER_VIEW);
529 /* Get selected headers */
530 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
531 if (selected_headers == NULL)
534 /* Check dimmed rule (TODO: check focus on widgets */
535 mgr = modest_runtime_get_window_mgr ();
536 iter = tny_list_create_iterator (selected_headers);
537 while (!tny_iterator_is_done (iter) && result) {
538 header = TNY_HEADER (tny_iterator_get_current (iter));
539 window = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header));
540 result = result && (window != NULL);
542 g_object_unref (header);
543 tny_iterator_next (iter);
547 if (selected_headers != NULL)
548 g_object_unref (selected_headers);
550 g_object_unref (iter);
556 _selected_msg_marked_as (ModestWindow *win,
560 GtkWidget *header_view = NULL;
561 TnyList *selected_headers = NULL;
562 TnyIterator *iter = NULL;
563 TnyHeader *header = NULL;
564 TnyHeaderFlags flags;
565 gboolean result = FALSE;
567 /* Get header view to check selected messages */
568 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
569 MODEST_WIDGET_TYPE_HEADER_VIEW);
571 /* Get selected headers */
572 selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
573 if (selected_headers == NULL)
576 /* Call the function for each header */
577 iter = tny_list_create_iterator (selected_headers);
578 while (!tny_iterator_is_done (iter) && !result) {
579 header = TNY_HEADER (tny_iterator_get_current (iter));
581 flags = tny_header_get_flags (header);
583 result = (flags & mask) == 0;
585 result = (flags & mask) != 0;
587 g_object_unref (header);
588 tny_iterator_next (iter);
592 if (selected_headers != NULL)
593 g_object_unref (selected_headers);
595 g_object_unref (iter);
601 _msg_download_in_progress (ModestMsgViewWindow *win)
603 gboolean result = FALSE;
605 g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE);