* Added new store actions: create/remove/rename/delete folder
[modest] / src / gtk / modest-edit-msg-window.c
index d09f149..d6baa82 100644 (file)
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-
+#include <glib/gi18n.h>
+#include <tny-account-store.h>
 #include "modest-edit-msg-window.h"
-#include <widgets/modest-msg-view.h>
-#include <modest-widget-memory.h>
-#include <modest-widget-factory.h>
-#include "modest-icon-names.h"
-#include <modest-tny-transport-actions.h>
+#include "modest-widget-memory.h"
+#include "modest-mail-operation.h"
+#include "modest-tny-platform-factory.h"
+#include "modest-tny-msg-actions.h"
+#include <tny-simple-list.h>
 
 static void  modest_edit_msg_window_class_init   (ModestEditMsgWindowClass *klass);
 static void  modest_edit_msg_window_init         (ModestEditMsgWindow *obj);
@@ -48,12 +49,12 @@ enum {
 typedef struct _ModestEditMsgWindowPrivate ModestEditMsgWindowPrivate;
 struct _ModestEditMsgWindowPrivate {
 
-       ModestConf *conf;
        ModestWidgetFactory *factory;
+       TnyPlatformFactory *fact;
        
        GtkWidget      *toolbar, *menubar;
        GtkWidget      *msg_body;
-       GtkWidget      *to_field, *cc_field, *bcc_field,
+       GtkWidget      *from_field, *to_field, *cc_field, *bcc_field,
                       *subject_field;
 };
 #define MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
@@ -114,6 +115,7 @@ 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;
@@ -125,9 +127,12 @@ static void
 save_settings (ModestEditMsgWindow *self)
 {
        ModestEditMsgWindowPrivate *priv;
+       ModestConf *conf;
+
        priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(self);
-       modest_widget_memory_save_settings (priv->conf,
-                                           GTK_WIDGET(self),
+       conf = modest_tny_platform_factory_get_modest_conf_instance (priv->fact);
+
+       modest_widget_memory_save_settings (conf, GTK_WIDGET(self),
                                            "modest-edit-msg-window");
 }
 
@@ -136,8 +141,12 @@ static void
 restore_settings (ModestEditMsgWindow *self)
 {
        ModestEditMsgWindowPrivate *priv;
+       ModestConf *conf;
+
        priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(self);
-       modest_widget_memory_restore_settings (priv->conf, GTK_WIDGET(self),
+       conf = modest_tny_platform_factory_get_modest_conf_instance (priv->fact);
+
+       modest_widget_memory_restore_settings (conf, GTK_WIDGET(self),
                                               "modest-edit-msg-window");
 }
 
@@ -156,42 +165,42 @@ on_menu_quit (ModestEditMsgWindow *self, guint action, GtkWidget *widget)
 
 /* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */
 static GtkItemFactoryEntry menu_items[] = {
-       { "/_File",             NULL,                   NULL,           0, "<Branch>" },
+       { "/_File",             NULL,                   NULL,           0, "<Branch>" ,NULL},
        { "/File/_New",         "<control>N",           NULL,           0, "<StockItem>", GTK_STOCK_NEW },
        { "/File/_Open",        "<control>O",           NULL,           0, "<StockItem>", GTK_STOCK_OPEN },
        { "/File/_Save",        "<control>S",           NULL,           0, "<StockItem>", GTK_STOCK_SAVE },
-       { "/File/Save _As",     NULL,                   NULL,           0, "<Item>" },
-       { "/File/Save Draft",   "<control><shift>S",    NULL,           0, "<Item>" },
+       { "/File/Save _As",     NULL,                   NULL,           0, "<Item>", NULL} ,
+       { "/File/Save Draft",   "<control><shift>S",    NULL,           0, "<Item>",NULL },
 
 
-       { "/File/sep1",         NULL,                   NULL,           0, "<Separator>" },
+       { "/File/sep1",         NULL,                   NULL,           0, "<Separator>" ,NULL },
        { "/File/_Quit",        "<CTRL>Q",              on_menu_quit,   0, "<StockItem>", GTK_STOCK_QUIT },
 
-       { "/_Edit",             NULL,                   NULL,           0, "<Branch>" },
+       { "/_Edit",             NULL,                   NULL,           0, "<Branch>" ,NULL },
        { "/Edit/_Undo",        "<CTRL>Z",              NULL,           0, "<StockItem>", GTK_STOCK_UNDO },
        { "/Edit/_Redo",        "<shift><CTRL>Z",       NULL,           0, "<StockItem>", GTK_STOCK_REDO },
-       { "/File/sep1",         NULL,                   NULL,           0, "<Separator>" },
+       { "/File/sep1",         NULL,                   NULL,           0, "<Separator>",NULL },
        { "/Edit/Cut",          "<control>X",           NULL,           0, "<StockItem>", GTK_STOCK_CUT  },
        { "/Edit/Copy",         "<CTRL>C",              NULL,           0, "<StockItem>", GTK_STOCK_COPY },
        { "/Edit/Paste",        NULL,                   NULL,           0, "<StockItem>", GTK_STOCK_PASTE},
-       { "/Edit/sep1",         NULL,                   NULL,           0, "<Separator>" },
-       { "/Edit/Delete",       "<CTRL>Q",              NULL,           0, "<Item>" },
-       { "/Edit/Select all",   "<CTRL>A",              NULL,           0, "<Item>" },
-       { "/Edit/Deselect all",  "<Shift><CTRL>A",      NULL,           0, "<Item>" },
+       { "/Edit/sep1",         NULL,                   NULL,           0, "<Separator>",NULL },
+       { "/Edit/Delete",       "<CTRL>Q",              NULL,           0, "<Item>" ,NULL },
+       { "/Edit/Select all",   "<CTRL>A",              NULL,           0, "<Item>" ,NULL },
+       { "/Edit/Deselect all",  "<Shift><CTRL>A",      NULL,           0, "<Item>",NULL },
 
-       { "/_View",             NULL,           NULL,           0, "<Branch>" },
-       { "/View/To-field",          NULL,              NULL,           0, "<CheckItem>" },
+       { "/_View",             NULL,           NULL,                   0, "<Branch>",NULL },
+       { "/View/To-field",          NULL,              NULL,           0, "<CheckItem>",NULL },
        
-       { "/View/Cc-field:",          NULL,             NULL,           0, "<CheckItem>" },
-       { "/View/Bcc-field:",          NULL,            NULL,           0, "<CheckItem>" },
+       { "/View/Cc-field:",          NULL,             NULL,           0, "<CheckItem>",NULL },
+       { "/View/Bcc-field:",          NULL,            NULL,           0, "<CheckItem>",NULL },
        
        
-       { "/_Insert",             NULL,         NULL,           0, "<Branch>" },
+       { "/_Insert",             NULL,         NULL,           0, "<Branch>",NULL },
 /*     { "/Actions/_Reply",    NULL,                   NULL,           0, "<Item>" }, */
 /*     { "/Actions/_Forward",  NULL,                   NULL,           0, "<Item>" }, */
 /*     { "/Actions/_Bounce",   NULL,                   NULL,           0, "<Item>" },   */
        
-       { "/_Format",            NULL,                  NULL,           0, "<Branch>" }
+       { "/_Format",            NULL,                  NULL,           0, "<Branch>",NULL }
 /*     { "/Options/_Accounts",  NULL,                  on_menu_accounts,0, "<Item>" }, */
 /*     { "/Options/_Contacts",  NULL,                  NULL,           0, "<Item>" }, */
 
@@ -232,22 +241,26 @@ menubar_new (ModestEditMsgWindow *self)
 static void
 send_mail (ModestEditMsgWindow *self)
 {
-       const gchar *from, *to, *cc, *bcc, *subject;
-       gchar *body;
+       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);
-
-       /* don't free these */
-       from = "djcb@djcbsoftware.nl";
-       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));
-       to   =  gtk_entry_get_text (GTK_ENTRY(priv->subject_field));
-
+       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));
        
