From 49dfb0047a53758a3e12699cf6e0b4da55aefd3e Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 23 May 2009 10:17:07 -0400
Subject: [PATCH] - Added message menu (some image needed), removed Print and Source buttons - Added possibility to save message as .eml file (#1485861)

---
 CHANGELOG                                   |    4 +
 skins/default/mail.css                      |   19 ++++-----
 program/steps/mail/viewsource.inc           |   15 +++++++
 program/steps/mail/show.inc                 |    1 
 skins/default/templates/message.html        |    7 ++-
 skins/default/includes/messagemenu.html     |   10 +++++
 skins/default/templates/messagepreview.html |    2 
 program/localization/en_GB/labels.inc       |    1 
 skins/default/templates/mail.html           |    5 +-
 program/localization/en_US/labels.inc       |    1 
 program/localization/pl_PL/labels.inc       |    1 
 program/include/rcube_template.php          |    3 -
 program/js/app.js                           |   47 +++++++++++++----------
 13 files changed, 74 insertions(+), 42 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index a99c9eb..b8a0255 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,7 +1,9 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
-- Add 1 minute interval in autosave options (#1485854)
+- Added message menu, removed Print and Source buttons
+- Added possibility to save message as .eml file (#1485861)
+- Added 1 minute interval in autosave options (#1485854)
 - Support UTF-7 encoding in messages (#1485832)
 - Better support for malformed character names (#1485758)
 
diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php
index 21363f2..b597c55 100755
--- a/program/include/rcube_template.php
+++ b/program/include/rcube_template.php
@@ -796,9 +796,6 @@
             else if (in_array($attrib['command'], $a_static_commands)) {
                 $attrib['href'] = rcmail_url($attrib['command']);
             }
-            else if ($attrib['command'] == 'permaurl' && !empty($this->env['permaurl'])) {
-                $attrib['href'] = $this->env['permaurl'];
-            }
         }
 
         // overwrite attributes
diff --git a/program/js/app.js b/program/js/app.js
index ec94b5a..8b357e7 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -150,9 +150,6 @@
     // enable general commands
     this.enable_command('logout', 'mail', 'addressbook', 'settings', true);
     
-    if (this.env.permaurl)
-      this.enable_command('permaurl', true);
-    
     switch (this.task)
       {
       case 'mail':
@@ -188,7 +185,9 @@
         
         if (this.env.action=='show' || this.env.action=='preview')
           {
-          this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource', 'print', 'load-attachment', 'load-headers', true);
+          this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete',
+	    'open', 'mark', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers', true);
+
           if (this.env.next_uid)
             {
             this.enable_command('nextmessage', true);
@@ -198,6 +197,13 @@
             {
             this.enable_command('previousmessage', true);
             this.enable_command('firstmessage', true);
+            }
+        
+	  if (this.env.blockedobjects)
+            {
+            if (this.gui_objects.remoteobjectsmsg)
+              this.gui_objects.remoteobjectsmsg.style.display = 'block';
+            this.enable_command('load-images', 'always-load', true);
             }
           }
 
@@ -209,13 +215,6 @@
           {
           this.enable_command('compose', 'add-contact', false);
           parent.rcmail.show_contentframe(true);
-          }
-
-        if ((this.env.action=='show' || this.env.action=='preview') && this.env.blockedobjects)
-          {
-          if (this.gui_objects.remoteobjectsmsg)
-            this.gui_objects.remoteobjectsmsg.style.display = 'block';
-          this.enable_command('load-images', 'always-load', true);
           }
 
         if (this.env.action=='compose')
@@ -560,12 +559,14 @@
         this.switch_task(command);
         break;
 
-      case 'permaurl':
-        if (obj && obj.href && obj.target)
-          return true;
-        else if (this.env.permaurl)
-          parent.location.href = this.env.permaurl;
-          break;
+      case 'open':
+	var uid;
+        if (uid = this.get_single_uid())
+	  {
+	  obj.href = '?_task='+this.env.task+'&_action=show&_mbox='+urlencode(this.env.mailbox)+'&_uid='+uid;
+	  return true;
+          }
+	break;
 
       // misc list commands
       case 'list':
@@ -992,10 +993,16 @@
         var uid;
         if (uid = this.get_single_uid())
           {
-          ref.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox));
+          ref.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox));
           if (this.sourcewin)
             window.setTimeout(function(){ ref.sourcewin.focus(); }, 20);
           }
+        break;
+
+      case 'download':
+        var uid;
+        if (uid = this.get_single_uid())
+          this.goto_url('viewsource', '&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+'&_save=1');
         break;
 
       case 'add-contact':
@@ -1357,12 +1364,12 @@
     if (this.env.mailbox == this.env.drafts_mailbox)
       {
       this.enable_command('reply', 'reply-all', 'forward', false);
-      this.enable_command('show', 'print', selected);
+      this.enable_command('show', 'print', 'open', 'download', 'viewsource', selected);
       this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false));
       }
     else
       {
-      this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', selected);
+      this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', 'open', 'download', 'viewsource', selected);
       this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false));
       }
 
