* fix for modest-icon-factory removal
[modest] / src / maemo / modest-edit-msg-window.c
index cefe3fb..26515cc 100644 (file)
  */
 #include <glib/gi18n.h>
 #include <tny-account-store.h>
+
+#include <modest-account-mgr.h>
+#include <modest-account-mgr-helpers.h>
+
 #include <widgets/modest-edit-msg-window.h>
-#include <hildon-widgets/hildon-window.h>
-#include <widgets/modest-toolbar.h>
+#include <modest-runtime.h>
+
+#include "modest-edit-msg-window-ui.h"
+#include "modest-icon-names.h"
+#include "modest-icon-factory.h"
 #include "modest-widget-memory.h"
+#include "modest-window-priv.h"
 #include "modest-mail-operation.h"
 #include "modest-tny-platform-factory.h"
 #include "modest-tny-msg-actions.h"
 #include <tny-simple-list.h>
-#include <string.h>
-
 
 static void  modest_edit_msg_window_class_init   (ModestEditMsgWindowClass *klass);
 static void  modest_edit_msg_window_init         (ModestEditMsgWindow *obj);
@@ -52,16 +58,14 @@ enum {
 
 typedef struct _ModestEditMsgWindowPrivate ModestEditMsgWindowPrivate;
 struct _ModestEditMsgWindowPrivate {
-
-       ModestWidgetFactory *factory;
-       TnyPlatformFactory *fact;
-       
-       GtkWidget      *toolbar, *menubar;
-       GtkWidget      *msg_body;
-       GtkWidget      *from_field, *to_field, *cc_field, *bcc_field,
-                      *subject_field;
-       GtkUIManager   *ui_manager;
+       GtkWidget   *msg_body;
+       GtkWidget   *from_field;
+       GtkWidget   *to_field;
+       GtkWidget   *cc_field;
+       GtkWidget   *bcc_field;
+       GtkWidget   *subject_field;
 };
+
 #define MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                     MODEST_TYPE_EDIT_MSG_WINDOW, \
                                                     ModestEditMsgWindowPrivate))
@@ -88,7 +92,7 @@ modest_edit_msg_window_get_type (void)
                        (GInstanceInitFunc) modest_edit_msg_window_init,
                        NULL
                };
-               my_type = g_type_register_static (HILDON_TYPE_WINDOW,
+               my_type = g_type_register_static (MODEST_TYPE_WINDOW,
                                                  "ModestEditMsgWindow",
                                                  &my_info, 0);
        }
@@ -105,13 +109,6 @@ modest_edit_msg_window_class_init (ModestEditMsgWindowClass *klass)
        gobject_class->finalize = modest_edit_msg_window_finalize;
 
        g_type_class_add_private (gobject_class, sizeof(ModestEditMsgWindowPrivate));