@@ -255,9 +268,39 @@ send_mail (ModestEditMsgWindow *self)
        body  = gtk_text_buffer_get_text (buf, &b, &e,
                                          FALSE); /* free this one */
 
-//     modest_tny_transport_actions_send_message (transport_account,
-//                                                from, to, cc, bcc,
-//                                                subject, *body, NULL);
+       /* 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 (TNY_ACCOUNT (transport_account));
+
+       modest_mail_operation_send_new_mail (mail_operation,
+                                            from, to, cc, bcc,
+                                            subject, body, NULL);
+       /* Clean up */
+       g_object_unref (mail_operation);
+       g_free (from);
        g_free (body);
 }
 
@@ -319,7 +362,7 @@ toolbar_new (ModestEditMsgWindow *self)
 static void
 init_window (ModestEditMsgWindow *obj)
 {
-       GtkWidget *to_button, *cc_button, *bcc_button, *subject_label; 
+       GtkWidget *to_button, *cc_button, *bcc_button; 
        GtkWidget *header_table;
        GtkWidget *main_vbox;
        
@@ -329,27 +372,29 @@ init_window (ModestEditMsgWindow *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..."));
-       subject_label = gtk_label_new (_("Subject:"));
-       
+
+       priv->from_field    = modest_widget_factory_get_combo_box (priv->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);
-
-       header_table = gtk_table_new (4,2, FALSE);
-       gtk_table_attach (GTK_TABLE(header_table), to_button,     0,1,0,1,
-                         GTK_SHRINK, 0, 0, 0);
-       gtk_table_attach (GTK_TABLE(header_table), cc_button,     0,1,1,2,
-                         GTK_SHRINK, 0, 0, 0);
-       gtk_table_attach (GTK_TABLE(header_table), bcc_button,    0,1,2,3,
-                         GTK_SHRINK, 0, 0, 0);
-       gtk_table_attach (GTK_TABLE(header_table), subject_label, 0,1,3,4,
-                         GTK_SHRINK, 0, 0, 0);
-       gtk_table_attach_defaults (GTK_TABLE(header_table), priv->to_field,     1,2,0,1);
-       gtk_table_attach_defaults (GTK_TABLE(header_table), priv->cc_field,     1,2,1,2);
-       gtk_table_attach_defaults (GTK_TABLE(header_table), priv->bcc_field,    1,2,2,3);
-       gtk_table_attach_defaults (GTK_TABLE(header_table), priv->subject_field,1,2,3,4);
+       
+       header_table = gtk_table_new (5,2, FALSE);
+       
+       gtk_table_attach (GTK_TABLE(header_table), gtk_label_new (_("From:")),
+                         0,1,0,1, GTK_SHRINK, 0, 0, 0);
+       gtk_table_attach (GTK_TABLE(header_table), to_button,     0,1,1,2, GTK_SHRINK, 0, 0, 0);
+       gtk_table_attach (GTK_TABLE(header_table), cc_button,     0,1,2,3, GTK_SHRINK, 0, 0, 0);
+       gtk_table_attach (GTK_TABLE(header_table), bcc_button,    0,1,3,4, GTK_SHRINK, 0, 0, 0);
+       gtk_table_attach (GTK_TABLE(header_table), gtk_label_new (_("Subject:")),
+                         0,1,4,5, GTK_SHRINK, 0, 0, 0);
+
+       gtk_table_attach_defaults (GTK_TABLE(header_table), priv->from_field,   1,2,0,1);
+       gtk_table_attach_defaults (GTK_TABLE(header_table), priv->to_field,     1,2,1,2);
+       gtk_table_attach_defaults (GTK_TABLE(header_table), priv->cc_field,     1,2,2,3);
+       gtk_table_attach_defaults (GTK_TABLE(header_table), priv->bcc_field,    1,2,3,4);
+       gtk_table_attach_defaults (GTK_TABLE(header_table), priv->subject_field,1,2,4,5);
 
        priv->msg_body = gtk_text_view_new ();
        
@@ -376,9 +421,6 @@ modest_edit_msg_window_finalize (GObject *obj)
 
        priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(obj);
 
-       g_object_unref (G_OBJECT(priv->conf));
-       priv->conf = NULL;
-
        g_object_unref (G_OBJECT(priv->factory));
        priv->factory = NULL;
        
@@ -397,24 +439,20 @@ on_delete_event (GtkWidget *widget, GdkEvent *event, ModestEditMsgWindow *self)
 
 
 GtkWidget*
-modest_edit_msg_window_new (ModestConf *conf, ModestWidgetFactory *factory,
-                           ModestEditType type, TnyMsgIface *msg)
+modest_edit_msg_window_new (ModestWidgetFactory *factory,
+                           ModestEditType type, TnyMsg *msg)
 {
        GObject *obj;
        ModestEditMsgWindowPrivate *priv;
 
-       g_return_val_if_fail (conf, NULL);
        g_return_val_if_fail (factory, NULL);
-       g_return_val_if_fail (type >= 0 && type < MODEST_EDIT_TYPE_NUM, NULL);
+       g_return_val_if_fail (type < MODEST_EDIT_TYPE_NUM, NULL);
        g_return_val_if_fail (!(type==MODEST_EDIT_TYPE_NEW && msg), NULL); 
        g_return_val_if_fail (!(type!=MODEST_EDIT_TYPE_NEW && !msg), NULL);     
        
        obj = g_object_new(MODEST_TYPE_EDIT_MSG_WINDOW, NULL);
        priv = MODEST_EDIT_MSG_WINDOW_GET_PRIVATE(obj);
 
-       g_object_ref (G_OBJECT(conf));
-       priv->conf = conf;
-
        g_object_ref (factory);
        priv->factory = factory;
 
@@ -429,5 +467,31 @@ modest_edit_msg_window_new (ModestConf *conf, ModestWidgetFactory *factory,
        g_signal_connect (G_OBJECT(obj), "delete-event",
                          G_CALLBACK(on_delete_event), obj);
        
+       if (msg) {
+               /* Testing code. Should be into a set_msg method */
+               TnyHeader *header;
+               GtkTextBuffer *buf;
+
+               header = tny_msg_get_header (msg);
+               gtk_entry_set_text (GTK_ENTRY(priv->to_field),
+                                   tny_header_get_to (header));
+               gtk_entry_set_text (GTK_ENTRY(priv->cc_field),
+                                   tny_header_get_cc (header));
+               gtk_entry_set_text (GTK_ENTRY(priv->bcc_field),
+                                   tny_header_get_bcc (header));
+               gtk_entry_set_text (GTK_ENTRY(priv->subject_field),
+                                   tny_header_get_subject (header));   
+
+               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, FALSE),
+                                         -1);
+
+               /* TODO: lower priority, select in the From: combo to
+                  the value that comes from msg */
+
+               /* TODO: set attachments */
+       }
+
        return GTK_WIDGET (obj);
 }