/*
- * 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.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.net.URL;
import java.net.URLEncoder;
import java.util.Arrays;
+import java.util.Deque;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
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);
}
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);
}
{
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()
{
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
{
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());
}
int hiddenOffset = viewport.getSelectionGroup().getStartRes();
for (int[] region : viewport.getColumnSelection().getHiddenColumns())
{
-
copiedHiddenColumns.addElement(new int[]
{ region[0] - hiddenOffset, region[1] - hiddenOffset });
}
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;
}
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.