diff options
Diffstat (limited to 'mail/message-list.h')
-rw-r--r-- | mail/message-list.h | 258 |
1 files changed, 157 insertions, 101 deletions
diff --git a/mail/message-list.h b/mail/message-list.h index dd57d69d1d..c3233db6a2 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -1,19 +1,54 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see <http://www.gnu.org/licenses/> + * + * + * Authors: + * Jeffrey Stedfast <fejj@ximian.com> + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) + * + */ + #ifndef _MESSAGE_LIST_H_ #define _MESSAGE_LIST_H_ -#include <gtk/gtkobject.h> -#include <gtk/gtkwidget.h> - -#include <gal/e-table/e-table-simple.h> -#include <gal/e-table/e-tree-scrolled.h> -#include "mail-types.h" - -#define MESSAGE_LIST_TYPE (message_list_get_type ()) -#define MESSAGE_LIST(o) (GTK_CHECK_CAST ((o), MESSAGE_LIST_TYPE, MessageList)) -#define MESSAGE_LIST_CLASS(k) (GTK_CHECK_CLASS_CAST((k), MESSAGE_LIST_TYPE, MessageListClass)) -#define IS_MESSAGE_LIST(o) (GTK_CHECK_TYPE ((o), MESSAGE_LIST_TYPE)) -#define IS_MESSAGE_LIST_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), MESSAGE_LIST_TYPE)) +#include <gtk/gtk.h> +#include <camel/camel.h> + +#include <e-util/e-util.h> +#include <libemail-engine/e-mail-session.h> + +/* Standard GObject macros */ +#define MESSAGE_LIST_TYPE \ + (message_list_get_type ()) +#define MESSAGE_LIST(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), MESSAGE_LIST_TYPE, MessageList)) +#define MESSAGE_LIST_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), MESSAGE_LIST_TYPE, MessageListClass)) +#define IS_MESSAGE_LIST(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), MESSAGE_LIST_TYPE)) +#define IS_MESSAGE_LIST_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), MESSAGE_LIST_TYPE)) +#define MESSAGE_LIST_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), MESSAGE_LIST_TYPE, MessageListClass)) + +G_BEGIN_DECLS enum { COL_MESSAGE_STATUS, @@ -30,131 +65,152 @@ enum { COL_FOLLOWUP_FLAG, COL_FOLLOWUP_DUE_BY, COL_LOCATION, /* vfolder location? */ - + COL_SENDER, + COL_RECIPIENTS, + COL_MIXED_SENDER, + COL_MIXED_RECIPIENTS, + COL_LABELS, + + /* subject with junk removed */ + COL_SUBJECT_TRIMMED, + /* normalised strings */ COL_FROM_NORM, COL_SUBJECT_NORM, COL_TO_NORM, - + COL_LAST, - + /* Invisible columns */ COL_DELETED, COL_UNREAD, - COL_COLOUR, + COL_COLOUR }; #define MESSAGE_LIST_COLUMN_IS_ACTIVE(col) (col == COL_MESSAGE_STATUS || \ col == COL_FLAGGED) -#define ML_HIDE_NONE_START (0) -#define ML_HIDE_NONE_END (2147483647) -/* dont change */ -#define ML_HIDE_SAME (2147483646) +typedef struct _MessageList MessageList; +typedef struct _MessageListClass MessageListClass; +typedef struct _MessageListPrivate MessageListPrivate; struct _MessageList { - ETreeScrolled parent; + ETree parent; + + MessageListPrivate *priv; /* The table */ - ETreeModel *model; - ETree *tree; - ETreePath tree_root; ETableExtras *extras; - /* The folder */ - CamelFolder *folder; - GHashTable *uid_nodemap; /* uid (from info) -> tree node mapping */ - + GHashTable *normalised_hash; - - /* UID's to hide. Keys in the mempool */ - /* IMPORTANT: You MUST have obtained the hide lock, to operate on this data */ - GHashTable *hidden; - struct _EMemPool *hidden_pool; - int hide_unhidden, /* total length, before hiding */ - hide_before, hide_after; /* hide ranges of messages */ /* Current search string, or %NULL */ - char *search; + gchar *search; - /* Are we displaying threaded view? */ - gboolean threaded; - /* do we automatically hide deleted messages? */ - gboolean hidedeleted; + /* are we regenerating the message_list because set_folder + * was just called? */ + guint just_set_folder : 1; - /* Where the ETree cursor is. */ - int cursor_row; - char *cursor_uid; + guint expand_all :1; + guint collapse_all :1; - /* Row-selection and seen-marking timers */ - guint idle_id, seen_id; + /* frozen count */ + guint frozen : 16; - /* locks */ - GMutex *hide_lock; /* for any 'hide' info above */ + /* Where the ETree cursor is. */ + gchar *cursor_uid; - /* list of outstanding regeneration requests */ - GList *regen; + /* whether the last selection was on a single row or none/multi */ + gboolean last_sel_single; - /* the current camel folder thread tree, if any */ - struct _CamelFolderThread *thread_tree; + /* Row-selection and seen-marking timers */ + guint idle_id, seen_id; - /* for message/folder chagned event handling */ - struct _MailAsyncEvent *async_event; + gchar *frozen_search; /* to save search took place while we were frozen */ }; -typedef struct { - ETreeScrolledClass parent_class; +struct _MessageListClass { + ETreeClass parent_class; /* signals - select a message */ - void (*message_selected) (MessageList *ml, const char *uid); - void (*message_list_built) (MessageList *ml); -} MessageListClass; - -typedef void (*MessageListForeachFunc) (MessageList *message_list, - const char *uid, - gpointer user_data); + void (*message_selected) (MessageList *message_list, const gchar *uid); + void (*message_list_built) (MessageList *message_list); + void (*message_list_scrolled) (MessageList *message_list); +}; typedef enum { - MESSAGE_LIST_SELECT_NEXT = 1, - MESSAGE_LIST_SELECT_PREVIOUS = -1 + MESSAGE_LIST_SELECT_NEXT = 0, + MESSAGE_LIST_SELECT_PREVIOUS = 1, + MESSAGE_LIST_SELECT_DIRECTION = 1, /* direction mask */ + MESSAGE_LIST_SELECT_WRAP = 1<<1 /* option bit */ } MessageListSelectDirection; -GtkType message_list_get_type (void); -GtkWidget *message_list_new (void); -void message_list_set_folder (MessageList *message_list, - CamelFolder *camel_folder, - gboolean outgoing); - -void message_list_foreach (MessageList *message_list, - MessageListForeachFunc callback, - gpointer user_data); - -gboolean message_list_select (MessageList *message_list, - MessageListSelectDirection direction, - guint32 flags, - guint32 mask, - gboolean wraparound); - -void message_list_select_uid (MessageList *message_list, - const char *uid); - -void message_list_select_next_thread (MessageList *messageList); - -/* info */ -unsigned int message_list_length(MessageList *ml); -unsigned int message_list_hidden(MessageList *ml); - -/* hide specific messages */ -void message_list_hide_add(MessageList *ml, const char *expr, unsigned int lower, unsigned int upper); -void message_list_hide_uids(MessageList *ml, GPtrArray *uids); -void message_list_hide_clear(MessageList *ml); - -void message_list_set_threaded(MessageList *ml, gboolean threaded); -void message_list_set_hidedeleted(MessageList *ml, gboolean hidedeleted); -void message_list_set_search(MessageList *ml, const char *search); - -#define MESSAGE_LIST_LOCK(m, l) g_mutex_lock(((MessageList *)m)->l) -#define MESSAGE_LIST_UNLOCK(m, l) g_mutex_unlock(((MessageList *)m)->l) +GType message_list_get_type (void); +GtkWidget * message_list_new (EMailSession *session); +EMailSession * message_list_get_session (MessageList *message_list); +CamelFolder * message_list_ref_folder (MessageList *message_list); +void message_list_set_folder (MessageList *message_list, + CamelFolder *folder); +GtkTargetList * message_list_get_copy_target_list + (MessageList *message_list); +GtkTargetList * message_list_get_paste_target_list + (MessageList *message_list); +void message_list_set_expanded_default + (MessageList *message_list, + gboolean expanded_default); +gboolean message_list_get_group_by_threads + (MessageList *message_list); +void message_list_set_group_by_threads + (MessageList *message_list, + gboolean group_by_threads); +gboolean message_list_get_show_deleted (MessageList *message_list); +void message_list_set_show_deleted (MessageList *message_list, + gboolean show_deleted); +gboolean message_list_get_thread_latest (MessageList *message_list); +void message_list_set_thread_latest (MessageList *message_list, + gboolean thread_latest); +gboolean message_list_get_thread_subject (MessageList *message_list); +void message_list_set_thread_subject (MessageList *message_list, + gboolean thread_subject); +void message_list_freeze (MessageList *message_list); +void message_list_thaw (MessageList *message_list); +GPtrArray * message_list_get_selected (MessageList *message_list); +void message_list_set_selected (MessageList *message_list, + GPtrArray *uids); +gboolean message_list_select (MessageList *message_list, + MessageListSelectDirection direction, + guint32 flags, + guint32 mask); +gboolean message_list_can_select (MessageList *message_list, + MessageListSelectDirection direction, + guint32 flags, + guint32 mask); +void message_list_select_uid (MessageList *message_list, + const gchar *uid, + gboolean with_fallback); +void message_list_select_next_thread (MessageList *message_list); +void message_list_select_prev_thread (MessageList *message_list); +void message_list_select_all (MessageList *message_list); +void message_list_select_thread (MessageList *message_list); +void message_list_select_subthread (MessageList *message_list); +void message_list_copy (MessageList *message_list, + gboolean cut); +void message_list_paste (MessageList *message_list); +guint message_list_count (MessageList *message_list); +guint message_list_selected_count (MessageList *message_list); +void message_list_set_threaded_expand_all + (MessageList *message_list); +void message_list_set_threaded_collapse_all + (MessageList *message_list); +void message_list_set_search (MessageList *message_list, + const gchar *search); +void message_list_save_state (MessageList *message_list); + +void message_list_sort_uids (MessageList *message_list, + GPtrArray *uids); + +G_END_DECLS #endif /* _MESSAGE_LIST_H_ */ |