diff --git a/program/localization/en_GB/labels.inc b/program/localization/en_GB/labels.inc
index 0e86a3c..96629a7 100644
--- a/program/localization/en_GB/labels.inc
+++ b/program/localization/en_GB/labels.inc
@@ -134,6 +134,7 @@
 $labels['searchmod']  = 'Search modifiers';
 $labels['msgtext']  = 'Entire message';
 $labels['openinextwin'] = 'Open in new window';
+$labels['emlsave'] = 'Save (.eml)';
 $labels['compose'] = 'Compose a message';
 $labels['savemessage'] = 'Save this draft';
 $labels['sendmessage'] = 'Send now';
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 89ab3c6..19c09e5 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -165,6 +165,7 @@
 $labels['msgtext']  = 'Entire message';
 
 $labels['openinextwin'] = 'Open in new window';
+$labels['emlsave'] = 'Save (.eml)';
 
 // message compose
 $labels['compose']        = 'Compose a message';
diff --git a/program/localization/pl_PL/labels.inc b/program/localization/pl_PL/labels.inc
index c68d19e..f0efaba 100644
--- a/program/localization/pl_PL/labels.inc
+++ b/program/localization/pl_PL/labels.inc
@@ -145,6 +145,7 @@
 $labels['searchmod']  = 'Parametry wyszukiwania';
 $labels['msgtext']  = 'Cała wiadomość';
 $labels['openinextwin'] = 'Otwórz w nowym oknie';
+$labels['emlsave'] = 'Zapisz (.eml)';
 $labels['compose'] = 'Utwórz wiadomość';
 $labels['savemessage'] = 'Zapisz kopię roboczą';
 $labels['sendmessage'] = 'Wyślij teraz';
diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc
index 9beb425..06c9f53 100644
--- a/program/steps/mail/show.inc
+++ b/program/steps/mail/show.inc
@@ -65,7 +65,6 @@
   // set environement
   $OUTPUT->set_env('safemode', $MESSAGE->is_safe);
   $OUTPUT->set_env('sender', $MESSAGE->sender['string']);
-  $OUTPUT->set_env('permaurl', rcmail_url('show', array('_uid' => $MESSAGE->uid, '_mbox' => $mbox_name)));
   $OUTPUT->set_env('mailbox', $mbox_name);
   if ($CONFIG['trash_mbox'])
     $OUTPUT->set_env('trash_mailbox', $CONFIG['trash_mbox']);
diff --git a/program/steps/mail/viewsource.inc b/program/steps/mail/viewsource.inc
index 6971e0c..8790830 100644
--- a/program/steps/mail/viewsource.inc
+++ b/program/steps/mail/viewsource.inc
@@ -26,6 +26,21 @@
   $headers = $IMAP->get_headers($uid);
   $charset = $headers->charset ? $headers->charset : $IMAP->default_charset;
   header("Content-Type: text/plain; charset={$charset}");
+
+  if (!empty($_GET['_save'])) {
+    $filename = ($headers->subject ? $headers->subject : 'roundcube') . '.eml';
+    $browser = new rcube_browser;
+    
+    if ($browser->ie && $browser->ver < 7)
+      $filename = rawurlencode(abbreviate_string($filename, 55));
+    else if ($browser->ie)
+      $filename = rawurlencode($filename);
+    else
+      $filename = addcslashes($filename, '"');
+      
+    header("Content-Disposition: attachment; filename=\"$filename\"");
+  }
+  
   $IMAP->print_raw_body($uid);
 }
 else