-
-       /* 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
@@ -120,10 +117,12 @@ modest_edit_msg_window_init (ModestEditMsgWindow *obj)
        ModestEditMsgWindowPrivate *priv;
        priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(obj);
 
-       priv->fact = modest_tny_platform_factory_get_instance ();
-       priv->factory = NULL;
-       priv->toolbar = NULL;
-       //priv->menubar = NULL;
+       priv->msg_body      = NULL;
+       priv->from_field    = NULL;
+       priv->to_field      = NULL;
+       priv->cc_field      = NULL;
+       priv->bcc_field     = NULL;
+       priv->subject_field = NULL;
 }
 
 
@@ -131,152 +130,17 @@ modest_edit_msg_window_init (ModestEditMsgWindow *obj)
 static void
 save_settings (ModestEditMsgWindow *self)
 {
-       ModestEditMsgWindowPrivate *priv;
-       ModestConf *conf;
-
-       priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(self);
-       conf = modest_tny_platform_factory_get_modest_conf_instance (priv->fact);
-
-       modest_widget_memory_save (conf, G_OBJECT(self),
-                                           "modest-edit-msg-window");
+       modest_widget_memory_save (modest_runtime_get_conf(),
+                                  G_OBJECT(self), "modest-edit-msg-window");
 }
 
 
 static void
 restore_settings (ModestEditMsgWindow *self)
 {
-       ModestEditMsgWindowPrivate *priv;
-       ModestConf *conf;
-
-       priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(self);
-       conf = modest_tny_platform_factory_get_modest_conf_instance (priv->fact);
-
-       modest_widget_memory_restore (conf, G_OBJECT(self),
-                                              "modest-edit-msg-window");
-}
-
-       
-
-
-static void
-send_mail (ModestEditMsgWindow *self)
-{
-       const gchar *to, *cc, *bcc, *subject;
-       gchar *body, *from;
-       ModestEditMsgWindowPrivate *priv;
-       TnyTransportAccount *transport_account;
-       ModestMailOperation *mail_operation;
-       ModestAccountData *data;
-       
-       GtkTextBuffer *buf;
-       GtkTextIter b, e;
-       
-       priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(self);
-       data = modest_combo_box_get_active_id (MODEST_COMBO_BOX (priv->from_field));
-
-       /* don't free these (except from) */
-       from    =  g_strdup_printf ("%s <%s>", data->full_name, data->email) ;
-       to      =  gtk_entry_get_text (GTK_ENTRY(priv->to_field));
-       cc      =  gtk_entry_get_text (GTK_ENTRY(priv->cc_field));
-       bcc     =  gtk_entry_get_text (GTK_ENTRY(priv->bcc_field));
-       subject =  gtk_entry_get_text (GTK_ENTRY(priv->subject_field));
-       
-       /* don't unref */
-       buf   =  gtk_text_view_get_buffer (GTK_TEXT_VIEW(priv->msg_body));
-       
-       gtk_text_buffer_get_bounds (buf, &b, &e);
-       body  = gtk_text_buffer_get_text (buf, &b, &e,
-                                         FALSE); /* free this one */
-
-       /* FIXME: Code added just for testing. The transport_account
-          should be provided by the account manager, maybe using
-          _get_current_account () or _get_default_account
-          (TRANSPORT_ACCOUNT). These methods do not exist currently. */
-       {
-               TnyList *accounts;
-               TnyIterator *iter;
-               TnyAccountStore *account_store;
-
-               accounts = TNY_LIST(tny_simple_list_new ());
-               account_store = tny_platform_factory_new_account_store (priv->fact);
-               tny_account_store_get_accounts (account_store, accounts,
-                                               TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS);
-
-               iter = tny_list_create_iterator(accounts);
-               tny_iterator_first (iter);
-               if (tny_iterator_is_done (iter)) {
-                       /* FIXME: Add error handling through mail operation */
-                       g_printerr("modest: no transport accounts defined\n");
-                       g_free (body);
-                       return;
-               }
-               transport_account = TNY_TRANSPORT_ACCOUNT (tny_iterator_get_current(iter));
-       }
-
-       mail_operation = modest_mail_operation_new ();
-
-       modest_mail_operation_send_new_mail (mail_operation,
-                                            transport_account,
-                                            from, to, cc, bcc,
-                                            subject, body, NULL);
-       /* Clean up */
-       g_object_unref (mail_operation);
-       g_free (from);
-       g_free (body);
-}
-
-
-static void
-on_toolbar_button_clicked (ModestToolbar *toolbar, ModestToolbarButton button_id,
-                          ModestEditMsgWindow *self)
-{
-       switch (button_id) {
-       case MODEST_TOOLBAR_BUTTON_MAIL_SEND:
-               send_mail (self);
-               save_settings (self);
-               gtk_widget_destroy (GTK_WIDGET(self));
-               break;
-               
-       case MODEST_TOOLBAR_BUTTON_REPLY:
-       case MODEST_TOOLBAR_BUTTON_REPLY_ALL:
-       case MODEST_TOOLBAR_BUTTON_FORWARD:
-       case MODEST_TOOLBAR_BUTTON_SEND_RECEIVE:
-       case MODEST_TOOLBAR_BUTTON_NEXT:
-       case MODEST_TOOLBAR_BUTTON_PREV:
-       case MODEST_TOOLBAR_BUTTON_DELETE:
-
-       default:
-               g_printerr ("modest: key %d pressed\n", button_id);
-       }
-}
-
-
-
-
-static ModestToolbar*
-toolbar_new (ModestEditMsgWindow *self)
-{
-       int i;
-       ModestToolbar *toolbar;
-       GSList *buttons = NULL;
-       ModestEditMsgWindowPrivate *priv;
 
-       ModestToolbarButton button_ids[] = {
-               MODEST_TOOLBAR_BUTTON_MAIL_SEND
-       };              
-       
-       priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(self);
-
-       for (i = 0 ; i != sizeof(button_ids) / sizeof(ModestToolbarButton); ++i)
-               buttons = g_slist_append (buttons, GINT_TO_POINTER(button_ids[i]));
-       
-       toolbar = modest_toolbar_new (buttons);
-       g_slist_free (buttons);
-
-       g_signal_connect (G_OBJECT(toolbar), "button_clicked",
-                         G_CALLBACK(on_toolbar_button_clicked), self);
-       
-       return toolbar;
+       modest_widget_memory_restore (modest_runtime_get_conf(),
+                                     G_OBJECT(self), "modest-edit-msg-window");
 }
 
 
