Add missing g_object_ref() when attaching files
[modest] / src / maemo / modest-msg-edit-window.c
index 657fd45..d2180be 100644 (file)
@@ -157,6 +157,7 @@ static void on_account_removed (TnyAccountStore *account_store,
                                TnyAccount *account,
                                gpointer user_data);
 
+static void init_window (ModestMsgEditWindow *obj);
 
 static void DEBUG_BUFFER (WPTextBuffer *buffer)
 {
@@ -315,7 +316,37 @@ save_state (ModestWindow *self)
 static void
 restore_settings (ModestMsgEditWindow *self)
 {
-       modest_widget_memory_restore (modest_runtime_get_conf(),
+       ModestConf *conf = NULL;
+       GtkAction *action;
+       ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
+
+       conf = modest_runtime_get_conf ();
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, 
+                                           "/MenuBar/ViewMenu/ShowToolbarMenu/ViewShowToolbarNormalScreenMenu");
+       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
+                                     modest_conf_get_bool (conf, MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR, NULL));
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, 
+                                           "/MenuBar/ViewMenu/ShowToolbarMenu/ViewShowToolbarFullScreenMenu");
+       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
+                                     modest_conf_get_bool (conf, MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR_FULLSCREEN, NULL));
+
+       /* set initial state of cc and bcc */
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewCcFieldMenu");
+       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
+                                              modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, NULL));
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewBccFieldMenu");
+       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
+                                              modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, NULL));
+
+       /* Dim at start clipboard actions */
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CutMenu");
+       gtk_action_set_sensitive (action, FALSE);
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CopyMenu");
+       gtk_action_set_sensitive (action, FALSE);
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/RemoveAttachmentsMenu");
+       gtk_action_set_sensitive (action, FALSE);
+
+       modest_widget_memory_restore (conf,
                                      G_OBJECT(self), MODEST_CONF_EDIT_WINDOW_KEY);
 }
 
@@ -384,6 +415,7 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj)
 
        modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
                                            GTK_WINDOW(obj),"applications_email_editor");
+       init_window (obj);
 }
 
 
