2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.structure;
23 import jalview.analysis.AlignSeq;
24 import jalview.api.StructureSelectionManagerProvider;
25 import jalview.commands.CommandI;
26 import jalview.commands.EditCommand;
27 import jalview.commands.OrderCommand;
28 import jalview.datamodel.AlignedCodonFrame;
29 import jalview.datamodel.AlignmentAnnotation;
30 import jalview.datamodel.AlignmentI;
31 import jalview.datamodel.Annotation;
32 import jalview.datamodel.PDBEntry;
33 import jalview.datamodel.SearchResults;
34 import jalview.datamodel.SequenceI;
35 import jalview.gui.IProgressIndicator;
36 import jalview.io.AppletFormatAdapter;
37 import jalview.util.MappingUtils;
38 import jalview.util.MessageManager;
39 import jalview.ws.sifts.SiftsClient;
40 import jalview.ws.sifts.SiftsException;
41 import jalview.ws.sifts.SiftsSettings;
43 import java.io.PrintStream;
44 import java.util.ArrayList;
45 import java.util.Arrays;
46 import java.util.Collections;
47 import java.util.Enumeration;
48 import java.util.HashMap;
49 import java.util.IdentityHashMap;
50 import java.util.List;
52 import java.util.Vector;
55 import MCview.PDBChain;
56 import MCview.PDBfile;
58 public class StructureSelectionManager
60 public final static String NEWLINE = System.lineSeparator();
62 static IdentityHashMap<StructureSelectionManagerProvider, StructureSelectionManager> instances;
64 private List<StructureMapping> mappings = new ArrayList<StructureMapping>();
66 private boolean processSecondaryStructure = false;
68 private boolean secStructServices = false;
70 private boolean addTempFacAnnot = false;
72 private IProgressIndicator progressIndicator;
74 private SiftsClient siftsClient = null;
76 private long progressSessionId;
79 * Set of any registered mappings between (dataset) sequences.
81 private List<AlignedCodonFrame> seqmappings = new ArrayList<AlignedCodonFrame>();
83 private List<CommandListener> commandListeners = new ArrayList<CommandListener>();
85 private List<SelectionListener> sel_listeners = new ArrayList<SelectionListener>();
88 * @return true if will try to use external services for processing secondary
91 public boolean isSecStructServices()
93 return secStructServices;
97 * control use of external services for processing secondary structure
99 * @param secStructServices
101 public void setSecStructServices(boolean secStructServices)
103 this.secStructServices = secStructServices;
107 * flag controlling addition of any kind of structural annotation
109 * @return true if temperature factor annotation will be added
111 public boolean isAddTempFacAnnot()
113 return addTempFacAnnot;
117 * set flag controlling addition of structural annotation
119 * @param addTempFacAnnot
121 public void setAddTempFacAnnot(boolean addTempFacAnnot)
123 this.addTempFacAnnot = addTempFacAnnot;
128 * @return if true, the structure manager will attempt to add secondary
129 * structure lines for unannotated sequences
132 public boolean isProcessSecondaryStructure()
134 return processSecondaryStructure;
138 * Control whether structure manager will try to annotate mapped sequences
139 * with secondary structure from PDB data.
143 public void setProcessSecondaryStructure(boolean enable)
145 processSecondaryStructure = enable;
149 * debug function - write all mappings to stdout
151 public void reportMapping()
153 if (mappings.isEmpty())
155 System.err.println("reportMapping: No PDB/Sequence mappings.");
159 System.err.println("reportMapping: There are " + mappings.size()
162 for (StructureMapping sm : mappings)
164 System.err.println("mapping " + i++ + " : " + sm.pdbfile);
170 * map between the PDB IDs (or structure identifiers) used by Jalview and the
171 * absolute filenames for PDB data that corresponds to it
173 Map<String, String> pdbIdFileName = new HashMap<String, String>();
175 Map<String, String> pdbFileNameId = new HashMap<String, String>();
177 public void registerPDBFile(String idForFile, String absoluteFile)
179 pdbIdFileName.put(idForFile, absoluteFile);
180 pdbFileNameId.put(absoluteFile, idForFile);
183 public String findIdForPDBFile(String idOrFile)
185 String id = pdbFileNameId.get(idOrFile);
189 public String findFileForPDBId(String idOrFile)
191 String id = pdbIdFileName.get(idOrFile);
195 public boolean isPDBFileRegistered(String idOrFile)
197 return pdbFileNameId.containsKey(idOrFile)
198 || pdbIdFileName.containsKey(idOrFile);
201 private static StructureSelectionManager nullProvider = null;
203 public static StructureSelectionManager getStructureSelectionManager(
204 StructureSelectionManagerProvider context)
208 if (nullProvider == null)
210 if (instances != null)
214 .getString("error.implementation_error_structure_selection_manager_null"),
215 new NullPointerException(MessageManager
216 .getString("exception.ssm_context_is_null")));
220 nullProvider = new StructureSelectionManager();
225 if (instances == null)
227 instances = new java.util.IdentityHashMap<StructureSelectionManagerProvider, StructureSelectionManager>();
229 StructureSelectionManager instance = instances.get(context);
230 if (instance == null)
232 if (nullProvider != null)
234 instance = nullProvider;
238 instance = new StructureSelectionManager();
240 instances.put(context, instance);
246 * flag controlling whether SeqMappings are relayed from received sequence
247 * mouse over events to other sequences
249 boolean relaySeqMappings = true;
252 * Enable or disable relay of seqMapping events to other sequences. You might
253 * want to do this if there are many sequence mappings and the host computer
258 public void setRelaySeqMappings(boolean relay)
260 relaySeqMappings = relay;
264 * get the state of the relay seqMappings flag.
266 * @return true if sequence mouse overs are being relayed to other mapped
269 public boolean isRelaySeqMappingsEnabled()
271 return relaySeqMappings;
274 Vector listeners = new Vector();
277 * register a listener for alignment sequence mouseover events
281 public void addStructureViewerListener(Object svl)
283 if (!listeners.contains(svl))
285 listeners.addElement(svl);
290 * Returns the file name for a mapped PDB id (or null if not mapped).
295 public String alreadyMappedToFile(String pdbid)
297 for (StructureMapping sm : mappings)
299 if (sm.getPdbId().equals(pdbid))
308 * Import structure data and register a structure mapping for broadcasting
309 * colouring, mouseovers and selection events (convenience wrapper).
312 * - one or more sequences to be mapped to pdbFile
313 * @param targetChains
314 * - optional chain specification for mapping each sequence to pdb
315 * (may be nill, individual elements may be nill)
317 * - structure data resource
319 * - how to resolve data from resource
320 * @return null or the structure data parsed as a pdb file
322 synchronized public PDBfile setMapping(SequenceI[] sequence,
323 String[] targetChains, String pdbFile, String protocol)
325 return setMapping(true, sequence, targetChains, pdbFile, protocol);
329 * create sequence structure mappings between each sequence and the given
330 * pdbFile (retrieved via the given protocol).
332 * @param forStructureView
333 * when true, record the mapping for use in mouseOvers
335 * @param sequenceArray
336 * - one or more sequences to be mapped to pdbFile
337 * @param targetChainIds
338 * - optional chain specification for mapping each sequence to pdb
339 * (may be nill, individual elements may be nill)
341 * - structure data resource
343 * - how to resolve data from resource
344 * @return null or the structure data parsed as a pdb file
346 synchronized public PDBfile setMapping(boolean forStructureView,
347 SequenceI[] sequenceArray, String[] targetChainIds,
352 * There will be better ways of doing this in the future, for now we'll use
353 * the tried and tested MCview pdb mapping
355 boolean parseSecStr = processSecondaryStructure;
356 if (isPDBFileRegistered(pdbFile))
358 for (SequenceI sq : sequenceArray)
361 while (ds.getDatasetSequence() != null)
363 ds = ds.getDatasetSequence();
366 if (ds.getAnnotation() != null)
368 for (AlignmentAnnotation ala : ds.getAnnotation())
370 // false if any annotation present from this structure
371 // JBPNote this fails for jmol/chimera view because the *file* is
372 // passed, not the structure data ID -
373 if (PDBfile.isCalcIdForFile(ala, findIdForPDBFile(pdbFile)))
382 boolean isMapUsingSIFTs = SiftsSettings.isMapWithSifts();
385 pdb = new PDBfile(addTempFacAnnot, parseSecStr, secStructServices,
388 if (pdb.getId() != null && pdb.getId().trim().length() > 0
389 && AppletFormatAdapter.FILE.equals(protocol))
391 registerPDBFile(pdb.getId().trim(), pdbFile);
393 } catch (Exception ex)
395 ex.printStackTrace();
403 siftsClient = new SiftsClient(pdb);
405 } catch (SiftsException e)
407 isMapUsingSIFTs = false;
411 String targetChainId;
412 for (int s = 0; s < sequenceArray.length; s++)
414 boolean infChain = true;
415 final SequenceI seq = sequenceArray[s];
416 if (targetChainIds != null && targetChainIds[s] != null)
419 targetChainId = targetChainIds[s];
421 else if (seq.getName().indexOf("|") > -1)
423 targetChainId = seq.getName().substring(
424 seq.getName().lastIndexOf("|") + 1);
425 if (targetChainId.length() > 1)
427 if (targetChainId.trim().length() == 0)
433 // not a valid chain identifier
444 * Attempt pairwise alignment of the sequence with each chain in the PDB,
445 * and remember the highest scoring chain
448 AlignSeq maxAlignseq = null;
449 String maxChainId = " ";
450 PDBChain maxChain = null;
451 boolean first = true;
452 for (PDBChain chain : pdb.getChains())
454 if (targetChainId.length() > 0 && !targetChainId.equals(chain.id)
457 continue; // don't try to map chains don't match.
459 // TODO: correctly determine sequence type for mixed na/peptide
461 final String type = chain.isNa ? AlignSeq.DNA : AlignSeq.PEP;
462 AlignSeq as = AlignSeq.doGlobalNWAlignment(seq, chain.sequence,
465 // AlignSeq as = new AlignSeq(sequence[s], chain.sequence, type);
466 // as.calcScoreMatrix();
467 // as.traceAlignment();
469 if (first || as.maxscore > max
470 || (as.maxscore == max && chain.id.equals(targetChainId)))
476 maxChainId = chain.id;
479 if (maxChain == null)
484 if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE))
486 pdbFile = "INLINE" + pdb.getId();
489 ArrayList<StructureMapping> seqToStrucMapping = new ArrayList<StructureMapping>();
492 setProgressBar(null);
493 setProgressBar("Obtaining mapping with SIFTS");
494 jalview.datamodel.Mapping sqmpping = maxAlignseq
495 .getMappingFromS1(false);
496 if (targetChainId != null && !targetChainId.trim().isEmpty())
498 StructureMapping mapping = getStructureMapping(seq, pdbFile,
499 targetChainId, pdb, maxChain, sqmpping, maxAlignseq);
500 seqToStrucMapping.add(mapping);
504 for (PDBChain chain : pdb.getChains())
506 StructureMapping mapping = getStructureMapping(seq, pdbFile,
507 chain.id, pdb, chain, sqmpping, maxAlignseq);
508 seqToStrucMapping.add(mapping);
514 setProgressBar(null);
515 setProgressBar("Obtaining mapping with NW alignment");
516 seqToStrucMapping.add(getNWMappings(seq, pdbFile, maxChainId,
517 maxChain, pdb, maxAlignseq));
520 if (forStructureView)
522 mappings.addAll(seqToStrucMapping);
528 private StructureMapping getStructureMapping(SequenceI seq,
529 String pdbFile, String targetChainId, PDBfile pdb,
530 PDBChain maxChain, jalview.datamodel.Mapping sqmpping,
531 AlignSeq maxAlignseq)
533 String maxChainId = targetChainId;
536 StructureMapping curChainMapping = siftsClient
537 .getSiftsStructureMapping(seq, pdbFile, targetChainId);
540 PDBChain chain = pdb.findChain(targetChainId);
543 chain.transferResidueAnnotation(curChainMapping, sqmpping);
545 } catch (Exception e)
549 return curChainMapping;
550 } catch (SiftsException e)
552 System.err.println(e.getMessage());
553 System.err.println(">>> Now switching mapping with NW alignment...");
554 setProgressBar(null);
555 setProgressBar(">>> Now switching mapping with NW alignment...");
556 return getNWMappings(seq, pdbFile, maxChainId, maxChain, pdb,
561 private StructureMapping getNWMappings(SequenceI seq,
563 String maxChainId, PDBChain maxChain, PDBfile pdb,
564 AlignSeq maxAlignseq)
566 final StringBuilder mappingDetails = new StringBuilder(128);
567 mappingDetails.append(NEWLINE).append(
568 "Sequence \u27f7 Structure mapping details");
569 mappingDetails.append(NEWLINE);
571 .append("Method: inferred with Needleman & Wunsch alignment");
572 mappingDetails.append(NEWLINE).append("PDB Sequence is :")
573 .append(NEWLINE).append("Sequence = ")
574 .append(maxChain.sequence.getSequenceAsString());
575 mappingDetails.append(NEWLINE).append("No of residues = ")
576 .append(maxChain.residues.size()).append(NEWLINE)
578 PrintStream ps = new PrintStream(System.out)
581 public void print(String x)
583 mappingDetails.append(x);
587 public void println()
589 mappingDetails.append(NEWLINE);
593 maxAlignseq.printAlignment(ps);
595 mappingDetails.append(NEWLINE).append("PDB start/end ");
596 mappingDetails.append(String.valueOf(maxAlignseq.seq2start))
598 mappingDetails.append(String.valueOf(maxAlignseq.seq2end));
599 mappingDetails.append(NEWLINE).append("SEQ start/end ");
600 mappingDetails.append(
601 String.valueOf(maxAlignseq.seq1start + (seq.getStart() - 1)))
603 mappingDetails.append(String.valueOf(maxAlignseq.seq1end
604 + (seq.getStart() - 1)));
605 mappingDetails.append(NEWLINE);
606 maxChain.makeExactMapping(maxAlignseq, seq);
607 jalview.datamodel.Mapping sqmpping = maxAlignseq
608 .getMappingFromS1(false);
609 maxChain.transferRESNUMFeatures(seq, null);
611 HashMap<Integer, int[]> mapping = new HashMap<Integer, int[]>();
618 Atom tmp = maxChain.atoms.elementAt(index);
619 if ((resNum != tmp.resNumber || insCode != tmp.insCode)
620 && tmp.alignmentMapping != -1)
622 resNum = tmp.resNumber;
623 insCode = tmp.insCode;
624 if (tmp.alignmentMapping >= -1)
626 mapping.put(tmp.alignmentMapping + 1, new int[] { tmp.resNumber,
632 } while (index < maxChain.atoms.size());
634 StructureMapping nwMapping = new StructureMapping(seq, pdbFile,
635 pdb.getId(), maxChainId, mapping, mappingDetails.toString());
636 maxChain.transferResidueAnnotation(nwMapping, sqmpping);
640 public void removeStructureViewerListener(Object svl, String[] pdbfiles)
642 listeners.removeElement(svl);
643 if (svl instanceof SequenceListener)
645 for (int i = 0; i < listeners.size(); i++)
647 if (listeners.elementAt(i) instanceof StructureListener)
649 ((StructureListener) listeners.elementAt(i))
650 .releaseReferences(svl);
655 if (pdbfiles == null)
661 * Remove mappings to the closed listener's PDB files, but first check if
662 * another listener is still interested
664 List<String> pdbs = new ArrayList<String>(Arrays.asList(pdbfiles));
666 StructureListener sl;
667 for (int i = 0; i < listeners.size(); i++)
669 if (listeners.elementAt(i) instanceof StructureListener)
671 sl = (StructureListener) listeners.elementAt(i);
672 for (String pdbfile : sl.getPdbFile())
674 pdbs.remove(pdbfile);
680 * Rebuild the mappings set, retaining only those which are for 'other' PDB
685 List<StructureMapping> tmp = new ArrayList<StructureMapping>();
686 for (StructureMapping sm : mappings)
688 if (!pdbs.contains(sm.pdbfile))
699 * Propagate mouseover of a single position in a structure
705 public void mouseOverStructure(int pdbResNum, String chain, String pdbfile)
707 AtomSpec atomSpec = new AtomSpec(pdbfile, chain, pdbResNum, 0);
708 List<AtomSpec> atoms = Collections.singletonList(atomSpec);
709 mouseOverStructure(atoms);
713 * Propagate mouseover or selection of multiple positions in a structure
717 public void mouseOverStructure(List<AtomSpec> atoms)
719 if (listeners == null)
721 // old or prematurely sent event
724 boolean hasSequenceListener = false;
725 for (int i = 0; i < listeners.size(); i++)
727 if (listeners.elementAt(i) instanceof SequenceListener)
729 hasSequenceListener = true;
732 if (!hasSequenceListener)
737 SearchResults results = new SearchResults();
738 for (AtomSpec atom : atoms)
740 SequenceI lastseq = null;
742 for (StructureMapping sm : mappings)
744 if (sm.pdbfile.equals(atom.getPdbFile())
745 && sm.pdbchain.equals(atom.getChain()))
747 int indexpos = sm.getSeqPos(atom.getPdbResNum());
748 if (lastipos != indexpos && lastseq != sm.sequence)
750 results.addResult(sm.sequence, indexpos, indexpos);
752 lastseq = sm.sequence;
753 // construct highlighted sequence list
754 for (AlignedCodonFrame acf : seqmappings)
756 acf.markMappedRegion(sm.sequence, indexpos, results);
762 for (Object li : listeners)
764 if (li instanceof SequenceListener)
766 ((SequenceListener) li).highlightSequence(results);
772 * highlight regions associated with a position (indexpos) in seq
775 * the sequence that the mouse over occurred on
777 * the absolute position being mouseovered in seq (0 to seq.length())
779 * the sequence position (if -1, seq.findPosition is called to
780 * resolve the residue number)
782 public void mouseOverSequence(SequenceI seq, int indexpos, int seqPos,
785 boolean hasSequenceListeners = handlingVamsasMo
786 || !seqmappings.isEmpty();
787 SearchResults results = null;
790 seqPos = seq.findPosition(indexpos);
792 for (int i = 0; i < listeners.size(); i++)
794 Object listener = listeners.elementAt(i);
795 if (listener == source)
797 // TODO listener (e.g. SeqPanel) is never == source (AlignViewport)
798 // Temporary fudge with SequenceListener.getVamsasSource()
801 if (listener instanceof StructureListener)
803 highlightStructure((StructureListener) listener, seq, seqPos);
807 if (listener instanceof SequenceListener)
809 final SequenceListener seqListener = (SequenceListener) listener;
810 if (hasSequenceListeners
811 && seqListener.getVamsasSource() != source)
813 if (relaySeqMappings)
817 results = MappingUtils.buildSearchResults(seq, seqPos,
820 if (handlingVamsasMo)
822 results.addResult(seq, seqPos, seqPos);
825 if (!results.isEmpty())
827 seqListener.highlightSequence(results);
832 else if (listener instanceof VamsasListener && !handlingVamsasMo)
834 ((VamsasListener) listener).mouseOverSequence(seq, indexpos,
837 else if (listener instanceof SecondaryStructureListener)
839 ((SecondaryStructureListener) listener).mouseOverSequence(seq,
847 * Send suitable messages to a StructureListener to highlight atoms
848 * corresponding to the given sequence position(s)
854 public void highlightStructure(StructureListener sl, SequenceI seq,
857 if (!sl.isListeningFor(seq))
862 List<AtomSpec> atoms = new ArrayList<AtomSpec>();
863 for (StructureMapping sm : mappings)
865 if (sm.sequence == seq || sm.sequence == seq.getDatasetSequence())
867 for (int index : positions)
869 atomNo = sm.getAtomNum(index);
873 atoms.add(new AtomSpec(sm.pdbfile, sm.pdbchain, sm
874 .getPDBResNum(index), atomNo));
879 sl.highlightAtoms(atoms);
883 * true if a mouse over event from an external (ie Vamsas) source is being
886 boolean handlingVamsasMo = false;
891 * as mouseOverSequence but only route event to SequenceListeners
895 * in an alignment sequence
897 public void mouseOverVamsasSequence(SequenceI sequenceI, int position,
900 handlingVamsasMo = true;
901 long msg = sequenceI.hashCode() * (1 + position);
905 mouseOverSequence(sequenceI, position, -1, source);
907 handlingVamsasMo = false;
910 public Annotation[] colourSequenceFromStructure(SequenceI seq,
914 // THIS WILL NOT BE AVAILABLE IN JALVIEW 2.3,
915 // UNTIL THE COLOUR BY ANNOTATION IS REWORKED
917 * Annotation [] annotations = new Annotation[seq.getLength()];
919 * StructureListener sl; int atomNo = 0; for (int i = 0; i <
920 * listeners.size(); i++) { if (listeners.elementAt(i) instanceof
921 * StructureListener) { sl = (StructureListener) listeners.elementAt(i);
923 * for (int j = 0; j < mappings.length; j++) {
925 * if (mappings[j].sequence == seq && mappings[j].getPdbId().equals(pdbid)
926 * && mappings[j].pdbfile.equals(sl.getPdbFile())) {
927 * System.out.println(pdbid+" "+mappings[j].getPdbId() +"
928 * "+mappings[j].pdbfile);
930 * java.awt.Color col; for(int index=0; index<seq.getLength(); index++) {
931 * if(jalview.util.Comparison.isGap(seq.getCharAt(index))) continue;
933 * atomNo = mappings[j].getAtomNum(seq.findPosition(index)); col =
934 * java.awt.Color.white; if (atomNo > 0) { col = sl.getColour(atomNo,
935 * mappings[j].getPDBResNum(index), mappings[j].pdbchain,
936 * mappings[j].pdbfile); }
938 * annotations[index] = new Annotation("X",null,' ',0,col); } return
939 * annotations; } } } }
941 * return annotations;
945 public void structureSelectionChanged()
949 public void sequenceSelectionChanged()
953 public void sequenceColoursChanged(Object source)
955 StructureListener sl;
956 for (int i = 0; i < listeners.size(); i++)
958 if (listeners.elementAt(i) instanceof StructureListener)
960 sl = (StructureListener) listeners.elementAt(i);
961 sl.updateColours(source);
966 public StructureMapping[] getMapping(String pdbfile)
968 List<StructureMapping> tmp = new ArrayList<StructureMapping>();
969 for (StructureMapping sm : mappings)
971 if (sm.pdbfile.equals(pdbfile))
976 return tmp.toArray(new StructureMapping[tmp.size()]);
980 * Returns a readable description of all mappings for the given pdbfile to any
981 * of the given sequences
987 public String printMappings(String pdbfile, List<SequenceI> seqs)
989 if (pdbfile == null || seqs == null || seqs.isEmpty())
994 StringBuilder sb = new StringBuilder(64);
995 for (StructureMapping sm : mappings)
997 if (sm.pdbfile.equals(pdbfile) && seqs.contains(sm.sequence))
999 sb.append(sm.mappingDetails);
1001 // separator makes it easier to read multiple mappings
1002 sb.append("=====================");
1008 return sb.toString();
1012 * Remove the given mapping
1016 public void deregisterMapping(AlignedCodonFrame acf)
1020 boolean removed = seqmappings.remove(acf);
1021 if (removed && seqmappings.isEmpty())
1023 System.out.println("All mappings removed");
1029 * Add each of the given codonFrames to the stored set, if not aready present.
1033 public void registerMappings(List<AlignedCodonFrame> mappings)
1035 if (mappings != null)
1037 for (AlignedCodonFrame acf : mappings)
1039 registerMapping(acf);
1045 * Add the given mapping to the stored set, unless already stored.
1047 public void registerMapping(AlignedCodonFrame acf)
1051 if (!seqmappings.contains(acf))
1053 seqmappings.add(acf);
1059 * Resets this object to its initial state by removing all registered
1060 * listeners, codon mappings, PDB file mappings
1062 public void resetAll()
1064 if (mappings != null)
1068 if (seqmappings != null)
1070 seqmappings.clear();
1072 if (sel_listeners != null)
1074 sel_listeners.clear();
1076 if (listeners != null)
1080 if (commandListeners != null)
1082 commandListeners.clear();
1084 if (view_listeners != null)
1086 view_listeners.clear();
1088 if (pdbFileNameId != null)
1090 pdbFileNameId.clear();
1092 if (pdbIdFileName != null)
1094 pdbIdFileName.clear();
1098 public void addSelectionListener(SelectionListener selecter)
1100 if (!sel_listeners.contains(selecter))
1102 sel_listeners.add(selecter);
1106 public void removeSelectionListener(SelectionListener toremove)
1108 if (sel_listeners.contains(toremove))
1110 sel_listeners.remove(toremove);
1114 public synchronized void sendSelection(
1115 jalview.datamodel.SequenceGroup selection,
1116 jalview.datamodel.ColumnSelection colsel, SelectionSource source)
1118 for (SelectionListener slis : sel_listeners)
1122 slis.selection(selection, colsel, source);
1127 Vector<AlignmentViewPanelListener> view_listeners = new Vector<AlignmentViewPanelListener>();
1129 public synchronized void sendViewPosition(
1130 jalview.api.AlignmentViewPanel source, int startRes, int endRes,
1131 int startSeq, int endSeq)
1134 if (view_listeners != null && view_listeners.size() > 0)
1136 Enumeration<AlignmentViewPanelListener> listeners = view_listeners
1138 while (listeners.hasMoreElements())
1140 AlignmentViewPanelListener slis = listeners.nextElement();
1143 slis.viewPosition(startRes, endRes, startSeq, endSeq, source);
1151 * release all references associated with this manager provider
1153 * @param jalviewLite
1155 public static void release(StructureSelectionManagerProvider jalviewLite)
1157 // synchronized (instances)
1159 if (instances == null)
1163 StructureSelectionManager mnger = (instances.get(jalviewLite));
1166 instances.remove(jalviewLite);
1170 } catch (Throwable x)
1177 public void registerPDBEntry(PDBEntry pdbentry)
1179 if (pdbentry.getFile() != null
1180 && pdbentry.getFile().trim().length() > 0)
1182 registerPDBFile(pdbentry.getId(), pdbentry.getFile());
1186 public void addCommandListener(CommandListener cl)
1188 if (!commandListeners.contains(cl))
1190 commandListeners.add(cl);
1194 public boolean hasCommandListener(CommandListener cl)
1196 return this.commandListeners.contains(cl);
1199 public boolean removeCommandListener(CommandListener l)
1201 return commandListeners.remove(l);
1205 * Forward a command to any command listeners (except for the command's
1209 * the command to be broadcast (in its form after being performed)
1211 * if true, the command was being 'undone'
1214 public void commandPerformed(CommandI command, boolean undo,
1215 VamsasSource source)
1217 for (CommandListener listener : commandListeners)
1219 listener.mirrorCommand(command, undo, this, source);
1224 * Returns a new CommandI representing the given command as mapped to the
1225 * given sequences. If no mapping could be made, or the command is not of a
1226 * mappable kind, returns null.
1234 public CommandI mapCommand(CommandI command, boolean undo,
1235 final AlignmentI mapTo, char gapChar)
1237 if (command instanceof EditCommand)
1239 return MappingUtils.mapEditCommand((EditCommand) command, undo,
1240 mapTo, gapChar, seqmappings);
1242 else if (command instanceof OrderCommand)
1244 return MappingUtils.mapOrderCommand((OrderCommand) command, undo,
1245 mapTo, seqmappings);
1250 public IProgressIndicator getProgressIndicator()
1252 return progressIndicator;
1255 public void setProgressIndicator(IProgressIndicator progressIndicator)
1257 this.progressIndicator = progressIndicator;
1260 public long getProgressSessionId()
1262 return progressSessionId;
1265 public void setProgressSessionId(long progressSessionId)
1267 this.progressSessionId = progressSessionId;
1270 public void setProgressBar(String message)
1272 progressIndicator.setProgressBar(message, progressSessionId);
1275 public List<AlignedCodonFrame> getSequenceMappings()