@@ -286,20 +150,20 @@ init_window (ModestEditMsgWindow *obj)
        GtkWidget *to_button, *cc_button, *bcc_button; 
        GtkWidget *header_table;
        GtkWidget *main_vbox;
-       
        ModestEditMsgWindowPrivate *priv;
+
        priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(obj);
 
        to_button     = gtk_button_new_with_label (_("To..."));
        cc_button     = gtk_button_new_with_label (_("Cc..."));
        bcc_button    = gtk_button_new_with_label (_("Bcc..."));
 
-       priv->from_field    = modest_widget_factory_get_combo_box (priv->factory,
+       priv->from_field    = modest_widget_factory_get_combo_box (modest_runtime_get_widget_factory(),
                                                                   MODEST_COMBO_BOX_TYPE_TRANSPORTS);
-       priv->to_field      = gtk_entry_new_with_max_length (40);
-       priv->cc_field      = gtk_entry_new_with_max_length (40);
-       priv->bcc_field     = gtk_entry_new_with_max_length (40);
-       priv->subject_field = gtk_entry_new_with_max_length (40);
+       priv->to_field      = gtk_entry_new_with_max_length (80);
+       priv->cc_field      = gtk_entry_new_with_max_length (80);
+       priv->bcc_field     = gtk_entry_new_with_max_length (80);
+       priv->subject_field = gtk_entry_new_with_max_length (80);
        
        header_table = gtk_table_new (5,2, FALSE);
        
@@ -321,14 +185,9 @@ init_window (ModestEditMsgWindow *obj)
        
        main_vbox = gtk_vbox_new  (FALSE, 6);
 
-       //priv->menubar = menubar_new (obj);
-       priv->toolbar = GTK_WIDGET(toolbar_new (obj));
-
-       //gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX(main_vbox), header_table, FALSE, FALSE, 6);
        gtk_box_pack_start (GTK_BOX(main_vbox), priv->msg_body, TRUE, TRUE, 6);
-       gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0);
-       
+
        gtk_widget_show_all (GTK_WIDGET(main_vbox));
        gtk_container_add (GTK_CONTAINER(obj), main_vbox);
 }
@@ -338,15 +197,7 @@ init_window (ModestEditMsgWindow *obj)
 static void
 modest_edit_msg_window_finalize (GObject *obj)
 {
-       ModestEditMsgWindowPrivate *priv;
-
-       priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(obj);
-
-       g_object_unref (G_OBJECT(priv->factory));
-       priv->factory = NULL;
-       
        G_OBJECT_CLASS(parent_class)->finalize (obj);
-
 }
 
 
@@ -358,22 +209,84 @@ on_delete_event (GtkWidget *widget, GdkEvent *event, ModestEditMsgWindow *self)
        return FALSE;
 }
 
+static GtkWidget *
+menubar_to_menu (GtkUIManager *ui_manager)
+{
+       GtkWidget *main_menu;
+       GtkWidget *menubar;
+       GList *iter;
+
+       /* Create new main menu */
+       main_menu = gtk_menu_new();
+
+       /* Get the menubar from the UI manager */
+       menubar = gtk_ui_manager_get_widget (ui_manager, "/MenuBar");
+
+       iter = gtk_container_get_children (GTK_CONTAINER (menubar));
+       while (iter) {
+               GtkWidget *menu;
+
+               menu = GTK_WIDGET (iter->data);
+               gtk_widget_reparent(menu, main_menu);
+
+               iter = g_list_next (iter);
+       }
+       return main_menu;
+}
 