@@ -460,11 +492,87 @@ void vadj_changed (GtkAdjustment *adj,
 
 
 static void
+connect_signals (ModestMsgEditWindow *obj)
+{
+       ModestMsgEditWindowPrivate *priv;
+
+       priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(obj);
+
+       g_signal_connect (G_OBJECT (priv->text_buffer), "refresh_attributes",
+                         G_CALLBACK (text_buffer_refresh_attributes), obj);
+       g_signal_connect (G_OBJECT (priv->text_buffer), "can-undo",
+                         G_CALLBACK (text_buffer_can_undo), obj);
+       g_signal_connect (G_OBJECT (priv->text_buffer), "can-redo",
+                         G_CALLBACK (text_buffer_can_redo), obj);
+       g_signal_connect (G_OBJECT (priv->text_buffer), "changed",
+                          G_CALLBACK (body_changed), obj);
+       g_signal_connect (G_OBJECT (obj), "window-state-event",
+                         G_CALLBACK (modest_msg_edit_window_window_state_event),
+                         NULL);
+       g_signal_connect_after (G_OBJECT (priv->text_buffer), "apply-tag",
+                               G_CALLBACK (text_buffer_apply_tag), obj);
+       g_signal_connect_swapped (G_OBJECT (priv->to_field), "open-addressbook", 
+                                 G_CALLBACK (modest_msg_edit_window_open_addressbook), obj);
+       g_signal_connect_swapped (G_OBJECT (priv->cc_field), "open-addressbook", 
+                                 G_CALLBACK (modest_msg_edit_window_open_addressbook), obj);
+       g_signal_connect_swapped (G_OBJECT (priv->bcc_field), "open-addressbook", 
+                                 G_CALLBACK (modest_msg_edit_window_open_addressbook), obj);
+
+       g_signal_connect (G_OBJECT (priv->add_attachment_button), "clicked",
+                         G_CALLBACK (modest_msg_edit_window_add_attachment_clicked), obj);
+
+       g_signal_connect (G_OBJECT (priv->msg_body), "focus-in-event",
+                         G_CALLBACK (msg_body_focus), obj);
+       g_signal_connect (G_OBJECT (priv->msg_body), "focus-out-event",
+                         G_CALLBACK (msg_body_focus), obj);
+       g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field))),
+                         "changed", G_CALLBACK (recpt_field_changed), obj);
+       g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field))),
+                         "changed", G_CALLBACK (recpt_field_changed), obj);
+       g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field))),
+                         "changed", G_CALLBACK (recpt_field_changed), obj);
+       g_signal_connect (G_OBJECT (priv->subject_field), "changed", G_CALLBACK (subject_field_changed), obj);
+       g_signal_connect_after (G_OBJECT (priv->subject_field), "move-cursor", G_CALLBACK (subject_field_move_cursor), obj);
+       g_signal_connect (G_OBJECT (priv->subject_field), "insert-text", G_CALLBACK (subject_field_insert_text), obj);
+
+       g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_edit_window_find_toolbar_close), obj);
+       g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_edit_window_find_toolbar_search), obj);
+
+       g_signal_connect (G_OBJECT (gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll))),
+                         "changed",
+                         G_CALLBACK (vadj_changed),
+                         obj);
+
+       priv->clipboard_change_handler_id = 
+               g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change",
+                                 G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj);
+       priv->default_clipboard_change_handler_id = 
+               g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)), "owner-change",
+                                 G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj);
+
+}
+
+static GtkWidget *
+menubar_to_menu (GtkUIManager *ui_manager)
+{
+       GtkWidget *main_menu;
+
+       /* Get the menubar from the UI manager */
+       main_menu = gtk_ui_manager_get_widget (ui_manager, "/MenuBar");
+
+       return main_menu;
+}
+
+static void
 init_window (ModestMsgEditWindow *obj)
 {
        GtkWidget *from_caption, *to_caption, *subject_caption;
        GtkWidget *main_vbox;
        ModestMsgEditWindowPrivate *priv;
+       GtkActionGroup *action_group;
+       ModestWindowPrivate *parent_priv;
+       GdkPixbuf *window_icon = NULL;
+       GError *error = NULL;
 
        GtkSizeGroup *size_group;
        GtkWidget *frame;
@@ -475,15 +583,70 @@ init_window (ModestMsgEditWindow *obj)
        GdkAtom deserialize_type;
 #endif
        priv = MODEST_MSG_EDIT_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 ("ModestMsgEditWindowActions");
+       gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
+
+       /* Add common actions */
+       gtk_action_group_add_actions (action_group,
+                                     modest_msg_edit_action_entries,
+                                     G_N_ELEMENTS (modest_msg_edit_action_entries),
+                                     obj);
+       gtk_action_group_add_toggle_actions (action_group,
+                                            modest_msg_edit_toggle_action_entries,
+                                            G_N_ELEMENTS (modest_msg_edit_toggle_action_entries),
+                                            obj);
+       gtk_action_group_add_radio_actions (action_group,
+                                           modest_msg_edit_alignment_radio_action_entries,
+                                           G_N_ELEMENTS (modest_msg_edit_alignment_radio_action_entries),
+                                           GTK_JUSTIFY_LEFT,
+                                           G_CALLBACK (modest_ui_actions_on_change_justify),
+                                           obj);
+       gtk_action_group_add_radio_actions (action_group,
+                                           modest_msg_edit_zoom_action_entries,
+                                           G_N_ELEMENTS (modest_msg_edit_zoom_action_entries),
+                                           100,
+                                           G_CALLBACK (modest_ui_actions_on_change_zoom),
+                                           obj);
+       gtk_action_group_add_radio_actions (action_group,
+                                           modest_msg_edit_priority_action_entries,
+                                           G_N_ELEMENTS (modest_msg_edit_priority_action_entries),
+                                           0,
+                                           G_CALLBACK (modest_ui_actions_msg_edit_on_change_priority),
+                                           obj);
+       gtk_action_group_add_radio_actions (action_group,
+                                           modest_msg_edit_file_format_action_entries,
+                                           G_N_ELEMENTS (modest_msg_edit_file_format_action_entries),
+                                           modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_PREFER_FORMATTED_TEXT, NULL),
+                                           G_CALLBACK (modest_ui_actions_msg_edit_on_change_file_format),
+                                           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-msg-edit-window-ui.xml",
+                                        &error);
+       if (error != NULL) {
+               g_warning ("Could not merge modest-msg-edit-window-ui.xml: %s", error->message);
+               g_clear_error (&error);
+       }
+
+       /* Add accelerators */
+       gtk_window_add_accel_group (GTK_WINDOW (obj), 
+                                   gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
+
+       /* Menubar. Update the state of some toggles */
+       parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager);
+       hildon_window_set_menu (HILDON_WINDOW (obj), GTK_MENU (parent_priv->menubar));
 
        size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 
        /* Note: This ModestPairList* must exist for as long as the combo
         * that uses it, because the ModestComboBox uses the ID opaquely, 
         * so it can't know how to manage its memory. */ 
