* Removed a duplicated save_state call
[modest] / src / widgets / modest-header-view.h
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 #ifndef __MODEST_HEADER_VIEW_H__
31 #define __MODEST_HEADER_VIEW_H__
32
33 #include <tny-folder.h>
34 #include <tny-folder-change.h>
35 #include <tny-gtk-account-list-model.h>
36 #include <tny-msg.h>
37 #include <tny-header.h>
38 #include <tny-gtk-header-list-model.h>
39 #include "modest-mail-operation.h"
40 #include "modest-header-view-observer.h"
41
42 G_BEGIN_DECLS
43
44 /* convenience macros */
45 #define MODEST_TYPE_HEADER_VIEW             (modest_header_view_get_type())
46 #define MODEST_HEADER_VIEW(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_HEADER_VIEW,ModestHeaderView))
47 #define MODEST_HEADER_VIEW_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_HEADER_VIEW,ModestHeaderViewClass))
48 #define MODEST_IS_HEADER_VIEW(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_HEADER_VIEW))
49 #define MODEST_IS_HEADER_VIEW_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_HEADER_VIEW))
50 #define MODEST_HEADER_VIEW_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_HEADER_VIEW,ModestHeaderViewClass))
51
52 typedef struct _ModestHeaderView      ModestHeaderView;
53 typedef struct _ModestHeaderViewClass ModestHeaderViewClass;
54
55 struct _ModestHeaderView {
56          GtkTreeView parent;
57         /* insert public members, if any */
58 };
59
60 #define MODEST_HEADER_VIEW_COLUMN    "header-view-column"
61 #define MODEST_HEADER_VIEW_FLAG_SORT "header-view-flags-sort"
62
63 typedef enum _ModestHeaderViewColumn {
64         MODEST_HEADER_VIEW_COLUMN_FROM                  = 0,
65         MODEST_HEADER_VIEW_COLUMN_TO                    = 1,
66         MODEST_HEADER_VIEW_COLUMN_SUBJECT               = 2,
67         MODEST_HEADER_VIEW_COLUMN_SENT_DATE             = 3,
68         MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE         = 4,
69         MODEST_HEADER_VIEW_COLUMN_MSGTYPE               = 5,
70         MODEST_HEADER_VIEW_COLUMN_ATTACH                = 6,
71         MODEST_HEADER_VIEW_COLUMN_SIZE                  = 7,
72         MODEST_HEADER_VIEW_COLUMN_STATUS                = 8,
73
74         /*
75          * these two are for compact display on small devices,
76          * with two line display with all relevant headers
77          */
78         MODEST_HEADER_VIEW_COLUMN_COMPACT_FLAG          = 9, /* priority and attachments */
79         MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN     = 10, /* incoming mail */
80         MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT    = 11,/* outgoing mail */
81         MODEST_HEADER_VIEW_COLUMN_COMPACT_SENT_DATE     = 12,
82         MODEST_HEADER_VIEW_COLUMN_COMPACT_RECEIVED_DATE = 13,
83
84         MODEST_HEADER_VIEW_COLUMN_NUM
85         
86 } ModestHeaderViewColumn;
87
88 /*
89  * this can be extended with more style thingies,
90  * to make a small-device specific display
91  */
92 typedef enum _ModestHeaderViewStyle {
93         MODEST_HEADER_VIEW_STYLE_DETAILS   = 0, /* many columns, single line, col headers visible */
94         MODEST_HEADER_VIEW_STYLE_TWOLINES  = 1, /* two-line headers, col headers invisible */
95         
96         MODEST_HEADER_VIEW_STYLE_NUM    
97 } ModestHeaderViewStyle;
98
99 typedef enum _ModestItemType {
100         MODEST_ITEM_TYPE_MESSAGE,
101         MODEST_ITEM_TYPE_FOLDER,
102         MODEST_ITEM_TYPE_NUM
103 } ModestItemType;
104
105
106 struct _ModestHeaderViewClass {
107         GtkTreeViewClass parent_class;
108
109         void (*header_selected) (ModestHeaderView* self,
110                                  TnyHeader *header,
111                                  gpointer user_data);
112
113         void (*item_not_found) (ModestHeaderView* self,
114                                 ModestItemType type,
115                                 gpointer user_data);
116
117         void (*header_activated) (ModestHeaderView* self,
118                                   TnyHeader *header,
119                                   gpointer user_data);
120
121         void (*msg_count_changed) (ModestHeaderView* self,
122                                    TnyFolder *folder,
123                                    TnyFolderChange *change,
124                                    gpointer user_data);
125 };
126
127 /**
128  * modest_header_view_get_type:
129  * 
130  * get the GType for ModestHeaderView
131  *  
132  * Returns: the GType
133  */
134 GType        modest_header_view_get_type    (void) G_GNUC_CONST;
135
136
137 /**
138  * modest_header_view_new:
139  * @folder: a TnyMsgFolder object
140  * @style: a ModestHeaderViewColumn with the style of this listview
141  *  (   MODEST_HEADER_VIEW_STYLE_NORMAL or MODEST_HEADER_VIEW_STYLE_COMPACT)
142  * 
143  * create a new ModestHeaderView instance, based on a folder iface
144  *   
145  * Returns: a new GtkWidget (a GtkTreeView-subclass)
146  */
147 GtkWidget*   modest_header_view_new        (TnyFolder *folder,
148                                             ModestHeaderViewStyle style);
149
150 /**
151  * modest_header_view_set_folder:
152  * @self: a ModestHeaderView instance
153  * @folder: a TnyFolder object
154  * 
155  * set the folder for this ModestHeaderView
156  */
157 void         modest_header_view_set_folder (ModestHeaderView *self,
158                                             TnyFolder *folder,
159                                             RefreshAsyncUserCallback callback,
160                                             gpointer user_data);
161
162 /**
163  * modest_header_view_get_folder:
164  * @self: a ModestHeaderView instance
165  * 
166  * get the folder in this ModestHeaderView
167  *  
168  * Returns: the tny folder instance or NULL if there is none
169  */
170 TnyFolder *modest_header_view_get_folder (ModestHeaderView *self);
171
172
173 /**
174  * modest_header_view_set_columns:
175  * @self: a ModestHeaderView instance
176  * @columns: a list of gint ModestHeaderViewColumn column IDs, using GINT_TO_POINTER() and GPOINTER_TO_INT().
177  * @type: #TnyFolderType type
178  * 
179  * set the columns for this ModestHeaderView.
180  *  
181  * Returns: TRUE if it succeeded, FALSE otherwise
182  */
183 gboolean modest_header_view_set_columns (ModestHeaderView *self,
184                                          const GList *columns,
185                                          TnyFolderType type);
186 /**
187  * modest_header_view_get_columns:
188  * @self: a ModestHeaderView instance
189  * 
190  * get the GtkTreeColumns for this ModestHeaderView. Each one of the
191  * tree columns will have property  than can be retrieved
192  * with g_object_get_data MODEST_HEADER_VIEW_COLUMN (#define),
193  * and which contains the corresponding ModestHeaderViewColumn
194  *  
195  * Returns: newly allocated list of #GtkTreeViewColumns objects, or NULL in case of no columns or error
196  * You must free the list with g_list_free
197  */
198 GList*  modest_header_view_get_columns (ModestHeaderView *self);
199
200
201 /**
202  * modest_header_view_set_style:
203  * @self: a ModestHeaderView instance
204  * @style: the style for this tree view
205  * 
206  * set the style for this ModestHeaderView
207  *  
208  * Returns: TRUE if it succeeded, FALSE otherwise
209  */
210 gboolean   modest_header_view_set_style (ModestHeaderView *self,
211                                          ModestHeaderViewStyle style);
212
213 /**
214  * modest_header_view_set_folder:
215  * @self: a ModestHeaderView instance
216  * 
217  * get the style for this ModestHeaderView
218  *  
219  * Returns: the current style
220  */
221 ModestHeaderViewStyle   modest_header_view_get_style (ModestHeaderView *self);
222
223 /**
224  * modest_header_view_count_selected_headers:
225  * @self: a ModestHeaderView instance
226  * 
227  * Check selected headers counter. 
228  * Returns: the number of selected headers.
229  */
230 guint
231 modest_header_view_count_selected_headers (ModestHeaderView *self);
232
233 /**
234  * modest_header_view_has_selected_headers:
235  * @self: a ModestHeaderView instance
236  * 
237  * Check if any row is selected on headers tree view. 
238  * Returns: TRUE if any header is selected, FALSE otherwise.
239  */
240 gboolean
241 modest_header_view_has_selected_headers (ModestHeaderView *self);
242
243 /**
244  * modest_header_view_get_selected_headers:
245  * @self: a ModestHeaderView instance
246  * 
247  * get the list of the currently selected TnyHeader's. The list and
248  * the headers should be freed by the caller
249  *  
250  * Returns: the list with the currently selected headers
251  */
252 TnyList* modest_header_view_get_selected_headers (ModestHeaderView *self);
253
254
255 /**
256  * modest_header_view_is_empty:
257  * @self: a valid ModestHeaderView instance
258  * 
259  * see if this header view is empty; use this function instead of
260  * using the GtkTreeView parent directly, as 'empty' in this case
261  * may mean that there is one "This is empty"-message, and of course
262  * GtkTreeView then thinks it is *not* empty
263  *  
264  * Returns: TRUE if the header view is empty, FALSE otherwise
265  */
266 gboolean  modest_header_view_is_empty (ModestHeaderView *self);
267
268
269
270 /**
271  * modest_header_view_select_next:
272  * @self: a #ModestHeaderView
273  * 
274  * Selects the header next to the current selected one
275  **/
276 void         modest_header_view_select_next          (ModestHeaderView *self);
277
278 /**
279  * modest_header_view_select_prev:
280  * @self: a #ModestHeaderView
281  * 
282  * Selects the previous header of the current selected one
283  **/
284 void         modest_header_view_select_prev          (ModestHeaderView *self);
285
286
287 /* PROTECTED method. It's useful when we want to force a given
288    selection to reload a msg. For example if we have selected a header
289    in offline mode, when Modest become online, we want to reload the
290    message automatically without an user click over the header */
291 void 
292 _modest_header_view_change_selection (GtkTreeSelection *selection,
293                                       gpointer user_data);
294
295 /**
296  * modest_header_view_get_sort_column_id:
297  * @self: a #ModestHeaderView
298  * @type: #TnyFolderType type
299  * 
300  * Gets the selected logical columnd id for sorting.
301  **/
302 gint
303 modest_header_view_get_sort_column_id (ModestHeaderView *self, TnyFolderType type);
304
305 /**
306  * modest_header_view_get_sort_type:
307  * @self: a #ModestHeaderView
308  * @type: #TnyFolderType type
309  * 
310  * Gets the selected sort type.
311  **/
312 GtkSortType
313 modest_header_view_get_sort_type (ModestHeaderView *self, TnyFolderType type);
314
315 /**
316  * modest_header_view_set_sort_params:
317  * @self: a #ModestHeaderView
318  * @sort_colid: logical column id to sort
319  * @sort_type: #GtkSortType sort type
320  * @type: #TnyFolderType type
321  * 
322  * Sets the logical columnd id and sort type for sorting operations.
323  **/
324 void
325 modest_header_view_set_sort_params (ModestHeaderView *self, guint sort_colid, GtkSortType sort_type, TnyFolderType type);
326
327 /**
328  * modest_header_view_set_sort_params:
329  * @self: a #ModestHeaderView
330  * @sort_colid: logical column id to sort
331  * @sort_type: #GtkSortType sort type
332  * 
333  * Sorts headers treeview by logical column id, @sort_colid, using a 
334  * @sort_type sorting method. In addition, new headder settings will be 
335  * stored in @self object. 
336  **/
337 void
338 modest_header_view_sort_by_column_id (ModestHeaderView *self, 
339                                       guint sort_colid,
340                                       GtkSortType sort_type);
341
342 /**
343  * modest_header_view_clear:
344  * @self: a #ModestHeaderView
345  *
346  * Clear the contents of a header view. It internally calls the
347  * set_folder function with last three arguments as NULL
348  **/
349 void
350 modest_header_view_clear (ModestHeaderView *self);
351
352 /**
353  * modest_header_view_copy_selection:
354  * @self: a #ModestHeaderView
355  * 
356  * Stores a #TnyList of selected headers in the own clibpoard of 
357  * @self header view.
358  **/
359 void 
360 modest_header_view_copy_selection (ModestHeaderView *header_view);
361
362 /**
363  * modest_header_view_cut_selection:
364  * @self: a #ModestHeaderView
365  * 
366  * Stores a #TnyList of selected headers in the own clibpoard of 
367  * @self header view and filter them into headers tree model to
368  * hide these rows in treeview.
369  **/
370 void 
371 modest_header_view_cut_selection (ModestHeaderView *header_view);
372
373
374 /**
375  * modest_header_view_paste_selection:
376  * @self: a #ModestHeaderView
377  * @headers: ouput parameter with a #TnyList of headers which will be returned.
378  * @delete: output parameter with indication about delete or not the selected headers. 
379  * 
380  * Gets the selected headers to copy/cut.
381  **/
382 void
383 modest_header_view_paste_selection (ModestHeaderView *header_view,
384                                     TnyList **headers,
385                                     gboolean *delete);
386
387 void modest_header_view_refilter (ModestHeaderView *header_view);
388
389 /**
390  * modest_header_view_add_observer:
391  * @header_view: a #ModestHeaderView
392  * @observer: The observer to notify.
393  * 
394  * Registers a new observer. Warning! Each added observer object must
395  * removed using @modest_header_view_remove_observer before destroying
396  * the observer, or at least when it is under destruction. Also you
397  * should care about that the observer's #update function might be
398  * called any time until the observer is removed.
399  **/
400 void modest_header_view_add_observer(
401                 ModestHeaderView *header_view,
402                 ModestHeaderViewObserver *observer);
403
404 /**
405  * modest_header_view_remove_observer:
406  * @header_view: a #ModestHeaderView
407  * @observer: The observer to remove.
408  * 
409  * Removes exactly one observer from the notification list. If you
410  * added an observer twice, you should call this remove funtion twice
411  * as well.
412  **/
413 void modest_header_view_remove_observer(
414                 ModestHeaderView *header_view,
415                 ModestHeaderViewObserver *observer);
416
417 G_END_DECLS
418
419
420
421 #endif /* __MODEST_HEADER_VIEW_H__ */
422