package jalview.gui; import jalview.gui.ViewSelectionMenu.ViewSetProvider; import jalview.jbgui.GStructureViewer; import java.awt.Component; import java.util.ArrayList; import java.util.List; import java.util.Vector; import javax.swing.JMenuItem; /** * Base class with common functionality for JMol, Chimera or other structure * viewers. * * @author gmcarstairs * */ public abstract class StructureViewerBase extends GStructureViewer implements Runnable, ViewSetProvider { /** * list of sequenceSet ids associated with the view */ protected List _aps = new ArrayList(); /** * list of alignment panels to use for superposition */ protected Vector _alignwith = new Vector(); /** * list of alignment panels that are used for colouring structures by aligned * sequences */ protected Vector _colourwith = new Vector(); private String viewId = null; private AlignmentPanel ap; /** * * @param ap2 * @return true if this Jmol instance is linked with the given alignPanel */ public boolean isLinkedWith(AlignmentPanel ap2) { return _aps.contains(ap2.av.getSequenceSetId()); } public boolean isUsedforaligment(AlignmentPanel ap2) { return (_alignwith != null) && _alignwith.contains(ap2); } public boolean isUsedforcolourby(AlignmentPanel ap2) { return (_colourwith != null) && _colourwith.contains(ap2); } /** * * @return TRUE if the view is NOT being coloured by the alignment colours. */ public boolean isColouredByViewer() { return !getBinding().isColourBySequence(); } public String getViewId() { if (viewId == null) { viewId = System.currentTimeMillis() + "." + this.hashCode(); } return viewId; } protected void setViewId(String viewId) { this.viewId = viewId; } public abstract String getStateInfo(); protected void buildActionMenu() { if (_alignwith == null) { _alignwith = new Vector(); } if (_alignwith.size() == 0 && ap != null) { _alignwith.add(ap); } ; for (Component c : viewerActionMenu.getMenuComponents()) { if (c != alignStructs) { viewerActionMenu.remove((JMenuItem) c); } } } public AlignmentPanel getAlignmentPanel() { return ap; } protected void setAlignmentPanel(AlignmentPanel alp) { this.ap = alp; } public AlignmentPanel[] getAllAlignmentPanels() { AlignmentPanel[] t, list = new AlignmentPanel[0]; for (String setid : _aps) { AlignmentPanel[] panels = PaintRefresher.getAssociatedPanels(setid); if (panels != null) { t = new AlignmentPanel[list.length + panels.length]; System.arraycopy(list, 0, t, 0, list.length); System.arraycopy(panels, 0, t, list.length, panels.length); list = t; } } return list; } /** * set the primary alignmentPanel reference and add another alignPanel to the * list of ones to use for colouring and aligning * * @param nap */ public void addAlignmentPanel(AlignmentPanel nap) { if (getAlignmentPanel() == null) { setAlignmentPanel(nap); } if (!_aps.contains(nap.av.getSequenceSetId())) { _aps.add(nap.av.getSequenceSetId()); } } /** * remove any references held to the given alignment panel * * @param nap */ public void removeAlignmentPanel(AlignmentPanel nap) { try { _alignwith.remove(nap); _colourwith.remove(nap); if (getAlignmentPanel() == nap) { setAlignmentPanel(null); for (AlignmentPanel aps : getAllAlignmentPanels()) { if (aps != nap) { setAlignmentPanel(aps); break; } } } } catch (Exception ex) { } if (getAlignmentPanel() != null) { buildActionMenu(); } } public void useAlignmentPanelForSuperposition(AlignmentPanel nap) { addAlignmentPanel(nap); if (!_alignwith.contains(nap)) { _alignwith.add(nap); } } public void excludeAlignmentPanelForSuperposition(AlignmentPanel nap) { if (_alignwith.contains(nap)) { _alignwith.remove(nap); } } public void useAlignmentPanelForColourbyseq(AlignmentPanel nap, boolean enableColourBySeq) { useAlignmentPanelForColourbyseq(nap); getBinding().setColourBySequence(enableColourBySeq); seqColour.setSelected(enableColourBySeq); viewerColour.setSelected(!enableColourBySeq); } public void useAlignmentPanelForColourbyseq(AlignmentPanel nap) { addAlignmentPanel(nap); if (!_colourwith.contains(nap)) { _colourwith.add(nap); } } public void excludeAlignmentPanelForColourbyseq(AlignmentPanel nap) { if (_colourwith.contains(nap)) { _colourwith.remove(nap); } } }