3572d5afbfdf78dd9f0b9c5b9c934bfc2770727f
[modest] / src / modest-ui-dimming-rules.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
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.
16  *
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.
28  */
29  
30 #ifdef HAVE_CONFIG_H
31 #include <config.h>
32 #endif /*HAVE_CONFIG_H*/
33
34 #include "modest-ui-dimming-rules.h"
35 #include "modest-tny-folder.h"
36
37 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
38 static gboolean _invalid_msg_selected (ModestMainWindow *win, gboolean unique);
39
40 gboolean 
41 modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
42 {
43         GtkWidget *folder_view = NULL;
44         TnyFolderStore *parent_folder = NULL;
45         ModestTnyFolderRules rules;
46         gboolean dimmed = FALSE;
47
48         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
49
50         /* Get folder view */
51         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
52                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
53         /* If no folder view, always dimmed */
54         if (!folder_view)
55                 return TRUE;
56         
57         /* Get selected folder as parent of new folder to create */
58         parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
59         if (!parent_folder)
60                 return TRUE;
61         
62         /* Check dimmed rule */ 
63         rules = modest_tny_folder_get_rules (TNY_FOLDER (parent_folder));
64         dimmed = rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE;
65
66         /* free */
67         g_object_unref (parent_folder);
68
69         return dimmed;
70 }
71
72 gboolean 
73 modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data)
74 {
75         gboolean dimmed = FALSE;
76
77         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
78                 
79         /* Check dimmed rule */ 
80         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE);
81
82         return dimmed;
83 }
84
85 gboolean 
86 modest_ui_dimming_rules_on_reply_msg (ModestWindow *win, gpointer user_data)
87 {
88         GtkWidget *folder_view = NULL;
89         TnyFolderStore *current_folder = NULL;
90         gboolean local_folder = FALSE;
91         gboolean dimmed = FALSE;
92         TnyFolderType types[2];
93
94         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
95
96         /* Get folder view */
97         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
98                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
99         /* If no folder view, always dimmed */
100         if (!folder_view)
101                 return TRUE;
102
103         /* Get selected folder as parent of new folder to create */
104         current_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
105         if (!current_folder)
106                 return TRUE;
107         
108         if (TNY_IS_FOLDER(current_folder))
109                 local_folder = modest_tny_folder_is_local_folder (TNY_FOLDER(current_folder));
110         types[0] = TNY_FOLDER_TYPE_DRAFTS; 
111         types[1] = TNY_FOLDER_TYPE_OUTBOX;
112
113         /* Check dimmed rule */ 
114         if (!dimmed)
115                 dimmed = ((local_folder) && 
116                           (_folder_is_any_of_type (TNY_FOLDER(current_folder), types, 2)));
117         
118         if (!dimmed)
119                 dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
120
121         /* free */
122         g_object_unref (current_folder);
123
124         return dimmed;
125 }
126
127
128 gboolean 
129 modest_ui_dimming_rules_on_contents_msg (ModestWindow *win, gpointer user_data)
130 {
131         gboolean dimmed = FALSE;
132
133         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
134                 
135         /* Check dimmed rule */ 
136         dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), FALSE);
137
138         return dimmed;
139 }
140
141 /* *********************** static utility functions ******************** */
142
143 static gboolean
144 _folder_is_any_of_type (TnyFolder *folder,
145                         TnyFolderType types[], 
146                         guint ntypes)
147 {
148         TnyFolderType folder_type;
149         gboolean result = FALSE;
150         guint i;
151
152         g_return_val_if_fail (TNY_IS_FOLDER(folder), FALSE);
153
154         /* Get folder type */
155         if (modest_tny_folder_is_local_folder (folder))
156                 folder_type = modest_tny_folder_get_local_folder_type (folder);         
157         else 
158                 folder_type = modest_tny_folder_guess_folder_type (folder);             
159         
160         /* Check foler type */
161         for (i=0; i < ntypes; i++) {
162                 result = result || folder_type == types[i];
163         }
164
165         return result;
166 }
167
168
169
170 static gboolean
171 _invalid_msg_selected (ModestMainWindow *win,
172                        gboolean unique) 
173 {
174         GtkWidget *header_view = NULL;          
175         GtkWidget *folder_view = NULL;
176         TnyList *selected_headers = NULL;
177         gboolean result = FALSE;
178
179         g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
180                 
181         /* Get header view to check selected messages */
182         header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
183                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
184         
185         /* Get folder view to check focus */
186         folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
187                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
188
189         /* Get selected headers */
190         selected_headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
191
192         /* Check dimmed rule (TODO: check focus on widgets */   
193         result = ((selected_headers == NULL) || 
194                   (GTK_WIDGET_HAS_FOCUS (folder_view)));
195         if (!result)
196                 result = tny_list_get_length (selected_headers) > 1;
197         
198         /* free */
199         if (selected_headers != NULL) 
200                 g_object_unref (selected_headers);
201
202         return result;
203 }