JAL-4307 View->Ligands submenu, implementation for Jmol and documentation
[jalview.git] / src / jalview / gui / StructureViewerBase.java
index ed42ffa..09d2dcb 100644 (file)
@@ -141,6 +141,8 @@ public abstract class StructureViewerBase extends GStructureViewer
 
   protected boolean allChainsSelected = false;
 
+  protected boolean allHetatmBeingSelected = false;
+
   protected JMenu viewSelectionMenu;
 
   /**
@@ -604,6 +606,80 @@ public abstract class StructureViewerBase extends GStructureViewer
       chainMenu.add(menuItem);
     }
   }
+  void setHetatmMenuItems(List<String> hetatmNames)
+  {
+    hetatmMenu.removeAll();
+    if (hetatmNames == null || hetatmNames.isEmpty())
+    {
+      hetatmMenu.setVisible(false);
+      return;
+    }
+    hetatmMenu.setVisible(true);
+    allHetatmBeingSelected=false;
+    JMenuItem allMenuItem = new JMenuItem(
+            MessageManager.getString("label.all"));
+    JMenuItem noneMenuItem = new JMenuItem(
+            MessageManager.getString("label.none"));
+    allMenuItem.addActionListener(new ActionListener()
+    {
+      @Override
+      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)
+          {
+            ((JCheckBoxMenuItem) hetatmMenu.getItem(i)).setSelected(true);
+          }
+        }
+        allHetatmBeingSelected=false;
+        showSelectedHetatms();
+      }
+      }});
+
+    noneMenuItem.addActionListener(new ActionListener()
+    {
+      @Override
+      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)
+          {
+            ((JCheckBoxMenuItem) hetatmMenu.getItem(i)).setSelected(false);
+          }
+        }
+        allHetatmBeingSelected=false;
+        showSelectedHetatms();
+      }
+      }});
+    hetatmMenu.add(noneMenuItem);
+    hetatmMenu.add(allMenuItem);
+
+    for (String chain : hetatmNames)
+    {
+      JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(chain, false);
+      menuItem.addItemListener(new ItemListener()
+      {
+        @Override
+        public void itemStateChanged(ItemEvent evt)
+        {
+          if (!allHetatmBeingSelected)
+          { 
+            // update viewer only when we were clicked, not programmatically
+            // checked/unchecked
+            showSelectedHetatms();
+          }
+        }
+      });
+
+      hetatmMenu.add(menuItem);
+    }
+  }
 
   /**
    * Action on selecting one of Jalview's registered colour schemes
@@ -1009,6 +1085,7 @@ public abstract class StructureViewerBase extends GStructureViewer
       return;
     }
     setChainMenuItems(binding.getChainNames());
+    setHetatmMenuItems(binding.getHetatmNames());
 
     this.setTitle(binding.getViewerTitle(getViewerName(), true));
 
@@ -1158,7 +1235,25 @@ public abstract class StructureViewerBase extends GStructureViewer
     }
     getBinding().showChains(toshow);
   }
-
+  /**
+   * Display selected hetatms in viewer
+   */
+  protected void showSelectedHetatms()
+  {
+    List<String> toshow = new ArrayList<>();
+    for (int i = 0; i < hetatmMenu.getItemCount(); i++)
+    {
+      if (hetatmMenu.getItem(i) instanceof JCheckBoxMenuItem)
+      {
+        JCheckBoxMenuItem item = (JCheckBoxMenuItem) hetatmMenu.getItem(i);
+        if (item.isSelected())
+        {
+          toshow.add(item.getText());
+        }
+      }
+    }
+    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.