JAL-2069 renamed helper method better
[jalview.git] / src / jalview / gui / JvSwingUtils.java
index a9d0e75..4658668 100644 (file)
@@ -24,14 +24,20 @@ import jalview.util.MessageManager;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
+import java.awt.Component;
 import java.awt.Font;
 import java.awt.GridLayout;
 import java.awt.Rectangle;
 import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.List;
 import java.util.Objects;
 
 import javax.swing.AbstractButton;
+import javax.swing.BorderFactory;
 import javax.swing.JButton;
+import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JMenu;
@@ -39,6 +45,8 @@ import javax.swing.JMenuItem;
 import javax.swing.JPanel;
 import javax.swing.JScrollBar;
 import javax.swing.SwingConstants;
+import javax.swing.border.Border;
+import javax.swing.border.TitledBorder;
 
 /**
  * useful functions for building Swing GUIs
@@ -49,28 +57,29 @@ import javax.swing.SwingConstants;
 public final class JvSwingUtils
 {
   /**
-   * wrap a bare html safe string to around 60 characters per line using a
-   * <table width=350>
-   * <tr>
-   * <td></td> field
- * @param enclose TODO
- * @param ttext
+   * wrap a bare html safe string to around 60 characters per line using a CSS
+   * style class specifying word-wrap and break-word
+   * 
+   * @param enclose
+   *          if true, add &lt;html&gt; wrapper tags
+   * @param ttext
    * 
    * @return
    */
   public static String wrapTooltip(boolean enclose, String ttext)
   {
-    Objects.requireNonNull(ttext, "Tootip text to format must not be null!");
+    Objects.requireNonNull(ttext,
+            "Tootip text to format must not be null!");
     ttext = ttext.trim();
-    boolean maxLenghtExceeded = false;
+    boolean maxLengthExceeded = false;
 
     if (ttext.contains("<br>"))
     {
       String[] htmllines = ttext.split("<br>");
       for (String line : htmllines)
       {
-        maxLenghtExceeded = line.length() > 60;
-        if (maxLenghtExceeded)
+        maxLengthExceeded = line.length() > 60;
+        if (maxLengthExceeded)
         {
           break;
         }
@@ -78,19 +87,18 @@ public final class JvSwingUtils
     }
     else
     {
-      maxLenghtExceeded = ttext.length() > 60;
+      maxLengthExceeded = ttext.length() > 60;
     }
 
-    if (!maxLenghtExceeded)
+    if (!maxLengthExceeded)
     {
       return enclose ? "<html>" + ttext + "</html>" : ttext;
     }
-    else
-    {
-      return enclose ? "<html><style> p.ttip {width: 350; text-align: justify; word-wrap: break-word;}</style><p class=\"ttip\">"
-              + ttext + "</p></html>"
-              : ttext;
-    }
+
+    return (enclose ? "<html>" : "")
+            + "<style> p.ttip {width: 350; text-align: justify; word-wrap: break-word;}</style><p class=\"ttip\">"
+            + ttext + "</p>" + ((enclose ? "</html>" : ""));
+
   }
 
   public static JButton makeButton(String label, String tooltip,
@@ -120,8 +128,8 @@ public final class JvSwingUtils
     for (int i = 0, iSize = menu.getMenuComponentCount(); i < iSize; i++)
     {
       if (menu.getMenuComponent(i) instanceof JMenu
-              && ((JMenu) menu.getMenuComponent(i)).getText().equals(
-                      submenu))
+              && ((JMenu) menu.getMenuComponent(i)).getText()
+                      .equals(submenu))
       {
         submenuinstance = (JMenu) menu.getMenuComponent(i);
       }
@@ -199,8 +207,10 @@ public final class JvSwingUtils
 
   public static Font getLabelFont(boolean bold, boolean italic)
   {
-    return new java.awt.Font("Verdana", (!bold && !italic) ? Font.PLAIN
-            : (bold ? Font.BOLD : 0) + (italic ? Font.ITALIC : 0), 11);
+    return new java.awt.Font("Verdana",
+            (!bold && !italic) ? Font.PLAIN
+                    : (bold ? Font.BOLD : 0) + (italic ? Font.ITALIC : 0),
+            11);
   }
 
   /**
@@ -276,8 +286,8 @@ public final class JvSwingUtils
      * of possible positions.
      */
     float fraction = proportion
-            * (scrollbar.getMaximum() - scrollbar.getMinimum() - scrollbar
-                    .getModel().getExtent())
+            * (scrollbar.getMaximum() - scrollbar.getMinimum()
+                    - scrollbar.getModel().getExtent())
             + (scrollbar.getModel().getExtent() / 2f);
     return Math.min(Math.round(fraction), scrollbar.getMaximum());
   }
@@ -302,4 +312,71 @@ public final class JvSwingUtils
     comp.setFont(JvSwingUtils.getLabelFont());
   }
 
+  /**
+   * A helper method to build a drop-down choice of values, with tooltips for
+   * the entries
+   * 
+   * @param entries
+   * @param tooltips
+   */
+  public static JComboBox<String> buildComboWithTooltips(
+          List<String> entries, List<String> tooltips)
+  {
+    JComboBox<String> combo = new JComboBox<>();
+    final ComboBoxTooltipRenderer renderer = new ComboBoxTooltipRenderer();
+    combo.setRenderer(renderer);
+    for (String attName : entries)
+    {
+      combo.addItem(attName);
+    }
+    renderer.setTooltips(tooltips);
+    final MouseAdapter mouseListener = new MouseAdapter()
+    {
+      @Override
+      public void mouseEntered(MouseEvent e)
+      {
+        int j = combo.getSelectedIndex();
+        if (j > -1)
+        {
+          combo.setToolTipText(tooltips.get(j));
+        }
+      }
+      @Override
+      public void mouseExited(MouseEvent e)
+      {
+        combo.setToolTipText(null);
+      }
+    };
+    for (Component c : combo.getComponents())
+    {
+      c.addMouseListener(mouseListener);
+    }
+    return combo;
+  }
+
+  /**
+   * Adds a titled border to the component in the default font and position (top
+   * left), optionally witht italic text
+   * 
+   * @param comp
+   * @param title
+   * @param italic
+   */
+  public static TitledBorder createTitledBorder(JComponent comp,
+          String title, boolean italic)
+  {
+    Font font = comp.getFont();
+    if (italic)
+    {
+      font = new Font(font.getName(), Font.ITALIC, font.getSize());
+    }
+    Border border = BorderFactory.createTitledBorder("");
+    TitledBorder titledBorder = BorderFactory.createTitledBorder(border,
+            title, TitledBorder.LEADING, TitledBorder.DEFAULT_POSITION,
+            font);
+    comp.setBorder(titledBorder);
+
+    return titledBorder;
+  }
+
 }