diff --git a/skins/default/includes/messagemenu.html b/skins/default/includes/messagemenu.html
new file mode 100644
index 0000000..81a1c5d
--- /dev/null
+++ b/skins/default/includes/messagemenu.html
@@ -0,0 +1,10 @@
+<div id="messagemenu">
+    <ul class="toolbarmenu">
+	<li><roundcube:button command="print" label="printmessage" classAct="active" /></li>
+	<li><roundcube:button command="download" label="emlsave" classAct="active" /></li>
+	<li><roundcube:button command="viewsource" label="viewsource" classAct="active" /></li>
+	<li><hr></li>
+	<li><roundcube:button command="open" label="openinextwin" target="_blank" classAct="active" /></li>
+	<roundcube:container name="messagemenu" id="messagemenu" />
+    </ul>
+</div>
diff --git a/skins/default/mail.css b/skins/default/mail.css
index 00f8ca3..7ab2e34 100644
--- a/skins/default/mail.css
+++ b/skins/default/mail.css
@@ -46,7 +46,8 @@
 }
 
 #markmessagemenu,
-#searchmenu
+#searchmenu,
+#messagemenu
 {
   position: absolute;
   top: 32px;
@@ -98,6 +99,12 @@
 ul.toolbarmenu li input
 {
   vertical-align: middle;
+}
+
+ul.toolbarmenu li hr
+{
+  width: 90%;
+  margin: 2px 10px;
 }
 
 #searchfilter
@@ -903,16 +910,6 @@
 #remote-objects-message a:hover
 {
   color: #333333;
-}
-
-#messageviewlink
-{
-  position: absolute;
-  top: 8px;
-  right: 10px;
-  width: 15px;
-  height: 15px;
-  border: 0;
 }
 
 /** message compose styles */
diff --git a/skins/default/templates/mail.html b/skins/default/templates/mail.html
index 7351446..bc931ca 100644
--- a/skins/default/templates/mail.html
+++ b/skins/default/templates/mail.html
@@ -27,6 +27,7 @@
 
 <roundcube:include file="/includes/taskbar.html" />
 <roundcube:include file="/includes/header.html" />
+<roundcube:include file="/includes/messagemenu.html" />
 
 <div id="mainscreen">
 
@@ -113,12 +114,12 @@
 <div id="messagetoolbar">
 <roundcube:button command="checkmail" imageSel="/images/buttons/inbox_sel.png" imageAct="/images/buttons/inbox_act.png" imagePas="/images/buttons/inbox_pas.png" width="32" height="32" title="checkmail" />
 <roundcube:button command="compose" imageSel="/images/buttons/compose_sel.png" imageAct="/images/buttons/compose_act.png" imagePas="/images/buttons/compose_pas.png" width="32" height="32" title="writenewmessage" />
-<roundcube:button name="markreadbutton" id="markreadbutton" image="/images/buttons/markread_act.png" width="32" height="32" title="markmessages" onclick="rcmail_ui.show_markmenu();return false" />
 <roundcube:button command="reply" imageSel="/images/buttons/reply_sel.png" imageAct="/images/buttons/reply_act.png" imagePas="/images/buttons/reply_pas.png" width="32" height="32" title="replytomessage" />
 <roundcube:button command="reply-all" imageSel="/images/buttons/replyall_sel.png" imageAct="/images/buttons/replyall_act.png" imagePas="/images/buttons/replyall_pas.png" width="32" height="32" title="replytoallmessage" />
 <roundcube:button command="forward" imageSel="/images/buttons/forward_sel.png" imageAct="/images/buttons/forward_act.png" imagePas="/images/buttons/forward_pas.png" width="32" height="32" title="forwardmessage" />
 <roundcube:button command="delete" imageSel="/images/buttons/delete_sel.png" imageAct="/images/buttons/delete_act.png" imagePas="/images/buttons/delete_pas.png" width="32" height="32" title="deletemessage" />
-<roundcube:button command="print" imageSel="/images/buttons/print_sel.png" imageAct="/images/buttons/print_act.png" imagePas="/images/buttons/print_pas.png" width="32" height="32" title="printmessage" />
+<roundcube:button name="markreadbutton" id="markreadbutton" image="/images/buttons/markread_act.png" width="32" height="32" title="markmessages" onclick="rcmail_ui.show_markmenu();return false" />
+<roundcube:button name="messagemenulink" id="messagemenulink" image="/images/icons/extwin.png" width="32" height="32" title="messagemenu" onclick="rcmail_ui.show_messagemenu();return false" />
 <roundcube:container name="toolbar" id="messagetoolbar" />
 
 <div id="markmessagemenu">
diff --git a/skins/default/templates/message.html b/skins/default/templates/message.html
index 7d42ef7..6786080 100644
--- a/skins/default/templates/message.html
+++ b/skins/default/templates/message.html
@@ -5,6 +5,7 @@
 <roundcube:include file="/includes/links.html" />
 <link rel="stylesheet" type="text/css" href="/mail.css" />
 <script type="text/javascript" src="/splitter.js"></script>
+<script type="text/javascript" src="/functions.js"></script>
 <style type="text/css">
 #mailboxlist-container { width: <roundcube:exp expression="!empty(cookie:mailviewsplitterv) ? cookie:mailviewsplitterv-5 : 160" />px; }
 #messageframe {
@@ -13,10 +14,11 @@
 }
 </style>
 </head>
