X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FStructureViewerBase.java;h=1f39b545bbc3f73e42ef2cc0526c9ca1511b4ab6;hb=afe4b88500a5d61bc8d312909cfdde2b7cdd53df;hp=6ebbf89425d532d017d9159a0fa05ac43f66ce7a;hpb=9ffbc78ef4639f680f304758c88d4e1d98c13859;p=jalview.git diff --git a/src/jalview/gui/StructureViewerBase.java b/src/jalview/gui/StructureViewerBase.java index 6ebbf89..1f39b54 100644 --- a/src/jalview/gui/StructureViewerBase.java +++ b/src/jalview/gui/StructureViewerBase.java @@ -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; @@ -47,6 +48,7 @@ import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import jalview.api.AlignmentViewPanel; +import jalview.api.structures.JalviewStructureDisplayI; import jalview.bin.Cache; import jalview.bin.Console; import jalview.datamodel.AlignmentI; @@ -64,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; @@ -87,12 +91,21 @@ public abstract class StructureViewerBase extends GStructureViewer BySequence, ByChain, ChargeCysteine, ByViewer } - private static List svbs = new ArrayList<>(); + /** + * 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 svbs = new ArrayList<>(); - public static List getAllStructureViewerBases() + /** + * + * @return list with all existing StructureViewers instance + */ + public static List getAllStructureViewerBases() { - List goodSvbs = new ArrayList<>(); - for (StructureViewerBase s : svbs) + List goodSvbs = new ArrayList<>(); + for (JalviewStructureDisplayI s : svbs) { if (s != null && !goodSvbs.contains(s)) { @@ -132,6 +145,8 @@ public abstract class StructureViewerBase extends GStructureViewer protected boolean allChainsSelected = false; + protected boolean allHetatmBeingSelected = false; + protected JMenu viewSelectionMenu; /** @@ -196,6 +211,7 @@ public abstract class StructureViewerBase extends GStructureViewer return _aps.contains(ap2.av.getSequenceSetId()); } + @Override public boolean isUsedforaligment(AlignmentViewPanel ap2) { @@ -212,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) @@ -379,6 +397,7 @@ public abstract class StructureViewerBase extends GStructureViewer } } + @Override public abstract ViewerType getViewerType(); /** @@ -595,6 +614,88 @@ public abstract class StructureViewerBase extends GStructureViewer } } + void setHetatmMenuItems(Map 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 (Map.Entry chain : hetatmNames.entrySet()) + { + 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(); + } + } + }); + + hetatmMenu.add(menuItem); + } + } + /** * Action on selecting one of Jalview's registered colour schemes */ @@ -999,6 +1100,7 @@ public abstract class StructureViewerBase extends GStructureViewer return; } setChainMenuItems(binding.getChainNames()); + setHetatmMenuItems(binding.getHetatmNames()); this.setTitle(binding.getViewerTitle(getViewerName(), true)); @@ -1088,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); @@ -1150,6 +1252,26 @@ public abstract class StructureViewerBase extends GStructureViewer } /** + * Display selected hetatms in viewer + */ + protected void showSelectedHetatms() + { + List 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. * @@ -1163,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 @@ -1241,6 +1362,7 @@ public abstract class StructureViewerBase extends GStructureViewer * * @return */ + @Override public File saveSession() { if (getBinding() == null) @@ -1352,6 +1474,16 @@ 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 + { + svbs.remove(this); + } catch (Throwable t) + { + Console.info( + "Unexpected exception when deregistering structure viewer", + t); + } dispose(); }