X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-widget-factory.c;h=3b61c6bf1d9423b91203811ee2846940bc73f0e2;hp=ddc7d29889742c41dadd83846c5007410f215e74;hb=31bb0518a45f4ca59a30a650475d3a3f9ff87610;hpb=1d54dd2435d706f0f82d2a81cd00c1410832a241 diff --git a/src/modest-widget-factory.c b/src/modest-widget-factory.c index ddc7d29..3b61c6b 100644 --- a/src/modest-widget-factory.c +++ b/src/modest-widget-factory.c @@ -27,12 +27,25 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "modest-widget-factory.h" -#include +#include +#include +#include +#include #include +#include #include +#include +#include "modest-widget-factory.h" +#include "modest-widget-memory.h" +#include #include "modest-tny-platform-factory.h" -#include "modest-account-mgr.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); @@ -40,32 +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, - TnyFolder *folder, - ModestWidgetFactory *self); -static void on_message_selected (ModestHeaderView *header_view, TnyMsg *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); - -static void on_connection_changed (TnyDevice *device, gboolean online, - ModestWidgetFactory *self); -static void on_online_toggle_toggled (GtkToggleButton *toggle, ModestWidgetFactory *factory); - -static void on_password_requested (ModestTnyAccountStore *account_store, const gchar* account_name, - gchar **password, gboolean *cancel, ModestWidgetFactory *self); - -static void on_item_not_found (ModestHeaderView* header_view, ModestItemType type, - ModestWidgetFactory *self); - - /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -74,22 +61,19 @@ enum { }; typedef struct _ModestWidgetFactoryPrivate ModestWidgetFactoryPrivate; -struct _ModestWidgetFactoryPrivate { - - TnyPlatformFactory *fact; - TnyAccountStore *account_store; - ModestProtocolMgr *proto_mgr; +struct _ModestWidgetFactoryPrivate { + + ModestTnyAccountStore *account_store; - ModestHeaderView *header_view; - ModestFolderView *folder_view; - ModestMsgView *msg_preview; - ModestToolbar *main_toolbar, *edit_toolbar; + ModestHeaderView *header_view; + ModestFolderView *folder_view; + ModestMsgView *msg_preview; - GtkWidget *progress_bar; - GtkWidget *status_bar; - GtkWidget *folder_info_label; + GtkWidget *progress_bar; + GtkWidget *status_bar; + GtkWidget *folder_info_label; - GtkWidget *online_toggle; + GtkWidget *online_toggle; }; #define MODEST_WIDGET_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_WIDGET_FACTORY, \ @@ -141,10 +125,8 @@ modest_widget_factory_init (ModestWidgetFactory *obj) { ModestWidgetFactoryPrivate *priv; priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj); - - priv->fact = modest_tny_platform_factory_get_instance (); - priv->account_store = tny_platform_factory_new_account_store (priv->fact); - priv->proto_mgr = modest_protocol_mgr_new (); + + priv->account_store = NULL; priv->progress_bar = gtk_progress_bar_new (); gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(priv->progress_bar), @@ -154,100 +136,50 @@ modest_widget_factory_init (ModestWidgetFactory *obj) FALSE); } -static void -modest_widget_factory_finalize (GObject *obj) -{ - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj); - - if (priv->proto_mgr) { - g_object_unref (G_OBJECT(priv->proto_mgr)); - priv->proto_mgr = NULL; - } -} - - static void -init_signals (ModestWidgetFactory *self) +modest_widget_factory_finalize (GObject *obj) { + /* no need to unref account_store; we don't own the reference */ - TnyDevice *device; - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - /* folder view */ - g_signal_connect (G_OBJECT(priv->folder_view), "folder_selected", - G_CALLBACK(on_folder_selected), self); - - /* header view */ - g_signal_connect (G_OBJECT(priv->header_view), "status_update", - G_CALLBACK(on_header_status_update), self); - g_signal_connect (G_OBJECT(priv->header_view), "message_selected", - G_CALLBACK(on_message_selected), self); - g_signal_connect (G_OBJECT(priv->header_view), "item_not_found", - G_CALLBACK(on_item_not_found), self); - - - /* msg preview */ - 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); - - /* account store */ - g_signal_connect (G_OBJECT (priv->account_store), "password_requested", - G_CALLBACK(on_password_requested), self); - - /* FIXME: const casting is evil ==> tinymail */ - device = (TnyDevice*) tny_account_store_get_device (priv->account_store); - if (device) { - g_signal_connect (G_OBJECT(device), "connection_changed", - G_CALLBACK(on_connection_changed), self); - g_signal_connect (G_OBJECT(priv->online_toggle), "toggled", - G_CALLBACK(on_online_toggle_toggled), self); - - /* init toggle in correct state */ - on_connection_changed (device, - tny_device_is_online (device), - self); - } + G_OBJECT_CLASS(parent_class)->finalize (obj); } + 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 (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; } - - /* online/offline combo */ priv->online_toggle = gtk_toggle_button_new (); @@ -255,22 +187,23 @@ init_widgets (ModestWidgetFactory *self) the current folder */ priv->folder_info_label = gtk_label_new (NULL); - init_signals (self); - return TRUE; } ModestWidgetFactory* -modest_widget_factory_new (void) +modest_widget_factory_new (ModestTnyAccountStore *account_store) { GObject *obj; ModestWidgetFactoryPrivate *priv; - ModestAccountMgr *account_mgr; + g_return_val_if_fail (account_store, NULL); + obj = g_object_new (MODEST_TYPE_WIDGET_FACTORY, NULL); priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj); - + + 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); @@ -310,16 +243,7 @@ modest_widget_factory_get_msg_preview (ModestWidgetFactory *self) ModestAccountView* modest_widget_factory_get_account_view (ModestWidgetFactory *self) { - ModestWidgetFactoryPrivate *priv; - ModestAccountMgr *account_mgr; - - g_return_val_if_fail (self, NULL); - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - account_mgr = - modest_tny_platform_factory_get_modest_account_mgr_instance (priv->fact); - - return modest_account_view_new (account_mgr); + return modest_account_view_new (modest_runtime_get_account_mgr()); } @@ -351,8 +275,7 @@ get_transports (ModestWidgetFactory *self) priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - account_mgr = - modest_tny_platform_factory_get_modest_account_mgr_instance (priv->fact); + account_mgr = modest_runtime_get_account_mgr(); cursor = accounts = modest_account_mgr_account_names (account_mgr, NULL); while (cursor) { ModestAccountData *data; @@ -360,10 +283,11 @@ get_transports (ModestWidgetFactory *self) 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); - ModestPair *pair = modest_pair_new ((gpointer)account_name, - (gpointer)display_name , TRUE); - transports = g_slist_append (transports, pair); + 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; @@ -374,11 +298,50 @@ get_transports (ModestWidgetFactory *self) } +#if 0 +static const GSList* +get_stores (ModestWidgetFactory *self, gboolean only_remote) +{ + ModestWidgetFactoryPrivate *priv; + TnyAccountStore *account_store; + TnyList *stores; + TnyIterator *iter; + + 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 + GtkWidget* modest_widget_factory_get_combo_box (ModestWidgetFactory *self, ModestComboBoxType type) { ModestWidgetFactoryPrivate *priv; - const GSList *list = NULL; + ModestPairList *protos = NULL; GtkWidget* combo_box; g_return_val_if_fail (self, NULL); @@ -387,26 +350,34 @@ modest_widget_factory_get_combo_box (ModestWidgetFactory *self, ModestComboBoxTy switch (type) { case MODEST_COMBO_BOX_TYPE_STORE_PROTOS: - list = modest_protocol_mgr_get_store_protocols (priv->proto_mgr); + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_STORE); break; case MODEST_COMBO_BOX_TYPE_TRANSPORT_PROTOS: - list = modest_protocol_mgr_get_transport_protocols (priv->proto_mgr); + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_TRANSPORT); break; case MODEST_COMBO_BOX_TYPE_SECURITY_PROTOS: - list = modest_protocol_mgr_get_security_protocols (priv->proto_mgr); + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_SECURITY); break; case MODEST_COMBO_BOX_TYPE_AUTH_PROTOS: - list = modest_protocol_mgr_get_auth_protocols (priv->proto_mgr); + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_AUTH); break; case MODEST_COMBO_BOX_TYPE_TRANSPORTS: - list = get_transports (self); + 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; } - combo_box = modest_combo_box_new (list); + 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; @@ -429,297 +400,3 @@ modest_widget_factory_get_folder_info_label (ModestWidgetFactory *self) g_return_val_if_fail (self, NULL); return MODEST_WIDGET_FACTORY_GET_PRIVATE(self)->folder_info_label; } - -ModestToolbar* -modest_widget_factory_get_main_toolbar (ModestWidgetFactory *self, - GSList *items) -{ - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - if (priv->main_toolbar) - return priv->main_toolbar; - - priv->main_toolbar = modest_toolbar_new (items); - if (!priv->main_toolbar) { - g_printerr ("modest: failed to create main toolbar\n"); - return NULL; - } - - return priv->main_toolbar; -} - - -ModestToolbar* -modest_widget_factory_get_edit_toolbar (ModestWidgetFactory *self, - GSList *items) -{ - return modest_toolbar_new (items); -} - - - -static void -on_folder_selected (ModestFolderView *folder_view, TnyFolder *folder, - ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - gchar *txt; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - modest_header_view_set_folder (priv->header_view, folder); - - if (folder) { - guint num, unread; - - num = tny_folder_get_all_count (folder); - unread = tny_folder_get_unread_count (folder); - - txt = g_strdup_printf (_("%d %s, %d unread"), - num, num==1 ? _("item") : _("items"), unread); - - gtk_label_set_label (GTK_LABEL(priv->folder_info_label), txt); - g_free (txt); - } else - gtk_label_set_label (GTK_LABEL(priv->folder_info_label), ""); -} - - -static void -on_message_selected (ModestHeaderView *folder_view, TnyMsg *msg, - ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - modest_msg_view_set_message (priv->msg_preview, msg); -} - - -/* - * below some stuff to clearup statusbar messages after 1,5 seconds.... - */ -typedef struct { - GtkWidget *status_bar; - GtkWidget *progress_bar; - guint msg_id; -} StatusRemoveData; - - -static gboolean -on_statusbar_remove_msg (StatusRemoveData *data) -{ - /* we need to test types, as this callback maybe called after the - * widgets have been destroyed - */ - if (GTK_IS_STATUSBAR(data->status_bar)) - gtk_statusbar_remove (GTK_STATUSBAR(data->status_bar), - 0, data->msg_id); - if (GTK_IS_PROGRESS_BAR(data->progress_bar)) - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(data->progress_bar), - 1.0); - g_free (data); - return FALSE; -} - - -static void -statusbar_push (ModestWidgetFactory *self, guint context_id, const gchar *msg) -{ - guint id; - StatusRemoveData *data; - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - if (!msg) - return; - - id = gtk_statusbar_push (GTK_STATUSBAR(priv->status_bar), 0, msg); - - data = g_new (StatusRemoveData, 1); - data->status_bar = priv->status_bar; - data->progress_bar = priv->progress_bar; - data->msg_id = id; - - g_timeout_add (1500, (GSourceFunc)on_statusbar_remove_msg, data); -} -/****************************************************************************/ - - -static void -on_header_status_update (ModestHeaderView *header_view, const gchar *msg, - gint status_id, ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - gtk_progress_bar_pulse (GTK_PROGRESS_BAR(priv->progress_bar)); - statusbar_push (self, 0, msg); -} - - -static void -on_msg_link_hover (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - statusbar_push (self, 0, link); - -} - - -static void -on_msg_link_clicked (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self) -{ - gchar *msg; - msg = g_strdup_printf (_("Opening %s..."), link); - statusbar_push (self, 0, msg); - g_free (msg); -} - -static void -on_msg_attachment_clicked (ModestMsgView *msgview, int index, - ModestWidgetFactory *self) -{ - gchar *msg; - - msg = g_strdup_printf (_("Opening attachment %d..."), index); - statusbar_push (self, 0, msg); - - g_free (msg); -} - - -static void -on_connection_changed (TnyDevice *device, gboolean online, - ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->online_toggle), - online); - gtk_button_set_label (GTK_BUTTON(priv->online_toggle), - online ? _("Online") : _("Offline")); - - statusbar_push (self, 0, online ? _("Modest went online") : _("Modest went offline")); -} - - -static void -on_online_toggle_toggled (GtkToggleButton *toggle, ModestWidgetFactory *self) -{ - gboolean online; - const TnyDevice *device; - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - online = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->online_toggle)); - device = tny_account_store_get_device (priv->account_store); - - /* FIXME: const casting should not be necessary ==> tinymail */ - if (online) /* we're moving to online state */ - tny_device_force_online ((TnyDevice*)device); - else /* we're moving to offline state */ - tny_device_force_offline ((TnyDevice*)device); -} - - -static void on_item_not_found (ModestHeaderView* header_view, ModestItemType type, - ModestWidgetFactory *self) -{ - /* FIXME ==> ask from UI... */ - GtkWidget *dialog; - gchar *txt; - gboolean online; - gchar *item = type == MODEST_ITEM_TYPE_FOLDER ? "folder" : "message"; - - TnyDevice *device; - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - device = tny_account_store_get_device (priv->account_store); - - online = tny_device_is_online (device); - if (online) { - /* already online -- the item is simply not there... */ - dialog = gtk_message_dialog_new (NULL, - GTK_DIALOG_MODAL, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_OK, - _("The %s you selected cannot be found"), - item); - gtk_dialog_run (GTK_DIALOG(dialog)); - } else { - - dialog = gtk_dialog_new_with_buttons (_("Connection requested"), - NULL, - GTK_DIALOG_MODAL, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - NULL); - - txt = g_strdup_printf (_("This %s is not available in offline mode.\n" - "Do you want to get online?"), item); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), - gtk_label_new (txt), FALSE, FALSE, 0); - gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); - g_free (txt); - - gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300); - if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) - tny_device_force_online (device); - } - gtk_widget_destroy (dialog); -} - - - -static void -on_password_requested (ModestTnyAccountStore *account_store, const gchar* account_name, - gchar **password, gboolean *cancel, ModestWidgetFactory *self) -{ - gchar *txt; - GtkWidget *dialog, *entry; - - dialog = gtk_dialog_new_with_buttons (_("Password requested"), - NULL, - GTK_DIALOG_MODAL, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - NULL); - - txt = g_strdup_printf (_("Please enter your password for %s"), account_name); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt), - FALSE, FALSE, 0); - g_free (txt); - - entry = gtk_entry_new_with_max_length (40); - gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE); - gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */ - - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry, - TRUE, FALSE, 0); - - gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); - - if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - *password = g_strdup(gtk_entry_get_text (GTK_ENTRY(entry))); - *cancel = FALSE; - } else { - *password = NULL; - *cancel = TRUE; - } - gtk_widget_destroy (dialog); -} -