JAL-3468 truncate feature description to 40 chars in tooltip/menu item
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 31 Oct 2019 15:45:51 +0000 (15:45 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 31 Oct 2019 15:45:51 +0000 (15:45 +0000)
src/jalview/gui/JvSwingUtils.java
src/jalview/gui/PopupMenu.java
src/jalview/io/SequenceAnnotationReport.java

index d6090e2..7a5dde6 100644 (file)
@@ -96,7 +96,7 @@ public final class JvSwingUtils
     }
 
     return (enclose ? "<html>" : "")
-            + "<style> p.ttip {width: 350; text-align: justify; word-wrap: break-word;}</style><p class=\"ttip\">"
+            + "<style> p.ttip {width: 350; text-align: left; word-wrap: break-word;}</style><p class=\"ttip\">"
             + ttext + "</p>" + ((enclose ? "</html>" : ""));
 
   }
index 415054e..187090b 100644 (file)
@@ -88,6 +88,11 @@ import javax.swing.JRadioButtonMenuItem;
 public class PopupMenu extends JPopupMenu implements ColourChangeListener
 {
   /*
+   * maximum length of feature description to include in popup menu item text
+   */
+  private static final int FEATURE_DESC_MAX = 40;
+
+  /*
    * true for ID Panel menu, false for alignment panel menu
    */
   private final boolean forIdPanel;
@@ -808,7 +813,8 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
 
   /**
    * A helper method to add one menu item whose action is to show details for one
-   * feature
+   * feature. The menu text includes feature description, but this may be
+   * truncated.
    * 
    * @param details
    * @param seqName
@@ -819,36 +825,36 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
   {
     int start = sf.getBegin();
     int end = sf.getEnd();
-    String desc = null;
-    if (start == end)
-    {
-      desc = String.format("%s %d", sf.getType(), start);
-    }
-    else
+    StringBuilder desc = new StringBuilder();
+    desc.append(sf.getType()).append(" ").append(String.valueOf(start));
+    if (start != end)
     {
-      desc = String.format("%s %d-%d", sf.getType(), start, end);
+      desc.append("-").append(String.valueOf(end));
     }
-    String tooltip = desc;
     String description = sf.getDescription();
     if (description != null)
     {
+      desc.append(" ");
       description = StringUtils.stripHtmlTags(description);
-      if (description.length() > 12)
-      {
-        desc = desc + " " + description.substring(0, 12) + "..";
-      }
-      else
+
+      /*
+       * truncate overlong descriptions unless they contain an href
+       * (as truncation could leave corrupted html)
+       */
+      boolean hasLink = description.indexOf("a href") > -1;
+      if (description.length() > FEATURE_DESC_MAX && !hasLink)
       {
-        desc = desc + " " + description;
+        description = description.substring(0, FEATURE_DESC_MAX) + "...";
       }
-      tooltip = tooltip + " " + description;
+      desc.append(description);
     }
-    if (sf.getFeatureGroup() != null)
+    String featureGroup = sf.getFeatureGroup();
+    if (featureGroup != null)
     {
-      tooltip = tooltip + (" (" + sf.getFeatureGroup() + ")");
+      desc.append(" (").append(featureGroup).append(")");
     }
-    JMenuItem item = new JMenuItem(desc);
-    item.setToolTipText(tooltip);
+    String htmlText = JvSwingUtils.wrapTooltip(true, desc.toString());
+    JMenuItem item = new JMenuItem(htmlText);
     item.addActionListener(new ActionListener()
     {
       @Override
index 5a55b5b..df28ea3 100644 (file)
@@ -46,6 +46,8 @@ import java.util.Map;
  */
 public class SequenceAnnotationReport
 {
+  private static final int MAX_DESCRIPTION_LENGTH = 40;
+
   private static final String COMMA = ",";
 
   private static final String ELLIPSIS = "...";
@@ -64,7 +66,7 @@ public class SequenceAnnotationReport
    * Comparator to order DBRefEntry by Source + accession id (case-insensitive),
    * with 'Primary' sources placed before others, and 'chromosome' first of all
    */
-  private static Comparator<DBRefEntry> comparator = new Comparator<DBRefEntry>()
+  private static Comparator<DBRefEntry> comparator = new Comparator<>()
   {
 
     @Override
@@ -206,6 +208,17 @@ public class SequenceAnnotationReport
       if (description != null && !description.equals(feature.getType()))
       {
         description = StringUtils.stripHtmlTags(description);
+
+        /*
+         * truncate overlong descriptions unless they contain an href
+         * (as truncation could leave corrupted html)
+         */
+        boolean hasLink = description.indexOf("a href") > -1;
+        if (description.length() > MAX_DESCRIPTION_LENGTH && !hasLink)
+        {
+          description = description.substring(0, MAX_DESCRIPTION_LENGTH)
+                  + ELLIPSIS;
+        }
         sb.append("; ").append(description);
       }
 
@@ -376,7 +389,7 @@ public class SequenceAnnotationReport
     if (sequence.getDescription() != null)
     {
       tmp = sequence.getDescription();
-      sb.append("<br>").append(tmp);
+      sb.append(tmp);
       maxWidth = Math.max(maxWidth, tmp.length());
     }
     SequenceI ds = sequence;