From a02c77c584906f629d382409e76f0df4d2cfaf01 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 15 Mar 2013 05:30:53 -0400
Subject: [PATCH] Add ability to toggle between view as HTML and text while viewing a message (#1486939)

---
 skins/classic/images/icons/html.png         |    0 
 CHANGELOG                                   |    1 
 skins/classic/mail.css                      |   19 ++++++---
 program/steps/mail/compose.inc              |   19 +++++++--
 program/localization/en_US/labels.inc       |    2 +
 skins/classic/templates/message.html        |    8 ++++
 program/steps/mail/show.inc                 |   27 +++++++++++--
 skins/classic/images/icons/text.png         |    0 
 program/js/app.js                           |   13 ++++++
 skins/classic/templates/messagepreview.html |   10 ++++
 10 files changed, 81 insertions(+), 18 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 6d0a959..42d6cc7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Add ability to toggle between HTML and text while viewing a message (#1486939)
 - Better handling of session errors in ajax requests (#1488960)
 - Fix HTML part detection for some specific message structures (#1488992)
 - Don't show fake address - phishing prevention (#1488981)
diff --git a/program/js/app.js b/program/js/app.js
index 637d6f5..d3c319e 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -229,7 +229,7 @@
         this.env.message_commands = ['show', 'reply', 'reply-all', 'reply-list',
           'moveto', 'copy', 'delete', 'open', 'mark', 'edit', 'viewsource',
           'print', 'load-attachment', 'download-attachment', 'show-headers', 'hide-headers', 'download',
-          'forward', 'forward-inline', 'forward-attachment'];
+          'forward', 'forward-inline', 'forward-attachment', 'change-format'];
 
         if (this.env.action == 'show' || this.env.action == 'preview') {
           this.enable_command(this.env.message_commands, this.env.uid);
@@ -608,6 +608,17 @@
         }
         break;
 
+      case 'change-format':
+        url = this.env.permaurl + '&_format=' + props;
+
+        if (this.env.action == 'preview')
+          url = url.replace(/_action=show/, '_action=preview') + '&_framed=1';
+        if (this.env.extwin)
+          url += '&_extwin=1';
+
+        location.href = url;
+        break;
+
       case 'menu-open':
         if (props && props.menu == 'attachmentmenu') {
           var mimetype = this.env.attachments[props.id];
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 61a13e9..252e0ce 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -205,6 +205,8 @@
 
 $labels['openinextwin'] = 'Open in new window';
 $labels['emlsave'] = 'Download (.eml)';
+$labels['changeformattext'] = 'Display in plain text format';
+$labels['changeformathtml'] = 'Display in HTML format';
 
 // message compose
 $labels['editasnew']      = 'Edit as new';
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 6402724..6a579f7 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -183,9 +183,18 @@
 
 if (!empty($msg_uid) && empty($COMPOSE['as_attachment']))
 {
-  // similar as in program/steps/mail/show.inc
-  // re-set 'prefer_html' to have possibility to use html part for compose
-  $CONFIG['prefer_html'] = $CONFIG['prefer_html'] || $CONFIG['htmleditor'] || $compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT;
+  $mbox_name = $RCMAIL->storage->get_folder();
+
+  // set format before rcube_message construction
+  // use the same format as for the message view
+  if (isset($_SESSION['msg_formats'][$mbox_name.':'.$msg_uid])) {
+    $RCMAIL->config->set('prefer_html', $_SESSION['msg_formats'][$mbox_name.':'.$msg_uid]);
+  }
+  else {
+    $prefer_html = $CONFIG['prefer_html'] || $CONFIG['htmleditor'] || $compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT;
+    $RCMAIL->config->set('prefer_html', $prefer_html);
+  }
+
   $MESSAGE = new rcube_message($msg_uid);
 
   // make sure message is marked as read
@@ -538,8 +547,8 @@
 
 function rcmail_message_is_html()
 {
-    global $MESSAGE;
-    return ($MESSAGE instanceof rcube_message) && $MESSAGE->has_html_part(true);
+    global $RCMAIL, $MESSAGE;
+    return $RCMAIL->config->get('prefer_html') && ($MESSAGE instanceof rcube_message) && $MESSAGE->has_html_part(true);
 }
 
 function rcmail_prepare_message_body()
diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc
index 87555cb..552c180 100644
--- a/program/steps/mail/show.inc
+++ b/program/steps/mail/show.inc
@@ -19,7 +19,7 @@
  +-----------------------------------------------------------------------+
 */
 
-$PRINT_MODE = $RCMAIL->action=='print' ? TRUE : FALSE;
+$PRINT_MODE = $RCMAIL->action == 'print' ? TRUE : FALSE;
 
 // Read browser capabilities and store them in session
 if ($caps = get_input_value('_caps', RCUBE_INPUT_GET)) {
@@ -31,8 +31,21 @@
   $_SESSION['browser_caps'] = $browser_caps;
 }
 
+$uid       = get_input_value('_uid', RCUBE_INPUT_GET);
+$mbox_name = $RCMAIL->storage->get_folder();
+
 // similar code as in program/steps/mail/get.inc
-if ($uid = get_input_value('_uid', RCUBE_INPUT_GET)) {
+if ($uid) {
+  // set message format (need to be done before rcube_message construction)
+  if (!empty($_GET['_format'])) {
+    $prefer_html = $_GET['_format'] == 'html';
+    $RCMAIL->config->set('prefer_html', $prefer_html);
+    $_SESSION['msg_formats'][$mbox_name.':'.$uid] = $prefer_html;
+  }
+  else if (isset($_SESSION['msg_formats'][$mbox_name.':'.$uid])) {
+    $RCMAIL->config->set('prefer_html', $_SESSION['msg_formats'][$mbox_name.':'.$uid]);
+  }
+
   $MESSAGE = new rcube_message($uid);
 
   // if message not found (wrong UID)...
@@ -40,7 +53,6 @@
     rcmail_message_error($uid);
   }
 
-  $mbox_name = $RCMAIL->storage->get_folder();
 
   // show images?
   rcmail_check_safe($MESSAGE);
@@ -105,6 +117,11 @@
   if (!$OUTPUT->ajax_call)
     $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash',
       'movingmessage', 'deletingmessage', 'markingmessage');
+
+  $prefer_html = $RCMAIL->config->get('prefer_html');
+  if ($MESSAGE->has_html_part()) {
+    $OUTPUT->set_env('optional_format', $prefer_html ? 'text' : 'html');
+  }
 
   // check for unset disposition notification
   if ($MESSAGE->headers->mdn_to
@@ -288,9 +305,9 @@
 ));
 
 
-if ($RCMAIL->action=='print' && $OUTPUT->template_exists('messageprint'))
+if ($RCMAIL->action == 'print' && $OUTPUT->template_exists('messageprint'))
   $OUTPUT->send('messageprint', false);
-else if ($RCMAIL->action=='preview' && $OUTPUT->template_exists('messagepreview'))
+else if ($RCMAIL->action == 'preview' && $OUTPUT->template_exists('messagepreview'))
   $OUTPUT->send('messagepreview', false);
 else
   $OUTPUT->send('message', false);
diff --git a/skins/classic/images/icons/html.png b/skins/classic/images/icons/html.png
new file mode 100644
index 0000000..3f022f6
--- /dev/null
+++ b/skins/classic/images/icons/html.png
Binary files differ
diff --git a/skins/classic/images/icons/text.png b/skins/classic/images/icons/text.png
new file mode 100644
index 0000000..94891be
--- /dev/null
+++ b/skins/classic/images/icons/text.png
Binary files differ
diff --git a/skins/classic/mail.css b/skins/classic/mail.css
index 4d42d98..7c350ca 100644
--- a/skins/classic/mail.css
+++ b/skins/classic/mail.css
@@ -1312,20 +1312,27 @@
   text-decoration: underline;
 }
 
-#openextwinlink
+#messagelinks
 {
   position: absolute;
   top: 8px;
   right: 10px;
-  width: 15px;
-  height: 15px;
-  border: 0;
+  height: 16px;
+  text-align: right;
+}
+
+#messageframe #messagelinks
+{
+  top: 2px;
+  right: 2px;
 }
 
 #compose-headers #openextwinlink
 {
-	top: 4px;
-	right: 2px;
+  position: absolute;
+  height: 15px;
+  top: 4px;
+  right: 2px;
 }
 
 #full-headers
diff --git a/skins/classic/templates/message.html b/skins/classic/templates/message.html
index 73dfcb9..11e58c7 100644
--- a/skins/classic/templates/message.html
+++ b/skins/classic/templates/message.html
@@ -39,6 +39,14 @@
 
 <div id="messageframe">
 <div class="boxlistcontent" style="top:0; overflow-x:auto">
+  <div id="messagelinks">
+    <roundcube:if condition="env:optional_format=='text'" />
+      <roundcube:button command="change-format" prop="text" image="/images/icons/text.png" width="15" height="15" title="changeformattext" id="changeformattext" />
+    <roundcube:endif />
+    <roundcube:if condition="env:optional_format=='html'" />
+      <roundcube:button command="change-format" prop="html" image="/images/icons/html.png" width="15" height="15" title="changeformathtml" id="changeformathtml" />
+    <roundcube:endif />
+  </div>
 <roundcube:object name="messageHeaders" class="headers-table" cellspacing="0" cellpadding="2" addicon="/images/icons/silhouette.png" summary="Message headers" />
 <roundcube:object name="messageFullHeaders" id="full-headers" />
 <roundcube:object name="messageAttachments" id="attachment-list" />
diff --git a/skins/classic/templates/messagepreview.html b/skins/classic/templates/messagepreview.html
index 935238e..80dbe38 100644
--- a/skins/classic/templates/messagepreview.html
+++ b/skins/classic/templates/messagepreview.html
@@ -9,7 +9,15 @@
 <body class="iframe" onload="rcube_init_mail_ui()">
 
 <div class="messageheaderbox">
-<roundcube:button command="extwin" image="/images/icons/extwin.png" width="15" height="15" title="openinextwin" id="openextwinlink" />
+  <div id="messagelinks">
+    <roundcube:if condition="env:optional_format=='text'" />
+      <roundcube:button command="change-format" prop="text" image="/images/icons/text.png" width="15" height="15" title="changeformattext" id="changeformattext" />
+    <roundcube:endif />
+    <roundcube:if condition="env:optional_format=='html'" />
+      <roundcube:button command="change-format" prop="html" image="/images/icons/html.png" width="15" height="15" title="changeformathtml" id="changeformathtml" />
+    <roundcube:endif />
+    <roundcube:button command="extwin" image="/images/icons/extwin.png" width="15" height="15" title="openinextwin" id="openextwinlink" />
+  </div>
 <roundcube:object name="messageHeaders" class="headers-table" cellspacing="0" cellpadding="2" addicon="/images/icons/silhouette.png" summary="Message headers" />
 <roundcube:object name="messageFullHeaders" id="full-headers" />
 <roundcube:object name="messageAttachments" id="attachment-list" />

--
Gitblit v1.9.1