-       priv->from_field_protos = get_transports ();
-
-       priv->from_field    = modest_combo_box_new (priv->from_field_protos, g_str_equal);
+       priv->from_field    = modest_combo_box_new (NULL, g_str_equal);
 
        priv->to_field      = modest_recpt_editor_new ();
        priv->cc_field      = modest_recpt_editor_new ();
@@ -552,46 +715,6 @@ init_window (ModestMsgEditWindow *obj)
 
 /*     g_signal_connect (G_OBJECT (obj), "key_pressed", G_CALLBACK (on_key_pressed), NULL) */
 
-       g_signal_connect (G_OBJECT (priv->text_buffer), "refresh_attributes",
-                         G_CALLBACK (text_buffer_refresh_attributes), obj);
-       g_signal_connect (G_OBJECT (priv->text_buffer), "can-undo",
-                         G_CALLBACK (text_buffer_can_undo), obj);
-       g_signal_connect (G_OBJECT (priv->text_buffer), "can-redo",
-                         G_CALLBACK (text_buffer_can_redo), obj);
-       g_signal_connect (G_OBJECT (priv->text_buffer), "changed",
-                          G_CALLBACK (body_changed), obj);
-       g_signal_connect (G_OBJECT (obj), "window-state-event",
-                         G_CALLBACK (modest_msg_edit_window_window_state_event),
-                         NULL);
-       g_signal_connect_after (G_OBJECT (priv->text_buffer), "apply-tag",
-                               G_CALLBACK (text_buffer_apply_tag), obj);
-       g_signal_connect_swapped (G_OBJECT (priv->to_field), "open-addressbook", 
-                                 G_CALLBACK (modest_msg_edit_window_open_addressbook), obj);
-       g_signal_connect_swapped (G_OBJECT (priv->cc_field), "open-addressbook", 
-                                 G_CALLBACK (modest_msg_edit_window_open_addressbook), obj);
-       g_signal_connect_swapped (G_OBJECT (priv->bcc_field), "open-addressbook", 
-                                 G_CALLBACK (modest_msg_edit_window_open_addressbook), obj);
-
-       g_signal_connect (G_OBJECT (priv->add_attachment_button), "clicked",
-                         G_CALLBACK (modest_msg_edit_window_add_attachment_clicked), obj);
-
-       g_signal_connect (G_OBJECT (priv->msg_body), "focus-in-event",
-                         G_CALLBACK (msg_body_focus), obj);
-       g_signal_connect (G_OBJECT (priv->msg_body), "focus-out-event",
-                         G_CALLBACK (msg_body_focus), obj);
-       g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field))),
-                         "changed", G_CALLBACK (recpt_field_changed), obj);
-       g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field))),
-                         "changed", G_CALLBACK (recpt_field_changed), obj);
-       g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field))),
-                         "changed", G_CALLBACK (recpt_field_changed), obj);
-       g_signal_connect (G_OBJECT (priv->subject_field), "changed", G_CALLBACK (subject_field_changed), obj);
-       g_signal_connect_after (G_OBJECT (priv->subject_field), "move-cursor", G_CALLBACK (subject_field_move_cursor), obj);
-       g_signal_connect (G_OBJECT (priv->subject_field), "insert-text", G_CALLBACK (subject_field_insert_text), obj);
-
-       g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_edit_window_find_toolbar_close), obj);
-       g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_edit_window_find_toolbar_search), obj);
-
        priv->scroll = gtk_scrolled_window_new (NULL, NULL);
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->scroll), GTK_SHADOW_NONE);
@@ -616,11 +739,13 @@ init_window (ModestMsgEditWindow *obj)
        gtk_container_add (GTK_CONTAINER(obj), window_box);
        priv->scroll_area = modest_scroll_area_new (priv->scroll, priv->msg_body);
        gtk_container_add (GTK_CONTAINER (frame), priv->scroll_area);