-<body>
+<body onload="rcube_init_mail_ui()">
 
 <roundcube:include file="/includes/taskbar.html" />
 <roundcube:include file="/includes/header.html" />
+<roundcube:include file="/includes/messagemenu.html" />
 
 <div id="messagecountbar">
 <roundcube:button command="firstmessage" imageSel="/images/buttons/first_sel.png" imageAct="/images/buttons/first_act.png" imagePas="/images/buttons/first_pas.png" width="11" height="11" title="firstmessage" />
@@ -33,8 +35,7 @@
 <roundcube:button command="reply-all" imageSel="/images/buttons/replyall_sel.png" imageAct="/images/buttons/replyall_act.png" imagePas="/images/buttons/replyall_pas.png" width="32" height="32" title="replytoallmessage" />
 <roundcube:button command="forward" imageSel="/images/buttons/forward_sel.png" imageAct="/images/buttons/forward_act.png" imagePas="/images/buttons/forward_pas.png" width="32" height="32" title="forwardmessage" />
 <roundcube:button command="delete" imageSel="/images/buttons/delete_sel.png" imageAct="/images/buttons/delete_act.png" imagePas="/images/buttons/delete_pas.png" width="32" height="32" title="deletemessage" />
-<roundcube:button command="print" imageSel="/images/buttons/print_sel.png" imageAct="/images/buttons/print_act.png" imagePas="/images/buttons/print_pas.png" width="32" height="32" title="printmessage" />
-<roundcube:button command="viewsource" imageSel="/images/buttons/source_sel.png" imageAct="/images/buttons/source_act.png" imagePas="/images/buttons/source_pas.png" width="32" height="32" title="viewsource" />
+<roundcube:button name="messagemenulink" image="/images/icons/extwin.png" width="32" height="32" title="messagemenu" onclick="rcmail_ui.show_messagemenu();return false" id="messagemenulink" />
 <roundcube:object name="mailboxlist" type="select" noSelection="moveto" maxlength="25" onchange="rcmail.command('moveto', this.options[this.selectedIndex].value)" class="mboxlist" />
 <roundcube:container name="toolbar" id="messagetoolbar" />
 </div>
diff --git a/skins/default/templates/messagepreview.html b/skins/default/templates/messagepreview.html
index 24848bb..9cd25f6 100644
--- a/skins/default/templates/messagepreview.html
+++ b/skins/default/templates/messagepreview.html
@@ -8,7 +8,7 @@
 <body class="iframe">
 
 <div class="messageheaderbox">
-<roundcube:button command="permaurl" image="/images/icons/extwin.png" width="15" height="15" title="openinextwin" id="messageviewlink" target="_blank" />
+<roundcube:button command="messagemenu" image="/images/icons/extwin.png" width="15" height="15" title="messageactions" id="messagemenulink" />
 <roundcube:object name="messageHeaders" class="headers-table" cellspacing="0" cellpadding="2" addicon="/images/icons/plus.gif" summary="Message headers" />
 <roundcube:object name="messageAttachments" id="attachment-list" />
 </div>

--
Gitblit v1.9.1