Bug 262328 - Selecting collapsed threads only selects the first message
[evolution.git] / src / mail / message-list.h
blob255185a603653cf4e0dcfd7174f83ccc29abcb81
1 /*
2 * This program is free software; you can redistribute it and/or modify it
3 * under the terms of the GNU Lesser General Public License as published by
4 * the Free Software Foundation.
6 * This program is distributed in the hope that it will be useful, but
7 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
8 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9 * for more details.
11 * You should have received a copy of the GNU Lesser General Public License
12 * along with this program; if not, see <http://www.gnu.org/licenses/>.
15 * Authors:
16 * Jeffrey Stedfast <fejj@ximian.com>
18 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
22 #ifndef _MESSAGE_LIST_H_
23 #define _MESSAGE_LIST_H_
25 #include <gtk/gtk.h>
26 #include <camel/camel.h>
28 #include <e-util/e-util.h>
29 #include <libemail-engine/libemail-engine.h>
31 /* Standard GObject macros */
32 #define MESSAGE_LIST_TYPE \
33 (message_list_get_type ())
34 #define MESSAGE_LIST(obj) \
35 (G_TYPE_CHECK_INSTANCE_CAST \
36 ((obj), MESSAGE_LIST_TYPE, MessageList))
37 #define MESSAGE_LIST_CLASS(cls) \
38 (G_TYPE_CHECK_CLASS_CAST \
39 ((cls), MESSAGE_LIST_TYPE, MessageListClass))
40 #define IS_MESSAGE_LIST(obj) \
41 (G_TYPE_CHECK_INSTANCE_TYPE \
42 ((obj), MESSAGE_LIST_TYPE))
43 #define IS_MESSAGE_LIST_CLASS(cls) \
44 (G_TYPE_CHECK_CLASS_TYPE \
45 ((cls), MESSAGE_LIST_TYPE))
46 #define MESSAGE_LIST_GET_CLASS(obj) \
47 (G_TYPE_INSTANCE_GET_CLASS \
48 ((obj), MESSAGE_LIST_TYPE, MessageListClass))
50 G_BEGIN_DECLS
52 enum {
53 COL_MESSAGE_STATUS,
54 COL_FLAGGED,
55 COL_SCORE,
56 COL_ATTACHMENT,
57 COL_FROM,
58 COL_SUBJECT,
59 COL_SENT,
60 COL_RECEIVED,
61 COL_TO,
62 COL_SIZE,
63 COL_FOLLOWUP_FLAG_STATUS,
64 COL_FOLLOWUP_FLAG,
65 COL_FOLLOWUP_DUE_BY,
66 COL_LOCATION, /* vfolder location? */
67 COL_SENDER,
68 COL_RECIPIENTS,
69 COL_MIXED_SENDER,
70 COL_MIXED_RECIPIENTS,
71 COL_LABELS,
73 /* subject with junk removed */
74 COL_SUBJECT_TRIMMED,
76 /* normalised strings */
77 COL_FROM_NORM,
78 COL_SUBJECT_NORM,
79 COL_TO_NORM,
81 COL_UID,
83 COL_LAST,
85 /* Invisible columns */
86 COL_DELETED,
87 COL_DELETED_OR_JUNK,
88 COL_JUNK,
89 COL_JUNK_STRIKEOUT_COLOR,
90 COL_UNREAD,
91 COL_COLOUR,
92 COL_ITALIC
95 #define MESSAGE_LIST_COLUMN_IS_ACTIVE(col) (col == COL_MESSAGE_STATUS || \
96 col == COL_FLAGGED)
98 typedef struct _MessageList MessageList;
99 typedef struct _MessageListClass MessageListClass;
100 typedef struct _MessageListPrivate MessageListPrivate;
102 struct _MessageList {
103 ETree parent;
105 MessageListPrivate *priv;
107 /* The table */
108 ETableExtras *extras;
110 GHashTable *uid_nodemap; /* uid (from info) -> tree node mapping */
112 GHashTable *normalised_hash;
114 /* Current search string, or %NULL */
115 gchar *search;
117 /* are we regenerating the message_list because set_folder
118 * was just called? */
119 guint just_set_folder : 1;
121 guint expand_all :1;
122 guint collapse_all :1;
124 /* frozen count */
125 guint frozen : 16;
127 /* Where the ETree cursor is. */
128 gchar *cursor_uid;
130 /* whether the last selection was on a single row or none/multi */
131 gboolean last_sel_single;
133 /* Row-selection and seen-marking timers */
134 guint idle_id, seen_id;
136 gchar *frozen_search; /* to save search took place while we were frozen */
139 struct _MessageListClass {
140 ETreeClass parent_class;
142 /* signals - select a message */
143 void (*message_selected) (MessageList *message_list, const gchar *uid);
144 void (*message_list_built) (MessageList *message_list);
145 void (*message_list_scrolled) (MessageList *message_list);
148 typedef enum {
149 MESSAGE_LIST_SELECT_NEXT = 0,
150 MESSAGE_LIST_SELECT_PREVIOUS = 1,
151 MESSAGE_LIST_SELECT_DIRECTION = 1, /* direction mask */
152 MESSAGE_LIST_SELECT_WRAP = 1 << 1, /* option bit */
153 MESSAGE_LIST_SELECT_INCLUDE_COLLAPSED = 1 << 2 /* whether to search collapsed nodes as well */
154 } MessageListSelectDirection;
156 GType message_list_get_type (void);
157 GtkWidget * message_list_new (EMailSession *session);
158 EMailSession * message_list_get_session (MessageList *message_list);
159 CamelFolder * message_list_ref_folder (MessageList *message_list);
160 void message_list_set_folder (MessageList *message_list,
161 CamelFolder *folder);
162 GtkTargetList * message_list_get_copy_target_list
163 (MessageList *message_list);
164 GtkTargetList * message_list_get_paste_target_list
165 (MessageList *message_list);
166 void message_list_set_expanded_default
167 (MessageList *message_list,
168 gboolean expanded_default);
169 gboolean message_list_get_group_by_threads
170 (MessageList *message_list);
171 void message_list_set_group_by_threads
172 (MessageList *message_list,
173 gboolean group_by_threads);
174 gboolean message_list_get_show_deleted (MessageList *message_list);
175 void message_list_set_show_deleted (MessageList *message_list,
176 gboolean show_deleted);
177 gboolean message_list_get_show_junk (MessageList *message_list);
178 void message_list_set_show_junk (MessageList *message_list,
179 gboolean show_junk);
180 gboolean message_list_get_show_subject_above_sender
181 (MessageList *message_list);
182 void message_list_set_show_subject_above_sender
183 (MessageList *message_list,
184 gboolean show_subject_above_sender);
185 gboolean message_list_get_thread_latest (MessageList *message_list);
186 void message_list_set_thread_latest (MessageList *message_list,
187 gboolean thread_latest);
188 gboolean message_list_get_thread_subject (MessageList *message_list);
189 void message_list_set_thread_subject (MessageList *message_list,
190 gboolean thread_subject);
191 void message_list_freeze (MessageList *message_list);
192 void message_list_thaw (MessageList *message_list);
193 GPtrArray * message_list_get_selected (MessageList *message_list);
194 GPtrArray * message_list_get_selected_with_collapsed_threads
195 (MessageList *message_list);
196 void message_list_set_selected (MessageList *message_list,
197 GPtrArray *uids);
198 gboolean message_list_select (MessageList *message_list,
199 MessageListSelectDirection direction,
200 guint32 flags,
201 guint32 mask);
202 gboolean message_list_can_select (MessageList *message_list,
203 MessageListSelectDirection direction,
204 guint32 flags,
205 guint32 mask);
206 void message_list_select_uid (MessageList *message_list,
207 const gchar *uid,
208 gboolean with_fallback);
209 void message_list_select_next_thread (MessageList *message_list);
210 void message_list_select_prev_thread (MessageList *message_list);
211 void message_list_select_all (MessageList *message_list);
212 void message_list_select_thread (MessageList *message_list);
213 void message_list_select_subthread (MessageList *message_list);
214 void message_list_copy (MessageList *message_list,
215 gboolean cut);
216 void message_list_paste (MessageList *message_list);
217 guint message_list_count (MessageList *message_list);
218 guint message_list_selected_count (MessageList *message_list);
219 void message_list_set_threaded_expand_all
220 (MessageList *message_list);
221 void message_list_set_threaded_collapse_all
222 (MessageList *message_list);
223 void message_list_set_search (MessageList *message_list,
224 const gchar *search);
225 void message_list_save_state (MessageList *message_list);
227 void message_list_sort_uids (MessageList *message_list,
228 GPtrArray *uids);
229 gboolean message_list_contains_uid (MessageList *message_list,
230 const gchar *uid);
232 G_END_DECLS
234 #endif /* _MESSAGE_LIST_H_ */