-GtkWidget*
-modest_edit_msg_window_new (ModestWidgetFactory *factory, ModestEditType type)
+ModestWindow*
+modest_edit_msg_window_new (ModestEditType type)
 {
        GObject *obj;
+       ModestWindowPrivate *parent_priv;
        ModestEditMsgWindowPrivate *priv;
+       GtkActionGroup *action_group;
+       GError *error = NULL;
 
-       g_return_val_if_fail (factory, NULL);
        g_return_val_if_fail (type < MODEST_EDIT_TYPE_NUM, NULL);
        
        obj = g_object_new(MODEST_TYPE_EDIT_MSG_WINDOW, NULL);
-       priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(obj);
 
-       g_object_ref (factory);
-       priv->factory = factory;
+       priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE (obj);
+       parent_priv = MODEST_WINDOW_GET_PRIVATE (obj);
+
+       parent_priv->ui_manager = gtk_ui_manager_new();
+       action_group = gtk_action_group_new ("ModestEditMsgWindowActions");
+
+       /* Add common actions */
+       gtk_action_group_add_actions (action_group,
+                                     modest_edit_msg_action_entries,
+                                     G_N_ELEMENTS (modest_edit_msg_action_entries),
+                                     obj);
+       gtk_action_group_add_toggle_actions (action_group,
+                                            modest_edit_msg_toggle_action_entries,
+                                            G_N_ELEMENTS (modest_edit_msg_toggle_action_entries),
+                                            obj);
+       gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
+       g_object_unref (action_group);
+
+       /* Load the UI definition */
+       gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-edit-msg-window-ui.xml", &error);
+       if (error != NULL) {
+               g_warning ("Could not merge modest-edit-msg-window-ui.xml: %s", error->message);
+               g_error_free (error);
+               error = NULL;
+       }
+
+       /* Add accelerators */
+       gtk_window_add_accel_group (GTK_WINDOW (obj), 
+                                   gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
+
+
+       /* Toolbar */
+       parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar");
+       hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (parent_priv->toolbar));
+
+       /* Menubar */
+       parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager);
+       hildon_window_set_menu (HILDON_WINDOW (obj), GTK_MENU (parent_priv->menubar));
 
+       /* Init window */
        init_window (MODEST_EDIT_MSG_WINDOW(obj));
 
        restore_settings (MODEST_EDIT_MSG_WINDOW(obj));
@@ -384,13 +297,10 @@ modest_edit_msg_window_new (ModestWidgetFactory *factory, ModestEditType type)
 
        g_signal_connect (G_OBJECT(obj), "delete-event",
                          G_CALLBACK(on_delete_event), obj);
-       
 
-       return GTK_WIDGET (obj);
+       return (ModestWindow*)obj;
 }
 
-
-
 void
 modest_edit_msg_window_set_msg (ModestEditMsgWindow *self, TnyMsg *msg)
 {
@@ -421,7 +331,7 @@ modest_edit_msg_window_set_msg (ModestEditMsgWindow *self, TnyMsg *msg)
        
        buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW(priv->msg_body));
        gtk_text_buffer_set_text (buf,
-                                 (const gchar *) modest_tny_msg_actions_find_body (msg, TRUE),
+                                 (const gchar *) modest_tny_msg_actions_find_body (msg, FALSE),
                                  -1);
 
        /* TODO: lower priority, select in the From: combo to the
@@ -430,3 +340,43 @@ modest_edit_msg_window_set_msg (ModestEditMsgWindow *self, TnyMsg *msg)
        
        /* TODO: set attachments */
 }
+
+MsgData * 
+modest_edit_msg_window_get_msg_data (ModestEditMsgWindow *edit_window)
+{
+       MsgData *data;
+       ModestAccountData *account_data;
+       GtkTextBuffer *buf;
+       GtkTextIter b, e;
+       ModestEditMsgWindowPrivate *priv;
+       
+       g_return_val_if_fail (MODEST_IS_EDIT_MSG_WINDOW (edit_window), NULL);
+
+       priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE (edit_window);
+                                                                       
+       account_data = modest_combo_box_get_active_id (MODEST_COMBO_BOX (priv->from_field));
+       buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->msg_body));        
+       gtk_text_buffer_get_bounds (buf, &b, &e);
+
+       /* don't free these (except from) */
+       data = g_slice_new0 (MsgData);
+       data->from    =  g_strdup_printf ("%s <%s>", account_data->fullname, account_data->email) ;
+       data->to      =  (gchar*) gtk_entry_get_text (GTK_ENTRY(priv->to_field));
+       data->cc      =  (gchar*) gtk_entry_get_text (GTK_ENTRY(priv->cc_field));
+       data->bcc     =  (gchar*) gtk_entry_get_text (GTK_ENTRY(priv->bcc_field));
+       data->subject =  (gchar*) gtk_entry_get_text (GTK_ENTRY(priv->subject_field));  
+       data->body    =  gtk_text_buffer_get_text (buf, &b, &e, FALSE);
+
+       return data;
+}
+
+void 
+modest_edit_msg_window_free_msg_data (ModestEditMsgWindow *edit_window,
+                                                     MsgData *data)
+{
+       g_return_if_fail (MODEST_IS_EDIT_MSG_WINDOW (edit_window));
+
+       g_free (data->from);
+       g_free (data->body);
+       g_slice_free (MsgData, data);
+}