Add a way to limit the number of chars in value part of from field selector picker.
[modest] / src / hildon2 / modest-msg-edit-window.c
index 01ea821..8571461 100644 (file)
@@ -92,6 +92,7 @@
 #define IMAGE_MAX_WIDTH 560
 #define DEFAULT_FONT_SCALE 1.5
 #define ATTACHMENT_BUTTON_WIDTH 118
+#define MAX_FROM_VALUE 48
 
 static gboolean is_wp_text_buffer_started = FALSE;
 
@@ -177,6 +178,9 @@ static void font_size_clicked (GtkToolButton *button,
                               ModestMsgEditWindow *window);
 static void font_face_clicked (GtkToolButton *button,
                               ModestMsgEditWindow *window);
+static void update_signature (ModestMsgEditWindow *self,
+                             const gchar *old_account, 
+                             const gchar *new_account);
 static void DEBUG_BUFFER (WPTextBuffer *buffer)
 {
 #ifdef DEBUG
@@ -445,6 +449,45 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj)
                                   HILDON_WINDOW(obj));
 }
 
+static gchar *
+multimailbox_get_default_mailbox (const gchar *account_name)
+{
+       gchar *transport_account;
+       gchar *result = NULL;
+
+       transport_account = modest_account_mgr_get_server_account_name (modest_runtime_get_account_mgr (),
+                                                                       account_name,
+                                                                       TNY_ACCOUNT_TYPE_TRANSPORT);
+       if (transport_account) {
+               gchar *proto;
+               ModestProtocolRegistry *registry;
+
+               registry = modest_runtime_get_protocol_registry ();
+
+               proto = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), transport_account, 
+                                                      MODEST_ACCOUNT_PROTO, TRUE);
+               if (proto != NULL) {
+                       ModestProtocol *protocol = 
+                               modest_protocol_registry_get_protocol_by_name (registry,
+                                                                              MODEST_PROTOCOL_REGISTRY_TRANSPORT_PROTOCOLS,
+                                                                              proto);
+                       if (MODEST_ACCOUNT_PROTOCOL (protocol)) {
+                               ModestPairList *pair_list;
+
+                               pair_list = modest_account_protocol_get_from_list (MODEST_ACCOUNT_PROTOCOL (protocol),
+                                                                                  account_name);
+                               if (pair_list) {
+                                       ModestPair *pair = (ModestPair *) pair_list->data;
+                                       result = g_strdup ((const gchar *) pair->first);
+                                       modest_pair_list_free (pair_list);
+                               }
+                       }
+                       
+               }
+       }
+
+       return result;
+}
 
 /** 
  * @result: A ModestPairList, which must be freed with modest_pair_list_free().
@@ -465,30 +508,23 @@ get_transports (void)
 
                        gchar *transport_account;
                        gboolean multi_mailbox = FALSE;
-                       gchar *proto;
-
-                       transport_account = modest_account_mgr_get_server_account_name (modest_runtime_get_account_mgr (),
-                                                                                       account_name,
-                                                                                       TNY_ACCOUNT_TYPE_TRANSPORT);
-                       if (transport_account) {
-                               proto = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), transport_account, 
-                                                                      MODEST_ACCOUNT_PROTO, TRUE);
-                               if (proto != NULL) {
-                                       ModestProtocol *protocol = 
-                                               modest_protocol_registry_get_protocol_by_name (modest_runtime_get_protocol_registry (),
-                                                                                              MODEST_PROTOCOL_REGISTRY_TRANSPORT_PROTOCOLS,
-                                                                                              proto);
-                                       if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
-                                               ModestPairList *pair_list;
-                                               pair_list = modest_account_protocol_get_from_list (MODEST_ACCOUNT_PROTOCOL (protocol),
-                                                                                                  account_name);
-                                               if (pair_list) {
-                                                       transports = g_slist_concat (transports, pair_list);
-                                                       multi_mailbox = TRUE;
-                                               }
+                       ModestProtocol *protocol = NULL;
+
+                       if (modest_account_mgr_account_is_multimailbox (account_mgr, account_name, &protocol)) {
+
+                               transport_account = modest_account_mgr_get_server_account_name 
+                                       (modest_runtime_get_account_mgr (),
+                                        account_name,
+                                        TNY_ACCOUNT_TYPE_TRANSPORT);
+                               if (protocol && MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+                                       ModestPairList *pair_list;
+                                       pair_list = modest_account_protocol_get_from_list (MODEST_ACCOUNT_PROTOCOL (protocol),
+                                                                                          account_name);
+                                       if (pair_list) {
+                                               transports = g_slist_concat (transports, pair_list);
+                                               multi_mailbox = TRUE;
                                        }
                                }
-                               g_free (proto);
                        }
 
                        if (!multi_mailbox) {
@@ -823,6 +859,7 @@ init_window (ModestMsgEditWindow *obj)
        priv->from_field    = modest_selector_picker_new (MODEST_EDITABLE_SIZE,
                                                          HILDON_BUTTON_ARRANGEMENT_HORIZONTAL,
                                                          NULL, g_str_equal);
+       modest_selector_picker_set_value_max_chars (MODEST_SELECTOR_PICKER (priv->from_field), MAX_FROM_VALUE);
        modest_maemo_utils_set_hbutton_layout (title_size_group, value_size_group, 
                                               _("mail_va_from"), priv->from_field);
 
@@ -912,6 +949,8 @@ init_window (ModestMsgEditWindow *obj)
 /*     g_signal_connect (G_OBJECT (obj), "key_pressed", G_CALLBACK (on_key_pressed), NULL) */
 
        priv->pannable = hildon_pannable_area_new ();
