X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fstructure%2FStructureSelectionManager.java;h=e6634fc786a3cd2b8dc95552984e0b3d13b76a01;hb=cfbf1b2d6661bb62b2b8748b4c29c12690c7b0b4;hp=502c68e35b1cb0e8e9f1ed2e6e3076a006b7128f;hpb=245a1b805629bedf7a0d66aecb26de6bc220b991;p=jalview.git diff --git a/src/jalview/structure/StructureSelectionManager.java b/src/jalview/structure/StructureSelectionManager.java index 502c68e..e6634fc 100644 --- a/src/jalview/structure/StructureSelectionManager.java +++ b/src/jalview/structure/StructureSelectionManager.java @@ -22,11 +22,13 @@ import java.util.*; import MCview.*; import jalview.analysis.*; +import jalview.api.AlignmentViewPanel; +import jalview.api.StructureSelectionManagerProvider; import jalview.datamodel.*; public class StructureSelectionManager { - static StructureSelectionManager instance; + static IdentityHashMap instances; StructureMapping[] mappings; @@ -47,13 +49,17 @@ public class StructureSelectionManager } Hashtable mappingData = new Hashtable(); - public static StructureSelectionManager getStructureSelectionManager() + public static StructureSelectionManager getStructureSelectionManager(StructureSelectionManagerProvider context) { - if (instance == null) + if (instances == null) { - instance = new StructureSelectionManager(); + instances = new java.util.IdentityHashMap(); + } + StructureSelectionManager instance=instances.get(context); + if (instance==null) + { + instances.put(context, instance=new StructureSelectionManager()); } - return instance; } @@ -146,16 +152,32 @@ public class StructureSelectionManager ex.printStackTrace(); return null; } - + String targetChain; for (int s = 0; s < sequence.length; s++) { + boolean infChain = true; if (targetChains != null && targetChains[s] != null) + { + infChain = false; targetChain = targetChains[s]; + } else if (sequence[s].getName().indexOf("|") > -1) { targetChain = sequence[s].getName().substring( sequence[s].getName().lastIndexOf("|") + 1); + if (targetChain.length() > 1) + { + if (targetChain.trim().length() == 0) + { + targetChain = " "; + } + else + { + // not a valid chain identifier + targetChain = ""; + } + } } else targetChain = ""; @@ -167,14 +189,11 @@ public class StructureSelectionManager boolean first = true; for (int i = 0; i < pdb.chains.size(); i++) { - // TODO: re http://issues.jalview.org/browse/JAL-583 : this patch may - // need to be revoked PDBChain chain = ((PDBChain) pdb.chains.elementAt(i)); - if (targetChain.length() > 0 && !targetChain.equals(chain.id)) + if (targetChain.length() > 0 && !targetChain.equals(chain.id) && !infChain) { continue; // don't try to map chains don't match. } - // end of patch for limiting computed mappings // TODO: correctly determine sequence type for mixed na/peptide // structures AlignSeq as = new AlignSeq(sequence[s], @@ -330,6 +349,11 @@ public class StructureSelectionManager public void mouseOverStructure(int pdbResNum, String chain, String pdbfile) { + if (listeners==null) + { + // old or prematurely sent event + return; + } boolean hasSequenceListeners = handlingVamsasMo || seqmappings != null; SearchResults results = null; SequenceI lastseq = null; @@ -374,7 +398,7 @@ public class StructureSelectionManager } } } - if (results.getSize() > 0) + if (results!=null) { for (int i = 0; i < listeners.size(); i++) { @@ -675,7 +699,7 @@ public class StructureSelectionManager modifySeqMappingList(true, codonFrames); } - Vector sel_listeners = new Vector(); + Vector sel_listeners = new Vector(); public void addSelectionListener(SelectionListener selecter) { @@ -712,4 +736,78 @@ public class StructureSelectionManager } } } + + Vector view_listeners=new Vector(); + public synchronized void sendViewPosition(jalview.api.AlignmentViewPanel source, int startRes, + int endRes, int startSeq, int endSeq) + { + + if (view_listeners != null && view_listeners.size() > 0) + { + Enumeration listeners = view_listeners.elements(); + while (listeners.hasMoreElements()) + { + AlignmentViewPanelListener slis = listeners + .nextElement(); + if (slis != source) + { + slis.viewPosition(startRes, endRes, startSeq, endSeq, source); + } + ; + } + } + } + + + public void finalize() throws Throwable { + if (listeners!=null) { + listeners.clear(); + listeners=null; + } + if (mappingData!=null) + { + mappingData.clear(); + mappingData=null; + } + if (sel_listeners!=null) + { + sel_listeners.clear(); + sel_listeners=null; + } + if (view_listeners!=null) + { + view_listeners.clear(); + view_listeners=null; + } + mappings=null; + seqmappingrefs=null; + } + + /** + * release all references associated with this manager provider + * @param jalviewLite + */ + public static void release(StructureSelectionManagerProvider jalviewLite) + { +// synchronized (instances) + { + if (instances == null) + { + return; + } + StructureSelectionManager mnger = (instances.get(jalviewLite)); + if (mnger != null) + { + instances.remove(jalviewLite); + try + { + mnger.finalize(); + } catch (Throwable x) + { + } + ; + } + } + } + }