-       
-       priv->clipboard_change_handler_id = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change",
-                                                             G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj);
-       priv->default_clipboard_change_handler_id = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)), "owner-change",
-                                                                     G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj);
+
+       /* Set window icon */
+       window_icon = modest_platform_get_icon (MODEST_APP_MSG_EDIT_ICON);
+       if (window_icon) {
+               gtk_window_set_icon (GTK_WINDOW (obj), window_icon);
+               g_object_unref (window_icon);
+       }
 
 }
        
@@ -679,10 +804,14 @@ modest_msg_edit_window_finalize (GObject *obj)
                g_object_unref (priv->outbox_msg);
                priv->outbox_msg = NULL;
        }
-       if (priv->msg_uid != NULL) {
-               g_free (priv->msg_uid);
-               priv->msg_uid = NULL;
-       }
+       g_free (priv->msg_uid);
+       g_free (priv->last_search);
+       g_slist_free (priv->font_items_group);
+       g_slist_free (priv->size_items_group);
+       g_list_foreach (priv->attachments, (GFunc) g_object_unref, NULL);
+       g_list_free (priv->attachments);
+       g_list_foreach (priv->images, (GFunc) g_object_unref, NULL);
+       g_list_free (priv->images);
 
        /* This had to stay alive for as long as the combobox that used it: */
        modest_pair_list_free (priv->from_field_protos);
