/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
import jalview.analysis.AlignmentSorter;
import jalview.api.AlignViewControllerGuiI;
import jalview.api.AlignViewControllerI;
+import jalview.api.AlignViewportI;
+import jalview.api.FeatureRenderer;
import jalview.api.SequenceStructureBinding;
import jalview.bin.JalviewLite;
import jalview.commands.CommandI;
import jalview.commands.EditCommand;
+import jalview.commands.EditCommand.Action;
import jalview.commands.OrderCommand;
import jalview.commands.RemoveGapColCommand;
import jalview.commands.RemoveGapsCommand;
import jalview.schemes.TurnColourScheme;
import jalview.schemes.ZappoColourScheme;
import jalview.structure.StructureSelectionManager;
+import jalview.structures.models.AAStructureBindingModel;
+import jalview.util.MappingUtils;
import jalview.util.MessageManager;
import java.awt.BorderLayout;
import java.io.IOException;
import java.net.URL;
import java.net.URLEncoder;
-import java.util.Enumeration;
+import java.util.Arrays;
+import java.util.Deque;
import java.util.Hashtable;
import java.util.List;
+import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
String jalviewServletURL;
- public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,
+ /**
+ * Constructor that creates the frame and adds it to the display.
+ *
+ * @param al
+ * @param applet
+ * @param title
+ * @param embedded
+ */
+ public AlignFrame(AlignmentI al, JalviewLite applet,
String title, boolean embedded)
{
+ this(al, applet, title, embedded, true);
+ }
+
+ /**
+ * Constructor that optionally allows the frame to be displayed or only
+ * created.
+ *
+ * @param al
+ * @param applet
+ * @param title
+ * @param embedded
+ * @param addToDisplay
+ */
+ public AlignFrame(AlignmentI al, JalviewLite applet,
+ String title, boolean embedded, boolean addToDisplay)
+ {
if (applet != null)
{
jalviewServletURL = applet.getParameter("APPLICATION_URL");
viewport.updateConservation(alignPanel);
viewport.updateConsensus(alignPanel);
- annotationPanelMenuItem.setState(viewport.showAnnotation);
+ annotationPanelMenuItem.setState(viewport.isShowAnnotation());
displayNonconservedMenuItem.setState(viewport.getShowUnconserved());
followMouseOverFlag.setState(viewport.getFollowHighlight());
showGroupConsensus.setState(viewport.isShowGroupConsensus());
normSequenceLogo.setState(viewport.isNormaliseSequenceLogo());
applyToAllGroups.setState(viewport.getColourAppliesToAllGroups());
- seqLimits.setState(viewport.showJVSuffix);
+ seqLimits.setState(viewport.getShowJVSuffix());
if (applet != null)
{
alignPanel.annotationPanelHolder.addKeyListener(this);
alignPanel.annotationSpaceFillerHolder.addKeyListener(this);
alignPanel.alabels.addKeyListener(this);
- createAlignFrameWindow(embedded, title);
+ if (addToDisplay)
+ {
+ addToDisplay(embedded);
+ }
+ }
+
+ /**
+ * @param embedded
+ */
+ public void addToDisplay(boolean embedded)
+ {
+ createAlignFrameWindow(embedded);
validate();
alignPanel.adjustAnnotationHeight();
alignPanel.paintAlignment(true);
{
featuresFile = new jalview.io.FeaturesFile(file, type)
.parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas
- .getFeatureRenderer().featureColours, featureLinks,
+ .getFeatureRenderer().getFeatureColours(), featureLinks,
true, viewport.applet.getDefaultParameter(
"relaxedidmatch", false));
} catch (Exception ex)
}
if (autoenabledisplay)
{
- viewport.showSequenceFeatures = true;
+ viewport.setShowSequenceFeatures(true);
sequenceFeatures.setState(true);
}
+ if (alignPanel.seqPanel.seqCanvas.fr != null)
+ {
+ // update the min/max ranges where necessary
+ alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
+ }
if (viewport.featureSettings != null)
{
viewport.featureSettings.refreshTable();
}
case KeyEvent.VK_PAGE_UP:
- if (viewport.wrapAlignment)
+ if (viewport.getWrapAlignment())
{
alignPanel.scrollUp(true);
}
break;
case KeyEvent.VK_PAGE_DOWN:
- if (viewport.wrapAlignment)
+ if (viewport.getWrapAlignment())
{
alignPanel.scrollUp(false);
}
}
else if (evt.getSource() == sequenceFeatures)
{
- viewport.showSequenceFeatures(sequenceFeatures.getState());
+ viewport.setShowSequenceFeatures(sequenceFeatures.getState());
alignPanel.seqPanel.seqCanvas.repaint();
}
else if (evt.getSource() == conservationMenuItem)
{
new AnnotationColourChooser(viewport, alignPanel);
}
+ else if (source == annotationColumnSelection)
+ {
+ new AnnotationColumnChooser(viewport, alignPanel);
+ }
else if (source == sortPairwiseMenuItem)
{
sortPairwiseMenuItem_actionPerformed();
Frame frame = new Frame();
frame.add(cap);
jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
- "label.alignment_output_command", new String[]
+ "label.alignment_output_command", new Object[]
{ e.getActionCommand() }), 600, 500);
cap.setText(new AppletFormatAdapter().formatSequences(
e.getActionCommand(), viewport.getAlignment(),
- viewport.showJVSuffix));
+ viewport.getShowJVSuffix()));
}
public void loadAnnotations()
public String outputAnnotations(boolean displayTextbox)
{
- String annotation = new AnnotationFile().printAnnotations(
- viewport.showAnnotation ? viewport.getAlignment()
- .getAlignmentAnnotation() : null, viewport
- .getAlignment().getGroups(), ((Alignment) viewport
- .getAlignment()).alignmentProperties);
+ String annotation = new AnnotationFile()
+ .printAnnotationsForView(viewport);
if (displayTextbox)
{
return annotation;
}
- private Hashtable getDisplayedFeatureCols()
+ private Map<String,Object> getDisplayedFeatureCols()
{
if (alignPanel.getFeatureRenderer() != null
- && viewport.featuresDisplayed != null)
+ && viewport.getFeaturesDisplayed()!= null)
{
- FeatureRenderer fr = alignPanel.getFeatureRenderer();
- Hashtable fcols = new Hashtable();
- Enumeration en = viewport.featuresDisplayed.keys();
- while (en.hasMoreElements())
- {
- Object col = en.nextElement();
- fcols.put(col, fr.featureColours.get(col));
- }
- return fcols;
+ return alignPanel.getFeatureRenderer().getDisplayedFeatureCols();
+
}
return null;
}
{
StringBuffer url = new StringBuffer(jalviewServletURL);
- url.append("?open="
+ // allow servlet parameters to be passed in applet parameter
+ String firstSep = url.lastIndexOf("?") > url.lastIndexOf("/") ? "&"
+ : "?";
+ url.append(firstSep);
+
+ url.append("open="
+ appendProtocol(viewport.applet.getParameter("file")));
if (viewport.applet.getParameter("features") != null)
void updateEditMenuBar()
{
- if (viewport.historyList.size() > 0)
+ if (viewport.getHistoryList().size() > 0)
{
undoMenuItem.setEnabled(true);
- CommandI command = (CommandI) viewport.historyList.peek();
+ CommandI command = viewport.getHistoryList().peek();
undoMenuItem.setLabel(MessageManager.formatMessage(
- "label.undo_command", new String[]
+ "label.undo_command", new Object[]
{ command.getDescription() }));
}
else
undoMenuItem.setLabel(MessageManager.getString("action.undo"));
}
- if (viewport.redoList.size() > 0)
+ if (viewport.getRedoList().size() > 0)
{
redoMenuItem.setEnabled(true);
- CommandI command = (CommandI) viewport.redoList.peek();
+ CommandI command = viewport.getRedoList().peek();
redoMenuItem.setLabel(MessageManager.formatMessage(
- "label.redo_command", new String[]
+ "label.redo_command", new Object[]
{ command.getDescription() }));
}
else
/**
* TODO: JAL-1104
*/
+ @Override
public void addHistoryItem(CommandI command)
{
if (command.getSize() > 0)
{
- viewport.historyList.push(command);
- viewport.redoList.removeAllElements();
+ viewport.addToHistoryList(command);
+ viewport.clearRedoList();
updateEditMenuBar();
viewport.updateHiddenColumns();
}
*/
protected void undoMenuItem_actionPerformed()
{
- if (viewport.historyList.size() < 1)
+ if (viewport.getHistoryList().isEmpty())
{
return;
}
- CommandI command = (CommandI) viewport.historyList.pop();
- viewport.redoList.push(command);
+ CommandI command = viewport.getHistoryList().pop();
+ viewport.addToRedoList(command);
command.undoCommand(null);
AlignViewport originalSource = getOriginatingSource(command);
*/
protected void redoMenuItem_actionPerformed()
{
- if (viewport.redoList.size() < 1)
+ if (viewport.getRedoList().isEmpty())
{
return;
}
- CommandI command = (CommandI) viewport.redoList.pop();
- viewport.historyList.push(command);
+ CommandI command = viewport.getRedoList().pop();
+ viewport.addToHistoryList(command);
command.doCommand(null);
AlignViewport originalSource = getOriginatingSource(command);
return originalSource;
}
+ /**
+ * Move the currently selected sequences up or down one position in the
+ * alignment
+ *
+ * @param up
+ */
public void moveSelectedSequences(boolean up)
{
SequenceGroup sg = viewport.getSelectionGroup();
viewport.getAlignment().moveSelectedSequencesByOne(sg,
up ? null : viewport.getHiddenRepSequences(), up);
alignPanel.paintAlignment(true);
+
+ /*
+ * Also move cDNA/protein complement sequences
+ */
+ AlignViewportI complement = viewport.getCodingComplement();
+ if (complement != null)
+ {
+ SequenceGroup mappedSelection = MappingUtils.mapSequenceGroup(sg,
+ viewport, complement);
+ complement.getAlignment().moveSelectedSequencesByOne(mappedSelection,
+ up ? null : complement.getHiddenRepSequences(), up);
+ // TODO need to trigger a repaint of the complementary panel - how?
+ // would prefer to handle in SplitFrame but it is not overriding key
+ // listener chiz
+ }
}
synchronized void slideSequences(boolean right, int size)
}
boolean appendHistoryItem = false;
- if (viewport.historyList != null && viewport.historyList.size() > 0
- && viewport.historyList.peek() instanceof SlideSequencesCommand)
+ Deque<CommandI> historyList = viewport.getHistoryList();
+ if (historyList != null && historyList.size() > 0
+ && historyList.peek() instanceof SlideSequencesCommand)
{
appendHistoryItem = ssc
- .appendSlideCommand((SlideSequencesCommand) viewport.historyList
+ .appendSlideCommand((SlideSequencesCommand) historyList
.peek());
}
{
copiedHiddenColumns = new Vector();
int hiddenOffset = viewport.getSelectionGroup().getStartRes();
- for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
- .size(); i++)
+ for (int[] region : viewport.getColumnSelection().getHiddenColumns())
{
- int[] region = (int[]) viewport.getColumnSelection()
- .getHiddenColumns().elementAt(i);
-
copiedHiddenColumns.addElement(new int[]
{ region[0] - hiddenOffset, region[1] - hiddenOffset });
}
}
// !newAlignment
- addHistoryItem(new EditCommand(MessageManager.getString("label.add_sequences"), EditCommand.PASTE,
+ addHistoryItem(new EditCommand(
+ MessageManager.getString("label.add_sequences"), Action.PASTE,
seqs, 0, viewport.getAlignment().getWidth(),
viewport.getAlignment()));
/*
* //ADD HISTORY ITEM
*/
- addHistoryItem(new EditCommand(MessageManager.getString("label.cut_sequences"), EditCommand.CUT, cut,
- sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
+ addHistoryItem(new EditCommand(
+ MessageManager.getString("label.cut_sequences"), Action.CUT,
+ cut, sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
viewport.getAlignment()));
viewport.setSelectionGroup(null);
newaf.setTitle(title.toString());
- newaf.viewport.historyList = viewport.historyList;
- newaf.viewport.redoList = viewport.redoList;
+ newaf.viewport.setHistoryList(viewport.getHistoryList());
+ newaf.viewport.setRedoList(viewport.getRedoList());
return newaf;
}
if (alignPanel != null
&& (fr = alignPanel.getFeatureRenderer()) != null)
{
- return fr.getGroups();
+ List gps = fr.getFeatureGroups();
+ int p=0;
+ String[] _gps = new String[gps.size()];
+ for (Object gp:gps)
+ {
+ _gps[p++] = gp.toString();
+ }
+ return _gps;
}
return null;
}
if (alignPanel != null
&& (fr = alignPanel.getFeatureRenderer()) != null)
{
- return fr.getGroups(visible);
+ List gps = fr.getGroups(visible);
+ int p=0;
+ String[] _gps = new String[gps.size()];
+ for (Object gp:gps)
+ {
+ _gps[p++] = gp.toString();
+ }
+ return _gps;
}
return null;
}
{
FeatureRenderer fr = null;
this.sequenceFeatures.setState(true);
- viewport.showSequenceFeatures(true);
+ viewport.setShowSequenceFeatures(true);
if (alignPanel != null
&& (fr = alignPanel.getFeatureRenderer()) != null)
{
- fr.setGroupState(groups, state);
+
+ fr.setGroupVisibility(Arrays.asList(groups), state);
alignPanel.seqPanel.seqCanvas.repaint();
if (alignPanel.overviewPanel != null)
{
protected void displayNonconservedMenuItem_actionPerformed()
{
- viewport.setShowunconserved(displayNonconservedMenuItem.getState());
+ viewport.setShowUnconserved(displayNonconservedMenuItem.getState());
alignPanel.paintAlignment(true);
}
annotationColour.setLabel(MessageManager
.getString("action.by_annotation"));
annotationColour.addActionListener(this);
+
+ annotationColumnSelection.setLabel("Select by Annotation");
+ annotationColumnSelection.addActionListener(this);
+
invertSequenceMenuItem.setLabel(MessageManager
.getString("action.invert_sequence_selection"));
invertColSel.setLabel(MessageManager
selectMenu.add(unGroup);
selectMenu.add(grpsFromSelection);
selectMenu.add(deleteGroups);
+ selectMenu.add(annotationColumnSelection);
}
MenuItem annotationColour = new MenuItem();
+ MenuItem annotationColumnSelection = new MenuItem();
+
MenuItem invertColSel = new MenuItem();
Menu menu1 = new Menu();
* true to attach the view to the applet area on the page rather than
* in a new window
*/
- public void createAlignFrameWindow(boolean reallyEmbedded, String title)
+ public void createAlignFrameWindow(boolean reallyEmbedded)
{
if (reallyEmbedded)
{
- // ////
- // Explicly build the embedded menu panel for the on-page applet
- //
- // view cannot be closed if its actually on the page
- fileMenu.remove(closeMenuItem);
- fileMenu.remove(3); // Remove Seperator
- embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
- Font.PLAIN, 11, false); // use our own fonts.
- // and actually add the components to the applet area
- viewport.applet.setLayout(new BorderLayout());
- viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
- viewport.applet.add(statusBar, BorderLayout.SOUTH);
- alignPanel.setSize(viewport.applet.getSize().width,
- viewport.applet.getSize().height - embeddedMenu.HEIGHT
- - statusBar.HEIGHT);
- viewport.applet.add(alignPanel, BorderLayout.CENTER);
- final AlignFrame me = this;
- viewport.applet.addFocusListener(new FocusListener()
- {
-
- @Override
- public void focusLost(FocusEvent e)
- {
- if (me.viewport.applet.currentAlignFrame == me)
- {
- me.viewport.applet.currentAlignFrame = null;
- }
- }
-
- @Override
- public void focusGained(FocusEvent e)
- {
- me.viewport.applet.currentAlignFrame = me;
- }
- });
- viewport.applet.validate();
+ embedAlignFrameInApplet(viewport.applet);
}
else
{
//
if (embedMenuIfNeeded(alignPanel))
{
- // adjust for status bar height too
- alignPanel.setSize(getSize().width, getSize().height
- - statusBar.HEIGHT);
+ /*
+ * adjust for status bar height too. ? pointless as overridden by layout
+ * manager
+ */
+ alignPanel.setSize(getSize().width,
+ getSize().height - statusBar.getHeight());
}
add(statusBar, BorderLayout.SOUTH);
add(alignPanel, BorderLayout.CENTER);
// and register with the applet so it can pass external API calls to us
- jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,
+ jalview.bin.JalviewLite.addFrame(this, this.getTitle(),
+ DEFAULT_WIDTH,
DEFAULT_HEIGHT);
}
}
/**
+ * Add the components of this AlignFrame to the applet container.
+ *
+ * @param theApplet
+ */
+ public void embedAlignFrameInApplet(final JalviewLite theApplet)
+ {
+ // ////
+ // Explicitly build the embedded menu panel for the on-page applet
+ //
+ // view cannot be closed if its actually on the page
+ fileMenu.remove(closeMenuItem);
+ fileMenu.remove(3); // Remove Separator
+ // construct embedded menu, using default font
+ embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, false, false);
+ // and actually add the components to the applet area
+ theApplet.setLayout(new BorderLayout());
+ theApplet.add(embeddedMenu, BorderLayout.NORTH);
+ theApplet.add(statusBar, BorderLayout.SOUTH);
+ // TODO should size be left to the layout manager?
+ alignPanel.setSize(theApplet.getSize().width,
+ theApplet.getSize().height - embeddedMenu.getHeight()
+ - statusBar.getHeight());
+ theApplet.add(alignPanel, BorderLayout.CENTER);
+ final AlignFrame me = this;
+ theApplet.addFocusListener(new FocusListener()
+ {
+
+ @Override
+ public void focusLost(FocusEvent e)
+ {
+ if (theApplet.currentAlignFrame == me)
+ {
+ theApplet.currentAlignFrame = null;
+ }
+ }
+
+ @Override
+ public void focusGained(FocusEvent e)
+ {
+ theApplet.currentAlignFrame = me;
+ }
+ });
+ theApplet.validate();
+ }
+
+ /**
* create a new binding between structures in an existing jmol viewer instance
* and an alignpanel with sequences that have existing PDBFile entries. Note,
* this does not open a new Jmol window, or modify the display of the
return null;
}
}
- ExtJmol jmv = null;
+ AAStructureBindingModel jmv = null;
// TODO: search for a jmv that involves viewer
if (jmv == null)
{ // create a new viewer/jalview binding.