From 765ecb9fa0eb5089242c0fb6d348dd600c95c39a Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Tue, 02 Oct 2012 08:14:24 -0400
Subject: [PATCH] Let the skin limit the number of visible recipeints and place a link to show them all in a dialog (better fix for #1488590)

---
 program/steps/mail/func.inc           |   49 +++++++++++++++++-------
 program/localization/en_US/labels.inc |    1 
 program/js/app.js                     |   26 +++++++++++++
 3 files changed, 61 insertions(+), 15 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 4d784e5..06eb929 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -5624,6 +5624,32 @@
     this.messages = {};
   };
 
+  // open a jquery UI dialog with the given content
+  this.show_popup_dialog = function(html, title)
+  {
+    // forward call to parent window
+    if (this.is_framed()) {
+      parent.rcmail.show_popup_dialog(html, title);
+      return;
+    }
+
+    var popup = $('<div class="popup">')
+      .html(html)
+      .dialog({
+        title: title,
+        modal: true,
+        resizable: true,
+        width: 580,
+        close: function(event, ui) { $(this).remove() }
+      });
+
+      // resize and center popup
+      var win = $(window), w = win.width(), h = win.height(),
+        width = popup.width(), height = popup.height();
+      popup.dialog('option', { height: Math.min(h-40, height+50), width: Math.min(w-20, width+50) })
+        .dialog('option', 'position', ['center', 'center']);  // only works in a separate call (!?)
+  };
+
   // enable/disable buttons for page shifting
   this.set_page_buttons = function()
   {
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 9882c19..5383339 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -236,6 +236,7 @@
 $labels['showimages'] = 'Display images';
 $labels['alwaysshow'] = 'Always show images from $sender';
 $labels['isdraft']    = 'This is a draft message.';
+$labels['andnmore']   = '$nr more...';
 
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Plain text';
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index c4791a0..88670bd 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -969,6 +969,8 @@
     if (in_array($hkey, $exclude_headers))
       continue;
 
+    $header_title = rcube_label(preg_replace('/(^mail-|-)/', '', $hkey));
+
     if ($hkey == 'date') {
       if ($PRINT_MODE)
         $header_value = format_date($value, $RCMAIL->config->get('date_long', 'x'));
@@ -984,7 +986,7 @@
     }
     else if ($hkey == 'replyto') {
       if ($headers['replyto'] != $headers['from']) {
-        $header_value = rcmail_address_string($value, null, true, $attrib['addicon'], $headers['charset']);
+        $header_value = rcmail_address_string($value, $attrib['max'], true, $attrib['addicon'], $headers['charset'], $header_title);
         $ishtml = true;
       }
       else
@@ -994,18 +996,18 @@
       if ($headers['mail-replyto'] != $headers['reply-to']
         && $headers['reply-to'] != $headers['from']
       ) {
-        $header_value = rcmail_address_string($value, null, true, $attrib['addicon'], $headers['charset']);
+        $header_value = rcmail_address_string($value, $attrib['max'], true, $attrib['addicon'], $headers['charset'], $header_title);
         $ishtml = true;
       }
       else
         continue;
     }
     else if ($hkey == 'mail-followup-to') {
-      $header_value = rcmail_address_string($value, null, true, $attrib['addicon'], $headers['charset']);
+      $header_value = rcmail_address_string($value, $attrib['max'], true, $attrib['addicon'], $headers['charset'], $header_title);
       $ishtml = true;
     }
     else if (in_array($hkey, array('from', 'to', 'cc', 'bcc'))) {
-      $header_value = rcmail_address_string($value, $attrib['max'], true, $attrib['addicon'], $headers['charset']);
+      $header_value = rcmail_address_string($value, $attrib['max'], true, $attrib['addicon'], $headers['charset'], $header_title);
       $ishtml = true;
     }
     else if ($hkey == 'subject' && empty($value))
@@ -1014,7 +1016,7 @@
       $header_value = trim(rcube_mime::decode_header($value, $headers['charset']));
 
     $output_headers[$hkey] = array(
-        'title' => rcube_label(preg_replace('/(^mail-|-)/', '', $hkey)),
+        'title' => $header_title,
         'value' => $header_value,
         'raw' => $value,
         'html' => $ishtml,
@@ -1405,7 +1407,7 @@
 /**
  * decode address string and re-format it as HTML links
  */
-function rcmail_address_string($input, $max=null, $linked=false, $addicon=null, $default_charset=null)
+function rcmail_address_string($input, $max=null, $linked=false, $addicon=null, $default_charset=null, $title=null)
 {
   global $RCMAIL, $PRINT_MODE, $CONFIG;
 
@@ -1417,6 +1419,7 @@
   $c = count($a_parts);
   $j = 0;
   $out = '';
+  $allvalues = array();
 
   if ($addicon && !isset($_SESSION['writeable_abook'])) {
     $_SESSION['writeable_abook'] = $RCMAIL->get_address_sources(true) ? true : false;
@@ -1424,7 +1427,6 @@
 
   foreach ($a_parts as $part) {
     $j++;
-
     $name   = $part['name'];
     $mailto = $part['mailto'];
     $string = $part['string'];
@@ -1466,7 +1468,6 @@
             'alt' => "Add contact",
           )));
       }
-      $out .= html::span('adr', $address);
     }
     else {
       $address = '';
@@ -1474,19 +1475,37 @@
         $address .= Q($name);
       if ($mailto)
         $address .= (strlen($address) ? ' ' : '') . sprintf('&lt;%s&gt;', Q($mailto));
-
-      $out .= html::span('adr', $address);
     }
 
-    if ($c>$j)
-      $out .= ','.($max ? '&nbsp;' : ' ');
+    $address = html::span('adr', $address);
+    $allvalues[] = $address;
 
-    if ($max && $j==$max && $c>$j) {
-      $out .= '...';
-      break;
+    if (!$moreadrs)
+      $out .= ($out ? ', ' : '') . $address;
+
+    if ($max && $j == $max && $c > $j) {
+      if ($linked) {
+        $moreadrs = $c - $j;
+      }
+      else {
+        $out .= '...';
+        break;
+      }
     }
   }
 
+  if ($moreadrs) {
+      $out .= ' ' . html::a(array(
+          'href' => '#more',
+          'class' => 'morelink',
+          'onclick' => sprintf("return %s.show_popup_dialog('%s','%s')",
+            JS_OBJECT_NAME,
+            JQ(join(', ', $allvalues)),
+            JQ($title))
+        ),
+        Q(rcube_label(array('name' => 'andnmore', 'vars' => array('nr' => $moreadrs)))));
+  }
+
   return $out;
 }
 

--
Gitblit v1.9.1