X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmodest-widget-factory.c;h=3b61c6bf1d9423b91203811ee2846940bc73f0e2;hb=31bb0518a45f4ca59a30a650475d3a3f9ff87610;hp=35bbafe2c4f519dd120ee6f148f87725fd004be7;hpb=863ef6ddca26d35008666611cb12b8266c8c305f;p=modest diff --git a/src/modest-widget-factory.c b/src/modest-widget-factory.c index 35bbafe..3b61c6b 100644 --- a/src/modest-widget-factory.c +++ b/src/modest-widget-factory.c @@ -27,8 +27,25 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +#include +#include +#include +#include +#include +#include +#include #include "modest-widget-factory.h" -/* include other impl specific header files */ +#include "modest-widget-memory.h" +#include +#include "modest-tny-platform-factory.h" + +#include +#include +#include + +#include "modest-mail-operation.h" +#include "widgets/modest-header-view-priv.h" /* 'private'/'protected' functions */ static void modest_widget_factory_class_init (ModestWidgetFactoryClass *klass); @@ -36,21 +53,6 @@ static void modest_widget_factory_init (ModestWidgetFactory *obj); static void modest_widget_factory_finalize (GObject *obj); -/* callbacks */ -static void on_folder_selected (ModestFolderView *folder_view, - TnyMsgFolderIface *folder, - ModestWidgetFactory *self); -static void on_message_selected (ModestHeaderView *header_view, TnyMsgIface *msg, - ModestWidgetFactory *self); -static void on_header_status_update (ModestHeaderView *header_view, const gchar *msg, - gint status_id, ModestWidgetFactory *self); -static void on_msg_link_hover (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self); -static void on_msg_link_clicked (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self); -static void on_msg_attachment_clicked (ModestMsgView *msgview, int index, - ModestWidgetFactory *self); - /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -58,34 +60,20 @@ enum { LAST_SIGNAL }; - -enum _StatusID { - STATUS_ID_HEADER, - STATUS_ID_FOLDER, - STATUS_ID_MESSAGE, - - STATUS_ID_NUM -}; -typedef enum _StatusID StatusID; - typedef struct _ModestWidgetFactoryPrivate ModestWidgetFactoryPrivate; -struct _ModestWidgetFactoryPrivate { - - ModestTnyAccountStore *account_store; - ModestAccountMgr *account_mgr; - ModestConf *conf; - - ModestHeaderView *header_view; - ModestFolderView *folder_view; - ModestMsgView *msg_preview; +struct _ModestWidgetFactoryPrivate { - GtkWidget *progress_bar; - GtkWidget *status_bar; + ModestTnyAccountStore *account_store; - gboolean auto_connect; + ModestHeaderView *header_view; + ModestFolderView *folder_view; + ModestMsgView *msg_preview; - StatusID status_bar_ctx[STATUS_ID_NUM]; - + GtkWidget *progress_bar; + GtkWidget *status_bar; + GtkWidget *folder_info_label; + + GtkWidget *online_toggle; }; #define MODEST_WIDGET_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_WIDGET_FACTORY, \ @@ -111,6 +99,7 @@ modest_widget_factory_get_type (void) sizeof(ModestWidgetFactory), 1, /* n_preallocs */ (GInstanceInitFunc) modest_widget_factory_init, + NULL }; my_type = g_type_register_static (G_TYPE_OBJECT, "ModestWidgetFactory", @@ -129,13 +118,6 @@ modest_widget_factory_class_init (ModestWidgetFactoryClass *klass) gobject_class->finalize = modest_widget_factory_finalize; g_type_class_add_private (gobject_class, sizeof(ModestWidgetFactoryPrivate)); - - /* signal definitions go here, e.g.: */ -/* signals[MY_SIGNAL_1] = */ -/* g_signal_new ("my_signal_1",....); */ -/* signals[MY_SIGNAL_2] = */ -/* g_signal_new ("my_signal_2",....); */ -/* etc. */ } static void @@ -143,9 +125,7 @@ modest_widget_factory_init (ModestWidgetFactory *obj) { ModestWidgetFactoryPrivate *priv; priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj); - - priv->conf = NULL; - priv->account_mgr = NULL; + priv->account_store = NULL; priv->progress_bar = gtk_progress_bar_new (); @@ -154,38 +134,15 @@ modest_widget_factory_init (ModestWidgetFactory *obj) priv->status_bar = gtk_statusbar_new (); gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR(priv->status_bar), FALSE); - - priv->status_bar_ctx[STATUS_ID_HEADER] = - gtk_statusbar_get_context_id (GTK_STATUSBAR(priv->status_bar), - "header"); - priv->status_bar_ctx[STATUS_ID_MESSAGE] = - gtk_statusbar_get_context_id (GTK_STATUSBAR(priv->status_bar), - "message"); - priv->status_bar_ctx[STATUS_ID_FOLDER] = - gtk_statusbar_get_context_id (GTK_STATUSBAR(priv->status_bar), - "folder"); } + static void modest_widget_factory_finalize (GObject *obj) { - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj); - - if (priv->account_mgr) { - g_object_unref (G_OBJECT(priv->account_mgr)); - priv->account_mgr = NULL; - } - - if (priv->conf) { - g_object_unref (G_OBJECT(priv->conf)); - priv->conf = NULL; - } - - if (priv->account_store) { - g_object_unref (G_OBJECT(priv->account_store)); - priv->account_store = NULL; - } + /* no need to unref account_store; we don't own the reference */ + + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -193,76 +150,60 @@ static gboolean init_widgets (ModestWidgetFactory *self) { ModestWidgetFactoryPrivate *priv; + TnyFolderStoreQuery *query; + priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); /* folder view */ - if (!(priv->folder_view = - MODEST_FOLDER_VIEW(modest_folder_view_new - (TNY_ACCOUNT_STORE_IFACE(priv->account_store))))) { + query = tny_folder_store_query_new (); + tny_folder_store_query_add_item (query, NULL, TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED); + + priv->folder_view = MODEST_FOLDER_VIEW(modest_folder_view_new (priv->account_store,query)); + if (!priv->folder_view) { g_printerr ("modest: cannot instantiate folder view\n"); return FALSE; - } - + } + g_object_unref (G_OBJECT (query)); + /* header view */ - if (!(priv->header_view = - MODEST_HEADER_VIEW(modest_header_view_new - (NULL, NULL,MODEST_HEADER_VIEW_STYLE_NORMAL)))) { + priv->header_view = + MODEST_HEADER_VIEW(modest_header_view_new (NULL, MODEST_HEADER_VIEW_STYLE_DETAILS)); + if (!priv->header_view) { g_printerr ("modest: cannot instantiate header view\n"); return FALSE; } - + /* msg preview */ - if (!(priv->msg_preview = MODEST_MSG_VIEW(modest_msg_view_new (NULL)))) { + priv->msg_preview = MODEST_MSG_VIEW(modest_msg_view_new (NULL)); + if (!priv->msg_preview) { g_printerr ("modest: cannot instantiate header view\n"); return FALSE; } - if (priv->auto_connect) { - g_signal_connect (G_OBJECT(priv->header_view), "message_selected", - G_CALLBACK(on_message_selected), self); - g_signal_connect (G_OBJECT(priv->folder_view), "folder_selected", - G_CALLBACK(on_folder_selected), self); - g_signal_connect (G_OBJECT(priv->header_view), "status_update", - G_CALLBACK(on_header_status_update), self); - g_signal_connect (G_OBJECT(priv->msg_preview), "link_clicked", - G_CALLBACK(on_msg_link_clicked), self); - g_signal_connect (G_OBJECT(priv->msg_preview), "link_hover", - G_CALLBACK(on_msg_link_hover), self); - g_signal_connect (G_OBJECT(priv->msg_preview), "attachment_clicked", - G_CALLBACK(on_msg_attachment_clicked), self); - } + /* online/offline combo */ + priv->online_toggle = gtk_toggle_button_new (); + /* label with number of items, unread items for + the current folder */ + priv->folder_info_label = gtk_label_new (NULL); + return TRUE; } ModestWidgetFactory* -modest_widget_factory_new (ModestConf *conf, - ModestTnyAccountStore *account_store, - ModestAccountMgr *account_mgr, - gboolean auto_connect) +modest_widget_factory_new (ModestTnyAccountStore *account_store) { GObject *obj; ModestWidgetFactoryPrivate *priv; g_return_val_if_fail (account_store, NULL); - g_return_val_if_fail (account_mgr, NULL); - g_return_val_if_fail (conf, NULL); - obj = g_object_new(MODEST_TYPE_WIDGET_FACTORY, NULL); + obj = g_object_new (MODEST_TYPE_WIDGET_FACTORY, NULL); priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj); - - priv->auto_connect = auto_connect; - - g_object_ref (G_OBJECT(conf)); - priv->conf = conf; - g_object_ref (G_OBJECT(account_mgr)); - priv->account_mgr = account_mgr; - - g_object_ref (G_OBJECT(account_store)); priv->account_store = account_store; - + if (!init_widgets (MODEST_WIDGET_FACTORY(obj))) { g_printerr ("modest: widget factory failed to init widgets\n"); g_object_unref (obj); @@ -302,11 +243,7 @@ modest_widget_factory_get_msg_preview (ModestWidgetFactory *self) ModestAccountView* modest_widget_factory_get_account_view (ModestWidgetFactory *self) { - ModestWidgetFactoryPrivate *priv; - - g_return_val_if_fail (self, NULL); - - return modest_account_view_new (priv->account_mgr); + return modest_account_view_new (modest_runtime_get_account_mgr()); } @@ -327,95 +264,139 @@ modest_widget_factory_get_status_bar (ModestWidgetFactory *self) } -static void -on_folder_selected (ModestFolderView *folder_view, TnyMsgFolderIface *folder, - ModestWidgetFactory *self) + +static const GSList* +get_transports (ModestWidgetFactory *self) { ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); + ModestAccountMgr *account_mgr; + GSList *transports = NULL; + GSList *cursor, *accounts; - modest_header_view_set_folder (priv->header_view, folder); -} - - -static void -on_message_selected (ModestHeaderView *folder_view, TnyMsgIface *msg, - ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); + + account_mgr = modest_runtime_get_account_mgr(); + cursor = accounts = modest_account_mgr_account_names (account_mgr, NULL); + while (cursor) { + ModestAccountData *data; + gchar *account_name = (gchar*)cursor->data; + + data = modest_account_mgr_get_account_data (account_mgr, account_name); + if (data && data->transport_account) { + ModestPair *pair; + gchar *display_name = g_strdup_printf ("%s (%s)", data->email, account_name); + pair = modest_pair_new ((gpointer) data, + (gpointer) display_name , TRUE); + transports = g_slist_prepend (transports, pair); + } + /* don't free account name; it's freed when the transports list is freed */ + cursor = cursor->next; + } + g_slist_free (accounts); - modest_msg_view_set_message (priv->msg_preview, msg); + return transports; } -static void -on_header_status_update (ModestHeaderView *header_view, const gchar *msg, - gint status_id, ModestWidgetFactory *self) +#if 0 +static const GSList* +get_stores (ModestWidgetFactory *self, gboolean only_remote) { ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); + TnyAccountStore *account_store; + TnyList *stores; + TnyIterator *iter; - if (msg && status_id) { - gchar *msg = g_strdup_printf ("%s", msg); - gtk_progress_bar_pulse (GTK_PROGRESS_BAR(priv->progress_bar)); - gtk_statusbar_push (GTK_STATUSBAR(priv->status_bar), - priv->status_bar_ctx[STATUS_ID_HEADER], - msg); - g_free (msg); - } else { - gtk_statusbar_pop (GTK_STATUSBAR(priv->status_bar), - priv->status_bar_ctx[STATUS_ID_HEADER]); - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(priv->progress_bar), - 1.0); + priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); + + account_store = + tny_platform_factory_new_account_store (priv->fact); + + stores = tny_simple_list_new (); + tny_account_store_get_accounts (account_store, stores, + TNY_ACCOUNT_STORE_STORE_ACCOUNTS); + + /* simply return all the stores */ + if (!only_remote) + return stores; + + /* remove the non-remote stores from the list */ + if (only_remote) { + iter = tny_list_create_iterator (stores); + while (!tny_iterator_is_done (iter)) { + TnyAccount *acc = (TnyAccount*)tny_iterator_get_current(iter); + /* is it a local account? if so, remove */ + ModestProtocol proto = modest_protocol_info_get_protocol (tny_account_get_proto(acc)); + if (modest_protocol_info_protocol_is_local_store(proto)) + tny_list_remove (stores, acc); /* FIXME: iter still valid? */ + tny_iterator_next (iter); + } + g_object_unref (G_OBJECT(iter)); } + return stores; } +#endif - -static void -on_msg_link_hover (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self) +GtkWidget* +modest_widget_factory_get_combo_box (ModestWidgetFactory *self, ModestComboBoxType type) { ModestWidgetFactoryPrivate *priv; + ModestPairList *protos = NULL; + GtkWidget* combo_box; + + g_return_val_if_fail (self, NULL); + priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); + + switch (type) { + case MODEST_COMBO_BOX_TYPE_STORE_PROTOS: + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_STORE); + break; + case MODEST_COMBO_BOX_TYPE_TRANSPORT_PROTOS: + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_TRANSPORT); + break; + case MODEST_COMBO_BOX_TYPE_SECURITY_PROTOS: + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_SECURITY); + break; + case MODEST_COMBO_BOX_TYPE_AUTH_PROTOS: + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_AUTH); + break; + case MODEST_COMBO_BOX_TYPE_TRANSPORTS: + protos = (ModestPairList *) get_transports (self); + break; +/* case MODEST_COMBO_BOX_TYPE_REMOTE_STORES: */ +/* // FIXME */ +/* list = get_stores (self, TRUE); /\* get all *remote* stores *\/ */ +/* combo_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL(list)); */ +/* g_object_unref (G_OBJECT(list)); */ +/* //return combo_box; */ + default: + g_warning ("invalid combo box type: %d", type); + return NULL; + } - if (link) - gtk_statusbar_push (GTK_STATUSBAR(priv->status_bar), - priv->status_bar_ctx[STATUS_ID_MESSAGE], - link); - else - gtk_statusbar_pop (GTK_STATUSBAR(priv->status_bar), - priv->status_bar_ctx[STATUS_ID_MESSAGE]); + combo_box = modest_combo_box_new (protos); + g_slist_free (protos); + + gtk_combo_box_set_active (GTK_COMBO_BOX(combo_box), 0); + + return combo_box; +} -} -static void -on_msg_link_clicked (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self) +GtkWidget* +modest_widget_factory_get_online_toggle (ModestWidgetFactory *self) { - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - if (link) { - gchar *msg = g_strdup_printf (_("Opening %s..."), link); - gtk_statusbar_push (GTK_STATUSBAR(priv->status_bar), - priv->status_bar_ctx[STATUS_ID_MESSAGE], - msg); - g_free (msg); - } + g_return_val_if_fail (self, NULL); + return MODEST_WIDGET_FACTORY_GET_PRIVATE(self)->online_toggle; } -static void -on_msg_attachment_clicked (ModestMsgView *msgview, int index, - ModestWidgetFactory *self) + + +GtkWidget* +modest_widget_factory_get_folder_info_label (ModestWidgetFactory *self) { - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - gchar *msg = g_strdup_printf (_("Opening attachment %d..."), index); - gtk_statusbar_push (GTK_STATUSBAR(priv->status_bar), - priv->status_bar_ctx[STATUS_ID_MESSAGE], - msg); - g_free (msg); + g_return_val_if_fail (self, NULL); + return MODEST_WIDGET_FACTORY_GET_PRIVATE(self)->folder_info_label; }