JAL-2484 adjusted default cache settings panel's left border width
[jalview.git] / src / jalview / io / cache / JvCacheableInputBox.java
index 3eb193e..444670b 100644 (file)
@@ -1,17 +1,21 @@
 package jalview.io.cache;
 
+import jalview.bin.Cache;
 import jalview.util.MessageManager;
 
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.swing.BorderFactory;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
 import javax.swing.JMenuItem;
@@ -28,48 +32,82 @@ public class JvCacheableInputBox<E> extends JComboBox<String>
 
   private static final long serialVersionUID = 5774610435079326695L;
 
-  private String cacheKey;
+  private static final int INPUT_LIMIT = 2;
 
-  private AppCache appCache;
+  private static final int LEFT_BOARDER_WIDTH = 16;
 
-  JPanel pnlDefaultCache = new JPanel();
+  private String cacheKey;
 
-  JLabel lblDefaultCacheSize = new JLabel();
+  private AppCache appCache;
 
-  JTextField txtDefaultCacheSize = new JTextField();
+  private JPanel pnlDefaultCache = new JPanel();
 
-  JPopupMenu popup = new JPopupMenu();
+  private JLabel lblDefaultCacheSize = new JLabel();
 
-  JMenuItem menuItemClearCache = new JMenuItem();
+  private JTextField txtDefaultCacheSize = new JTextField();
 
-  final static int INPUT_LIMIT = 2;
+  private JPopupMenu popup = new JPopupMenu();
 
-  final static String SPACE = "    ";
+  private JMenuItem menuItemClearCache = new JMenuItem();
 
-  public JvCacheableInputBox(String cacheKey)
+  public JvCacheableInputBox(String newCacheKey)
   {
     super();
-    this.cacheKey = cacheKey;
+    this.cacheKey = newCacheKey;
     setEditable(true);
     setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
     appCache = AppCache.getInstance();
     initCachePopupMenu();
-    appCache.initCache(cacheKey);
+    initCache(newCacheKey);
     updateCache();
   }
 
+  /**
+   * Method for initialising cache items for a given cache key and populating
+   * the in-memory cache with persisted cache items
+   * 
+   * @param cacheKey
+   */
+  private void initCache(String cacheKey)
+  {
+    // obtain persisted cache items from properties file as a delimited string
+    String delimitedCacheStr = Cache.getProperty(cacheKey);
+    if (delimitedCacheStr == null || delimitedCacheStr.isEmpty())
+    {
+      return;
+    }
+    // convert delimited cache items to a list of strings
+    List<String> persistedCacheItems = Arrays.asList(delimitedCacheStr
+            .split(AppCache.CACHE_DELIMITER));
+
+    LinkedHashSet<String> foundCacheItems = appCache
+            .getAllCachedItemsFor(cacheKey);
+    if (foundCacheItems == null)
+    {
+      foundCacheItems = new LinkedHashSet<String>();
+    }
+    // populate memory cache
+    for (String cacheItem : persistedCacheItems)
+    {
+      foundCacheItems.add(cacheItem);
+    }
+    appCache.putCache(cacheKey, foundCacheItems);
+  }
 
   /**
    * Initialise this cache's pop-up menu
    */
   private void initCachePopupMenu()
   {
-    add(popup);
-    setComponentPopupMenu(popup);
     pnlDefaultCache.setBackground(Color.WHITE);
+    // pad panel so as to align with other menu items
+    pnlDefaultCache.setBorder(BorderFactory.createEmptyBorder(0,
+            LEFT_BOARDER_WIDTH, 0, 0));
     txtDefaultCacheSize.setPreferredSize(new Dimension(45, 20));
-    lblDefaultCacheSize.setText(SPACE
-            + MessageManager.getString("label.default_cache_size"));
+    txtDefaultCacheSize.setFont(new java.awt.Font("Verdana", 0, 12));
+    lblDefaultCacheSize.setText(MessageManager
+            .getString("label.default_cache_size"));
+    lblDefaultCacheSize.setFont(new java.awt.Font("Verdana", 0, 12));
     // Force input to accept only Integer entries up to length - INPUT_LIMIT
     txtDefaultCacheSize.setDocument(new PlainDocument()
     {
@@ -85,11 +123,24 @@ public class JvCacheableInputBox<E> extends JComboBox<String>
         }
       }
     });
-    txtDefaultCacheSize.setText(appCache.getCacheLmit(cacheKey));
+    txtDefaultCacheSize.addKeyListener(new java.awt.event.KeyAdapter()
+    {
+      @Override
+      public void keyPressed(KeyEvent e)
+      {
+        if (e.getKeyCode() == KeyEvent.VK_ENTER)
+        {
+          e.consume();
+          updateCache();
+          closePopup();
+        }
+      }
+    });
+
+    txtDefaultCacheSize.setText(appCache.getCacheLimit(cacheKey));
     pnlDefaultCache.add(lblDefaultCacheSize);
+    menuItemClearCache.setFont(new java.awt.Font("Verdana", 0, 12));
     pnlDefaultCache.add(txtDefaultCacheSize);
-    popup.insert(pnlDefaultCache, 0);
-
     menuItemClearCache.setText(MessageManager
             .getString("action.clear_cached_items"));
     menuItemClearCache.addActionListener(new ActionListener()
@@ -97,14 +148,23 @@ public class JvCacheableInputBox<E> extends JComboBox<String>
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        System.out.println(">>>>> Clear cache items");
+        // System.out.println(">>>>> Clear cache items");
         setSelectedItem("");
         appCache.deleteCacheItems(cacheKey);
         updateCache();
       }
     });
 
+    popup.insert(pnlDefaultCache, 0);
     popup.add(menuItemClearCache);
+    setComponentPopupMenu(popup);
+    add(popup);
+  }
+
+  private void closePopup()
+  {
+    popup.setVisible(false);
+    popup.transferFocus();
   }
 
   /**
@@ -113,7 +173,7 @@ public class JvCacheableInputBox<E> extends JComboBox<String>
    * @param text
    * @return
    */
-  private boolean isInteger(String text)
+  static boolean isInteger(String text)
   {
     try
     {
@@ -135,8 +195,10 @@ public class JvCacheableInputBox<E> extends JComboBox<String>
       @Override
       public void run()
       {
-        int cacheLimit = appCache.updateCacheLimit(cacheKey,
-                txtDefaultCacheSize.getText());
+        int userLimit = txtDefaultCacheSize.getText().trim().isEmpty() ? Integer
+                .valueOf(AppCache.DEFAULT_LIMIT) : Integer
+                .valueOf(txtDefaultCacheSize.getText());
+        int cacheLimit = appCache.updateCacheLimit(cacheKey, userLimit);
         String userInput = getUserInput();
         if (userInput != null && !userInput.isEmpty())
         {
@@ -205,7 +267,10 @@ public class JvCacheableInputBox<E> extends JComboBox<String>
   public void persistCache()
   {
     appCache.persistCache(cacheKey);
-    appCache.updateCacheLimit(cacheKey, txtDefaultCacheSize.getText());
+    int userLimit = txtDefaultCacheSize.getText().trim().isEmpty() ? Integer
+            .valueOf(AppCache.DEFAULT_LIMIT) : Integer
+            .valueOf(txtDefaultCacheSize.getText());
+    appCache.updateCacheLimit(cacheKey, userLimit);
   }
 
   /**