+
+       g_object_set (G_OBJECT (priv->pannable), "hscrollbar-policy", GTK_POLICY_NEVER, NULL);
        
        main_vbox = gtk_vbox_new  (FALSE, DEFAULT_MAIN_VBOX_SPACING);
        window_align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
@@ -1543,9 +1582,22 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, const gchar
 
        /* Menubar. Update the state of some toggles */
        priv->from_field_protos = get_transports ();
+       priv->original_mailbox = NULL;
        modest_selector_picker_set_pair_list (MODEST_SELECTOR_PICKER (priv->from_field), priv->from_field_protos);
+       modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field), (gpointer) account_name);
+       priv->last_from_account = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field));
        if (mailbox && modest_pair_list_find_by_first_as_string (priv->from_field_protos, mailbox)) {
                modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field), (gpointer) mailbox);
+               priv->original_mailbox = g_strdup (mailbox);
+       } else if (modest_account_mgr_account_is_multimailbox (modest_runtime_get_account_mgr (), account_name, NULL)) {
+               /* We set the first mailbox as the active mailbox */
+               priv->original_mailbox = multimailbox_get_default_mailbox (account_name);
+               if (priv->original_mailbox != NULL)
+                       modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field),
+                                                             (gpointer) priv->original_mailbox);
+               else
+                       modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field),
+                                                             (gpointer) account_name);
        } else {
                modest_selector_picker_set_active_id (MODEST_SELECTOR_PICKER (priv->from_field), (gpointer) account_name);
        }
@@ -1564,10 +1616,9 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, const gchar
        restore_settings (MODEST_MSG_EDIT_WINDOW(obj));
                
        modest_window_set_active_account (MODEST_WINDOW(obj), account_name);
-       modest_window_set_active_mailbox (MODEST_WINDOW(obj), mailbox);
+       modest_window_set_active_mailbox (MODEST_WINDOW(obj), priv->original_mailbox);
 
        priv->original_account_name = (account_name) ? g_strdup (account_name) : NULL;
-       priv->original_mailbox = (mailbox) ? g_strdup (mailbox) : NULL;
 
        toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE);
        clipboard_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_CLIPBOARD, FALSE);
@@ -1660,14 +1711,15 @@ modest_msg_edit_window_get_msg_data (ModestMsgEditWindow *edit_window)
        const gchar *account_name;
        ModestMsgEditWindowPrivate *priv;
        TnyIterator *att_iter;
+       const gchar *picker_active_id;
        
        g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (edit_window), NULL);
 
        priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (edit_window);
-                                                                       
-       account_name = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field));
-       g_return_val_if_fail (account_name, NULL);
        
+       picker_active_id = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field));
+       g_return_val_if_fail (picker_active_id, NULL);
+       account_name = modest_utils_get_account_name_from_recipient (picker_active_id, NULL);
        
        /* don't free these (except from) */
        data = g_slice_new0 (MsgData);
