X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fgtk%2Fmodest-main-window.c;h=422e9cafa2cb6d49cb0a2f50a2fb28a5d3628178;hp=83e058bb07a70d22ac4b5882d8280d53825f51b0;hb=cd391684b9e177e208e90bcd53da83e871e06de5;hpb=9ad90e9053e1e0cc87885f714f513061ac734632 diff --git a/src/gtk/modest-main-window.c b/src/gtk/modest-main-window.c index 83e058b..422e9ca 100644 --- a/src/gtk/modest-main-window.c +++ b/src/gtk/modest-main-window.c @@ -27,6 +27,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +#include +#include + #include #include @@ -34,9 +38,13 @@ #include "modest-main-window.h" #include "modest-account-view-window.h" +#include "modest-account-mgr.h" +#include "modest-conf.h" #include "modest-edit-msg-window.h" #include "modest-icon-names.h" - +#include "modest-tny-platform-factory.h" +#include "modest-tny-msg-actions.h" +#include "modest-mail-operation.h" /* 'private'/'protected' functions */ static void modest_main_window_class_init (ModestMainWindowClass *klass); @@ -63,10 +71,9 @@ struct _ModestMainWindowPrivate { GtkWidget *msg_paned; GtkWidget *main_paned; - ModestWidgetFactory *factory; - ModestConf *conf; - ModestAccountMgr *account_mgr; - + ModestWidgetFactory *widget_factory; + TnyPlatformFactory *factory; + ModestHeaderView *header_view; ModestFolderView *folder_view; ModestMsgView *msg_preview; @@ -131,10 +138,8 @@ modest_main_window_init (ModestMainWindow *obj) ModestMainWindowPrivate *priv; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); - - priv->factory = NULL; - priv->conf = NULL; - priv->account_mgr = NULL; + + priv->factory = modest_tny_platform_factory_get_instance (); } static void @@ -142,19 +147,10 @@ modest_main_window_finalize (GObject *obj) { ModestMainWindowPrivate *priv; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); - if (priv->factory) { - g_object_unref (G_OBJECT(priv->factory)); - priv->factory = NULL; + if (priv->widget_factory) { + g_object_unref (G_OBJECT(priv->widget_factory)); + priv->widget_factory = NULL; } - if (priv->conf) { - g_object_unref (G_OBJECT(priv->conf)); - priv->conf = NULL; - } - - if (priv->account_mgr) { - g_object_unref (G_OBJECT(priv->account_mgr)); - priv->account_mgr = NULL; - } G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -198,8 +194,7 @@ on_menu_accounts (ModestMainWindow *self, guint action, GtkWidget *widget) g_return_if_fail (self); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - account_win = modest_account_view_window_new (priv->account_mgr, - priv->factory); + account_win = modest_account_view_window_new (priv->widget_factory); gtk_window_set_transient_for (GTK_WINDOW(account_win), GTK_WINDOW(self)); @@ -214,22 +209,162 @@ on_menu_new_message (ModestMainWindow *self, guint action, GtkWidget *widget) GtkWidget *msg_win; ModestMainWindowPrivate *priv; - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - msg_win = modest_edit_msg_window_new (priv->conf, - priv->factory, + msg_win = modest_edit_msg_window_new (priv->widget_factory, MODEST_EDIT_TYPE_NEW, NULL); gtk_widget_show (msg_win); } static void +on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget) +{ + GtkWidget *msg_win; + ModestMainWindowPrivate *priv; + ModestHeaderView *header_view; + TnyList *header_list; + TnyIterator *iter; + const gchar *from; + gchar *reply_key, *forward_key; + ModestMailOperationReplyType reply_type; + ModestMailOperationForwardType forward_type; + ModestConf *conf; + GError *error; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); + + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + header_list = modest_header_view_get_selected_headers (header_view); + + /* Get reply and forward types */ + error = NULL; + reply_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_REPLY_TYPE); + reply_type = modest_conf_get_int (conf, reply_key, &error); + if (error) { + g_warning ("key %s not defined", reply_key); + reply_type = MODEST_MAIL_OPERATION_REPLY_TYPE_CITE; + g_error_free (error); + error = NULL; + } + g_free (reply_key); + + forward_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_FORWARD_TYPE); + forward_type = modest_conf_get_int (conf, forward_key, NULL); + if (error) { + g_warning ("key %s not defined", forward_key); + reply_type = MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE; + g_error_free (error); + } + g_free (forward_key); + + if (header_list) { + iter = tny_list_create_iterator (header_list); + do { + TnyHeader *header, *new_header; + TnyFolder *folder; + TnyMsg *msg, *new_msg; + ModestEditType edit_type; + + /* Get msg from header */ + header = TNY_HEADER (tny_iterator_get_current (iter)); + folder = tny_header_get_folder (header); + msg = tny_folder_get_msg (folder, header); + + from = modest_folder_view_get_selected_account (priv->folder_view); + + /* FIXME: select proper action */ + switch (action) { + case 1: + new_msg = + modest_mail_operation_create_reply_mail (msg, from, reply_type, + MODEST_MAIL_OPERATION_REPLY_MODE_SENDER); + edit_type = MODEST_EDIT_TYPE_REPLY; + break; + case 2: + new_msg = + modest_mail_operation_create_reply_mail (msg, from, reply_type, + MODEST_MAIL_OPERATION_REPLY_MODE_ALL); + edit_type = MODEST_EDIT_TYPE_REPLY; + break; + case 3: + new_msg = + modest_mail_operation_create_forward_mail (msg, from, forward_type); + edit_type = MODEST_EDIT_TYPE_FORWARD; + break; + default: + g_warning ("unexpected action type: %d", action); + } + + /* Set from */ + new_header = tny_msg_get_header (new_msg); + tny_header_set_from (new_header, + modest_folder_view_get_selected_account (priv->folder_view)); + + /* Show edit window */ + msg_win = modest_edit_msg_window_new (priv->widget_factory, + edit_type, + new_msg); + gtk_widget_show (msg_win); + + /* Clean and go on */ + g_object_unref (new_msg); + tny_iterator_next (iter); + + } while (!tny_iterator_is_done (iter)); + } +} + +static void on_menu_quit (ModestMainWindow *self, guint action, GtkWidget *widget) { save_sizes (self); gtk_widget_destroy (GTK_WIDGET(self)); } +static void +on_menu_delete (ModestMainWindow *self, guint action, GtkWidget *widget) +{ + ModestMainWindowPrivate *priv; + ModestHeaderView *header_view; + TnyList *header_list; + TnyIterator *iter; + GtkTreeModel *model; + + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + header_list = modest_header_view_get_selected_headers (header_view); + + if (header_list) { + iter = tny_list_create_iterator (header_list); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); + if (GTK_IS_TREE_MODEL_SORT (model)) + model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model)); + do { + TnyHeader *header; + ModestMailOperation *mail_op; + + header = TNY_HEADER (tny_iterator_get_current (iter)); + /* TODO: thick grain mail operation involving + a list of objects. Composite pattern ??? */ + mail_op = modest_mail_operation_new (); + + /* Move to trash */ + modest_mail_operation_remove_msg (mail_op, header, TRUE); + + /* Remove from tree model */ + tny_list_remove (TNY_LIST (model), G_OBJECT (header)); + + g_object_unref (G_OBJECT (mail_op)); + g_object_unref (header); + tny_iterator_next (iter); + + } while (!tny_iterator_is_done (iter)); + } +} + /* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */ static GtkItemFactoryEntry menu_items[] = { @@ -255,8 +390,8 @@ static GtkItemFactoryEntry menu_items[] = { { "/_Actions", NULL, NULL, 0, "" ,NULL}, { "/Actions/_New Message", NULL, on_menu_new_message, 0, "",NULL }, - { "/Actions/_Reply", NULL, NULL, 0, "" ,NULL}, - { "/Actions/_Forward", NULL, NULL, 0, "" ,NULL}, + { "/Actions/_Reply", NULL, on_menu_reply_forward, 1, "" ,NULL}, + { "/Actions/_Forward", NULL, on_menu_reply_forward, 3, "" ,NULL}, { "/Actions/_Bounce", NULL, NULL, 0, "",NULL }, { "/_Options", NULL, NULL, 0, "" ,NULL}, @@ -309,17 +444,17 @@ header_view_new (ModestMainWindow *self) ModestHeaderViewColumn cols[] = { MODEST_HEADER_VIEW_COLUMN_MSGTYPE, MODEST_HEADER_VIEW_COLUMN_ATTACH, - MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER -/* MODEST_HEADER_VIEW_COLUMN_FROM, */ -/* MODEST_HEADER_VIEW_COLUMN_SUBJECT, */ -/* MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE */ +/* MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER, */ + MODEST_HEADER_VIEW_COLUMN_FROM, + MODEST_HEADER_VIEW_COLUMN_SUBJECT, + MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE }; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); for (i = 0 ; i != sizeof(cols) / sizeof(ModestHeaderViewColumn); ++i) columns = g_slist_append (columns, GINT_TO_POINTER(cols[i])); - header_view = modest_widget_factory_get_header_view (priv->factory); + header_view = modest_widget_factory_get_header_view (priv->widget_factory); modest_header_view_set_columns (header_view, columns); g_slist_free (columns); @@ -342,10 +477,13 @@ on_toolbar_button_clicked (ModestToolbar *toolbar, ModestToolbarButton button_id on_menu_new_message (self, 0, NULL); break; case MODEST_TOOLBAR_BUTTON_REPLY: + on_menu_reply_forward (self, 1, NULL); break; case MODEST_TOOLBAR_BUTTON_REPLY_ALL: + on_menu_reply_forward (self, 2, NULL); break; case MODEST_TOOLBAR_BUTTON_FORWARD: + on_menu_reply_forward (self, 3, NULL); break; case MODEST_TOOLBAR_BUTTON_SEND_RECEIVE: @@ -367,6 +505,8 @@ on_toolbar_button_clicked (ModestToolbar *toolbar, ModestToolbarButton button_id break; case MODEST_TOOLBAR_BUTTON_DELETE: + on_menu_delete (self, 0, GTK_WIDGET (toolbar)); + break; default: g_printerr ("modest: key %d pressed\n", button_id); @@ -400,7 +540,7 @@ toolbar_new (ModestMainWindow *self) for (i = 0 ; i != sizeof(button_ids) / sizeof(ModestToolbarButton); ++i) buttons = g_slist_append (buttons, GINT_TO_POINTER(button_ids[i])); - toolbar = modest_widget_factory_get_main_toolbar (priv->factory, buttons); + toolbar = modest_widget_factory_get_main_toolbar (priv->widget_factory, buttons); g_slist_free (buttons); g_signal_connect (G_OBJECT(toolbar), "button_clicked", @@ -414,16 +554,19 @@ toolbar_new (ModestMainWindow *self) static void restore_sizes (ModestMainWindow *self) { - ModestMainWindowPrivate *priv; - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + ModestConf *conf; + ModestMainWindowPrivate *priv; - modest_widget_memory_restore_settings (priv->conf,GTK_WIDGET(self), + priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); + + modest_widget_memory_restore_settings (conf,GTK_WIDGET(self), "modest-main-window"); - modest_widget_memory_restore_settings (priv->conf, GTK_WIDGET(priv->folder_paned), + modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->folder_paned), "modest-folder-paned"); - modest_widget_memory_restore_settings (priv->conf, GTK_WIDGET(priv->msg_paned), + modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->msg_paned), "modest-msg-paned"); - modest_widget_memory_restore_settings (priv->conf, GTK_WIDGET(priv->main_paned), + modest_widget_memory_restore_settings (conf, GTK_WIDGET(priv->main_paned), "modest-main-paned"); } @@ -432,16 +575,18 @@ static void save_sizes (ModestMainWindow *self) { ModestMainWindowPrivate *priv; + ModestConf *conf; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); + conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); - modest_widget_memory_save_settings (priv->conf,GTK_WIDGET(self), + modest_widget_memory_save_settings (conf,GTK_WIDGET(self), "modest-main-window"); - modest_widget_memory_save_settings (priv->conf, GTK_WIDGET(priv->folder_paned), + modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->folder_paned), "modest-folder-paned"); - modest_widget_memory_save_settings (priv->conf, GTK_WIDGET(priv->msg_paned), + modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->msg_paned), "modest-msg-paned"); - modest_widget_memory_save_settings (priv->conf, GTK_WIDGET(priv->main_paned), + modest_widget_memory_save_settings (conf, GTK_WIDGET(priv->main_paned), "modest-main-paned"); } @@ -497,8 +642,7 @@ favorites_view () GtkWidget* -modest_main_window_new (ModestConf *conf, ModestAccountMgr *account_mgr, - ModestWidgetFactory *factory) +modest_main_window_new (ModestWidgetFactory *widget_factory) { GObject *obj; ModestMainWindowPrivate *priv; @@ -507,25 +651,18 @@ modest_main_window_new (ModestConf *conf, ModestAccountMgr *account_mgr, GtkWidget *status_hbox; GtkWidget *header_win, *folder_win, *favorites_win; - g_return_val_if_fail (factory, NULL); - g_return_val_if_fail (conf, NULL); + g_return_val_if_fail (widget_factory, NULL); obj = g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); - g_object_ref (factory); - priv->factory = factory; - - g_object_ref (conf); - priv->conf = conf; - - g_object_ref (account_mgr); - priv->account_mgr = account_mgr; + g_object_ref (widget_factory); + priv->widget_factory = widget_factory; /* widgets from factory */ - priv->folder_view = modest_widget_factory_get_folder_view (factory); + priv->folder_view = modest_widget_factory_get_folder_view (widget_factory); priv->header_view = header_view_new (MODEST_MAIN_WINDOW(obj)); - priv->msg_preview = modest_widget_factory_get_msg_preview (factory); + priv->msg_preview = modest_widget_factory_get_msg_preview (widget_factory); folder_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->folder_view), FALSE); @@ -555,16 +692,16 @@ modest_main_window_new (ModestConf *conf, ModestAccountMgr *account_mgr, /* status bar / progress */ status_hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(status_hbox), - modest_widget_factory_get_folder_info_label (factory), + modest_widget_factory_get_folder_info_label (widget_factory), FALSE,FALSE, 6); gtk_box_pack_start (GTK_BOX(status_hbox), - modest_widget_factory_get_status_bar(factory), + modest_widget_factory_get_status_bar(widget_factory), TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX(status_hbox), - modest_widget_factory_get_progress_bar(factory), + modest_widget_factory_get_progress_bar(widget_factory), FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(status_hbox), - modest_widget_factory_get_online_toggle(factory), + modest_widget_factory_get_online_toggle(widget_factory), FALSE, FALSE, 0); /* putting it all together... */