@@ -690,31 +819,6 @@ modest_msg_edit_window_finalize (GObject *obj)
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
-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;
-}
-
 static GdkPixbuf *
 pixbuf_from_stream (TnyStream *stream, const gchar *mime_type)
 {
@@ -1180,100 +1284,34 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre
        GObject *obj;
        ModestWindowPrivate *parent_priv;
        ModestMsgEditWindowPrivate *priv;
-       GtkActionGroup *action_group;
-       GError *error = NULL;
-       GdkPixbuf *window_icon = NULL;
-       GtkAction *action;
-       ModestConf *conf;
        ModestPair *account_pair = NULL;
        ModestDimmingRulesGroup *menu_rules_group = NULL;
        ModestDimmingRulesGroup *toolbar_rules_group = NULL;
        ModestDimmingRulesGroup *clipboard_rules_group = NULL;
+       ModestWindowMgr *mgr = NULL;
 
        g_return_val_if_fail (msg, NULL);
        g_return_val_if_fail (account_name, NULL);
+
+       mgr = modest_runtime_get_window_mgr ();
        
-       obj = g_object_new(MODEST_TYPE_MSG_EDIT_WINDOW, NULL);
+       obj = G_OBJECT (modest_window_mgr_get_msg_edit_window (mgr));
 
        priv = MODEST_MSG_EDIT_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 ("ModestMsgEditWindowActions");
-       gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
-
-       /* Add common actions */
-       gtk_action_group_add_actions (action_group,
-                                     modest_msg_edit_action_entries,
-                                     G_N_ELEMENTS (modest_msg_edit_action_entries),
-                                     obj);
-       gtk_action_group_add_toggle_actions (action_group,
-                                            modest_msg_edit_toggle_action_entries,
-                                            G_N_ELEMENTS (modest_msg_edit_toggle_action_entries),
-                                            obj);
-       gtk_action_group_add_radio_actions (action_group,
-                                           modest_msg_edit_alignment_radio_action_entries,
-                                           G_N_ELEMENTS (modest_msg_edit_alignment_radio_action_entries),
-                                           GTK_JUSTIFY_LEFT,
-                                           G_CALLBACK (modest_ui_actions_on_change_justify),
-                                           obj);
-       gtk_action_group_add_radio_actions (action_group,
-                                           modest_msg_edit_zoom_action_entries,
-                                           G_N_ELEMENTS (modest_msg_edit_zoom_action_entries),
-                                           100,
-                                           G_CALLBACK (modest_ui_actions_on_change_zoom),
-                                           obj);
-       gtk_action_group_add_radio_actions (action_group,
-                                           modest_msg_edit_priority_action_entries,
-                                           G_N_ELEMENTS (modest_msg_edit_priority_action_entries),
-                                           0,
-                                           G_CALLBACK (modest_ui_actions_msg_edit_on_change_priority),
-                                           obj);
-       gtk_action_group_add_radio_actions (action_group,
-                                           modest_msg_edit_file_format_action_entries,
-                                           G_N_ELEMENTS (modest_msg_edit_file_format_action_entries),
-                                           modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_PREFER_FORMATTED_TEXT, NULL),
-                                           G_CALLBACK (modest_ui_actions_msg_edit_on_change_file_format),
-                                           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-msg-edit-window-ui.xml",
-                                        &error);
-       if (error != NULL) {
-               g_warning ("Could not merge modest-msg-edit-window-ui.xml: %s", error->message);
-               g_clear_error (&error);
-       }
-
-       /* Add accelerators */
-       gtk_window_add_accel_group (GTK_WINDOW (obj), 
-                                   gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
-
-       /* Menubar. Update the state of some toggles */
-       parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager);
-       conf = modest_runtime_get_conf ();
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, 
-                                           "/MenuBar/ViewMenu/ShowToolbarMenu/ViewShowToolbarNormalScreenMenu");
-       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
-                                     modest_conf_get_bool (conf, MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR, NULL));
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, 
-                                           "/MenuBar/ViewMenu/ShowToolbarMenu/ViewShowToolbarFullScreenMenu");
-       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
-                                     modest_conf_get_bool (conf, MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR_FULLSCREEN, NULL));
-
-       hildon_window_set_menu (HILDON_WINDOW (obj), GTK_MENU (parent_priv->menubar));
+       priv->from_field_protos = get_transports ();
+       modest_combo_box_set_pair_list (MODEST_COMBO_BOX (priv->from_field), priv->from_field_protos);
+       modest_msg_edit_window_setup_toolbar (MODEST_MSG_EDIT_WINDOW (obj));
+       hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar));
 
        /* Init window */
-       init_window (MODEST_MSG_EDIT_WINDOW(obj));
+       connect_signals (MODEST_MSG_EDIT_WINDOW(obj));
 
        restore_settings (MODEST_MSG_EDIT_WINDOW(obj));
                
        modest_window_set_active_account (MODEST_WINDOW(obj), account_name);
 
-       modest_msg_edit_window_setup_toolbar (MODEST_MSG_EDIT_WINDOW (obj));
-       hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar));
-
        account_pair = modest_pair_list_find_by_first_as_string (priv->from_field_protos, account_name);
        if (account_pair != NULL)
                modest_combo_box_set_active_id (MODEST_COMBO_BOX (priv->from_field), account_pair->first);
@@ -1317,32 +1355,7 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre
 
        text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (obj));
 
-       /* Set window icon */
-       window_icon = modest_platform_get_icon (MODEST_APP_MSG_EDIT_ICON);
-       if (window_icon) {
-               gtk_window_set_icon (GTK_WINDOW (obj), window_icon);
-               g_object_unref (window_icon);
-       }
-
         modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj));
