Merge branch 'develop' into bug/JAL-4059_update_swingJS_for_JalviewJS_2_11_2_and_2_11_3
[jalview.git] / src / jalview / gui / StructureViewerBase.java
index 09d2dcb..1f39b54 100644 (file)
@@ -35,6 +35,7 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Random;
 import java.util.Vector;
 
@@ -65,6 +66,8 @@ import jalview.schemes.ColourSchemes;
 import jalview.structure.StructureMapping;
 import jalview.structures.models.AAStructureBindingModel;
 import jalview.util.BrowserLauncher;
+import jalview.util.IdUtils;
+import jalview.util.IdUtils.IdType;
 import jalview.util.MessageManager;
 import jalview.ws.dbsources.EBIAlfaFold;
 import jalview.ws.dbsources.Pdb;
@@ -89,8 +92,9 @@ public abstract class StructureViewerBase extends GStructureViewer
   }
 
   /**
-   * Singleton list of all (open) instances of structureViewerBase
-   * TODO: JAL-3362 - review and adopt the swingJS-safe singleton pattern so each structure viewer base instance is kept to its own JalviewJS parent
+   * Singleton list of all (open) instances of structureViewerBase TODO:
+   * JAL-3362 - review and adopt the swingJS-safe singleton pattern so each
+   * structure viewer base instance is kept to its own JalviewJS parent
    */
   private static List<JalviewStructureDisplayI> svbs = new ArrayList<>();
 
@@ -224,11 +228,13 @@ public abstract class StructureViewerBase extends GStructureViewer
    * 
    * @return TRUE if the view is NOT being coloured by the alignment colours.
    */
+  @Override
   public boolean isColouredByViewer()
   {
     return !getBinding().isColourBySequence();
   }
 
+  @Override
   public String getViewId()
   {
     if (viewId == null)
@@ -391,6 +397,7 @@ public abstract class StructureViewerBase extends GStructureViewer
     }
   }
 