@@ -2727,6 +2779,7 @@ font_face_clicked (GtkToolButton *button,
 
        selector = hildon_touch_selector_new ();
        renderer = gtk_cell_renderer_text_new ();
+       g_object_set (G_OBJECT (renderer), "alignment", PANGO_ALIGN_CENTER, "xalign", 0.5, NULL);
        hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (selector), priv->faces_model, 
                                             renderer, "family", 0, "text", 0, NULL);
        hildon_touch_selector_set_active (HILDON_TOUCH_SELECTOR (selector), 0, priv->current_face_index);
@@ -3287,10 +3340,10 @@ modest_msg_edit_window_is_modified (ModestMsgEditWindow *editor)
                return TRUE;
 
        account_name = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field));
-       if ((priv->original_mailbox) && 
-           (!account_name || strcmp (account_name, priv->original_mailbox)))
-               return TRUE;
-       if (!priv->original_account_name || strcmp(account_name, priv->original_account_name)) {
+       if (priv->original_mailbox) {
+               if (!account_name || strcmp (account_name, priv->original_mailbox))
+                       return TRUE;
+       } else if (!priv->original_account_name || strcmp(account_name, priv->original_account_name)) {
                return TRUE;
        }
 
@@ -3800,9 +3853,9 @@ on_account_removed (TnyAccountStore *account_store,
        }
 }
 
-static void
-from_field_changed (HildonPickerButton *button,
-                   ModestMsgEditWindow *self)
+static void update_signature (ModestMsgEditWindow *self,
+                             const gchar *old_account, 
+                             const gchar *new_account)
 {
        ModestMsgEditWindowPrivate *priv;
        gboolean has_old_signature, has_new_signature;
@@ -3814,30 +3867,54 @@ from_field_changed (HildonPickerButton *button,
 
        priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self);
 
+       gtk_text_buffer_begin_user_action (priv->text_buffer);
+
        gtk_text_buffer_get_start_iter (priv->text_buffer, &iter);
        mgr = modest_runtime_get_account_mgr ();
-       signature = modest_account_mgr_get_signature (mgr, priv->last_from_account, &has_old_signature);
-       if (has_old_signature) {
-               full_signature = g_strconcat ("\n--\n", signature, NULL);
-               if (gtk_text_iter_forward_search (&iter, full_signature, 0, &match_start, &match_end, NULL)) {
-                       gtk_text_buffer_delete (priv->text_buffer, &match_start, &match_end);
-                       iter = match_start;
-               } else if (gtk_text_iter_forward_search (&iter, _("mcen_ia_editor_original_message"), 0,
-                                                        &match_start, &match_end, NULL)) {
-                       iter = match_start;
+
+
+       if (old_account) {
+               signature = modest_account_mgr_get_signature_from_recipient (mgr, old_account, &has_old_signature);
+               if (has_old_signature) {
+                       full_signature = g_strconcat ("\n--\n", signature, NULL);
+                       if (gtk_text_iter_forward_search (&iter, full_signature, 0, &match_start, &match_end, NULL)) {
+                               gtk_text_buffer_delete (priv->text_buffer, &match_start, &match_end);
+                               iter = match_start;
+                       } else if (gtk_text_iter_forward_search (&iter, _("mcen_ia_editor_original_message"), 0,
+                                                                &match_start, &match_end, NULL)) {
+                               iter = match_start;
+                       }
+                       g_free (full_signature);
                }
-               g_free (full_signature);
+               g_free (signature);
        }
-       g_free (signature);
 
        priv->last_from_account = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field));
-       signature = modest_account_mgr_get_signature (mgr, priv->last_from_account, &has_new_signature);
+       signature = modest_account_mgr_get_signature_from_recipient (mgr, new_account, &has_new_signature);
        if (has_new_signature) {
                full_signature = g_strconcat ("\n--\n", signature, NULL);
                gtk_text_buffer_insert (priv->text_buffer, &iter, full_signature, -1);
                g_free (full_signature);
        }
        g_free (signature);
+       gtk_text_buffer_end_user_action (priv->text_buffer);
+}
+
+static void
+from_field_changed (HildonPickerButton *button,
+                   ModestMsgEditWindow *self)
+{
+       ModestMsgEditWindowPrivate *priv;
+       gchar *old_account, *new_account;
+
+       priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self);
+
+       old_account = priv->last_from_account;
+       priv->last_from_account = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (priv->from_field));
+       new_account = priv->last_from_account;
+
+       update_signature (self, old_account, new_account);
+
 }
 
 typedef struct _MessageSettingsHelper {