modest_window_mgr_register_window (modest_runtime_get_window_mgr (),
MODEST_WINDOW (headerwin),
MODEST_WINDOW (self));
+
+ modest_window_set_active_account (MODEST_WINDOW (headerwin),
+ modest_window_get_active_account (MODEST_WINDOW (self)));
gtk_widget_show (GTK_WIDGET (headerwin));
}
#include <modest-defs.h>
#include <modest-widget-memory.h>
#include <modest-ui-actions.h>
+#include <modest-platform.h>
+#include <modest-text-utils.h>
#include <hildon/hildon-button.h>
#include <hildon/hildon-program.h>
#include <hildon/hildon-banner.h>
TnyFolder *folder;
+ /* banners */
+ GtkWidget *updating_banner;
+ guint updating_banner_timeout;
+
/* signals */
GSList *sighandlers;
TnyHeader *header,
GtkTreePath *path,
ModestHeaderWindow *header_window);
+static void on_updating_msg_list (ModestHeaderView *header_view,
+ gboolean starting,
+ gpointer user_data);
/* globals */
priv->contents_view = NULL;
priv->contents_state = CONTENTS_STATE_NONE;
priv->folder = NULL;
+ priv->updating_banner = NULL;
+ priv->updating_banner_timeout = 0;
modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
GTK_WINDOW(obj),
call this function before */
modest_header_window_disconnect_signals (MODEST_WINDOW (obj));
+ if (priv->updating_banner_timeout > 0) {
+ g_source_remove (priv->updating_banner_timeout);
+ priv->updating_banner_timeout = 0;
+ }
+ if (priv->updating_banner) {
+ gtk_widget_destroy (priv->updating_banner);
+ priv->updating_banner = NULL;
+ }
+
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
modest_signal_mgr_connect (priv->sighandlers, G_OBJECT (priv->header_view),
"header-activated",
G_CALLBACK (on_header_activated), self);
-
+ priv->sighandlers =
+ modest_signal_mgr_connect (priv->sighandlers,
+ G_OBJECT (priv->header_view),
+ "updating-msg-list",
+ G_CALLBACK (on_updating_msg_list),
+ self);
+
/* TODO: connect header view activate */
/* new message button */
app_menu = hildon_app_menu_new ();
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_viewer_newemail"),
+ G_CALLBACK (modest_ui_actions_on_new_msg));
add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_sendandreceive"),
G_CALLBACK (modest_ui_actions_on_send_receive));
+ add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_messagedetails"),
+ G_CALLBACK (modest_ui_actions_on_details));
hildon_stackable_window_set_main_menu (HILDON_STACKABLE_WINDOW (self),
HILDON_APP_MENU (app_menu));
{
modest_ui_actions_on_header_activated (header_view, header, path, MODEST_WINDOW (header_window));
}
+
+static void
+updating_banner_destroyed (gpointer data,
+ GObject *where_the_object_was)
+{
+ ModestHeaderWindowPrivate *priv = NULL;
+
+ priv = MODEST_HEADER_WINDOW_GET_PRIVATE (data);
+
+ priv->updating_banner = NULL;
+}
+
+static gboolean
+show_updating_banner (gpointer user_data)
+{
+ ModestHeaderWindowPrivate *priv = NULL;
+
+ priv = MODEST_HEADER_WINDOW_GET_PRIVATE (user_data);
+
+ if (priv->updating_banner == NULL) {
+
+ /* We're outside the main lock */
+ gdk_threads_enter ();
+ priv->updating_banner =
+ modest_platform_animation_banner (GTK_WIDGET (user_data), NULL,
+ _CS ("ckdg_pb_updating"));
+
+ /* We need this because banners in Maemo could be
+ destroyed by dialogs so we need to properly update
+ our reference to it */
+ g_object_weak_ref (G_OBJECT (priv->updating_banner),
+ updating_banner_destroyed,
+ user_data);
+ gdk_threads_leave ();
+ }
+
+ /* Remove timeout */
+ priv->updating_banner_timeout = 0;
+ return FALSE;
+}
+
+/**
+ * We use this function to show/hide a progress banner showing
+ * "Updating" while the header view is being filled. We're not showing
+ * it unless the update takes more than 2 seconds
+ *
+ * If starting = TRUE then the refresh is starting, otherwise it means
+ * that is has just finished
+ */
+static void
+on_updating_msg_list (ModestHeaderView *header_view,
+ gboolean starting,
+ gpointer user_data)
+{
+ ModestHeaderWindowPrivate *priv = NULL;
+
+ priv = MODEST_HEADER_WINDOW_GET_PRIVATE (user_data);
+
+ /* Remove old timeout */
+ if (priv->updating_banner_timeout > 0) {
+ g_source_remove (priv->updating_banner_timeout);
+ priv->updating_banner_timeout = 0;
+ }
+
+ /* Create a new timeout */
+ if (starting) {
+ priv->updating_banner_timeout =
+ g_timeout_add (2000, show_updating_banner, user_data);
+ } else {
+ /* Remove the banner if exists */
+ if (priv->updating_banner) {
+ gtk_widget_destroy (priv->updating_banner);
+ priv->updating_banner = NULL;
+ }
+ }
+}
#define MYDOCS_ENV "MYDOCSDIR"
#define DOCS_FOLDER ".documents"
+typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate;
+struct _ModestMsgViewWindowPrivate {
+
+ GtkWidget *msg_view;
+ GtkWidget *main_scroll;
+ GtkWidget *find_toolbar;
+ gchar *last_search;
+
+ /* Progress observers */
+ GtkWidget *progress_bar;
+ GSList *progress_widgets;
+
+ /* Tollbar items */
+ GtkWidget *progress_toolitem;
+ GtkWidget *cancel_toolitem;
+ GtkWidget *prev_toolitem;
+ GtkWidget *next_toolitem;
+ ModestToolBarModes current_toolbar_mode;
+
+ /* Optimized view enabled */
+ gboolean optimized_view;
+
+ /* Whether this was created via the *_new_for_search_result() function. */
+ gboolean is_search_result;
+
+ /* Whether the message is in outbox */
+ gboolean is_outbox;
+
+ /* A reference to the @model of the header view
+ * to allow selecting previous/next messages,
+ * if the message is currently selected in the header view.
+ */
+ const gchar *header_folder_id;
+ GtkTreeModel *header_model;
+ GtkTreeRowReference *row_reference;
+ GtkTreeRowReference *next_row_reference;
+
+ gulong clipboard_change_handler;
+ gulong queue_change_handler;
+ gulong account_removed_handler;
+ gulong row_changed_handler;
+ gulong row_deleted_handler;
+ gulong row_inserted_handler;
+ gulong rows_reordered_handler;
+
+ guint purge_timeout;
+ GtkWidget *remove_attachment_banner;
+
+ guint progress_bar_timeout;
+
+ gchar *msg_uid;
+
+ GSList *sighandlers;
+};
+
static void modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass);
static void modest_msg_view_window_init (ModestMsgViewWindow *obj);
static void modest_header_view_observer_init(
GtkScrollType scroll_type,
gboolean horizontal,
gpointer userdata);
+static gboolean message_reader (ModestMsgViewWindow *window,
+ ModestMsgViewWindowPrivate *priv,
+ TnyHeader *header,
+ GtkTreeRowReference *row_reference);
/* list my signals */
enum {
{ "FindInMessage", MODEST_TOOLBAR_ICON_FIND, N_("qgn_toolb_gene_find"), NULL, NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
};
-typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate;
-struct _ModestMsgViewWindowPrivate {
-
- GtkWidget *msg_view;
- GtkWidget *main_scroll;
- GtkWidget *find_toolbar;
- gchar *last_search;
-
- /* Progress observers */
- GtkWidget *progress_bar;
- GSList *progress_widgets;
-
- /* Tollbar items */
- GtkWidget *progress_toolitem;
- GtkWidget *cancel_toolitem;
- GtkWidget *prev_toolitem;
- GtkWidget *next_toolitem;
- ModestToolBarModes current_toolbar_mode;
-
- /* Optimized view enabled */
- gboolean optimized_view;
-
- /* Whether this was created via the *_new_for_search_result() function. */
- gboolean is_search_result;
-
- /* Whether the message is in outbox */
- gboolean is_outbox;
-
- /* A reference to the @model of the header view
- * to allow selecting previous/next messages,
- * if the message is currently selected in the header view.
- */
- const gchar *header_folder_id;
- GtkTreeModel *header_model;
- GtkTreeRowReference *row_reference;
- GtkTreeRowReference *next_row_reference;
-
- gulong clipboard_change_handler;
- gulong queue_change_handler;
- gulong account_removed_handler;
- gulong row_changed_handler;
- gulong row_deleted_handler;
- gulong row_inserted_handler;
- gulong rows_reordered_handler;
-
- guint purge_timeout;
- GtkWidget *remove_attachment_banner;
-
- guint progress_bar_timeout;
-
- gchar *msg_uid;
-
- GSList *sighandlers;
-};
-
#define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
MODEST_TYPE_MSG_VIEW_WINDOW, \
ModestMsgViewWindowPrivate))
MODEST_CONF_MSG_VIEW_WINDOW_KEY);
}
-static
-gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
- GtkScrollType scroll_type,
- gboolean horizontal,
- gpointer userdata)
+static void
+restore_settings (ModestMsgViewWindow *self)
+{
+ ModestConf *conf;
+
+ conf = modest_runtime_get_conf ();
+ modest_widget_memory_restore (conf,
+ G_OBJECT(self),
+ MODEST_CONF_MSG_VIEW_WINDOW_KEY);
+}
+
+static gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
+ GtkScrollType scroll_type,
+ gboolean horizontal,
+ gpointer userdata)
{
ModestMsgViewWindowPrivate *priv;
gboolean return_value;
G_CALLBACK (modest_ui_actions_on_msg_attachment_clicked), obj);
g_signal_connect (G_OBJECT(priv->msg_view), "recpt_activated",
G_CALLBACK (modest_ui_actions_on_msg_recpt_activated), obj);
+ g_signal_connect (G_OBJECT(priv->msg_view), "show_details",
+ G_CALLBACK (modest_ui_actions_on_details), obj);
g_signal_connect (G_OBJECT(priv->msg_view), "link_contextual",
G_CALLBACK (modest_ui_actions_on_msg_link_contextual), obj);
g_signal_connect (G_OBJECT (priv->msg_view), "fetch_image",
g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj);
priv->last_search = NULL;
+ modest_msg_view_window_show_toolbar (MODEST_WINDOW (obj), TRUE);
+
/* Init the clipboard actions dim status */
modest_msg_view_grab_focus(MODEST_MSG_VIEW (priv->msg_view));
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
update_window_title (MODEST_MSG_VIEW_WINDOW (window));
+
/* gtk_widget_show_all (GTK_WIDGET (window)); */
modest_msg_view_window_update_priority (window);
+ /* Check dimming rules */
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
+ modest_window_check_dimming_rules_group (MODEST_WINDOW (window), MODEST_DIMMING_RULES_CLIPBOARD);
+
+ return MODEST_WINDOW(window);
+}
+
+ModestWindow *
+modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
+ const gchar *modest_account_name,
+ const gchar *msg_uid,
+ GtkTreeRowReference *row_reference)
+{
+ ModestMsgViewWindow *window = NULL;
+ ModestMsgViewWindowPrivate *priv = NULL;
+ TnyFolder *header_folder = NULL;
+ ModestWindowMgr *mgr = NULL;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+
+ mgr = modest_runtime_get_window_mgr ();
+ window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr));
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL);
+
+ modest_msg_view_window_construct (window, modest_account_name, msg_uid);
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ /* Remember the message list's TreeModel so we can detect changes
+ * and change the list selection when necessary: */
+
+ if (header_view != NULL){
+ header_folder = modest_header_view_get_folder(header_view);
+ /* This could happen if the header folder was
+ unseleted before opening this msg window (for
+ example if the user selects an account in the
+ folder view of the main window */
+ if (header_folder) {
+ priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == TNY_FOLDER_TYPE_OUTBOX);
+ priv->header_folder_id = tny_folder_get_id(header_folder);
+ g_assert(priv->header_folder_id != NULL);
+ g_object_unref(header_folder);
+ }
+ }
+
+ /* Setup row references and connect signals */
+ priv->header_model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+
+ if (row_reference) {
+ priv->row_reference = gtk_tree_row_reference_copy (row_reference);
+ priv->next_row_reference = gtk_tree_row_reference_copy (row_reference);
+ select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE, priv->is_outbox);
+ } else {
+ priv->row_reference = NULL;
+ priv->next_row_reference = NULL;
+ }
+
+ /* Connect signals */
+ priv->row_changed_handler =
+ g_signal_connect (GTK_TREE_MODEL(priv->header_model), "row-changed",
+ G_CALLBACK(modest_msg_view_window_on_row_changed),
+ window);
+ priv->row_deleted_handler =
+ g_signal_connect (GTK_TREE_MODEL(priv->header_model), "row-deleted",
+ G_CALLBACK(modest_msg_view_window_on_row_deleted),
+ window);
+ priv->row_inserted_handler =
+ g_signal_connect (GTK_TREE_MODEL(priv->header_model), "row-inserted",
+ G_CALLBACK(modest_msg_view_window_on_row_inserted),
+ window);
+ priv->rows_reordered_handler =
+ g_signal_connect(GTK_TREE_MODEL(priv->header_model), "rows-reordered",
+ G_CALLBACK(modest_msg_view_window_on_row_reordered),
+ window);
+
+ if (header_view != NULL){
+ modest_header_view_add_observer(header_view,
+ MODEST_HEADER_VIEW_OBSERVER(window));
+ }
+
+ tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), NULL);
+
+ path = gtk_tree_row_reference_get_path (row_reference);
+ if (gtk_tree_model_get_iter (priv->header_model, &iter, path)) {
+ TnyHeader *header;
+ gtk_tree_model_get (priv->header_model, &iter,
+ TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+ message_reader (window, priv, header, row_reference);
+ }
+ gtk_tree_path_free (path);
/* Check dimming rules */
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
typedef struct {
GtkTreeModel *model;
- TnyList *headers;
+ TnyHeader *header;
OpenMsgBannerInfo *banner_info;
- GHashTable *row_refs_per_header;
+ GtkTreeRowReference *rowref;
} OpenMsgHelper;
gboolean
}
-static void
-open_msg_cb (ModestMailOperation *mail_op,
- TnyHeader *header,
- gboolean canceled,
- TnyMsg *msg,
- GError *err,
- gpointer user_data)
+static GtkWidget *
+get_header_view_from_window (ModestWindow *window)
{
- ModestWindowMgr *mgr = NULL;
- ModestWindow *parent_win = NULL;
- ModestWindow *win = NULL;
- TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
- gchar *account = NULL;
- TnyFolder *folder;
- gboolean open_in_editor = FALSE;
- OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
+ GtkWidget *header_view;
- /* Do nothing if there was any problem with the mail
- operation. The error will be shown by the error_handler of
- the mail operation */
- if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
- return;
+ if (MODEST_IS_MAIN_WINDOW (window)) {
+ header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
+ MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+#ifdef MODEST_TOOLKIT_HILDON2
+ } else if (MODEST_IS_HEADER_WINDOW (window)){
+ header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (window)));
+#endif
+ } else {
+ header_view = NULL;
+ }
- parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
- folder = tny_header_get_folder (header);
+ return header_view;
+}
- /* Mark header as read */
- headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
+static gchar *
+get_info_from_header (TnyHeader *header, gboolean *is_draft)
+{
+ TnyFolder *folder;
+ gchar *account = NULL;
+ TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
+ *is_draft = FALSE;
+
+ folder = tny_header_get_folder (header);
/* Gets folder type (OUTBOX headers will be opened in edit window */
if (modest_tny_folder_is_local_folder (folder)) {
folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
if (folder_type == TNY_FOLDER_TYPE_INVALID)
g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
}
-
-
+
if (folder_type == TNY_FOLDER_TYPE_OUTBOX) {
TnyTransportAccount *traccount = NULL;
ModestTnyAccountStore *accstore = modest_runtime_get_account_store();
/* Only open messages in outbox with the editor if they are in Failed state */
if (status == MODEST_TNY_SEND_QUEUE_FAILED) {
- open_in_editor = TRUE;
- }
-#ifdef MODEST_TOOLKIT_HILDON2
- else {
- /* In Fremantle we can not
- open any message from
- outbox which is not in
- failed state */
- g_object_unref(traccount);
- goto cleanup;
+ *is_draft = TRUE;
}
#endif
}
g_warning("Cannot get transport account for message in outbox!!");
}
} else if (folder_type == TNY_FOLDER_TYPE_DRAFTS) {
- open_in_editor = TRUE; /* Open in editor if the message is in the Drafts folder */
+ *is_draft = TRUE; /* Open in editor if the message is in the Drafts folder */
}
+ g_object_unref (folder);
+
+ return account;
+}
+
+static void
+open_msg_cb (ModestMailOperation *mail_op,
+ TnyHeader *header,
+ gboolean canceled,
+ TnyMsg *msg,
+ GError *err,
+ gpointer user_data)
+{
+ ModestWindowMgr *mgr = NULL;
+ ModestWindow *parent_win = NULL;
+ ModestWindow *win = NULL;
+ gchar *account = NULL;
+ gboolean open_in_editor = FALSE;
+ OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
+
+ /* Do nothing if there was any problem with the mail
+ operation. The error will be shown by the error_handler of
+ the mail operation */
+ if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
+ return;
+
+ parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
+
+ /* Mark header as read */
+ headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
+
+ account = get_info_from_header (header, &open_in_editor);
+
/* Get account */
if (!account)
account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win)));
win = modest_msg_edit_window_new (msg, account, TRUE);
} else {
gchar *uid = modest_tny_folder_get_header_unique_id (header);
- GtkTreeRowReference *row_reference;
- row_reference = (GtkTreeRowReference *) g_hash_table_lookup (helper->row_refs_per_header, header);
- if (row_reference && helper->model) {
+ if (helper->rowref && helper->model) {
win = modest_msg_view_window_new_with_header_model (msg, account, (const gchar*) uid,
- helper->model, row_reference);
+ helper->model, helper->rowref);
} else {
win = modest_msg_view_window_new_for_attachment (msg, account, (const gchar*) uid);
}
/* Free */
g_free(account);
g_object_unref (parent_win);
- g_object_unref (folder);
}
static gboolean
return account;
}
-static void
-foreach_unregister_headers (gpointer data,
- gpointer user_data)
+static TnyAccount*
+get_account_from_header (TnyHeader *header)
{
- ModestWindowMgr *mgr = (ModestWindowMgr *) user_data;
- TnyHeader *header = TNY_HEADER (data);
+ TnyAccount *account = NULL;
+ TnyFolder *folder;
- modest_window_mgr_unregister_header (mgr, header);
+ folder = tny_header_get_folder (header);
+
+ if (folder) {
+ account = tny_folder_get_account (folder);
+ g_object_unref (folder);
+ }
+
+ return account;
}
static void
-open_msgs_helper_destroyer (gpointer user_data)
+open_msg_helper_destroyer (gpointer user_data)
{
OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
helper->banner_info = NULL;
}
g_object_unref (helper->model);
- g_object_unref (helper->headers);
- g_hash_table_destroy (helper->row_refs_per_header);
+ g_object_unref (helper->header);
+ gtk_tree_row_reference_free (helper->rowref);
g_slice_free (OpenMsgHelper, helper);
}
static void
-open_msgs_performer(gboolean canceled,
+open_msg_performer(gboolean canceled,
GError *err,
GtkWindow *parent_window,
TnyAccount *account,
ModestMailOperation *mail_op = NULL;
gchar *error_msg;
ModestProtocolType proto;
- TnyList *not_opened_headers;
TnyConnectionStatus status;
gboolean show_open_draft = FALSE;
OpenMsgHelper *helper = NULL;
helper = (OpenMsgHelper *) user_data;
- not_opened_headers = helper->headers;
status = tny_account_get_connection_status (account);
if (err || canceled) {
- /* Unregister the already registered headers */
- tny_list_foreach (not_opened_headers, foreach_unregister_headers,
- modest_runtime_get_window_mgr ());
+ modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), helper->header);
/* Free the helper */
- open_msgs_helper_destroyer (helper);
-
+ open_msg_helper_destroyer (helper);
+
/* In memory full conditions we could get this error here */
check_memory_full_error ((GtkWidget *) parent_window, err);
-
+
goto clean;
}
if (proto == MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
proto = MODEST_PROTOCOLS_STORE_MAILDIR;
}
+
+ ModestProtocol *protocol;
+ ModestProtocolRegistry *protocol_registry;
+ gchar *subject;
+
+ protocol_registry = modest_runtime_get_protocol_registry ();
+ subject = tny_header_dup_subject (helper->header);
- /* Create the error messages */
- if (tny_list_get_length (not_opened_headers) == 1) {
- ModestProtocol *protocol;
- ModestProtocolRegistry *protocol_registry;
- TnyIterator *iter;
- TnyHeader *header;
- gchar *subject;
-
- protocol_registry = modest_runtime_get_protocol_registry ();
- iter = tny_list_create_iterator (not_opened_headers);
- header = TNY_HEADER (tny_iterator_get_current (iter));
- subject = tny_header_dup_subject (header);
+ protocol = modest_protocol_registry_get_protocol_by_type (protocol_registry, proto);
+ error_msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
+ if (subject)
+ g_free (subject);
+
+ if (error_msg == NULL) {
+ error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
+ }
- protocol = modest_protocol_registry_get_protocol_by_type (protocol_registry, proto);
- error_msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
- if (subject)
- g_free (subject);
- g_object_unref (header);
- g_object_unref (iter);
+ if (modest_protocol_registry_protocol_type_has_tag (protocol_registry,
+ proto,
+ MODEST_PROTOCOL_REGISTRY_LOCAL_STORE_PROTOCOLS)) {
+ TnyFolder *folder;
+ TnyFolderType folder_type;
- if (error_msg == NULL) {
- error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
- }
+ folder = tny_header_get_folder (helper->header);
+ folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
+ show_open_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
+ g_object_unref (folder);
+ }
- if (modest_protocol_registry_protocol_type_has_tag (protocol_registry,
- proto,
- MODEST_PROTOCOL_REGISTRY_LOCAL_STORE_PROTOCOLS)) {
- TnyHeader *header;
- TnyFolder *folder;
- TnyIterator *iter;
- TnyFolderType folder_type;
+#ifdef MODEST_TOOLKIT_HILDON2
+ gboolean is_draft;
+ gchar *account_name = get_info_from_header (helper->header, &is_draft);
- iter = tny_list_create_iterator (not_opened_headers);
- header = TNY_HEADER (tny_iterator_get_current (iter));
- folder = tny_header_get_folder (header);
- folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
- show_open_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
- g_object_unref (folder);
- g_object_unref (header);
- g_object_unref (iter);
+ if (!is_draft) {
+ ModestWindow *window;
+ GtkWidget *header_view;
+ gchar *uid;
+
+ header_view = get_header_view_from_window (MODEST_WINDOW (parent_window));
+ uid = modest_tny_folder_get_header_unique_id (helper->header);
+ if (header_view) {
+ window = modest_msg_view_window_new_from_header_view
+ (MODEST_HEADER_VIEW (header_view), account_name, uid, helper->rowref);
+ if (window != NULL) {
+ if (!modest_window_mgr_register_window (modest_runtime_get_window_mgr (),
+ window, NULL)) {
+ gtk_widget_destroy (GTK_WIDGET (window));
+ } else {
+ gtk_widget_show_all (GTK_WIDGET(window));
+ }
+ }
}
- } else {
- error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
+ g_free (account_name);
+ g_free (uid);
+ open_msg_helper_destroyer (helper);
+ goto clean;
}
-
+ g_free (account_name);
+#endif
/* Create the mail operation */
mail_op =
modest_mail_operation_new_with_error_handling ((GObject *) parent_window,
helper->banner_info);
}
+ TnyList *headers;
+ headers = TNY_LIST (tny_simple_list_new ());
+ tny_list_prepend (headers, G_OBJECT (helper->header));
modest_mail_operation_get_msgs_full (mail_op,
- not_opened_headers,
+ headers,
open_msg_cb,
helper,
- open_msgs_helper_destroyer);
+ open_msg_helper_destroyer);
+ g_object_unref (headers);
/* Frees */
clean:
* same when trying to open messages.
*/
static void
-open_msgs_from_headers (TnyList *headers, GtkTreePath *path, ModestWindow *win)
+open_msg_from_header (TnyHeader *header, GtkTreeRowReference *rowref, ModestWindow *win)
{
ModestWindowMgr *mgr = NULL;
- TnyIterator *iter = NULL, *iter_not_opened = NULL;
- TnyList *not_opened_headers = NULL;
- TnyHeaderFlags flags = 0;
TnyAccount *account;
- gint uncached_msgs = 0;
+ gboolean cached = FALSE;
+ gboolean found;
GtkWidget *header_view = NULL;
- GtkTreeModel *model;
- GHashTable *refs_for_headers;
OpenMsgHelper *helper;
- GtkTreeSelection *sel;
- GList *sel_list = NULL, *sel_list_iter = NULL;
+ ModestWindow *window;
+
+ g_return_if_fail (header != NULL && rowref != NULL);
- g_return_if_fail (headers != NULL);
+ mgr = modest_runtime_get_window_mgr ();
- /* Check that only one message is selected for opening */
- if (tny_list_get_length (headers) != 1) {
- modest_platform_information_banner ((win) ? GTK_WIDGET (win) : NULL,
- NULL, _("mcen_ib_select_one_message"));
+ /* get model */
+ header_view = get_header_view_from_window (MODEST_WINDOW (win));
+ if (header_view == NULL)
return;
- }
-
- mgr = modest_runtime_get_window_mgr ();
- iter = tny_list_create_iterator (headers);
/* Get the account */
- account = get_account_from_header_list (headers);
-
+ account = get_account_from_header (header);
if (!account)
return;
- if (!MODEST_IS_MAIN_WINDOW (win) && path == NULL)
- return;
-
- /* get model */
- if (MODEST_IS_MAIN_WINDOW (win)) {
- header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
- MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
-#ifdef MODEST_TOOLKIT_HILDON2
- } else if (MODEST_IS_HEADER_WINDOW (win)){
-#endif
- header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
- }
-
- if (!header_view)
- return;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
- if (path && MODEST_IS_HEADER_WINDOW (win)) {
- sel_list = g_list_prepend (NULL, gtk_tree_path_copy (path));
- } else {
- /* Get the selections, we need to get the references to the
- rows here because the treeview/model could dissapear (the
- user might want to select another folder)*/
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
- sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
- }
- refs_for_headers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL,
- (GDestroyNotify) gtk_tree_row_reference_free);
-
- /* Look if we already have a message view for each header. If
- true, then remove the header from the list of headers to
- open */
- sel_list_iter = sel_list;
-
- not_opened_headers = tny_simple_list_new ();
- while (!tny_iterator_is_done (iter) && sel_list_iter) {
-
- ModestWindow *window = NULL;
- TnyHeader *header = NULL;
- gboolean found = FALSE;
-
- header = TNY_HEADER (tny_iterator_get_current (iter));
- if (header)
- flags = tny_header_get_flags (header);
-
- window = NULL;
- found = modest_window_mgr_find_registered_header (mgr, header, &window);
-
- /* Do not open again the message and present the
- window to the user */
- if (found) {
- if (window) {
+ window = NULL;
+ found = modest_window_mgr_find_registered_header (mgr, header, &window);
+
+ /* Do not open again the message and present the
+ window to the user */
+ if (found) {
+ if (window) {
#ifndef MODEST_TOOLKIT_HILDON2
- gtk_window_present (GTK_WINDOW (window));
+ gtk_window_present (GTK_WINDOW (window));
#endif
- } else {
- /* the header has been registered already, we don't do
- * anything but wait for the window to come up*/
- g_debug ("header %p already registered, waiting for window", header);
- }
} else {
- GtkTreeRowReference *row_reference;
-
- tny_list_append (not_opened_headers, G_OBJECT (header));
- /* Create a new row reference and add it to the hash table */
- row_reference = gtk_tree_row_reference_new (model, (GtkTreePath *) sel_list_iter->data);
- g_hash_table_insert (refs_for_headers, header, row_reference);
+ /* the header has been registered already, we don't do
+ * anything but wait for the window to come up*/
+ g_debug ("header %p already registered, waiting for window", header);
}
-
- if (header)
- g_object_unref (header);
-
- /* Go to next */
- tny_iterator_next (iter);
- sel_list_iter = g_list_next (sel_list_iter);
+ goto cleanup;
}
- g_object_unref (iter);
- iter = NULL;
- g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
- g_list_free (sel_list);
/* Open each message */
- if (tny_list_get_length (not_opened_headers) == 0) {
- g_hash_table_destroy (refs_for_headers);
- goto cleanup;
- }
-
- /* If some messages would have to be downloaded, ask the user to
- * make a connection. It's generally easier to do this here (in the mainloop)
- * than later in a thread:
- */
- if (tny_list_get_length (not_opened_headers) > 0) {
- uncached_msgs = header_list_count_uncached_msgs (not_opened_headers);
-
- if (uncached_msgs > 0) {
- /* Allways download if we are online. */
- if (!tny_device_is_online (modest_runtime_get_device ())) {
- gint response;
-
- /* If ask for user permission to download the messages */
- response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
- ngettext("mcen_nc_get_msg",
- "mcen_nc_get_msgs",
- uncached_msgs));
-
- /* End if the user does not want to continue */
- if (response == GTK_RESPONSE_CANCEL) {
- g_hash_table_destroy (refs_for_headers);
- goto cleanup;
- }
+ cached = tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED;
+ if (!cached) {
+ /* Allways download if we are online. */
+ if (!tny_device_is_online (modest_runtime_get_device ())) {
+ gint response;
+
+ /* If ask for user permission to download the messages */
+ response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
+ _("mcen_nc_get_msg"));
+
+ /* End if the user does not want to continue */
+ if (response == GTK_RESPONSE_CANCEL) {
+ goto cleanup;
}
}
}
- /* Register the headers before actually creating the windows: */
- iter_not_opened = tny_list_create_iterator (not_opened_headers);
- while (!tny_iterator_is_done (iter_not_opened)) {
- TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter_not_opened));
- if (header) {
- modest_window_mgr_register_header (mgr, header, NULL);
- g_object_unref (header);
- }
- tny_iterator_next (iter_not_opened);
- }
- g_object_unref (iter_not_opened);
- iter_not_opened = NULL;
+ /* We register the window for opening */
+ modest_window_mgr_register_header (mgr, header, NULL);
/* Create the helper. We need to get a reference to the model
here because it could change while the message is readed
(the user could switch between folders) */
helper = g_slice_new (OpenMsgHelper);
- helper->model = g_object_ref (model);
- helper->headers = g_object_ref (not_opened_headers);
- helper->row_refs_per_header = refs_for_headers;
+ helper->model = g_object_ref (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)));
+ helper->header = g_object_ref (header);
+ helper->rowref = gtk_tree_row_reference_copy (rowref);
helper->banner_info = NULL;
/* Connect to the account and perform */
- if (uncached_msgs > 0) {
+ if (!cached) {
modest_platform_connect_and_perform ((GtkWindow *) win, TRUE, g_object_ref (account),
- open_msgs_performer, helper);
+ open_msg_performer, helper);
} else {
/* Call directly the performer, do not need to connect */
- open_msgs_performer (FALSE, NULL, (GtkWindow *) win,
- g_object_ref (account), helper);
+ open_msg_performer (FALSE, NULL, (GtkWindow *) win,
+ g_object_ref (account), helper);
}
cleanup:
/* Clean */
if (account)
g_object_unref (account);
- if (not_opened_headers)
- g_object_unref (not_opened_headers);
}
void
modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
{
TnyList *headers;
+ TnyHeader *header;
+ gint headers_count;
+ TnyIterator *iter;
/* we check for low-mem; in that case, show a warning, and don't allow
* opening
if (!headers)
return;
+ headers_count = tny_list_get_length (headers);
+ if (headers_count != 1) {
+ if (headers_count > 1) {
+ /* Don't allow activation if there are more than one message selected */
+ modest_platform_information_banner (NULL, NULL, _("mcen_ib_select_one_message"));
+ }
+
+ g_object_unref (headers);
+ return;
+ }
+
+ iter = tny_list_create_iterator (headers);
+ header = TNY_HEADER (tny_iterator_get_current (iter));
+ g_object_unref (iter);
+
/* Open them */
- open_msgs_from_headers (headers, NULL, win);
+ if (header) {
+ open_msg_from_header (header, NULL, win);
+ g_object_unref (header);
+ }
g_object_unref(headers);
}
GtkTreePath *path,
ModestWindow *window)
{
- TnyList *headers;
+ GtkWidget *open_widget;
+ GtkTreeRowReference *rowref;
g_return_if_fail (MODEST_IS_WINDOW(window));
+ g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
+ g_return_if_fail (TNY_IS_HEADER (header));
- if (!header)
- return;
-
- if (MODEST_IS_MAIN_WINDOW (window) &&
- modest_header_view_count_selected_headers (header_view) > 1) {
+ if (modest_header_view_count_selected_headers (header_view) > 1) {
+ /* Don't allow activation if there are more than one message selected */
modest_platform_information_banner (NULL, NULL, _("mcen_ib_select_one_message"));
return;
}
return;
}
- if (MODEST_IS_MAIN_WINDOW (window)) {
- headers = modest_header_view_get_selected_headers (header_view);
- } else {
- headers = tny_simple_list_new ();
- tny_list_prepend (TNY_LIST (headers), G_OBJECT (header));
- }
-
- open_msgs_from_headers (headers, path, MODEST_WINDOW (window));
-
- g_object_unref (headers);
+ rowref = gtk_tree_row_reference_new (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)), path);
+ open_msg_from_header (header, rowref, MODEST_WINDOW (window));
+ gtk_tree_row_reference_free (rowref);
}
static void
/* Show details of each header */
do_headers_action (win, headers_action_show_details, header_view);
}
+#ifdef MODEST_TOOLKIT_HILDON2
+ } else if (MODEST_IS_HEADER_WINDOW (win)) {
+ TnyFolder *folder;
+ GtkWidget *header_view;
+
+ header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
+ folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
+ if (folder) {
+ modest_platform_run_folder_details_dialog (GTK_WINDOW (win),
+ folder);
+ g_object_unref (folder);
+ }
+#endif
}
}
modest-attachments-view.h \
modest-combo-box.c \
modest-combo-box.h \
+ modest-compact-mail-header-view.c \
+ modest-compact-mail-header-view.h \
modest-default-account-settings-dialog.h \
modest-dnd.c \
modest-dnd.h \
modest-easysetup-wizard-page.c \
+ modest-expander-mail-header-view.c \
+ modest-expander-mail-header-view.h \
modest-folder-view.c \
modest-global-settings-dialog.c \
modest-global-settings-dialog.h \
modest-isearch-view.h \
modest-limit-retrieve-combo-box.h \
modest-limit-retrieve-combo-box.c \
- modest-mail-header-view.c \
- modest-mail-header-view.h \
+ modest-mail-header-view.h \
+ modest-mail-header-view.c \
modest-main-window.h \
modest-mime-part-view.c \
modest-mime-part-view.h \
--- /dev/null
+/* Copyright (c) 2007, Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <config.h>
+//#include <glib/gi18n-lib.h>
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include <modest-text-utils.h>
+#include <modest-expander-mail-header-view.h>
+#include <modest-tny-folder.h>
+#include <modest-recpt-view.h>
+
+static GObjectClass *parent_class = NULL;
+
+typedef struct _ModestExpanderMailHeaderViewPriv ModestExpanderMailHeaderViewPriv;
+
+struct _ModestExpanderMailHeaderViewPriv
+{
+ GtkWidget *fromto_label;
+ GtkWidget *fromto_contents;
+ GtkWidget *main_vbox;
+ GtkWidget *expander;
+ GtkWidget *headers_vbox;
+ GtkWidget *subject_box;
+ GtkWidget *priority_icon;
+ GtkSizeGroup *labels_size_group;
+ gboolean is_outgoing;
+ gboolean is_draft;
+ TnyHeader *header;
+ TnyHeaderFlags priority_flags;
+};
+
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, ModestExpanderMailHeaderViewPriv))
+
+/* GObject */
+static void modest_expander_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class);
+static void modest_expander_mail_header_view_class_init (ModestExpanderMailHeaderViewClass *klass);
+static void modest_expander_mail_header_view_finalize (GObject *object);
+
+/* TnyHeaderView interface */
+static void tny_header_view_init (gpointer g, gpointer iface_data);
+static void modest_expander_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header);
+static void modest_expander_mail_header_view_update_is_outgoing (TnyHeaderView *self);
+static void modest_expander_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header);
+static void modest_expander_mail_header_view_clear (TnyHeaderView *self);
+static void modest_expander_mail_header_view_clear_default (TnyHeaderView *self);
+
+/* ModestMailHeaderView interface */
+static void modest_mail_header_view_init (gpointer g, gpointer iface_data);
+static TnyHeaderFlags modest_expander_mail_header_view_get_priority (ModestMailHeaderView *self);
+static TnyHeaderFlags modest_expander_mail_header_view_get_priority_default (ModestMailHeaderView *headers_view);
+static void modest_expander_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags);
+static void modest_expander_mail_header_view_set_priority_default (ModestMailHeaderView *headers_view,
+ TnyHeaderFlags flags);
+static const GtkWidget *modest_expander_mail_header_view_add_custom_header (ModestMailHeaderView *self,
+ const gchar *label,
+ GtkWidget *custom_widget,
+ gboolean with_expander,
+ gboolean start);
+static const GtkWidget *modest_expander_mail_header_view_add_custom_header_default (ModestMailHeaderView *self,
+ const gchar *label,
+ GtkWidget *custom_widget,
+ gboolean with_expander,
+ gboolean start);
+
+/* internal */
+static void add_date_time_header (ModestExpanderMailHeaderView *mail_header, const gchar *name, time_t date);
+static void activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data);
+static void add_recpt_header (ModestExpanderMailHeaderView *widget, const gchar *field, const gchar *value);
+static void clean_headers (GtkWidget *vbox);
+static void expander_activate (GtkWidget *expander, ModestExpanderMailHeaderView *header_view);
+
+
+
+static void
+add_date_time_header (ModestExpanderMailHeaderView *mail_header, const gchar *name, time_t date)
+{
+ const guint BUF_SIZE = 64;
+ gchar date_buf [BUF_SIZE];
+ gchar time_buf [BUF_SIZE];
+
+ ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (mail_header);
+ GtkWidget *hbox, *date_hbox, *time_hbox;
+ GtkWidget *label;
+
+ modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date);
+ modest_text_utils_strftime (time_buf, BUF_SIZE, "%X", date);
+
+ hbox = gtk_hbox_new (FALSE, 48);
+ date_hbox = gtk_hbox_new (FALSE, 12);
+ time_hbox = gtk_hbox_new (FALSE, 12);
+
+ label = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (label), name);
+ gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0);
+ gtk_box_pack_start (GTK_BOX (date_hbox), label, FALSE, FALSE, 0);
+ gtk_size_group_add_widget (priv->labels_size_group, label);
+
+ label = gtk_label_new(date_buf);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
+ gtk_box_pack_start (GTK_BOX (date_hbox), label, TRUE, TRUE, 0);
+
+ gtk_box_pack_start (GTK_BOX (hbox), date_hbox, FALSE, FALSE, 0);
+
+ label = gtk_label_new(NULL);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
+ gtk_label_set_markup (GTK_LABEL (label), _("mail_va_time"));
+ gtk_box_pack_start (GTK_BOX (time_hbox), label, FALSE, FALSE, 0);
+
+ label = gtk_label_new(time_buf);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
+ gtk_box_pack_start (GTK_BOX (time_hbox), label, TRUE, TRUE, 0);
+
+ gtk_box_pack_start (GTK_BOX (hbox), time_hbox, TRUE, TRUE, 0);
+
+ gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+}
+
+static void
+activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data)
+{
+ ModestExpanderMailHeaderView * view = MODEST_EXPANDER_MAIL_HEADER_VIEW (user_data);
+
+ g_signal_emit_by_name (G_OBJECT (view), "recpt-activated", address);
+}
+
+
+static void
+add_recpt_header (ModestExpanderMailHeaderView *widget, const gchar *field, const gchar *value)
+{
+ ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (widget);
+ GtkWidget *hbox;
+ GtkWidget *label_field, *label_value;
+
+ hbox = gtk_hbox_new (FALSE, 12);
+ label_field = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (label_field), field);
+ gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
+ label_value = modest_recpt_view_new ();
+ modest_recpt_view_set_recipients (MODEST_RECPT_VIEW(label_value), value);
+ g_signal_connect (G_OBJECT (label_value), "activate", G_CALLBACK (activate_recpt), widget);
+
+ gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), label_value, TRUE, TRUE, 0);
+ gtk_size_group_add_widget (priv->labels_size_group, label_field);
+
+ gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
+
+ gtk_widget_show (hbox);
+}
+
+static void
+clean_headers (GtkWidget *vbox)
+{
+ GList *headers_list, *node;
+
+ headers_list = gtk_container_get_children (GTK_CONTAINER (vbox));
+
+ for (node = headers_list; node != NULL; node = g_list_next (node)) {
+ gtk_widget_destroy (GTK_WIDGET (node->data));
+ }
+ g_list_free (headers_list);
+}
+
+static void
+modest_expander_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header)
+{
+ MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->set_header_func (self, header);
+ return;
+}
+
+static void
+modest_expander_mail_header_view_update_is_outgoing (TnyHeaderView *self)
+{
+ ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+ TnyFolder *folder = NULL;
+
+ priv->is_outgoing = FALSE;
+
+ if (priv->header == NULL)
+ return;
+
+ folder = tny_header_get_folder (priv->header);
+
+ if (folder) {
+ TnyFolderType folder_type = tny_folder_get_folder_type (folder);
+
+ switch (folder_type) {
+ case TNY_FOLDER_TYPE_DRAFTS:
+ case TNY_FOLDER_TYPE_OUTBOX:
+ case TNY_FOLDER_TYPE_SENT:
+ priv->is_outgoing = TRUE;
+ break;
+ default:
+ priv->is_outgoing = FALSE;
+ }
+ priv->is_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
+
+ g_object_unref (folder);
+ }
+}
+
+static void
+modest_expander_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
+{
+ ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+
+ if (header)
+ g_assert (TNY_IS_HEADER (header));
+
+ if (G_LIKELY (priv->header))
+ g_object_unref (G_OBJECT (priv->header));
+ priv->header = NULL;
+
+ clean_headers (priv->headers_vbox);
+
+ if (header && G_IS_OBJECT (header))
+ {
+ gchar *to, *from, *subject, *bcc, *cc;
+ GtkWidget *subject_label;
+
+ g_object_ref (G_OBJECT (header));
+ priv->header = header;
+
+ modest_expander_mail_header_view_update_is_outgoing (self);
+
+
+ to = tny_header_dup_to (header);
+ from = tny_header_dup_from (header);
+ subject = tny_header_dup_subject (header);
+ cc = tny_header_dup_cc (header);
+ bcc = tny_header_dup_bcc (header);
+
+ priv->subject_box = gtk_hbox_new (FALSE, 0);
+ subject_label = gtk_label_new (NULL);
+ if (subject && (subject[0] != '\0'))
+ gtk_label_set_text (GTK_LABEL (subject_label), subject);
+ else
+ gtk_label_set_text (GTK_LABEL (subject_label), _("mail_va_no_subject"));
+ gtk_label_set_single_line_mode (GTK_LABEL (subject_label), TRUE);
+ gtk_label_set_ellipsize (GTK_LABEL (subject_label), PANGO_ELLIPSIZE_END);
+ gtk_label_set_selectable (GTK_LABEL (subject_label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (subject_label), 0.0, 0.0);
+
+ priv->priority_icon = NULL;
+ gtk_box_pack_end (GTK_BOX (priv->subject_box), subject_label, TRUE, TRUE, 0);
+ if (priv->is_outgoing) {
+ gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_to"));
+ if (to)
+ modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), to);
+ if (cc)
+ add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
+ if (bcc)
+ add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
+ if (priv->is_draft&& from)
+ add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_from"), from);
+ modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
+ priv->subject_box, TRUE, TRUE);
+ if (priv->is_draft)
+ add_date_time_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_created"),
+ tny_header_get_date_sent (header));
+ else
+ add_date_time_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_sent"),
+ tny_header_get_date_sent (header));
+ } else {
+ gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_from"));
+ if (from)
+ modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), from);
+ if (to)
+ add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_to"), to);
+ if (cc)
+ add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
+ if (bcc)
+ add_recpt_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
+ modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
+ priv->subject_box, TRUE, TRUE);
+ add_date_time_header (MODEST_EXPANDER_MAIL_HEADER_VIEW (self), _("mail_va_date"),
+ tny_header_get_date_received (header));
+ }
+ g_free (subject);
+ g_free (to);
+ g_free (from);
+ g_free (cc);
+ g_free (bcc);
+ }
+
+ gtk_widget_show_all (GTK_WIDGET (self));
+
+ return;
+}
+
+static void
+modest_expander_mail_header_view_clear (TnyHeaderView *self)
+{
+ MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->clear_func (self);
+ return;
+}
+
+static void
+modest_expander_mail_header_view_clear_default (TnyHeaderView *self)
+{
+ ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+
+ if (G_LIKELY (priv->header))
+ g_object_unref (G_OBJECT (priv->header));
+ priv->header = NULL;
+
+ clean_headers (priv->headers_vbox);
+
+ gtk_label_set_text (GTK_LABEL (priv->fromto_label), "");
+ modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), "");
+
+ gtk_widget_hide (GTK_WIDGET(self));
+
+ return;
+}
+
+static void
+expander_activate (GtkWidget *expander, ModestExpanderMailHeaderView *header_view)
+{
+ ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
+
+ gtk_widget_queue_resize (GTK_WIDGET (header_view));
+ gtk_widget_queue_draw (GTK_WIDGET (header_view));
+
+ if (gtk_expander_get_expanded (GTK_EXPANDER (expander))) {
+ if (gtk_widget_get_parent (priv->headers_vbox) == NULL) {
+ gtk_box_pack_start (GTK_BOX(priv->main_vbox), priv->headers_vbox, TRUE, TRUE, 0);
+ gtk_widget_show_all (GTK_WIDGET (priv->headers_vbox));
+ }
+ } else {
+ if (gtk_widget_get_parent (priv->headers_vbox) != NULL) {
+ gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->headers_vbox);
+ }
+ }
+ gtk_widget_queue_resize (GTK_WIDGET (priv->expander));
+ gtk_widget_queue_draw (GTK_WIDGET (priv->expander));
+}
+
+static const GtkWidget *
+modest_expander_mail_header_view_add_custom_header (ModestMailHeaderView *self,
+ const gchar *label,
+ GtkWidget *custom_widget,
+ gboolean with_expander,
+ gboolean start)
+{
+ return MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->add_custom_header_func (self, label,
+ custom_widget, with_expander,
+ start);
+}
+
+static const GtkWidget *
+modest_expander_mail_header_view_add_custom_header_default (ModestMailHeaderView *self,
+ const gchar *label,
+ GtkWidget *custom_widget,
+ gboolean with_expander,
+ gboolean start)
+{
+ ModestExpanderMailHeaderViewPriv *priv;
+ g_return_val_if_fail (MODEST_IS_EXPANDER_MAIL_HEADER_VIEW (self), NULL);
+ GtkWidget *hbox;
+ GtkWidget *label_field;
+
+ priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+ hbox = gtk_hbox_new (FALSE, 12);
+ label_field = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (label_field), label);
+ gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
+ gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), custom_widget, TRUE, TRUE, 0);
+ gtk_size_group_add_widget (priv->labels_size_group, label_field);
+
+ if (with_expander) {
+ if (start)
+ gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
+ else
+ gtk_box_pack_end (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
+ } else {
+ if (start)
+ gtk_box_pack_start (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
+ else
+ gtk_box_pack_end (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
+ }
+
+ return hbox;
+}
+
+/**
+ * modest_expander_mail_header_view_new:
+ *
+ * Return value: a new #ModestHeaderView instance implemented for Gtk+
+ **/
+TnyHeaderView*
+modest_expander_mail_header_view_new (gboolean expanded)
+{
+ ModestExpanderMailHeaderViewPriv *priv;
+ ModestExpanderMailHeaderView *self = g_object_new (MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, NULL);
+
+ priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+ gtk_expander_set_expanded (GTK_EXPANDER (priv->expander), expanded);
+ expander_activate (priv->expander, self);
+
+ return TNY_HEADER_VIEW (self);
+}
+
+static void
+modest_expander_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class)
+{
+ ModestExpanderMailHeaderView *self = (ModestExpanderMailHeaderView *)instance;
+ ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+ GtkWidget *fromto_hbox = NULL;
+ GtkSizeGroup *expander_group = NULL;
+
+ priv->header = NULL;
+
+ priv->expander = gtk_expander_new (NULL);
+ priv->main_vbox = gtk_vbox_new (FALSE, 1);
+ gtk_box_pack_start (GTK_BOX (instance), priv->expander, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (instance), priv->main_vbox, TRUE, TRUE, 0);
+ g_signal_connect_after (G_OBJECT (priv->expander), "activate", G_CALLBACK (expander_activate), instance);
+
+ fromto_hbox = gtk_hbox_new (FALSE, 12);
+ priv->fromto_label = gtk_label_new (NULL);
+ gtk_misc_set_alignment (GTK_MISC (priv->fromto_label), 1.0, 0.0);
+ priv->fromto_contents = modest_recpt_view_new ();
+ g_signal_connect (G_OBJECT (priv->fromto_contents), "activate", G_CALLBACK (activate_recpt), instance);
+
+ gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_label, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_contents, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (priv->main_vbox), fromto_hbox, FALSE, FALSE, 0);
+
+ priv->labels_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+ gtk_size_group_add_widget (priv->labels_size_group, priv->fromto_label);
+
+ priv->headers_vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_set_focus_chain (GTK_CONTAINER (priv->headers_vbox), NULL);
+ g_object_ref (priv->headers_vbox);
+
+ expander_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+ gtk_size_group_add_widget (expander_group, priv->headers_vbox);
+ gtk_size_group_add_widget (expander_group, fromto_hbox);
+ g_object_unref (expander_group);
+
+ gtk_container_set_reallocate_redraws (GTK_CONTAINER (instance), TRUE);
+
+ priv->is_outgoing = FALSE;
+ priv->is_draft = FALSE;
+
+ return;
+}
+
+static void
+modest_expander_mail_header_view_finalize (GObject *object)
+{
+ ModestExpanderMailHeaderView *self = (ModestExpanderMailHeaderView *)object;
+ ModestExpanderMailHeaderViewPriv *priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (self);
+
+ if (G_LIKELY (priv->header))
+ g_object_unref (G_OBJECT (priv->header));
+ priv->header = NULL;
+
+ if (G_LIKELY (priv->headers_vbox))
+ g_object_unref (G_OBJECT (priv->headers_vbox));
+
+ priv->headers_vbox = NULL;
+
+ g_object_unref (priv->labels_size_group);
+
+ (*parent_class->finalize) (object);
+
+ return;
+}
+
+static void
+tny_header_view_init (gpointer g, gpointer iface_data)
+{
+ TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
+
+ klass->set_header = modest_expander_mail_header_view_set_header;
+ klass->clear = modest_expander_mail_header_view_clear;
+
+ return;
+}
+
+static void
+modest_mail_header_view_init (gpointer g, gpointer iface_data)
+{
+ ModestMailHeaderViewIface *klass = (ModestMailHeaderViewIface *)g;
+
+ klass->get_priority = modest_expander_mail_header_view_get_priority;
+ klass->set_priority = modest_expander_mail_header_view_set_priority;
+ klass->add_custom_header = modest_expander_mail_header_view_add_custom_header;
+
+ return;
+}
+
+static void
+modest_expander_mail_header_view_class_init (ModestExpanderMailHeaderViewClass *klass)
+{
+ GObjectClass *object_class;
+
+ parent_class = g_type_class_peek_parent (klass);
+ object_class = (GObjectClass*) klass;
+
+ klass->set_header_func = modest_expander_mail_header_view_set_header_default;
+ klass->clear_func = modest_expander_mail_header_view_clear_default;
+ klass->set_priority_func = modest_expander_mail_header_view_set_priority_default;
+ klass->get_priority_func = modest_expander_mail_header_view_get_priority_default;
+ klass->add_custom_header_func = modest_expander_mail_header_view_add_custom_header_default;
+
+ object_class->finalize = modest_expander_mail_header_view_finalize;
+
+ g_type_class_add_private (object_class, sizeof (ModestExpanderMailHeaderViewPriv));
+
+ return;
+}
+
+GType
+modest_expander_mail_header_view_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY(type == 0))
+ {
+ static const GTypeInfo info =
+ {
+ sizeof (ModestExpanderMailHeaderViewClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) modest_expander_mail_header_view_class_init, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (ModestExpanderMailHeaderView),
+ 0, /* n_preallocs */
+ modest_expander_mail_header_view_instance_init /* instance_init */
+ };
+
+ static const GInterfaceInfo tny_header_view_info =
+ {
+ (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+
+ static const GInterfaceInfo modest_mail_header_view_info =
+ {
+ (GInterfaceInitFunc) modest_mail_header_view_init, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+
+ type = g_type_register_static (GTK_TYPE_HBOX,
+ "ModestExpanderMailHeaderView",
+ &info, 0);
+
+ g_type_add_interface_static (type, TNY_TYPE_HEADER_VIEW,
+ &tny_header_view_info);
+
+ g_type_add_interface_static (type, MODEST_TYPE_MAIL_HEADER_VIEW,
+ &modest_mail_header_view_info);
+
+ }
+
+ return type;
+}
+
+static TnyHeaderFlags
+modest_expander_mail_header_view_get_priority (ModestMailHeaderView *self)
+{
+ return MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->get_priority_func (self);
+}
+
+static TnyHeaderFlags
+modest_expander_mail_header_view_get_priority_default (ModestMailHeaderView *headers_view)
+{
+ ModestExpanderMailHeaderViewPriv *priv;
+
+ g_return_val_if_fail (MODEST_IS_EXPANDER_MAIL_HEADER_VIEW (headers_view), 0);
+ priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
+
+ return priv->priority_flags;
+}
+
+static void
+modest_expander_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags)
+{
+ MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS (self)->set_priority_func (self, flags);
+ return;
+}
+
+static void
+modest_expander_mail_header_view_set_priority_default (ModestMailHeaderView *headers_view,
+ TnyHeaderFlags flags)
+{
+ ModestExpanderMailHeaderViewPriv *priv;
+
+ g_return_if_fail (MODEST_IS_EXPANDER_MAIL_HEADER_VIEW (headers_view));
+ priv = MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
+
+ priv->priority_flags = flags & TNY_HEADER_FLAG_PRIORITY_MASK ;
+
+ if (priv->priority_flags == TNY_HEADER_FLAG_NORMAL_PRIORITY) {
+ if (priv->priority_icon != NULL) {
+ gtk_widget_destroy (priv->priority_icon);
+ priv->priority_icon = NULL;
+ }
+ } else if (priv->priority_flags == TNY_HEADER_FLAG_HIGH_PRIORITY) {
+ priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_high", GTK_ICON_SIZE_MENU);
+ gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
+ gtk_widget_show (priv->priority_icon);
+ } else if (priv->priority_flags == TNY_HEADER_FLAG_LOW_PRIORITY) {
+ priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_low", GTK_ICON_SIZE_MENU);
+ gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
+ gtk_widget_show (priv->priority_icon);
+ }
+}
--- /dev/null
+/* Copyright (c) 2007, 2008, Nokia Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Nokia Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MODEST_EXPANDER_MAIL_HEADER_VIEW_H
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW_H
+
+#include <gtk/gtk.h>
+#include <glib-object.h>
+
+#include <tny-header-view.h>
+#include <modest-mail-header-view.h>
+
+G_BEGIN_DECLS
+
+#define MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW (modest_expander_mail_header_view_get_type ())
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, ModestExpanderMailHeaderView))
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, ModestExpanderMailHeaderViewClass))
+#define MODEST_IS_EXPANDER_MAIL_HEADER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW))
+#define MODEST_IS_EXPANDER_MAIL_HEADER_VIEW_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW))
+#define MODEST_EXPANDER_MAIL_HEADER_VIEW_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MODEST_TYPE_EXPANDER_MAIL_HEADER_VIEW, ModestExpanderMailHeaderViewClass))
+
+typedef struct _ModestExpanderMailHeaderView ModestExpanderMailHeaderView;
+typedef struct _ModestExpanderMailHeaderViewClass ModestExpanderMailHeaderViewClass;
+
+struct _ModestExpanderMailHeaderView
+{
+ GtkHBox parent;
+
+};
+
+struct _ModestExpanderMailHeaderViewClass
+{
+ GtkHBoxClass parent_class;
+
+ /* virtual methods */
+ void (*set_header_func) (TnyHeaderView *self, TnyHeader *header);
+ void (*clear_func) (TnyHeaderView *self);
+ void (*set_priority_func) (ModestMailHeaderView *self, TnyHeaderFlags flags);
+ TnyHeaderFlags (*get_priority_func) (ModestMailHeaderView *self);
+ const GtkWidget *(*add_custom_header_func) (ModestMailHeaderView *self,
+ const gchar *label,
+ GtkWidget *custom_widget,
+ gboolean with_expander,
+ gboolean start);
+};
+
+GType modest_expander_mail_header_view_get_type (void);
+TnyHeaderView* modest_expander_mail_header_view_new (gboolean expanded);
+
+G_END_DECLS
+
+#endif
gchar * substring;
if (number > 0) {
substring = g_strdup_printf (drafts?"TODO:%d messages":"TODO:%d new messages", number);
+ item_name = g_strdup_printf ("<span weight='800'>%s</span>\n<span weight='800' size='x-small' color='grey'>%s</span>",
+ fname, substring);
+ item_weight = 800;
} else {
substring = g_strdup ("");
+ item_name = g_strdup_printf ("%s\n<span size='x-small' color='grey'>%s</span>",
+ fname, substring);
+ item_weight = 400;
}
- item_name = g_strdup_printf ("%s\n<span size='x-small' color='grey'>%s</span>",
- fname, substring);
g_free (substring);
} else {
/* Use bold font style if there are unread or unset messages */
#include <modest-tny-msg.h>
#include <modest-text-utils.h>
#include <widgets/modest-msg-view.h>
+#ifdef MODEST_TOOLKIT_HILDON2
+#include <widgets/modest-compact-mail-header-view.h>
+#else
#include <widgets/modest-mail-header-view.h>
+#endif
#include <widgets/modest-attachments-view.h>
#include <modest-marshal.h>
#include <widgets/modest-gtkhtml-mime-part-view.h>
/* headers signals */
static void on_recpt_activated (ModestMailHeaderView *header_view, const gchar *address, ModestGtkhtmlMsgView *msg_view);
+static void on_show_details (ModestMailHeaderView *header_view, ModestGtkhtmlMsgView *msg_view);
static void on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer userdata);
static void on_view_images_clicked (GtkButton * button, gpointer self);
priv->msg = NULL;
priv->body_view = GTK_WIDGET (g_object_new (MODEST_TYPE_GTKHTML_MIME_PART_VIEW, NULL));
- priv->mail_header_view = GTK_WIDGET(modest_mail_header_view_new (TRUE));
+#ifdef MODEST_TOOLKIT_HILDON2
+ priv->mail_header_view = GTK_WIDGET(modest_compact_mail_header_view_new ());
+#else
+ priv->mail_header_view = GTK_WIDGET(modest_expander_mail_header_view_new (TRUE));
+#endif
priv->view_images_button = gtk_button_new_with_label (_("mail_bd_external_images"));
gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
gtk_widget_set_no_show_all (priv->view_images_button, TRUE);
g_signal_connect (G_OBJECT (priv->mail_header_view), "recpt-activated",
G_CALLBACK (on_recpt_activated), obj);
+ g_signal_connect (G_OBJECT (priv->mail_header_view), "show-details",
+ G_CALLBACK (on_show_details), obj);
g_signal_connect (G_OBJECT (priv->attachments_view), "activate",
G_CALLBACK (on_attachment_activated), obj);
}
static void
+on_show_details (ModestMailHeaderView *header_view,
+ ModestGtkhtmlMsgView *self)
+{
+ g_signal_emit_by_name (G_OBJECT (self), "show-details");
+}
+
+static void
on_attachment_activated (ModestAttachmentsView * att_view, TnyMimePart *mime_part, gpointer self)
{
-/* Copyright (c) 2007, Nokia Corporation
+/* Copyright (c) 2008, Nokia Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
*/
#include <config.h>
-//#include <glib/gi18n-lib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-#include <modest-text-utils.h>
-#include <modest-mail-header-view.h>
-#include <modest-tny-folder.h>
+#include <widgets/modest-mail-header-view.h>
+#include <modest-marshal.h>
-static GObjectClass *parent_class = NULL;
-
-/* signals */
enum {
RECPT_ACTIVATED_SIGNAL,
+ SHOW_DETAILS_SIGNAL,
LAST_SIGNAL
};
-
-typedef struct _ModestMailHeaderViewPriv ModestMailHeaderViewPriv;
-
-struct _ModestMailHeaderViewPriv
-{
- GtkWidget *fromto_label;
- GtkWidget *fromto_contents;
- GtkWidget *main_vbox;
- GtkWidget *expander;
- GtkWidget *headers_vbox;
- GtkWidget *subject_box;
- GtkWidget *priority_icon;
- GtkSizeGroup *labels_size_group;
- gboolean is_outgoing;
- gboolean is_draft;
- TnyHeader *header;
- TnyHeaderFlags priority_flags;
-};
-
-#define MODEST_MAIL_HEADER_VIEW_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_MAIL_HEADER_VIEW, ModestMailHeaderViewPriv))
-
static guint signals[LAST_SIGNAL] = {0};
-static void
-add_date_time_header (ModestMailHeaderView *mail_header, const gchar *name, time_t date)
-{
- const guint BUF_SIZE = 64;
- gchar date_buf [BUF_SIZE];
- gchar time_buf [BUF_SIZE];
-
- ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (mail_header);
- GtkWidget *hbox, *date_hbox, *time_hbox;
- GtkWidget *label;
-
- modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date);
- modest_text_utils_strftime (time_buf, BUF_SIZE, "%X", date);
-
- hbox = gtk_hbox_new (FALSE, 48);
- date_hbox = gtk_hbox_new (FALSE, 12);
- time_hbox = gtk_hbox_new (FALSE, 12);
-
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label), name);
- gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0);
- gtk_box_pack_start (GTK_BOX (date_hbox), label, FALSE, FALSE, 0);
- gtk_size_group_add_widget (priv->labels_size_group, label);
-
- label = gtk_label_new(date_buf);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
- gtk_box_pack_start (GTK_BOX (date_hbox), label, TRUE, TRUE, 0);
-
- gtk_box_pack_start (GTK_BOX (hbox), date_hbox, FALSE, FALSE, 0);
-
- label = gtk_label_new(NULL);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
- gtk_label_set_markup (GTK_LABEL (label), _("mail_va_time"));
- gtk_box_pack_start (GTK_BOX (time_hbox), label, FALSE, FALSE, 0);
-
- label = gtk_label_new(time_buf);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
- gtk_box_pack_start (GTK_BOX (time_hbox), label, TRUE, TRUE, 0);
-
- gtk_box_pack_start (GTK_BOX (hbox), time_hbox, TRUE, TRUE, 0);
-
- gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show (hbox);
-}
-
-static void
-activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data)
-{
- ModestMailHeaderView * view = MODEST_MAIL_HEADER_VIEW (user_data);
-
- g_signal_emit (G_OBJECT (view), signals[RECPT_ACTIVATED_SIGNAL], 0, address);
-}
-
-#if 0 /* This function is not used. murrayc. */
-static void
-add_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value)
-{
- ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (widget);
- GtkWidget *hbox;
- GtkWidget *label_field, *label_value;
- GtkWidget *scroll_text;
- GtkTextBuffer *text_buffer;
-
- hbox = gtk_hbox_new (FALSE, 12);
- label_field = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label_field), field);
- gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
- scroll_text = modest_scroll_text_new (NULL, 2);
- label_value = (GtkWidget *) modest_scroll_text_get_text_view (MODEST_SCROLL_TEXT (scroll_text));
- text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (label_value));
- gtk_text_buffer_set_text (text_buffer, value, -1);
-
- gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), scroll_text, TRUE, TRUE, 0);
- gtk_size_group_add_widget (priv->labels_size_group, label_field);
-
- gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show (hbox);
-
-}
-#endif
-
-
-static void
-add_recpt_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value)
-{
- ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (widget);
- GtkWidget *hbox;
- GtkWidget *label_field, *label_value;
-
- hbox = gtk_hbox_new (FALSE, 12);
- label_field = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label_field), field);
- gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
- label_value = modest_recpt_view_new ();
- modest_recpt_view_set_recipients (MODEST_RECPT_VIEW(label_value), value);
- g_signal_connect (G_OBJECT (label_value), "activate", G_CALLBACK (activate_recpt), widget);
-
- gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), label_value, TRUE, TRUE, 0);
- gtk_size_group_add_widget (priv->labels_size_group, label_field);
-
- gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
-
- gtk_widget_show (hbox);
-}
-
-static void
-clean_headers (GtkWidget *vbox)
-{
- GList *headers_list, *node;
-
- headers_list = gtk_container_get_children (GTK_CONTAINER (vbox));
-
- for (node = headers_list; node != NULL; node = g_list_next (node)) {
- gtk_widget_destroy (GTK_WIDGET (node->data));
- }
- g_list_free (headers_list);
-}
-
-static void
-modest_mail_header_view_set_header (TnyHeaderView *self, TnyHeader *header)
-{
- MODEST_MAIL_HEADER_VIEW_GET_CLASS (self)->set_header_func (self, header);
- return;
-}
-
-static void
-modest_mail_header_view_update_is_outgoing (TnyHeaderView *self)
-{
- ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
- TnyFolder *folder = NULL;
-
- priv->is_outgoing = FALSE;
-
- if (priv->header == NULL)
- return;
-
- folder = tny_header_get_folder (priv->header);
-
- if (folder) {
- TnyFolderType folder_type = tny_folder_get_folder_type (folder);
-
- switch (folder_type) {
- case TNY_FOLDER_TYPE_DRAFTS:
- case TNY_FOLDER_TYPE_OUTBOX:
- case TNY_FOLDER_TYPE_SENT:
- priv->is_outgoing = TRUE;
- break;
- default:
- priv->is_outgoing = FALSE;
- }
- priv->is_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
-
- g_object_unref (folder);
- }
-}
-
-static void
-modest_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *header)
-{
- ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
-
- if (header)
- g_assert (TNY_IS_HEADER (header));
-
- if (G_LIKELY (priv->header))
- g_object_unref (G_OBJECT (priv->header));
- priv->header = NULL;
-
- clean_headers (priv->headers_vbox);
-
- if (header && G_IS_OBJECT (header))
- {
- gchar *to, *from, *subject, *bcc, *cc;
- GtkWidget *subject_label;
-
- g_object_ref (G_OBJECT (header));
- priv->header = header;
-
- modest_mail_header_view_update_is_outgoing (self);
-
-
- to = tny_header_dup_to (header);
- from = tny_header_dup_from (header);
- subject = tny_header_dup_subject (header);
- cc = tny_header_dup_cc (header);
- bcc = tny_header_dup_bcc (header);
-
- priv->subject_box = gtk_hbox_new (FALSE, 0);
- subject_label = gtk_label_new (NULL);
- if (subject && (subject[0] != '\0'))
- gtk_label_set_text (GTK_LABEL (subject_label), subject);
- else
- gtk_label_set_text (GTK_LABEL (subject_label), _("mail_va_no_subject"));
- gtk_label_set_single_line_mode (GTK_LABEL (subject_label), TRUE);
- gtk_label_set_ellipsize (GTK_LABEL (subject_label), PANGO_ELLIPSIZE_END);
- gtk_label_set_selectable (GTK_LABEL (subject_label), TRUE);
- gtk_misc_set_alignment (GTK_MISC (subject_label), 0.0, 0.0);
-
- /* TODO: code disabled until we can get real priority information from message */
-/* if (tny_header_get_priority (header)) { */
-/* GtkWidget *priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_high", GTK_ICON_SIZE_MENU); */
-/* gtk_box_pack_start (GTK_BOX (subject_box), priority_icon, FALSE, FALSE, 0); */
-/* } */
- priv->priority_icon = NULL;
- gtk_box_pack_end (GTK_BOX (priv->subject_box), subject_label, TRUE, TRUE, 0);
- if (priv->is_outgoing) {
- gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_to"));
- if (to)
- modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), to);
- if (cc)
- add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
- if (bcc)
- add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
- if (priv->is_draft&& from)
- add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_from"), from);
- modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
- priv->subject_box, TRUE, TRUE);
- if (priv->is_draft)
- add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_created"),
- tny_header_get_date_sent (header));
- else
- add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_sent"),
- tny_header_get_date_sent (header));
- } else {
- gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_from"));
- if (from)
- modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), from);
- if (to)
- add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_to"), to);
- if (cc)
- add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc);
- if (bcc)
- add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc);
- modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"),
- priv->subject_box, TRUE, TRUE);
- add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_date"),
- tny_header_get_date_received (header));
- }
- g_free (subject);
- g_free (to);
- g_free (from);
- g_free (cc);
- g_free (bcc);
- }
-
- gtk_widget_show_all (GTK_WIDGET (self));
-
- return;
-}
-
-static void
-modest_mail_header_view_clear (TnyHeaderView *self)
-{
- MODEST_MAIL_HEADER_VIEW_GET_CLASS (self)->clear_func (self);
- return;
-}
-
-static void
-modest_mail_header_view_clear_default (TnyHeaderView *self)
+TnyHeaderFlags
+modest_mail_header_view_get_priority (ModestMailHeaderView *self)
{
- ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
-
- if (G_LIKELY (priv->header))
- g_object_unref (G_OBJECT (priv->header));
- priv->header = NULL;
-
- clean_headers (priv->headers_vbox);
-
- gtk_label_set_text (GTK_LABEL (priv->fromto_label), "");
- modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), "");
-
- gtk_widget_hide (GTK_WIDGET(self));
-
- return;
+ return MODEST_MAIL_HEADER_VIEW_GET_IFACE (self)->get_priority (self);
}
-static void
-expander_activate (GtkWidget *expander, ModestMailHeaderView *header_view)
+void
+modest_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags)
{
- ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
-
- gtk_widget_queue_resize (GTK_WIDGET (header_view));
- gtk_widget_queue_draw (GTK_WIDGET (header_view));
-
- if (gtk_expander_get_expanded (GTK_EXPANDER (expander))) {
- if (gtk_widget_get_parent (priv->headers_vbox) == NULL) {
- gtk_box_pack_start (GTK_BOX(priv->main_vbox), priv->headers_vbox, TRUE, TRUE, 0);
- gtk_widget_show_all (GTK_WIDGET (priv->headers_vbox));
- }
- } else {
- if (gtk_widget_get_parent (priv->headers_vbox) != NULL) {
- gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->headers_vbox);
- }
- }
- gtk_widget_queue_resize (GTK_WIDGET (priv->expander));
- gtk_widget_queue_draw (GTK_WIDGET (priv->expander));
+ MODEST_MAIL_HEADER_VIEW_GET_IFACE (self)->set_priority (self, flags);
}
const GtkWidget *
-modest_mail_header_view_add_custom_header (ModestMailHeaderView *header_view,
+modest_mail_header_view_add_custom_header (ModestMailHeaderView *self,
const gchar *label,
GtkWidget *custom_widget,
gboolean with_expander,
gboolean start)
{
- ModestMailHeaderViewPriv *priv;
- g_return_val_if_fail (MODEST_IS_MAIL_HEADER_VIEW (header_view), NULL);
- GtkWidget *hbox;
- GtkWidget *label_field;
-
- priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (header_view);
- hbox = gtk_hbox_new (FALSE, 12);
- label_field = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label_field), label);
- gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0);
- gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), custom_widget, TRUE, TRUE, 0);
- gtk_size_group_add_widget (priv->labels_size_group, label_field);
-
- if (with_expander) {
- if (start)
- gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
- else
- gtk_box_pack_end (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0);
- } else {
- if (start)
- gtk_box_pack_start (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
- else
- gtk_box_pack_end (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0);
- }
-
- return hbox;
-}
-
-/**
- * modest_mail_header_view_new:
- *
- * Return value: a new #ModestHeaderView instance implemented for Gtk+
- **/
-TnyHeaderView*
-modest_mail_header_view_new (gboolean expanded)
-{
- ModestMailHeaderViewPriv *priv;
- ModestMailHeaderView *self = g_object_new (MODEST_TYPE_MAIL_HEADER_VIEW, NULL);
-
- priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
- gtk_expander_set_expanded (GTK_EXPANDER (priv->expander), expanded);
- expander_activate (priv->expander, self);
-
- return TNY_HEADER_VIEW (self);
+ return MODEST_MAIL_HEADER_VIEW_GET_IFACE (self)->add_custom_header (self, label, custom_widget,
+ with_expander, start);
}
static void
-modest_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class)
-{
- ModestMailHeaderView *self = (ModestMailHeaderView *)instance;
- ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
- GtkWidget *fromto_hbox = NULL;
- GtkSizeGroup *expander_group = NULL;
-
- priv->header = NULL;
-
- priv->expander = gtk_expander_new (NULL);
- priv->main_vbox = gtk_vbox_new (FALSE, 1);
- gtk_box_pack_start (GTK_BOX (instance), priv->expander, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (instance), priv->main_vbox, TRUE, TRUE, 0);
- g_signal_connect_after (G_OBJECT (priv->expander), "activate", G_CALLBACK (expander_activate), instance);
-
- fromto_hbox = gtk_hbox_new (FALSE, 12);
- priv->fromto_label = gtk_label_new (NULL);
- gtk_misc_set_alignment (GTK_MISC (priv->fromto_label), 1.0, 0.0);
- priv->fromto_contents = modest_recpt_view_new ();
- g_signal_connect (G_OBJECT (priv->fromto_contents), "activate", G_CALLBACK (activate_recpt), instance);
-
- gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_label, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (fromto_hbox), priv->fromto_contents, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (priv->main_vbox), fromto_hbox, FALSE, FALSE, 0);
-
- priv->labels_size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
- gtk_size_group_add_widget (priv->labels_size_group, priv->fromto_label);
-
- priv->headers_vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_set_focus_chain (GTK_CONTAINER (priv->headers_vbox), NULL);
- g_object_ref (priv->headers_vbox);
-
- expander_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
- gtk_size_group_add_widget (expander_group, priv->headers_vbox);
- gtk_size_group_add_widget (expander_group, fromto_hbox);
- g_object_unref (expander_group);
-
- gtk_container_set_reallocate_redraws (GTK_CONTAINER (instance), TRUE);
-
- priv->is_outgoing = FALSE;
- priv->is_draft = FALSE;
-
- return;
-}
-
-static void
-modest_mail_header_view_finalize (GObject *object)
-{
- ModestMailHeaderView *self = (ModestMailHeaderView *)object;
- ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self);
-
- if (G_LIKELY (priv->header))
- g_object_unref (G_OBJECT (priv->header));
- priv->header = NULL;
-
- if (G_LIKELY (priv->headers_vbox))
- g_object_unref (G_OBJECT (priv->headers_vbox));
-
- priv->headers_vbox = NULL;
-
- g_object_unref (priv->labels_size_group);
-
- (*parent_class->finalize) (object);
-
- return;
-}
-
-static void
-tny_header_view_init (gpointer g, gpointer iface_data)
-{
- TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g;
-
- klass->set_header = modest_mail_header_view_set_header;
- klass->clear = modest_mail_header_view_clear;
-
- return;
-}
-
-static void
-modest_mail_header_view_class_init (ModestMailHeaderViewClass *klass)
-{
- GObjectClass *object_class;
-
- parent_class = g_type_class_peek_parent (klass);
- object_class = (GObjectClass*) klass;
-
- klass->set_header_func = modest_mail_header_view_set_header_default;
- klass->clear_func = modest_mail_header_view_clear_default;
-
- object_class->finalize = modest_mail_header_view_finalize;
-
- klass->recpt_activated = NULL;
-
- g_type_class_add_private (object_class, sizeof (ModestMailHeaderViewPriv));
-
- signals[RECPT_ACTIVATED_SIGNAL] =
- g_signal_new ("recpt_activated",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
- G_STRUCT_OFFSET(ModestMailHeaderViewClass, recpt_activated),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
-
-
- return;
+modest_mail_header_view_base_init (gpointer g_class)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+
+ signals[RECPT_ACTIVATED_SIGNAL] =
+ g_signal_new ("recpt_activated",
+ MODEST_TYPE_MAIL_HEADER_VIEW,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET(ModestMailHeaderViewIface, recpt_activated),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1, G_TYPE_STRING);
+
+ signals[SHOW_DETAILS_SIGNAL] =
+ g_signal_new ("show_details",
+ MODEST_TYPE_MAIL_HEADER_VIEW,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET(ModestMailHeaderViewIface, show_details),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ initialized = TRUE;
+ }
}
-GType
+GType
modest_mail_header_view_get_type (void)
{
- static GType type = 0;
-
- if (G_UNLIKELY(type == 0))
- {
- static const GTypeInfo info =
- {
- sizeof (ModestMailHeaderViewClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) modest_mail_header_view_class_init, /* class_init */
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (ModestMailHeaderView),
- 0, /* n_preallocs */
- modest_mail_header_view_instance_init /* instance_init */
+ static GType my_type = 0;
+ if (!my_type) {
+ static const GTypeInfo my_info = {
+ sizeof(ModestMailHeaderViewIface),
+ modest_mail_header_view_base_init, /* base init */
+ NULL, /* base finalize */
+ NULL, /* class_init */
+ NULL, /* class finalize */
+ NULL, /* class data */
+ 0,
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL
};
- static const GInterfaceInfo tny_header_view_info =
- {
- (GInterfaceInitFunc) tny_header_view_init, /* interface_init */
- NULL, /* interface_finalize */
- NULL /* interface_data */
- };
-
- type = g_type_register_static (GTK_TYPE_HBOX,
- "ModestMailHeaderView",
- &info, 0);
-
- g_type_add_interface_static (type, TNY_TYPE_HEADER_VIEW,
- &tny_header_view_info);
-
- }
-
- return type;
-}
-
-TnyHeaderFlags
-modest_mail_header_view_get_priority (ModestMailHeaderView *headers_view)
-{
- ModestMailHeaderViewPriv *priv;
-
- g_return_val_if_fail (MODEST_IS_MAIL_HEADER_VIEW (headers_view), 0);
- priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
-
- return priv->priority_flags;
-}
-
-void
-modest_mail_header_view_set_priority (ModestMailHeaderView *headers_view,
- TnyHeaderFlags flags)
-{
- ModestMailHeaderViewPriv *priv;
-
- g_return_if_fail (MODEST_IS_MAIL_HEADER_VIEW (headers_view));
- priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view);
+ my_type = g_type_register_static (G_TYPE_INTERFACE,
+ "ModestMailHeaderView",
+ &my_info, 0);
- priv->priority_flags = flags & TNY_HEADER_FLAG_PRIORITY_MASK ;
+ g_type_interface_add_prerequisite (my_type,
+ TNY_TYPE_HEADER_VIEW);
- if (priv->priority_flags == TNY_HEADER_FLAG_NORMAL_PRIORITY) {
- if (priv->priority_icon != NULL) {
- gtk_widget_destroy (priv->priority_icon);
- priv->priority_icon = NULL;
- }
- } else if (priv->priority_flags == TNY_HEADER_FLAG_HIGH_PRIORITY) {
- priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_high", GTK_ICON_SIZE_MENU);
- gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
- gtk_widget_show (priv->priority_icon);
- } else if (priv->priority_flags == TNY_HEADER_FLAG_LOW_PRIORITY) {
- priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_low", GTK_ICON_SIZE_MENU);
- gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0);
- gtk_widget_show (priv->priority_icon);
}
+ return my_type;
}
-/* Copyright (c) 2007, Nokia Corporation
+/* Copyright (c) 2008, Nokia Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef MODEST_MAIL_HEADER_VIEW_H
-#define MODEST_MAIL_HEADER_VIEW_H
-
-#include <gtk/gtk.h>
-#include <glib-object.h>
+#ifndef __MODEST_MAIL_HEADER_VIEW_H__
+#define __MODEST_MAIL_HEADER_VIEW_H__
#include <tny-header-view.h>
-#include <modest-recpt-view.h>
+#include <gtk/gtkwidget.h>
G_BEGIN_DECLS
-#define MODEST_TYPE_MAIL_HEADER_VIEW (modest_mail_header_view_get_type ())
-#define MODEST_MAIL_HEADER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEST_TYPE_MAIL_HEADER_VIEW, ModestMailHeaderView))
-#define MODEST_MAIL_HEADER_VIEW_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MODEST_TYPE_MAIL_HEADER_VIEW, ModestMailHeaderViewClass))
-#define MODEST_IS_MAIL_HEADER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEST_TYPE_MAIL_HEADER_VIEW))
-#define MODEST_IS_MAIL_HEADER_VIEW_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MODEST_TYPE_MAIL_HEADER_VIEW))
-#define MODEST_MAIL_HEADER_VIEW_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MODEST_TYPE_MAIL_HEADER_VIEW, ModestMailHeaderViewClass))
-
-typedef struct _ModestMailHeaderView ModestMailHeaderView;
-typedef struct _ModestMailHeaderViewClass ModestMailHeaderViewClass;
-
-struct _ModestMailHeaderView
-{
- GtkHBox parent;
-
-};
-
-struct _ModestMailHeaderViewClass
-{
- GtkHBoxClass parent_class;
-
- /* virtual methods */
- void (*set_header_func) (TnyHeaderView *self, TnyHeader *header);
- void (*clear_func) (TnyHeaderView *self);
-
+/* convenience macros */
+#define MODEST_TYPE_MAIL_HEADER_VIEW (modest_mail_header_view_get_type())
+#define MODEST_MAIL_HEADER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_MAIL_HEADER_VIEW,ModestMailHeaderView))
+#define MODEST_IS_MAIL_HEADER_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_MAIL_HEADER_VIEW))
+#define MODEST_MAIL_HEADER_VIEW_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj),MODEST_TYPE_MAIL_HEADER_VIEW,ModestMailHeaderViewIface))
+
+typedef struct _ModestMailHeaderView ModestMailHeaderView;
+typedef struct _ModestMailHeaderViewIface ModestMailHeaderViewIface;
+
+struct _ModestMailHeaderViewIface {
+ GTypeInterface parent;
+
+ TnyHeaderFlags (*get_priority) (ModestMailHeaderView *self);
+ void (*set_priority) (ModestMailHeaderView *self, TnyHeaderFlags flags);
+ const GtkWidget *(*add_custom_header) (ModestMailHeaderView *self,
+ const gchar *label,
+ GtkWidget *custom_widget,
+ gboolean with_expander,
+ gboolean start);
+
/* signals */
- void (*recpt_activated) (const gchar *address);
+ void (*show_details) (ModestMailHeaderView *msgview,
+ gpointer user_data);
+ void (*recpt_activated) (ModestMailHeaderView *msgview, const gchar *address,
+ gpointer user_data);
};
-GType modest_mail_header_view_get_type (void);
-TnyHeaderView* modest_mail_header_view_new (gboolean expanded);
+/**
+ *
+ * modest_mail_header_view_get_type
+ *
+ * get the GType for the this interface
+ *
+ * Returns: the GType for this interface
+ */
+GType modest_mail_header_view_get_type (void) G_GNUC_CONST;
+
+TnyHeaderFlags modest_mail_header_view_get_priority (ModestMailHeaderView *self);
+void modest_mail_header_view_set_priority (ModestMailHeaderView *self, TnyHeaderFlags flags);
const GtkWidget *modest_mail_header_view_add_custom_header (ModestMailHeaderView *header_view,
const gchar *label,
GtkWidget *custom_widget,
gboolean with_expander,
gboolean start);
-TnyHeaderFlags modest_mail_header_view_get_priority (ModestMailHeaderView *header_view);
-void modest_mail_header_view_set_priority (ModestMailHeaderView *header_view, TnyHeaderFlags flags);
-
G_END_DECLS
-#endif
+#endif /* __MODEST_MAIL_HEADER_VIEW_H__ */
priv->current_zoom = 1.0;
priv->body_view = GTK_WIDGET (g_object_new (MODEST_TYPE_MOZEMBED_MIME_PART_VIEW, NULL));
- priv->mail_header_view = GTK_WIDGET(modest_mail_header_view_new (TRUE));
+ priv->mail_header_view = GTK_WIDGET(modest_compact_mail_header_view_new (TRUE));
gtk_widget_set_no_show_all (priv->mail_header_view, TRUE);
priv->attachments_view = GTK_WIDGET(modest_attachments_view_new (NULL));
#include <tny-msg.h>
#include <tny-folder.h>
#include <widgets/modest-window.h>
+#include <widgets/modest-header-view.h>
#include <gtk/gtktreemodel.h>
#include <gtk/gtkenums.h>
GtkTreeModel *model,
GtkTreeRowReference *row_reference);
+/**
+ * modest_msg_view_window_new_from_header_view:
+ * @header_view: an #ModestHeaderView instance
+ * @modest_account_name: the account name
+ * @msg_uid: the initial uid reserved by this window
+ * @row_reference: a #GtkTreeRowReference, pointing to the selected position @model.
+ *
+ * instantiates a new #ModestMsgViewWindow widget. The account name is used to
+ * set the proper account when choosing reply/forward from the msg view window.
+ * It's different from new_with_header_model, as it creates the window and then
+ * loads the message in that window.
+ *
+ * Returns: a new #ModestMsgViewWindow, or NULL in case of error
+ */
+ModestWindow* modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
+ const gchar *modest_account_name,
+ const gchar *msg_uid,
+ GtkTreeRowReference *row_reference);
+
/**
* modest_msg_view_window_new_for_search_result:
RECPT_ACTIVATED_SIGNAL,
LINK_CONTEXTUAL_SIGNAL,
FETCH_IMAGE_SIGNAL,
+ SHOW_DETAILS_SIGNAL,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = {0};
modest_marshal_BOOLEAN__STRING_OBJECT,
G_TYPE_BOOLEAN, 2, G_TYPE_STRING, G_TYPE_OBJECT);
+ signals[SHOW_DETAILS_SIGNAL] =
+ g_signal_new ("show_details",
+ MODEST_TYPE_MSG_VIEW,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET(ModestMsgViewIface, show_details),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
initialized = TRUE;
}
}
gpointer user_data);
gboolean (*fetch_image) (ModestMsgView *msgview, const gchar *uri,
TnyStream *stream);
+ void (*show_details) (ModestMsgView *msgview, gpointer userdata);
};