+  @Override
   public abstract ViewerType getViewerType();
 
   /**
@@ -606,7 +613,8 @@ public abstract class StructureViewerBase extends GStructureViewer
       chainMenu.add(menuItem);
     }
   }
-  void setHetatmMenuItems(List<String> hetatmNames)
+
+  void setHetatmMenuItems(Map<String, String> hetatmNames)
   {
     hetatmMenu.removeAll();
     if (hetatmNames == null || hetatmNames.isEmpty())
@@ -615,7 +623,7 @@ public abstract class StructureViewerBase extends GStructureViewer
       return;
     }
     hetatmMenu.setVisible(true);
-    allHetatmBeingSelected=false;
+    allHetatmBeingSelected = false;
     JMenuItem allMenuItem = new JMenuItem(
             MessageManager.getString("label.all"));
     JMenuItem noneMenuItem = new JMenuItem(
@@ -623,53 +631,60 @@ public abstract class StructureViewerBase extends GStructureViewer
     allMenuItem.addActionListener(new ActionListener()
     {
       @Override
-      public void actionPerformed(ActionEvent e) {
+      public void actionPerformed(ActionEvent e)
       {
-        allHetatmBeingSelected=true;
-        // Toggle state of everything - on
-        for (int i = 0; i < hetatmMenu.getItemCount(); i++)
         {
-          if (hetatmMenu.getItem(i) instanceof JCheckBoxMenuItem)
+          allHetatmBeingSelected = true;
+          // Toggle state of everything - on
+          for (int i = 0; i < hetatmMenu.getItemCount(); i++)
           {
-            ((JCheckBoxMenuItem) hetatmMenu.getItem(i)).setSelected(true);
+            if (hetatmMenu.getItem(i) instanceof JCheckBoxMenuItem)
+            {
+              ((JCheckBoxMenuItem) hetatmMenu.getItem(i)).setSelected(true);
+            }
           }
+          allHetatmBeingSelected = false;
+          showSelectedHetatms();
         }
-        allHetatmBeingSelected=false;
-        showSelectedHetatms();
       }
-      }});
+    });
 
     noneMenuItem.addActionListener(new ActionListener()
     {
       @Override
-      public void actionPerformed(ActionEvent e) {
+      public void actionPerformed(ActionEvent e)
       {
-        allHetatmBeingSelected=true;
-        // Toggle state of everything off
-        for (int i = 0; i < hetatmMenu.getItemCount(); i++)
         {
-          if (hetatmMenu.getItem(i) instanceof JCheckBoxMenuItem)
+          allHetatmBeingSelected = true;
+          // Toggle state of everything off
+          for (int i = 0; i < hetatmMenu.getItemCount(); i++)
           {
-            ((JCheckBoxMenuItem) hetatmMenu.getItem(i)).setSelected(false);
+            if (hetatmMenu.getItem(i) instanceof JCheckBoxMenuItem)
+            {
+              ((JCheckBoxMenuItem) hetatmMenu.getItem(i))
+                      .setSelected(false);
+            }
           }
+          allHetatmBeingSelected = false;
+          showSelectedHetatms();
         }
-        allHetatmBeingSelected=false;
-        showSelectedHetatms();
       }
-      }});
+    });
     hetatmMenu.add(noneMenuItem);
     hetatmMenu.add(allMenuItem);
 
-    for (String chain : hetatmNames)
+    for (Map.Entry<String, String> chain : hetatmNames.entrySet())
     {
-      JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(chain, false);
+      JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(chain.getKey(),
+              false);
+      menuItem.setToolTipText(chain.getValue());
       menuItem.addItemListener(new ItemListener()
       {
         @Override
         public void itemStateChanged(ItemEvent evt)
         {
           if (!allHetatmBeingSelected)
-          { 
+          {
             // update viewer only when we were clicked, not programmatically
             // checked/unchecked
             showSelectedHetatms();
@@ -1175,7 +1190,7 @@ public abstract class StructureViewerBase extends GStructureViewer
   {
     // TODO would rather have startProgress/stopProgress as the
     // IProgressIndicator interface
-    long tm = random.nextLong();
+    long tm = IdUtils.newId(IdType.PROGRESS);
     if (progressBar != null)
     {
       progressBar.setProgressBar(msg, tm);
@@ -1235,6 +1250,7 @@ public abstract class StructureViewerBase extends GStructureViewer
     }
     getBinding().showChains(toshow);
   }
+
   /**
    * Display selected hetatms in viewer
    */
@@ -1254,6 +1270,7 @@ public abstract class StructureViewerBase extends GStructureViewer
     }
     getBinding().showHetatms(toshow);
   }
+
   /**
    * Tries to fetch a PDB file and save to a temporary local file. Returns the
    * saved file path if successful, or null if not.
@@ -1268,8 +1285,7 @@ public abstract class StructureViewerBase extends GStructureViewer
     EBIAlfaFold afclient = new EBIAlfaFold();
     AlignmentI pdbseq = null;
     String pdbid = processingEntry.getId();
-    long handle = System.currentTimeMillis()
-            + Thread.currentThread().hashCode();
+    long handle = IdUtils.newId(IdType.PROGRESS);
 
     /*
      * Write 'fetching PDB' progress on AlignFrame as we are not yet visible
@@ -1346,6 +1362,7 @@ public abstract class StructureViewerBase extends GStructureViewer
    * 
    * @return
    */
+  @Override
   public File saveSession()
   {
     if (getBinding() == null)
@@ -1457,12 +1474,15 @@ public abstract class StructureViewerBase extends GStructureViewer
     // TODO: check for memory leaks where instance isn't finalised because jmb
     // holds a reference to the window
     // jmb = null;
-    
-    try {
+
+    try
+    {
       svbs.remove(this);
     } catch (Throwable t)
     {
-      Console.info("Unexpected exception when deregistering structure viewer",t);
+      Console.info(
+              "Unexpected exception when deregistering structure viewer",
+              t);
     }
     dispose();
   }