-        modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), "ModestClipboardDimmingRules");
-
-       /* Dim at start clipboard actions */
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CutMenu");
-       gtk_action_set_sensitive (action, FALSE);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CopyMenu");
-       gtk_action_set_sensitive (action, FALSE);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/RemoveAttachmentsMenu");
-       gtk_action_set_sensitive (action, FALSE);
-
-       /* set initial state of cc and bcc */
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewCcFieldMenu");
-       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
-                                              modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, NULL));
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewBccFieldMenu");
-       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
-                                              modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, NULL));
-
        modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), "ModestClipboardDimmingRules");
        priv->update_caption_visibility = TRUE;
 
@@ -1498,6 +1511,7 @@ modest_msg_edit_window_free_msg_data (ModestMsgEditWindow *edit_window,
        g_free (data->to);
        g_free (data->cc);
        g_free (data->bcc);
+       g_free (data->from);
        g_free (data->subject);
        g_free (data->plain_body);
        g_free (data->html_body);
@@ -1753,22 +1767,42 @@ modest_msg_edit_window_select_color (ModestMsgEditWindow *window)
        hildon_color_selector_set_color (HILDON_COLOR_SELECTOR (dialog), &(buffer_format->color));
        g_free (buffer_format);
 
-       response = gtk_dialog_run (GTK_DIALOG (dialog));
-       switch (response) {
-       case GTK_RESPONSE_OK: {
+       if (gtk_dialog_run (GTK_DIALOG (dialog) == GTK_RESPONSE_OK)) {
                new_color = hildon_color_selector_get_color (HILDON_COLOR_SELECTOR (dialog));
-       }
-               break;
-       default:
-               break;
+               if (new_color != NULL) {
+                       wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FORECOLOR,
+                                                     (gpointer) new_color);
+               }
        }
        gtk_widget_destroy (dialog);
+}
+
+
+void
+modest_msg_edit_window_select_background_color (ModestMsgEditWindow *window)
+{
+       
+       ModestMsgEditWindowPrivate *priv;
+       GtkWidget *dialog = NULL;
+       gint response;
+       GdkColor *old_color = NULL;
+       const GdkColor *new_color = NULL;
+       
+       priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
+       old_color = (GdkColor*)wp_text_buffer_get_background_color (WP_TEXT_BUFFER (priv->text_buffer));
        
-       if (new_color != NULL) {
-               wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FORECOLOR, (gpointer) new_color);
-               /* FIXME: free new_color here? */
+       dialog = hildon_color_selector_new (GTK_WINDOW (window));
+       hildon_color_selector_set_color (HILDON_COLOR_SELECTOR (dialog),(GdkColor*)old_color);
+
+       if (gtk_dialog_run (GTK_DIALOG (dialog) == GTK_RESPONSE_OK)) {
+               new_color = hildon_color_selector_get_color (HILDON_COLOR_SELECTOR (dialog));
+               if (new_color != NULL)
+                       wp_text_buffer_set_background_color (WP_TEXT_BUFFER (priv->text_buffer), new_color);
        }
+       gtk_widget_destroy (dialog);
+
 }
+
 #else 
 void
 modest_msg_edit_window_select_color (ModestMsgEditWindow *window)
@@ -1777,9 +1811,6 @@ modest_msg_edit_window_select_color (ModestMsgEditWindow *window)
        WPTextBufferFormat *buffer_format = g_new0 (WPTextBufferFormat, 1);
        ModestMsgEditWindowPrivate *priv;
        GtkWidget *dialog = NULL;
-       gint response;
-       const GdkColor *new_color = NULL;
-       GdkColor col;
 
        priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
        wp_text_buffer_get_attributes (WP_TEXT_BUFFER (priv->text_buffer), buffer_format, FALSE);
@@ -1788,24 +1819,15 @@ modest_msg_edit_window_select_color (ModestMsgEditWindow *window)
        hildon_color_chooser_set_color (HILDON_COLOR_CHOOSER (dialog), &(buffer_format->color));
        g_free (buffer_format);
 
-       response = gtk_dialog_run (GTK_DIALOG (dialog));
-       switch (response) {
-       case GTK_RESPONSE_OK: {
+       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
+               GdkColor col;
                hildon_color_chooser_get_color (HILDON_COLOR_CHOOSER(dialog), &col);
-               new_color = &col;
-       }
-               
-               break;
-       default:
-               break;
+               wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FORECOLOR,
+                                             (gpointer) &col);
        }
        gtk_widget_destroy (dialog);
