From 7d3be1f3c8ac361b2632be2cb16ebd18fb41f3cf Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Fri, 26 Sep 2014 17:41:17 -0400
Subject: [PATCH] Fix restoring draft messages from localStorage if editor mode differs (#1490016)

---
 CHANGELOG            |    1 +
 program/js/editor.js |   30 +++++++++++++++++++++++-------
 program/js/app.js    |   10 +++++++---
 3 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 470f717..c4575e2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@
 - Support contacts import in GMail CSV format
 - Added namespace filter in Folder Manager
 - Added folder searching in Folder Manager
+- Added 'sig_max_lines' config option to default config file (#1490071)
 - Added config option/user preference to disable saving messages in localStorage (#1489979)
 - Added config option 'imap_log_session' to enable Roundcube <-> IMAP session ID logging
 - Added config option 'log_session_id' to control the lengh of the session identifer in logs
diff --git a/program/js/app.js b/program/js/app.js
index 2018cfb..eb3ff67 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3617,11 +3617,15 @@
   this.toggle_editor = function(props, obj, e)
   {
     // @todo: this should work also with many editors on page
-    var result = this.editor.toggle(props.html);
+    var result = this.editor.toggle(props.html, props.noconvert || false);
+
+    // satisfy the expectations of aftertoggle-editor event subscribers
+    props.mode = props.html ? 'html' : 'plain';
 
     if (!result && e) {
       // fix selector value if operation failed
-      $(e.target).filter('select').val(props.html ? 'plain' : 'html');
+      props.mode = props.html ? 'plain' : 'html';
+      $(e.target).filter('select').val(props.mode);
     }
 
     if (result) {
@@ -3924,7 +3928,7 @@
 
       // initialize HTML editor
       if ((formdata._is_html == '1' && !html_mode) || (formdata._is_html != '1' && html_mode)) {
-        this.command('toggle-editor', {id: this.env.composebody, html: !html_mode});
+        this.command('toggle-editor', {id: this.env.composebody, html: !html_mode, noconvert: true});
       }
     }
   };
diff --git a/program/js/editor.js b/program/js/editor.js
index b2e96d1..0facfd9 100644
--- a/program/js/editor.js
+++ b/program/js/editor.js
@@ -194,7 +194,7 @@
   };
 
   // switch html/plain mode
-  this.toggle = function(ishtml)
+  this.toggle = function(ishtml, noconvert)
   {
     var curr, content, result,
       // these non-printable chars are not removed on text2html and html2text
@@ -214,8 +214,7 @@
       if (is_sig)
         content = content.replace(signature.text, sig_mark);
 
-      // convert to html
-      result = rcmail.plain2html(content, function(data) {
+      var init_editor = function(data) {
         // replace signature mark with html version of the signature
         if (is_sig)
           data = data.replace(sig_mark, '<div id="_rc_sig">' + signature.html + '</div>');
@@ -231,7 +230,16 @@
             ref.tabindex(true);
           }
         }, 500);
-      });
+      };
+
+      // convert to html
+      if (!noconvert) {
+        result = rcmail.plain2html(content, init_editor);
+      }
+      else {
+        init_editor(content);
+        result = true;
+      }
     }
     else if (this.editor) {
       if (is_sig) {
@@ -250,8 +258,7 @@
       // get html content
       content = this.editor.getContent();
 
-      // convert html to text
-      result = rcmail.html2plain(content, function(data) {
+      var init_plaintext = function(data) {
         tinymce.execCommand('mceRemoveEditor', false, ref.id);
         ref.editor = null;
 
@@ -260,7 +267,16 @@
           data = data.replace(sig_mark, "\n" + signature.text);
 
         input.val(data).focus();
-      });
+      };
+
+      // convert html to text
+      if (!noconvert) {
+        result = rcmail.html2plain(content, init_plaintext);
+      }
+      else {
+        init_plaintext(input.val());
+        result = true;
+      }
 
       // bring back current signature
       if (!result && curr)

--
Gitblit v1.9.1