*/
package jalview.gui;
+import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
import jalview.bin.Cache;
import jalview.datamodel.Alignment;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Vector;
/**
* list of alignment panels to use for superposition
*/
- protected Vector<AlignmentPanel> _alignwith = new Vector<>();
+ protected Vector<AlignmentViewPanel> _alignwith = new Vector<>();
/**
* list of alignment panels that are used for colouring structures by aligned
* sequences
*/
- protected Vector<AlignmentPanel> _colourwith = new Vector<>();
+ protected Vector<AlignmentViewPanel> _colourwith = new Vector<>();
private String viewId = null;
}
/**
+ * @return true if added structures should be aligned to existing one(s)
+ */
+ @Override
+ public boolean isAlignAddedStructures()
+ {
+ return alignAddedStructures;
+ }
+
+ /**
+ *
+ * @param true
+ * if added structures should be aligned to existing one(s)
+ */
+ @Override
+ public void setAlignAddedStructures(boolean alignAdded)
+ {
+ alignAddedStructures = alignAdded;
+ }
+
+ /**
*
* @param ap2
* @return true if this Jmol instance is linked with the given alignPanel
return (_alignwith != null) && _alignwith.contains(ap2);
}
- public boolean isUsedforcolourby(AlignmentPanel ap2)
+ @Override
+ public boolean isUsedforcolourby(AlignmentViewPanel avp)
{
- return (_colourwith != null) && _colourwith.contains(ap2);
+ return (_colourwith != null) && _colourwith.contains(avp);
}
/**
*/
protected void addStructure(final PDBEntry pdbentry,
final SequenceI[] seqs, final String[] chains,
- final boolean align, final IProgressIndicator alignFrame)
+ final IProgressIndicator alignFrame)
{
if (pdbentry.getFile() == null)
{
}
}
// and call ourselves again.
- addStructure(pdbentry, seqs, chains, align, alignFrame);
+ addStructure(pdbentry, seqs, chains, alignFrame);
}
}).start();
return;
{ seqs }, new String[][] { chains });
addingStructures = true;
_started = false;
- alignAddedStructures = align;
worker = new Thread(this);
worker.start();
return;
}
- /**
- * Presents a dialog with the option to add an align a structure to an
- * existing structure view
- *
- * @param pdbId
- * @param view
- * @return YES, NO or CANCEL JvOptionPane code
- */
- protected int chooseAlignStructureToViewer(String pdbId,
- StructureViewerBase view)
- {
- int option = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
- MessageManager.formatMessage("label.add_pdbentry_to_view",
- new Object[]
- { pdbId, view.getTitle() }),
- MessageManager
- .getString("label.align_to_existing_structure_view"),
- JvOptionPane.YES_NO_CANCEL_OPTION);
- return option;
- }
-
protected boolean hasPdbId(String pdbId)
{
return getBinding().hasPdbId(pdbId);
return Desktop.instance.getStructureViewers(alp, this.getClass());
}
-
- /**
- * Check for any existing views involving this alignment and give user the
- * option to add and align this molecule to one of them
- *
- * @param pdbentry
- * @param seq
- * @param chains
- * @param apanel
- * @param pdbId
- * @return true if user adds to a view, or cancels entirely, else false
- */
@Override
- public boolean addToExistingViewer(PDBEntry pdbentry, SequenceI[] seq,
+ public void addToExistingViewer(PDBEntry pdbentry, SequenceI[] seq,
String[] chains, final AlignmentViewPanel apanel, String pdbId)
{
/*
* JAL-1742 exclude view with this structure already mapped (don't offer
- * to align chain B to chain A of the same structure)
+ * to align chain B to chain A of the same structure); code may defend
+ * against this possibility before we reach here
*/
if (hasPdbId(pdbId))
{
- return false;
+ return;
}
- AlignmentPanel ap = (AlignmentPanel) apanel; // Implementation error if this
+ AlignmentPanel alignPanel = (AlignmentPanel) apanel; // Implementation error if this
// cast fails
- useAlignmentPanelForSuperposition(ap);
- addStructure(pdbentry, seq, chains, true, ap.alignFrame);
- return true;
+ useAlignmentPanelForSuperposition(alignPanel);
+ addStructure(pdbentry, seq, chains, alignPanel.alignFrame);
}
/**
}
}
- /**
- * Check if the PDB file is already loaded, if so offer to add it to the
- * existing viewer
- *
- * @param seq
- * @param chains
- * @param apanel
- * @param pdbId
- * @return true if the user chooses to add to a viewer, or to cancel entirely
- */
@Override
public boolean addAlreadyLoadedFile(SequenceI[] seq, String[] chains,
final AlignmentViewPanel apanel, String pdbId)
{
- boolean finished = false;
String alreadyMapped = apanel.getStructureSelectionManager()
.alreadyMappedToFile(pdbId);
- if (alreadyMapped != null)
+ if (alreadyMapped == null)
{
- /*
- * the PDB file is already loaded
- */
- addSequenceMappingsToStructure(seq, chains, apanel, alreadyMapped);
- finished = true;
+ return false;
}
- return finished;
+
+ addSequenceMappingsToStructure(seq, chains, apanel, alreadyMapped);
+ return true;
}
void setChainMenuItems(List<String> chainNames)
{
return;
}
+
+ /*
+ * add the 'All' menu item
+ */
JMenuItem menuItem = new JMenuItem(
MessageManager.getString("label.all"));
menuItem.addActionListener(new ActionListener()
allChainsSelected = false;
}
});
-
chainMenu.add(menuItem);
+ /*
+ * add a menu item for each structure and chain
+ */
+ Collections.sort(chainNames);
+ String lastSeqName = "";
for (String chain : chainNames)
{
- menuItem = new JCheckBoxMenuItem(chain, true);
+ String seqName = getSequenceNameForChain(chain);
+ int nameLength = seqName.length();
+ if (nameLength > 16)
+ {
+ seqName = seqName.substring(0, 8) + "..."
+ + seqName.substring(nameLength - 8, nameLength);
+ }
+ String text = chain;
+ if (!lastSeqName.equals(seqName))
+ {
+ text = text + " " + seqName;
+ }
+ lastSeqName = seqName;
+ menuItem = new JCheckBoxMenuItem(text, true);
menuItem.addItemListener(new ItemListener()
{
@Override
}
}
- abstract void showSelectedChains();
+ /**
+ * Answers the name of the sequence mapped to the given chain (formatted as
+ * pdbId:chainId, e.g. 1A70:A). Answers null if no mapped sequence is found. If
+ * more than one sequence is matched, just answers the name of the first one
+ * found.
+ *
+ * @param chain
+ * @return
+ */
+ private String getSequenceNameForChain(String chain)
+ {
+ String[] tokens = chain.split(":");
+ String pdbId = tokens[0];
+ String chainId = tokens[1];
+ List<StructureMapping> mappings = getBinding().getSsm()
+ .getMappingForChain(pdbId, chainId);
+ return mappings.isEmpty() ? null
+ : mappings.get(0).getSequence().getName();
+ }
/**
* Action on selecting one of Jalview's registered colour schemes
{
AlignmentI al = getAlignmentPanel().av.getAlignment();
ColourSchemeI cs = ColourSchemes.getInstance()
- .getColourScheme(colourSchemeName, al, null);
+ .getColourScheme(colourSchemeName, getAlignmentPanel().av, al,
+ null);
getBinding().setJalviewColourScheme(cs);
}
});
viewMenu.add(seqColourBy);
+ showAlignmentOnly = new JCheckBoxMenuItem(
+ MessageManager.getString("label.show_alignment_only"));
+ showAlignmentOnly.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ hideHiddenRegions.setEnabled(showAlignmentOnly.isSelected());
+ getBinding().setShowAlignmentOnly(showAlignmentOnly.isSelected());
+ getBinding().showStructures(getAlignmentPanel().getAlignViewport(),
+ true);
+ }
+ });
+ viewMenu.add(showAlignmentOnly);
+
+ hideHiddenRegions = new JCheckBoxMenuItem(
+ MessageManager.getString("label.hide_hidden_regions"));
+ hideHiddenRegions.setEnabled(false);
+ hideHiddenRegions.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ getBinding().setHideHiddenRegions(hideHiddenRegions.isSelected());
+ getBinding().showStructures(getAlignmentPanel().getAlignViewport(),
+ false);
+ }
+ });
+ viewMenu.add(hideHiddenRegions);
+
final ItemListener handler = new ItemListener()
{
@Override
buildColourMenu();
}
- @Override
- public void setJalviewColourScheme(ColourSchemeI cs)
- {
- getBinding().setJalviewColourScheme(cs);
- }
-
/**
* Sends commands to the structure viewer to superimpose structures based on
* currently associated alignments. May optionally return an error message for
int[] alm = new int[_alignwith.size()];
int a = 0;
- for (AlignmentPanel ap : _alignwith)
+ for (AlignmentViewPanel alignPanel : _alignwith)
{
- als[a] = ap.av.getAlignment();
+ AlignViewportI av = alignPanel.getAlignViewport();
+ als[a] = av.getAlignment();
alm[a] = -1;
- alc[a++] = ap.av.getAlignment().getHiddenColumns();
+ alc[a++] = av.getAlignment().getHiddenColumns();
}
reply = getBinding().superposeStructures(als, alm, alc);
if (reply != null)
} catch (Exception e)
{
StringBuffer sp = new StringBuffer();
- for (AlignmentPanel ap : _alignwith)
+ for (AlignmentViewPanel avp : _alignwith)
{
- sp.append("'" + ap.alignFrame.getTitle() + "' ");
+ sp.append(
+ "'" + ((AlignmentPanel) avp).alignFrame.getTitle() + "' ");
}
Cache.log.info("Couldn't align structures with the " + sp.toString()
+ "associated alignment panels.", e);
}
}
// Set the colour using the current view for the associated alignframe
- for (AlignmentPanel ap : _colourwith)
+ for (AlignmentViewPanel avp : _colourwith)
{
- binding.colourBySequence(ap);
+ binding.updateStructureColours(avp);
}
seqColoursApplied = true;
}
}
@Override
+ public String toString()
+ {
+ return getTitle();
+ }
+
+ @Override
public boolean hasMapping()
{
if (worker != null && (addingStructures || _started))
return seqColoursApplied;
}
+ @Override
+ public void raiseViewer()
+ {
+ toFront();
+ }
+
+ @Override
+ public abstract AAStructureBindingModel getBinding();
+
+ /**
+ * Show only the selected chain(s) in the viewer
+ */
+ protected void showSelectedChains()
+ {
+ setSelectedChains();
+
+ /*
+ * refresh display without resizing - easier to see what changed
+ */
+ getBinding().showStructures(getAlignmentPanel().getAlignViewport(),
+ false);
+ }
+
}