-       if (new_color != NULL)
-               wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FORECOLOR,
-                                             (gpointer) new_color);
 }
 
-#endif /*!MODEST_HILDON_VERSION_0*/
 
 void
 modest_msg_edit_window_select_background_color (ModestMsgEditWindow *window)
@@ -1813,42 +1835,25 @@ modest_msg_edit_window_select_background_color (ModestMsgEditWindow *window)
        
        ModestMsgEditWindowPrivate *priv;
        GtkWidget *dialog = NULL;
-       gint response;
        GdkColor *old_color = NULL;
-       const GdkColor *new_color = NULL;
        
        priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
        old_color = (GdkColor*)wp_text_buffer_get_background_color (WP_TEXT_BUFFER (priv->text_buffer));
        
-#ifdef MODEST_HILDON_VERSION_0 
-       dialog = hildon_color_selector_new (GTK_WINDOW (window));
-       hildon_color_selector_set_color (HILDON_COLOR_SELECTOR (dialog),(GdkColor*)old_color);
-#else
        dialog = hildon_color_chooser_new ();
        hildon_color_chooser_set_color (HILDON_COLOR_CHOOSER (dialog),(GdkColor*)old_color);
-#endif /*MODEST_HILDON_VERSION_9*/             
 
-       response = gtk_dialog_run (GTK_DIALOG (dialog));
-       switch (response) {
-       case GTK_RESPONSE_OK: {
-#ifdef MODEST_HILDON_VERSION_0
-               new_color = hildon_color_selector_get_color (HILDON_COLOR_SELECTOR (dialog));
-#else
+       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { 
                GdkColor col;
                hildon_color_chooser_get_color (HILDON_COLOR_CHOOSER(dialog), &col);
-               new_color = &col;
-#endif /*MODEST_HILDON_VERSION_0*/
-          }
-               break;
-       default:
-               break;
+               wp_text_buffer_set_background_color (WP_TEXT_BUFFER (priv->text_buffer), &col);
        }
        gtk_widget_destroy (dialog);
+}
+
+#endif /*!MODEST_HILDON_VERSION_0*/
 
-       if (new_color != NULL)
-               wp_text_buffer_set_background_color (WP_TEXT_BUFFER (priv->text_buffer), new_color);
 
-}
 
 static TnyStream* create_stream_for_uri (const gchar* uri)
 {
@@ -1961,16 +1966,12 @@ modest_msg_edit_window_insert_image (ModestMsgEditWindow *window)
 
 void
 modest_msg_edit_window_offer_attach_file (ModestMsgEditWindow *window)
-{
-       
-       ModestMsgEditWindowPrivate *priv;
+{      
        GtkWidget *dialog = NULL;
        gint response = 0;
        GSList *uris = NULL;
        GSList *uri_node;
        
-       priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
-       
        dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), GTK_FILE_CHOOSER_ACTION_OPEN);
        gtk_window_set_title (GTK_WINDOW (dialog), _("mcen_ti_select_attachment_title"));
        gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE);
@@ -2046,7 +2047,7 @@ modest_msg_edit_window_attach_file_one (
                tny_mime_part_set_filename (mime_part, basename);
                g_free (basename);
                
-               priv->attachments = g_list_prepend (priv->attachments, mime_part);
+               priv->attachments = g_list_prepend (priv->attachments, g_object_ref(mime_part));
                modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
                                                        mime_part);
                gtk_widget_set_no_show_all (priv->attachments_caption, FALSE);
@@ -3222,7 +3223,6 @@ modest_msg_edit_window_set_draft (ModestMsgEditWindow *window,
        ModestWindowMgr *mgr = modest_runtime_get_window_mgr ();
 
        if (priv->draft_msg != NULL) {
-               modest_window_mgr_unregister_window (mgr, MODEST_WINDOW (window));
                g_object_unref (priv->draft_msg);
        }