X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fext%2Frbvi%2Fchimera%2FJalviewChimeraBinding.java;h=af87e445ba5138f746196c8a5268a27c1e024839;hb=9da6fa6166a6cb1ca3725bea4d58029b8605fa5b;hp=cee271ae24ef397ae327a2d19de3eadf533f5eca;hpb=3bc2fbe640abb0d8941aead117c9624dd16773a3;p=jalview.git diff --git a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java index cee271a..af87e44 100644 --- a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java +++ b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java @@ -20,18 +20,6 @@ */ package jalview.ext.rbvi.chimera; -import java.awt.Color; -import java.net.BindException; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import ext.edu.ucsf.rbvi.strucviz2.ChimeraManager; -import ext.edu.ucsf.rbvi.strucviz2.ChimeraModel; -import ext.edu.ucsf.rbvi.strucviz2.StructureManager; -import ext.edu.ucsf.rbvi.strucviz2.StructureManager.ModelType; - import jalview.api.AlignmentViewPanel; import jalview.api.FeatureRenderer; import jalview.api.SequenceRenderer; @@ -49,6 +37,18 @@ import jalview.structure.StructureSelectionManager; import jalview.structures.models.AAStructureBindingModel; import jalview.util.MessageManager; +import java.awt.Color; +import java.net.BindException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import ext.edu.ucsf.rbvi.strucviz2.ChimeraManager; +import ext.edu.ucsf.rbvi.strucviz2.ChimeraModel; +import ext.edu.ucsf.rbvi.strucviz2.StructureManager; +import ext.edu.ucsf.rbvi.strucviz2.StructureManager.ModelType; + public abstract class JalviewChimeraBinding extends AAStructureBindingModel { // Chimera clause to exclude alternate locations in atom selection @@ -86,11 +86,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel */ private boolean loadingFinished = true; - /* - * state flag used to check if the Chimera viewer's paint method can be called - */ - private boolean finishedInit = false; - public String fileLoadingError; /* @@ -113,7 +108,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel */ String[] modelFileNames = null; - String lastMousedOverAtomSpec; + String lastHighlightCommand; private List lastReply; @@ -613,6 +608,11 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel */ public void sendChimeraCommand(final String command, boolean logResponse) { + if (viewer == null) + { + // ? thread running after viewer shut down + return; + } viewerCommandHistory(false); if (lastCommand == null || !lastCommand.equals(command)) { @@ -818,8 +818,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * Construct and send a command to highlight zero, one or more atoms. * *
-   * Done by generating a command like (to 'highlight' position 44)
-   *   show #0:44.C
+   * Done by generating a command like (to 'highlight' positions 44 and 46)
+   *   show #0:44,46.C
    * 
*/ @Override @@ -829,8 +829,10 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel { return; } - StringBuilder atomSpecs = new StringBuilder(); + StringBuilder cmd = new StringBuilder(128); boolean first = true; + boolean found = false; + for (AtomSpec atom : atoms) { int pdbResNum = atom.getPdbResNum(); @@ -839,39 +841,42 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel List cms = chimeraMaps.get(pdbfile); if (cms != null && !cms.isEmpty()) { - /* - * Formatting as #0:34.A,#1:33.A doesn't work as desired, so instead we - * concatenate multiple 'show' commands - */ - atomSpecs.append(first ? "" : ";show "); + if (first) + { + cmd.append("show #").append(cms.get(0).getModelNumber()) + .append(":"); + } + else + { + cmd.append(","); + } first = false; - atomSpecs.append("#" + cms.get(0).getModelNumber()); - atomSpecs.append(":" + pdbResNum); + cmd.append(cms.get(0).getModelNumber()).append(":"); + cmd.append(pdbResNum); if (!chain.equals(" ")) { - atomSpecs.append("." + chain); + cmd.append(".").append(chain); } + found = true; } } - String atomSpec = atomSpecs.toString(); + String command = cmd.toString(); /* * Avoid repeated commands for the same residue */ - if (atomSpec.equals(lastMousedOverAtomSpec)) + if (command.equals(lastHighlightCommand)) { return; } - StringBuilder command = new StringBuilder(32); viewerCommandHistory(false); - if (atomSpec.length() > 0) + if (found) { - command.append("show ").append(atomSpec); viewer.sendChimeraCommand(command.toString(), false); } viewerCommandHistory(true); - this.lastMousedOverAtomSpec = atomSpec; + this.lastHighlightCommand = command; } /** @@ -994,6 +999,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel */ public abstract void refreshGUI(); + @Override public void setLoadingFromArchive(boolean loadingFromArchive) { this.loadingFromArchive = loadingFromArchive; @@ -1004,6 +1010,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * @return true if Chimeral is still restoring state or loading is still going * on (see setFinsihedLoadingFromArchive) */ + @Override public boolean isLoadingFromArchive() { return loadingFromArchive && !loadingFinished; @@ -1015,6 +1022,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel * * @param finishedLoading */ + @Override public void setFinishedLoadingFromArchive(boolean finishedLoading) { loadingFinished = finishedLoading; @@ -1079,16 +1087,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel return true; } - public boolean isFinishedInit() - { - return finishedInit; - } - - public void setFinishedInit(boolean finishedInit) - { - this.finishedInit = finishedInit; - } - /** * Returns a list of chains mapped in this viewer. Note this list is not * currently scoped per structure. @@ -1125,4 +1123,30 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel { sendChimeraCommand("focus", false); } + + /** + * Send a 'show' command for all atoms in the currently selected columns + * + * @param vp + */ + public void highlightSelection(AlignmentViewPanel vp) + { + List cols = vp.getAlignViewport().getColumnSelection() + .getSelected(); + AlignmentI alignment = vp.getAlignment(); + StructureSelectionManager sm = getSsm(); + for (SequenceI seq : alignment.getSequences()) + { + /* + * convert selected columns into sequence positions + */ + int[] positions = new int[cols.size()]; + int i = 0; + for (Integer col : cols) + { + positions[i++] = seq.findPosition(col); + } + sm.highlightStructure(this, seq, positions); + } + } }