+ * This file is part of Jalview.\r
+ *\r
+ * Jalview is free software: you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
+ *\r
+ * Jalview is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty\r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r
+ * PURPOSE. See the GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.\r
+ */\r
+package jalview.appletgui;\r
+\r
+import jalview.analysis.AAFrequency;\r
+import jalview.analysis.AlignmentSorter;\r
+import jalview.analysis.Conservation;\r
+import jalview.api.SequenceStructureBinding;\r
+import jalview.bin.JalviewLite;\r
+import jalview.commands.CommandI;\r
+import jalview.commands.EditCommand;\r
+import jalview.commands.OrderCommand;\r
+import jalview.commands.RemoveGapColCommand;\r
+import jalview.commands.RemoveGapsCommand;\r
+import jalview.commands.SlideSequencesCommand;\r
+import jalview.commands.TrimRegionCommand;\r
+import jalview.datamodel.Alignment;\r
+import jalview.datamodel.AlignmentI;\r
+import jalview.datamodel.AlignmentOrder;\r
+import jalview.datamodel.ColumnSelection;\r
+import jalview.datamodel.PDBEntry;\r
+import jalview.datamodel.Sequence;\r
+import jalview.datamodel.SequenceCollectionI;\r
+import jalview.datamodel.SequenceGroup;\r
+import jalview.datamodel.SequenceI;\r
+import jalview.io.AnnotationFile;\r
+import jalview.io.AppletFormatAdapter;\r
+import jalview.io.FeaturesFile;\r
+import jalview.io.TCoffeeScoreFile;\r
+import jalview.schemes.Blosum62ColourScheme;\r
+import jalview.schemes.BuriedColourScheme;\r
+import jalview.schemes.ClustalxColourScheme;\r
+import jalview.schemes.ColourSchemeI;\r
+import jalview.schemes.HelixColourScheme;\r
+import jalview.schemes.HydrophobicColourScheme;\r
+import jalview.schemes.NucleotideColourScheme;\r
+import jalview.schemes.PIDColourScheme;\r
+import jalview.schemes.PurinePyrimidineColourScheme;\r
+import jalview.schemes.RNAHelicesColourChooser;\r
+import jalview.schemes.ResidueProperties;\r
+import jalview.schemes.StrandColourScheme;\r
+import jalview.schemes.TCoffeeColourScheme;\r
+import jalview.schemes.TaylorColourScheme;\r
+import jalview.schemes.TurnColourScheme;\r
+import jalview.schemes.ZappoColourScheme;\r
+import jalview.structure.StructureSelectionManager;\r
+\r
+import java.awt.BorderLayout;\r
+import java.awt.Canvas;\r
+import java.awt.CheckboxMenuItem;\r
+import java.awt.Color;\r
+import java.awt.Font;\r
+import java.awt.FontMetrics;\r
+import java.awt.Frame;\r
+import java.awt.Graphics;\r
+import java.awt.Label;\r
+import java.awt.Menu;\r
+import java.awt.MenuBar;\r
+import java.awt.MenuItem;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.event.FocusEvent;\r
+import java.awt.event.FocusListener;\r
+import java.awt.event.ItemEvent;\r
+import java.awt.event.ItemListener;\r
+import java.awt.event.KeyEvent;\r
+import java.awt.event.KeyListener;\r
+import java.awt.event.WindowAdapter;\r
+import java.awt.event.WindowEvent;\r
+import java.io.IOException;\r
+import java.io.InputStreamReader;\r
+import java.net.URL;\r
+import java.net.URLEncoder;\r
+import java.util.Enumeration;\r
+import java.util.Hashtable;\r
+import java.util.List;\r
+import java.util.StringTokenizer;\r
+import java.util.Vector;\r
+\r
+public class AlignFrame extends EmbmenuFrame implements ActionListener, ItemListener, KeyListener\r
+{\r
+ public AlignmentPanel alignPanel;\r
+\r
+ public AlignViewport viewport;\r
+\r
+ int DEFAULT_WIDTH = 700;\r
+\r
+ int DEFAULT_HEIGHT = 500;\r
+\r
+ String jalviewServletURL;\r
+\r
+\r
+ public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet, String title, boolean embedded)\r
+ {\r
+ if (applet != null)\r
+ {\r
+ jalviewServletURL = applet.getParameter("APPLICATION_URL");\r
+ }\r
+\r
+ try\r
+ {\r
+ jbInit();\r
+ } catch (Exception ex)\r
+ {\r
+ ex.printStackTrace();\r
+ }\r
+\r
+ viewport = new AlignViewport(al, applet);\r
+ alignPanel = new AlignmentPanel(this, viewport);\r
+\r
+ viewport.updateConservation(alignPanel);\r
+ viewport.updateConsensus(alignPanel);\r
+\r
+ annotationPanelMenuItem.setState(viewport.showAnnotation);\r
+ displayNonconservedMenuItem.setState(viewport.getShowUnconserved());\r
+ followMouseOverFlag.setState(viewport.getFollowHighlight());\r
+ showGroupConsensus.setState(viewport.isShowGroupConsensus());\r
+ showGroupConservation.setState(viewport.isShowGroupConservation());\r
+ showConsensusHistogram.setState(viewport.isShowConsensusHistogram());\r
+ showSequenceLogo.setState(viewport.isShowSequenceLogo());\r
+\r
+ seqLimits.setState(viewport.showJVSuffix);\r
+\r
+ if (applet != null)\r
+ {\r
+ String param = applet.getParameter("sortBy");\r
+ if (param != null)\r
+ {\r
+ if (param.equalsIgnoreCase("Id"))\r
+ {\r
+ sortIDMenuItem_actionPerformed();\r
+ }\r
+ else if (param.equalsIgnoreCase("Pairwise Identity"))\r
+ {\r
+ sortPairwiseMenuItem_actionPerformed();\r
+ }\r
+ else if (param.equalsIgnoreCase("Length"))\r
+ {\r
+ sortLengthMenuItem_actionPerformed();\r
+ }\r
+ }\r
+\r
+ param = applet.getParameter("wrap");\r
+ if (param != null)\r
+ {\r
+ if (param.equalsIgnoreCase("true"))\r
+ {\r
+ wrapMenuItem.setState(true);\r
+ wrapMenuItem_actionPerformed();\r
+ }\r
+ }\r
+ param = applet.getParameter("centrecolumnlabels");\r
+ if (param != null)\r
+ {\r
+ centreColumnLabelFlag.setState(true);\r
+ centreColumnLabelFlag_stateChanged();\r
+ }\r
+ try\r
+ {\r
+ param = applet.getParameter("windowWidth");\r
+ if (param != null)\r
+ {\r
+ int width = Integer.parseInt(param);\r
+ DEFAULT_WIDTH = width;\r
+ }\r
+ param = applet.getParameter("windowHeight");\r
+ if (param != null)\r
+ {\r
+ int height = Integer.parseInt(param);\r
+ DEFAULT_HEIGHT = height;\r
+ }\r
+ } catch (Exception ex)\r
+ {\r
+ }\r
+\r
+ }\r
+ if (viewport.getAlignment().isNucleotide())\r
+ {\r
+ viewport.updateStrucConsensus(alignPanel);\r
+ if (viewport.getAlignment().hasRNAStructure())\r
+ {\r
+ RNAHelixColour.setEnabled(true);\r
+ }\r
+ else {\r
+ RNAHelixColour.setEnabled(false);\r
+ }\r
+ } else {\r
+ RNAHelixColour.setEnabled(false);\r
+ purinePyrimidineColour.setEnabled(false);\r
+ }\r
+ // Some JVMS send keyevents to Top frame or lowest panel,\r
+ // Havent worked out why yet. So add to both this frame and seqCanvas for\r
+ // now\r
+ this.addKeyListener(this);\r
+ alignPanel.seqPanel.seqCanvas.addKeyListener(this);\r
+ alignPanel.idPanel.idCanvas.addKeyListener(this);\r
+ alignPanel.scalePanel.addKeyListener(this);\r
+ alignPanel.annotationPanel.addKeyListener(this);\r
+ alignPanel.annotationPanelHolder.addKeyListener(this);\r
+ alignPanel.annotationSpaceFillerHolder.addKeyListener(this);\r
+ alignPanel.alabels.addKeyListener(this);\r
+ createAlignFrameWindow(embedded, title);\r
+\r
+ validate();\r
+ alignPanel.adjustAnnotationHeight();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ public AlignViewport getAlignViewport()\r
+ {\r
+ return viewport;\r
+ }\r
+\r
+ public SeqCanvas getSeqcanvas()\r
+ {\r
+ return alignPanel.seqPanel.seqCanvas;\r
+ }\r
+\r
+ /**\r
+ * Load a features file onto the alignment\r
+ *\r
+ * @param file file URL, content, or other resolvable path\r
+ * @param type is protocol for accessing data referred to by file\r
+ */\r
+\r
+ public boolean parseFeaturesFile(String file, String type)\r
+ {\r
+ return parseFeaturesFile(file, type, true);\r
+ }\r
+\r
+ /**\r
+ * Load a features file onto the alignment\r
+ *\r
+ * @param file file URL, content, or other resolvable path\r
+ * @param type is protocol for accessing data referred to by file\r
+ * @param autoenabledisplay when true, display features flag will be automatically enabled if features are loaded\r
+ * @return true if data parsed as a features file\r
+ */\r
+ public boolean parseFeaturesFile(String file, String type, boolean autoenabledisplay)\r
+ {\r
+ // TODO: test if importing a features file onto an alignment which already has features with links overwrites the original links.\r
+\r
+ Hashtable featureLinks = new Hashtable();\r
+ boolean featuresFile = false;\r
+ try\r
+ {\r
+ featuresFile = new jalview.io.FeaturesFile(file, type)\r
+ .parse(viewport.getAlignment(),\r
+ alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours,\r
+ featureLinks, true, viewport.applet.getDefaultParameter("relaxedidmatch", false));\r
+ } catch (Exception ex)\r
+ {\r
+ ex.printStackTrace();\r
+ }\r
+\r
+ if (featuresFile)\r
+ {\r
+ if (featureLinks.size() > 0)\r
+ {\r
+ alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;\r
+ }\r
+ if (autoenabledisplay)\r
+ {\r
+ viewport.showSequenceFeatures = true;\r
+ sequenceFeatures.setState(true);\r
+ }\r
+ if (viewport.featureSettings != null)\r
+ {\r
+ viewport.featureSettings.refreshTable();\r
+ }\r
+ alignPanel.paintAlignment(true);\r
+ statusBar.setText("Successfully added features to alignment.");\r
+ }\r
+ return featuresFile;\r
+ }\r
+\r
+ @Override\r
+ public void keyPressed(KeyEvent evt)\r
+ {\r
+ if (viewport.cursorMode\r
+ && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt\r
+ .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt\r
+ .getKeyCode() <= KeyEvent.VK_NUMPAD9))\r
+ && Character.isDigit(evt.getKeyChar()))\r
+ alignPanel.seqPanel.numberPressed(evt.getKeyChar());\r
+\r
+ switch (evt.getKeyCode())\r
+ {\r
+ case 27: // escape key\r
+ deselectAllSequenceMenuItem_actionPerformed();\r
+\r
+ alignPanel.alabels.cancelDrag();\r
+ break;\r
+ case KeyEvent.VK_X:\r
+ if (evt.isControlDown() || evt.isMetaDown())\r
+ {\r
+ cut_actionPerformed();\r
+ }\r
+ break;\r
+ case KeyEvent.VK_C:\r
+ if (viewport.cursorMode && !evt.isControlDown())\r
+ {\r
+ alignPanel.seqPanel.setCursorColumn();\r
+ }\r
+ if (evt.isControlDown() || evt.isMetaDown())\r
+ {\r
+ copy_actionPerformed();\r
+ }\r
+ break;\r
+ case KeyEvent.VK_V:\r
+ if (evt.isControlDown())\r
+ {\r
+ paste(evt.isShiftDown());\r
+ }\r
+ break;\r
+ case KeyEvent.VK_A:\r
+ if (evt.isControlDown() || evt.isMetaDown())\r
+ {\r
+ selectAllSequenceMenuItem_actionPerformed();\r
+ }\r
+ break;\r
+ case KeyEvent.VK_DOWN:\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.moveCursor(0, 1);\r
+ }\r
+ else\r
+ {\r
+ moveSelectedSequences(false);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_UP:\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.moveCursor(0, -1);\r
+ }\r
+ else\r
+ {\r
+ moveSelectedSequences(true);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_LEFT:\r
+ if (evt.isAltDown() || !viewport.cursorMode)\r
+ slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());\r
+ else\r
+ alignPanel.seqPanel.moveCursor(-1, 0);\r
+ break;\r
+\r
+ case KeyEvent.VK_RIGHT:\r
+ if (evt.isAltDown() || !viewport.cursorMode)\r
+ slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());\r
+ else\r
+ alignPanel.seqPanel.moveCursor(1, 0);\r
+ break;\r
+\r
+ case KeyEvent.VK_SPACE:\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()\r
+ || evt.isShiftDown() || evt.isAltDown());\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_DELETE:\r
+ case KeyEvent.VK_BACK_SPACE:\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()\r
+ || evt.isShiftDown() || evt.isAltDown());\r
+ }\r
+ else\r
+ {\r
+ cut_actionPerformed();\r
+ alignPanel.seqPanel.seqCanvas.repaint();\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_S:\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.setCursorRow();\r
+ }\r
+ break;\r
+ case KeyEvent.VK_P:\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.setCursorPosition();\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_ENTER:\r
+ case KeyEvent.VK_COMMA:\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.setCursorRowAndColumn();\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_Q:\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.setSelectionAreaAtCursor(true);\r
+ }\r
+ break;\r
+ case KeyEvent.VK_M:\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.setSelectionAreaAtCursor(false);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_F2:\r
+ viewport.cursorMode = !viewport.cursorMode;\r
+ statusBar.setText("Keyboard editing mode is "\r
+ + (viewport.cursorMode ? "on" : "off"));\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;\r
+ alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_F:\r
+ if (evt.isControlDown())\r
+ {\r
+ findMenuItem_actionPerformed();\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_H:\r
+ {\r
+ boolean toggleSeqs = !evt.isControlDown();\r
+ boolean toggleCols = !evt.isShiftDown();\r
+ toggleHiddenRegions(toggleSeqs, toggleCols);\r
+ break;\r
+ }\r
+\r
+ case KeyEvent.VK_PAGE_UP:\r
+ if (viewport.wrapAlignment)\r
+ {\r
+ alignPanel.scrollUp(true);\r
+ }\r
+ else\r
+ {\r
+ alignPanel.setScrollValues(viewport.startRes, viewport.startSeq\r
+ - viewport.endSeq + viewport.startSeq);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_PAGE_DOWN:\r
+ if (viewport.wrapAlignment)\r
+ {\r
+ alignPanel.scrollUp(false);\r
+ }\r
+ else\r
+ {\r
+ alignPanel.setScrollValues(viewport.startRes, viewport.startSeq\r
+ + viewport.endSeq - viewport.startSeq);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_Z:\r
+ if (evt.isControlDown())\r
+ {\r
+ undoMenuItem_actionPerformed();\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_Y:\r
+ if (evt.isControlDown())\r
+ {\r
+ redoMenuItem_actionPerformed();\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_L:\r
+ if (evt.isControlDown())\r
+ {\r
+ trimAlignment(true);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_R:\r
+ if (evt.isControlDown())\r
+ {\r
+ trimAlignment(false);\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_E:\r
+ if (evt.isControlDown())\r
+ {\r
+ if (evt.isShiftDown())\r
+ {\r
+ this.removeAllGapsMenuItem_actionPerformed();\r
+ }\r
+ else\r
+ {\r
+ removeGappedColumnMenuItem_actionPerformed();\r
+ }\r
+ }\r
+ break;\r
+ case KeyEvent.VK_I:\r
+ if (evt.isControlDown())\r
+ {\r
+ if (evt.isAltDown())\r
+ {\r
+ invertColSel_actionPerformed();\r
+ }\r
+ else\r
+ {\r
+ invertSequenceMenuItem_actionPerformed();\r
+ }\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_U:\r
+ if (evt.isControlDown())\r
+ {\r
+ this.deleteGroups_actionPerformed();\r
+ }\r
+ break;\r
+\r
+ case KeyEvent.VK_T:\r
+ if (evt.isControlDown())\r
+ {\r
+ newView(null);\r
+ }\r
+ break;\r
+\r
+ }\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ /**\r
+ * called by key handler and the hide all/show all menu items\r
+ *\r
+ * @param toggleSeqs\r
+ * @param toggleCols\r
+ */\r
+ private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)\r
+ {\r
+ boolean hide = false;\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+ if (!toggleSeqs && !toggleCols)\r
+ {\r
+ // Hide everything by the current selection - this is a hack - we do the\r
+ // invert and then hide\r
+ // first check that there will be visible columns after the invert.\r
+ if ((viewport.getColumnSelection() != null && viewport.getColumnSelection().getSelected() != null && viewport.getColumnSelection()\r
+ .getSelected().size() > 0)\r
+ || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg\r
+ .getEndRes()))\r
+ {\r
+ // now invert the sequence set, if required - empty selection implies\r
+ // that no hiding is required.\r
+ if (sg != null)\r
+ {\r
+ invertSequenceMenuItem_actionPerformed();\r
+ sg = viewport.getSelectionGroup();\r
+ toggleSeqs = true;\r
+\r
+ }\r
+ viewport.expandColSelection(sg, true);\r
+ // finally invert the column selection and get the new sequence\r
+ // selection and indicate it should be hidden.\r
+ invertColSel_actionPerformed();\r
+ toggleCols = true;\r
+ }\r
+ }\r
+\r
+ if (toggleSeqs)\r
+ {\r
+ if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())\r
+ {\r
+ hide = true;\r
+ viewport.hideAllSelectedSeqs();\r
+ }\r
+ else if (!(toggleCols && viewport.getColumnSelection().getSelected().size() > 0))\r
+ {\r
+ viewport.showAllHiddenSeqs();\r
+ }\r
+ }\r
+\r
+ if (toggleCols)\r
+ {\r
+ if (viewport.getColumnSelection().getSelected().size() > 0)\r
+ {\r
+ viewport.hideSelectedColumns();\r
+ if (!toggleSeqs)\r
+ {\r
+ viewport.setSelectionGroup(sg);\r
+ }\r
+ }\r
+ else if (!hide)\r
+ {\r
+ viewport.showAllHiddenColumns();\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void keyReleased(KeyEvent evt)\r
+ {\r
+ }\r
+\r
+ @Override\r
+ public void keyTyped(KeyEvent evt)\r
+ {\r
+ }\r
+\r
+ @Override\r
+ public void itemStateChanged(ItemEvent evt)\r
+ {\r
+ if (evt.getSource() == displayNonconservedMenuItem)\r
+ {\r
+ displayNonconservedMenuItem_actionPerformed();\r
+ }\r
+ else if (evt.getSource() == colourTextMenuItem)\r
+ {\r
+ colourTextMenuItem_actionPerformed();\r
+ }\r
+ else if (evt.getSource() == wrapMenuItem)\r
+ {\r
+ wrapMenuItem_actionPerformed();\r
+ }\r
+ else if (evt.getSource() == scaleAbove)\r
+ {\r
+ viewport.setScaleAboveWrapped(scaleAbove.getState());\r
+ }\r
+ else if (evt.getSource() == scaleLeft)\r
+ {\r
+ viewport.setScaleLeftWrapped(scaleLeft.getState());\r
+ }\r
+ else if (evt.getSource() == scaleRight)\r
+ {\r
+ viewport.setScaleRightWrapped(scaleRight.getState());\r
+ }\r
+ else if (evt.getSource() == seqLimits)\r
+ {\r
+ seqLimits_itemStateChanged();\r
+ }\r
+ else if (evt.getSource() == viewBoxesMenuItem)\r
+ {\r
+ viewport.setShowBoxes(viewBoxesMenuItem.getState());\r
+ }\r
+ else if (evt.getSource() == viewTextMenuItem)\r
+ {\r
+ viewport.setShowText(viewTextMenuItem.getState());\r
+ }\r
+ else if (evt.getSource() == renderGapsMenuItem)\r
+ {\r
+ viewport.setRenderGaps(renderGapsMenuItem.getState());\r
+ }\r
+ else if (evt.getSource() == annotationPanelMenuItem)\r
+ {\r
+ viewport.setShowAnnotation(annotationPanelMenuItem.getState());\r
+ alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());\r
+ }\r
+ else if (evt.getSource() == sequenceFeatures)\r
+ {\r
+ viewport.showSequenceFeatures(sequenceFeatures.getState());\r
+ alignPanel.seqPanel.seqCanvas.repaint();\r
+ }\r
+ else if (evt.getSource() == conservationMenuItem)\r
+ {\r
+ conservationMenuItem_actionPerformed();\r
+ }\r
+ else if (evt.getSource() == abovePIDThreshold)\r
+ {\r
+ abovePIDThreshold_actionPerformed();\r
+ }\r
+ else if (evt.getSource() == applyToAllGroups)\r
+ {\r
+ viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
+ }\r
+ else if (evt.getSource() == autoCalculate)\r
+ {\r
+ viewport.autoCalculateConsensus = autoCalculate.getState();\r
+ }\r
+ else if (evt.getSource() == sortByTree)\r
+ {\r
+ viewport.sortByTree = sortByTree.getState();\r
+ }\r
+ else if (evt.getSource() == this.centreColumnLabelFlag)\r
+ {\r
+ centreColumnLabelFlag_stateChanged();\r
+ }\r
+ else if (evt.getSource() == this.followMouseOverFlag)\r
+ {\r
+ mouseOverFlag_stateChanged();\r
+ }\r
+ else if (evt.getSource() == showGroupConsensus)\r
+ {\r
+ showGroupConsensus_actionPerformed();\r
+ }\r
+ else if (evt.getSource() == showGroupConservation)\r
+ {\r
+ showGroupConservation_actionPerformed();\r
+ }\r
+ else if (evt.getSource() == showSequenceLogo)\r
+ {\r
+ showSequenceLogo_actionPerformed();\r
+ }\r
+ else if (evt.getSource() == showConsensusHistogram)\r
+ {\r
+ showConsensusHistogram_actionPerformed();\r
+ }\r
+ else if (evt.getSource() == applyAutoAnnotationSettings)\r
+ {\r
+ applyAutoAnnotationSettings_actionPerformed();\r
+ }\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ private void mouseOverFlag_stateChanged()\r
+ {\r
+ viewport.followHighlight = followMouseOverFlag.getState();\r
+ // TODO: could kick the scrollTo mechanism to reset view for current\r
+ // searchresults.\r
+ }\r
+\r
+ private void centreColumnLabelFlag_stateChanged()\r
+ {\r
+ viewport.centreColumnLabels = centreColumnLabelFlag.getState();\r
+ this.alignPanel.annotationPanel.repaint();\r
+ }\r
+\r
+ @Override\r
+ public void actionPerformed(ActionEvent evt)\r
+ {\r
+ Object source = evt.getSource();\r
+\r
+ if (source == inputText)\r
+ {\r
+ inputText_actionPerformed();\r
+ }\r
+ else if (source == loadTree)\r
+ {\r
+ loadTree_actionPerformed();\r
+ }\r
+ else if (source == loadApplication)\r
+ {\r
+ launchFullApplication();\r
+ }\r
+ else if (source == loadAnnotations)\r
+ {\r
+ loadAnnotations();\r
+ }\r
+ else if (source == outputAnnotations)\r
+ {\r
+ outputAnnotations(true);\r
+ }\r
+ else if (source == outputFeatures)\r
+ {\r
+ outputFeatures(true, "Jalview");\r
+ }\r
+ else if (source == closeMenuItem)\r
+ {\r
+ closeMenuItem_actionPerformed();\r
+ }\r
+ else if (source == copy)\r
+ {\r
+ copy_actionPerformed();\r
+ }\r
+ else if (source == undoMenuItem)\r
+ {\r
+ undoMenuItem_actionPerformed();\r
+ }\r
+ else if (source == redoMenuItem)\r
+ {\r
+ redoMenuItem_actionPerformed();\r
+ }\r
+ else if (source == inputText)\r
+ {\r
+ inputText_actionPerformed();\r
+ }\r
+ else if (source == closeMenuItem)\r
+ {\r
+ closeMenuItem_actionPerformed();\r
+ }\r
+ else if (source == undoMenuItem)\r
+ {\r
+ undoMenuItem_actionPerformed();\r
+ }\r
+ else if (source == redoMenuItem)\r
+ {\r
+ redoMenuItem_actionPerformed();\r
+ }\r
+ else if (source == copy)\r
+ {\r
+ copy_actionPerformed();\r
+ }\r
+ else if (source == pasteNew)\r
+ {\r
+ pasteNew_actionPerformed();\r
+ }\r
+ else if (source == pasteThis)\r
+ {\r
+ pasteThis_actionPerformed();\r
+ }\r
+ else if (source == cut)\r
+ {\r
+ cut_actionPerformed();\r
+ }\r
+ else if (source == delete)\r
+ {\r
+ delete_actionPerformed();\r
+ }\r
+ else if (source == grpsFromSelection)\r
+ {\r
+ makeGrpsFromSelection_actionPerformed();\r
+ }\r
+ else if (source == deleteGroups)\r
+ {\r
+ deleteGroups_actionPerformed();\r
+ }\r
+ else if (source == selectAllSequenceMenuItem)\r
+ {\r
+ selectAllSequenceMenuItem_actionPerformed();\r
+ }\r
+ else if (source == deselectAllSequenceMenuItem)\r
+ {\r
+ deselectAllSequenceMenuItem_actionPerformed();\r
+ }\r
+ else if (source == invertSequenceMenuItem)\r
+ {\r
+ invertSequenceMenuItem_actionPerformed();\r
+ }\r
+ else if (source == invertColSel)\r
+ {\r
+ viewport.invertColumnSelection();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+ else if (source == remove2LeftMenuItem)\r
+ {\r
+ trimAlignment(true);\r
+ }\r
+ else if (source == remove2RightMenuItem)\r
+ {\r
+ trimAlignment(false);\r
+ }\r
+ else if (source == removeGappedColumnMenuItem)\r
+ {\r
+ removeGappedColumnMenuItem_actionPerformed();\r
+ }\r
+ else if (source == removeAllGapsMenuItem)\r
+ {\r
+ removeAllGapsMenuItem_actionPerformed();\r
+ }\r
+ else if (source == findMenuItem)\r
+ {\r
+ findMenuItem_actionPerformed();\r
+ }\r
+ else if (source == font)\r
+ {\r
+ new FontChooser(alignPanel);\r
+ }\r
+ else if (source == newView)\r
+ {\r
+ newView(null);\r
+ }\r
+ else if (source == showColumns)\r
+ {\r
+ viewport.showAllHiddenColumns();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+ else if (source == showSeqs)\r
+ {\r
+ viewport.showAllHiddenSeqs();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+ else if (source == hideColumns)\r
+ {\r
+ viewport.hideSelectedColumns();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+ else if (source == hideSequences\r
+ && viewport.getSelectionGroup() != null)\r
+ {\r
+ viewport.hideAllSelectedSeqs();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+ else if (source == hideAllButSelection)\r
+ {\r
+ toggleHiddenRegions(false, false);\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+ else if (source == hideAllSelection)\r
+ {\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+ viewport.expandColSelection(sg, false);\r
+ viewport.hideAllSelectedSeqs();\r
+ viewport.hideSelectedColumns();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+ else if (source == showAllHidden)\r
+ {\r
+ viewport.showAllHiddenColumns();\r
+ viewport.showAllHiddenSeqs();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+ else if (source == showGroupConsensus)\r
+ {\r
+ showGroupConsensus_actionPerformed();\r
+ }\r
+ else if (source == showGroupConservation)\r
+ {\r
+ showGroupConservation_actionPerformed();\r
+ }\r
+ else if (source == showSequenceLogo)\r
+ {\r
+ showSequenceLogo_actionPerformed();\r
+ }\r
+ else if (source == showConsensusHistogram)\r
+ {\r
+ showConsensusHistogram_actionPerformed();\r
+ }\r
+ else if (source == applyAutoAnnotationSettings)\r
+ {\r
+ applyAutoAnnotationSettings_actionPerformed();\r
+ }\r
+ else if (source == featureSettings)\r
+ {\r
+ new FeatureSettings(alignPanel);\r
+ }\r
+ else if (source == alProperties)\r
+ {\r
+ StringBuffer contents = new jalview.io.AlignmentProperties(\r
+ viewport.getAlignment()).formatAsString();\r
+ CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);\r
+ cap.setText(contents.toString());\r
+ Frame frame = new Frame();\r
+ frame.add(cap);\r
+ jalview.bin.JalviewLite.addFrame(frame, "Alignment Properties: "\r
+ + getTitle(), 400, 250);\r
+ }\r
+ else if (source == overviewMenuItem)\r
+ {\r
+ overviewMenuItem_actionPerformed();\r
+ }\r
+ else if (source == noColourmenuItem)\r
+ {\r
+ changeColour(null);\r
+ }\r
+ else if (source == clustalColour)\r
+ {\r
+ abovePIDThreshold.setState(false);\r
+ changeColour(new ClustalxColourScheme(viewport.getAlignment(),null));\r
+ }\r
+ else if (source == zappoColour)\r
+ {\r
+ changeColour(new ZappoColourScheme());\r
+ }\r
+ else if (source == taylorColour)\r
+ {\r
+ changeColour(new TaylorColourScheme());\r
+ }\r
+ else if (source == hydrophobicityColour)\r
+ {\r
+ changeColour(new HydrophobicColourScheme());\r
+ }\r
+ else if (source == helixColour)\r
+ {\r
+ changeColour(new HelixColourScheme());\r
+ }\r
+ else if (source == strandColour)\r
+ {\r
+ changeColour(new StrandColourScheme());\r
+ }\r
+ else if (source == turnColour)\r
+ {\r
+ changeColour(new TurnColourScheme());\r
+ }\r
+ else if (source == buriedColour)\r
+ {\r
+ changeColour(new BuriedColourScheme());\r
+ }\r
+ else if (source == nucleotideColour)\r
+ {\r
+ changeColour(new NucleotideColourScheme());\r
+ }\r
+ else if (source == purinePyrimidineColour)\r
+ {\r
+ changeColour(new PurinePyrimidineColourScheme());\r
+ }\r
+ else if (source == RNAHelixColour)\r
+ {\r
+ new RNAHelicesColourChooser(viewport, alignPanel);\r
+ }\r
+ else if (source == modifyPID)\r
+ {\r
+ modifyPID_actionPerformed();\r
+ }\r
+ else if (source == modifyConservation)\r
+ {\r
+ modifyConservation_actionPerformed();\r
+ }\r
+ else if (source == userDefinedColour)\r
+ {\r
+ new UserDefinedColours(alignPanel, null);\r
+ }\r
+ else if (source == PIDColour)\r
+ {\r
+ changeColour(new PIDColourScheme());\r
+ }\r
+ else if (source == BLOSUM62Colour)\r
+ {\r
+ changeColour(new Blosum62ColourScheme());\r
+ }\r
+ else if (source == tcoffeeColour) {\r
+ changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));\r
+ }\r
+ else if (source == annotationColour)\r
+ {\r
+ new AnnotationColourChooser(viewport, alignPanel);\r
+ }\r
+ else if (source == sortPairwiseMenuItem)\r
+ {\r
+ sortPairwiseMenuItem_actionPerformed();\r
+ }\r
+ else if (source == sortIDMenuItem)\r
+ {\r
+ sortIDMenuItem_actionPerformed();\r
+ }\r
+ else if (source == sortLengthMenuItem)\r
+ {\r
+ sortLengthMenuItem_actionPerformed();\r
+ }\r
+ else if (source == sortGroupMenuItem)\r
+ {\r
+ sortGroupMenuItem_actionPerformed();\r
+ }\r
+ else if (source == removeRedundancyMenuItem)\r
+ {\r
+ removeRedundancyMenuItem_actionPerformed();\r
+ }\r
+ else if (source == pairwiseAlignmentMenuItem)\r
+ {\r
+ pairwiseAlignmentMenuItem_actionPerformed();\r
+ }\r
+ else if (source == PCAMenuItem)\r
+ {\r
+ PCAMenuItem_actionPerformed();\r
+ }\r
+ else if (source == averageDistanceTreeMenuItem)\r
+ {\r
+ averageDistanceTreeMenuItem_actionPerformed();\r
+ }\r
+ else if (source == neighbourTreeMenuItem)\r
+ {\r
+ neighbourTreeMenuItem_actionPerformed();\r
+ }\r
+ else if (source == njTreeBlosumMenuItem)\r
+ {\r
+ njTreeBlosumMenuItem_actionPerformed();\r
+ }\r
+ else if (source == avDistanceTreeBlosumMenuItem)\r
+ {\r
+ avTreeBlosumMenuItem_actionPerformed();\r
+ }\r
+ else if (source == documentation)\r
+ {\r
+ documentation_actionPerformed();\r
+ }\r
+ else if (source == about)\r
+ {\r
+ about_actionPerformed();\r
+ }\r
+\r
+ }\r
+\r
+ public void inputText_actionPerformed()\r
+ {\r
+ CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
+ Frame frame = new Frame();\r
+ frame.add(cap);\r
+ jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500, 500);\r
+ }\r
+\r
+ protected void outputText_actionPerformed(ActionEvent e)\r
+ {\r
+ CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
+ Frame frame = new Frame();\r
+ frame.add(cap);\r
+ jalview.bin.JalviewLite.addFrame(frame,\r
+ "Alignment output - " + e.getActionCommand(), 600, 500);\r
+ cap.setText(new AppletFormatAdapter().formatSequences(\r
+ e.getActionCommand(), viewport.getAlignment(),\r
+ viewport.showJVSuffix));\r
+ }\r
+\r
+ public void loadAnnotations()\r
+ {\r
+ CutAndPasteTransfer cap = new CutAndPasteTransfer(true, this);\r
+ cap.setText("Paste your features / annotations / T-coffee score file here.");\r
+ cap.setAnnotationImport();\r
+ Frame frame = new Frame();\r
+ frame.add(cap);\r
+ jalview.bin.JalviewLite.addFrame(frame, "Paste Annotations ", 400, 300);\r
+\r
+ }\r
+\r
+ public String outputAnnotations(boolean displayTextbox)\r
+ {\r
+ String annotation = new AnnotationFile().printAnnotations(\r
+ viewport.showAnnotation ? viewport.getAlignment()\r
+ .getAlignmentAnnotation() : null, viewport.getAlignment()\r
+ .getGroups(),\r
+ ((Alignment) viewport.getAlignment()).alignmentProperties);\r
+\r
+ if (displayTextbox)\r
+ {\r
+ CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);\r
+ Frame frame = new Frame();\r
+ frame.add(cap);\r
+ jalview.bin.JalviewLite.addFrame(frame, "Annotations", 600, 500);\r
+ cap.setText(annotation);\r
+ }\r
+\r
+ return annotation;\r
+ }\r
+\r
+ private Hashtable getDisplayedFeatureCols()\r
+ {\r
+ if (alignPanel.getFeatureRenderer() != null && viewport.featuresDisplayed!=null)\r
+ {\r
+ FeatureRenderer fr = alignPanel.getFeatureRenderer();\r
+ Hashtable fcols = new Hashtable();\r
+ Enumeration en = viewport.featuresDisplayed.keys();\r
+ while (en.hasMoreElements())\r
+ {\r
+ Object col = en.nextElement();\r
+ fcols.put(col, fr.featureColours.get(col));\r
+ }\r
+ return fcols;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public String outputFeatures(boolean displayTextbox, String format)\r
+ {\r
+ String features;\r
+ if (format.equalsIgnoreCase("Jalview"))\r
+ {\r
+ features = new FeaturesFile().printJalviewFormat(\r
+ viewport.getAlignment().getSequencesArray(),\r
+ getDisplayedFeatureCols());\r
+ }\r
+ else\r
+ {\r
+ features = new FeaturesFile().printGFFFormat(\r
+ viewport.getAlignment().getSequencesArray(),\r
+ getDisplayedFeatureCols());\r
+ }\r
+\r
+ if (displayTextbox)\r
+ {\r
+ boolean frimport=false;\r
+ if (features==null || features.equals("No Features Visible"))\r
+ {\r
+ features = "# No features visible - paste some and import them here.";\r
+ frimport=true;\r
+ }\r
+\r
+ CutAndPasteTransfer cap = new CutAndPasteTransfer(frimport, this);\r
+ if (frimport)\r
+ {\r
+ cap.setAnnotationImport();\r
+ }\r
+ Frame frame = new Frame();\r
+ frame.add(cap);\r
+ jalview.bin.JalviewLite.addFrame(frame, "Features", 600, 500);\r
+ cap.setText(features);\r
+ } else {\r
+ if (features==null)\r
+ features = "";\r
+ }\r
+\r
+ return features;\r
+ }\r
+\r
+ void launchFullApplication()\r
+ {\r
+ StringBuffer url = new StringBuffer(jalviewServletURL);\r
+\r
+ url.append("?open="\r
+ + appendProtocol(viewport.applet.getParameter("file")));\r
+\r
+ if (viewport.applet.getParameter("features") != null)\r
+ {\r
+ url.append("&features=");\r
+ url.append(appendProtocol(viewport.applet.getParameter("features")));\r
+ }\r
+\r
+ if (viewport.applet.getParameter("annotations") != null)\r
+ {\r
+ url.append("&annotations=");\r
+ url.append(appendProtocol(viewport.applet.getParameter("annotations")));\r
+ }\r
+\r
+ if (viewport.applet.getParameter("jnetfile") != null)\r
+ {\r
+ url.append("&annotations=");\r
+ url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));\r
+ }\r
+\r
+ if (viewport.applet.getParameter("defaultColour") != null)\r
+ {\r
+ url.append("&colour="\r
+ + removeWhiteSpace(viewport.applet\r
+ .getParameter("defaultColour")));\r
+ }\r
+\r
+ if (viewport.applet.getParameter("userDefinedColour") != null)\r
+ {\r
+ url.append("&colour="\r
+ + removeWhiteSpace(viewport.applet\r
+ .getParameter("userDefinedColour")));\r
+ }\r
+ if (viewport.applet.getParameter("tree") != null)\r
+ {\r
+ url.append("&tree="\r
+ + appendProtocol(viewport.applet.getParameter("tree")));\r
+ }\r
+ if (viewport.applet.getParameter("treeFile") != null)\r
+ {\r
+ url.append("&tree="\r
+ + appendProtocol(viewport.applet.getParameter("treeFile")));\r
+ }\r
+\r
+ showURL(url.toString(), "FULL_APP");\r
+ }\r
+\r
+ String removeWhiteSpace(String colour)\r
+ {\r
+ StringBuffer sb = new StringBuffer();\r
+ for (int i = 0; i < colour.length(); i++)\r
+ {\r
+ if (Character.isWhitespace(colour.charAt(i)))\r
+ {\r
+ sb.append("%20");\r
+ }\r
+ else\r
+ {\r
+ sb.append(colour.charAt(i));\r
+ }\r
+ }\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ String appendProtocol(String url)\r
+ {\r
+ try\r
+ {\r
+ new URL(url);\r
+ url = URLEncoder.encode(url);\r
+ }\r
+ /*\r
+ * When we finally deprecate 1.1 compatibility, we can start to use\r
+ * URLEncoder.encode(url,"UTF-8") and then we'll need this catch: catch\r
+ * (UnsupportedEncodingException ex) { System.err.println("WARNING -\r
+ * IMPLEMENTATION ERROR - UNSUPPORTED ENCODING EXCEPTION FOR "+url);\r
+ * ex.printStackTrace(); }\r
+ */\r
+ catch (java.net.MalformedURLException ex)\r
+ {\r
+ url = viewport.applet.getCodeBase() + url;\r
+ }\r
+ return url;\r
+ }\r
+\r
+ public void closeMenuItem_actionPerformed()\r
+ {\r
+ PaintRefresher.RemoveComponent(alignPanel);\r
+ if (alignPanel.seqPanel!=null && alignPanel.seqPanel.seqCanvas!=null)\r
+ {\r
+ PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);\r
+ }\r
+ if (alignPanel.idPanel!=null && alignPanel.idPanel.idCanvas!=null) {\r
+ PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);\r
+ }\r
+\r
+ if (PaintRefresher.components.size() == 0 && viewport.applet == null)\r
+ {\r
+ System.exit(0);\r
+ } else {\r
+ }\r
+ viewport = null;\r
+ alignPanel = null;\r
+ this.dispose();\r
+ }\r
+\r
+ /**\r
+ * TODO: JAL-1104\r
+ */\r
+ void updateEditMenuBar()\r
+ {\r
+\r
+ if (viewport.historyList.size() > 0)\r
+ {\r
+ undoMenuItem.setEnabled(true);\r
+ CommandI command = (CommandI) viewport.historyList.peek();\r
+ undoMenuItem.setLabel("Undo " + command.getDescription());\r
+ }\r
+ else\r
+ {\r
+ undoMenuItem.setEnabled(false);\r
+ undoMenuItem.setLabel("Undo");\r
+ }\r
+\r
+ if (viewport.redoList.size() > 0)\r
+ {\r
+ redoMenuItem.setEnabled(true);\r
+\r
+ CommandI command = (CommandI) viewport.redoList.peek();\r
+ redoMenuItem.setLabel("Redo " + command.getDescription());\r
+ }\r
+ else\r
+ {\r
+ redoMenuItem.setEnabled(false);\r
+ redoMenuItem.setLabel("Redo");\r
+ }\r
+ }\r
+\r
+ /**\r
+ * TODO: JAL-1104\r
+ */\r
+ public void addHistoryItem(CommandI command)\r
+ {\r
+ if (command.getSize() > 0)\r
+ {\r
+ viewport.historyList.push(command);\r
+ viewport.redoList.removeAllElements();\r
+ updateEditMenuBar();\r
+ viewport.updateHiddenColumns();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * TODO: JAL-1104\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e\r
+ * DOCUMENT ME!\r
+ */\r
+ protected void undoMenuItem_actionPerformed()\r
+ {\r
+ if (viewport.historyList.size() < 1)\r
+ {\r
+ return;\r
+ }\r
+\r
+ CommandI command = (CommandI) viewport.historyList.pop();\r
+ viewport.redoList.push(command);\r
+ command.undoCommand(null);\r
+\r
+ AlignViewport originalSource = getOriginatingSource(command);\r
+ // JBPNote Test\r
+ if (originalSource!=viewport) {\r
+ System.err.println("Warning: Viewport object mismatch whilst undoing");\r
+ }\r
+ originalSource.updateHiddenColumns(); // originalSource.hasHiddenColumns = viewport.getColumnSelection().getHiddenColumns() != null;\r
+ updateEditMenuBar();\r
+ originalSource.firePropertyChange("alignment", null,\r
+ originalSource.getAlignment().getSequences());\r
+ }\r
+\r
+ /**\r
+ * TODO: JAL-1104\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e\r
+ * DOCUMENT ME!\r
+ */\r
+ protected void redoMenuItem_actionPerformed()\r
+ {\r
+ if (viewport.redoList.size() < 1)\r
+ {\r
+ return;\r
+ }\r
+\r
+ CommandI command = (CommandI) viewport.redoList.pop();\r
+ viewport.historyList.push(command);\r
+ command.doCommand(null);\r
+\r
+ AlignViewport originalSource = getOriginatingSource(command);\r
+ // JBPNote Test\r
+ if (originalSource!=viewport) {\r
+ System.err.println("Warning: Viewport object mismatch whilst re-doing");\r
+ }\r
+ originalSource.updateHiddenColumns(); //sethasHiddenColumns(); = viewport.getColumnSelection().getHiddenColumns() != null;\r
+\r
+ updateEditMenuBar();\r
+ originalSource.firePropertyChange("alignment", null,\r
+ originalSource.getAlignment().getSequences());\r
+ }\r
+\r
+ AlignViewport getOriginatingSource(CommandI command)\r
+ {\r
+ AlignViewport originalSource = null;\r
+ // For sequence removal and addition, we need to fire\r
+ // the property change event FROM the viewport where the\r
+ // original alignment was altered\r
+ AlignmentI al = null;\r
+ if (command instanceof EditCommand)\r
+ {\r
+ EditCommand editCommand = (EditCommand) command;\r
+ al = editCommand.getAlignment();\r
+ Vector comps = (Vector) PaintRefresher.components.get(viewport\r
+ .getSequenceSetId());\r
+ for (int i = 0; i < comps.size(); i++)\r
+ {\r
+ if (comps.elementAt(i) instanceof AlignmentPanel)\r
+ {\r
+ if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())\r
+ {\r
+ originalSource = ((AlignmentPanel) comps.elementAt(i)).av;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (originalSource == null)\r
+ {\r
+ // The original view is closed, we must validate\r
+ // the current view against the closed view first\r
+ if (al != null)\r
+ {\r
+ PaintRefresher.validateSequences(al, viewport.getAlignment());\r
+ }\r
+\r
+ originalSource = viewport;\r
+ }\r
+\r
+ return originalSource;\r
+ }\r
+\r
+ public void moveSelectedSequences(boolean up)\r
+ {\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+ if (sg == null)\r
+ {\r
+ return;\r
+ }\r
+ viewport.getAlignment().moveSelectedSequencesByOne(sg, up ? null : viewport.getHiddenRepSequences(), up);\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ synchronized void slideSequences(boolean right, int size)\r
+ {\r
+ List<SequenceI>sg = new Vector<SequenceI>();\r
+ if (viewport.cursorMode)\r
+ {\r
+ sg.add(viewport.getAlignment()\r
+ .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));\r
+ }\r
+ else if (viewport.getSelectionGroup() != null\r
+ && viewport.getSelectionGroup().getSize() != viewport.getAlignment()\r
+ .getHeight())\r
+ {\r
+ sg = viewport.getSelectionGroup().getSequences(\r
+ viewport.getHiddenRepSequences());\r
+ }\r
+\r
+ if (sg.size() < 1)\r
+ {\r
+ return;\r
+ }\r
+\r
+ Vector<SequenceI> invertGroup = new Vector();\r
+\r
+ for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
+ {\r
+ if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))\r
+ invertGroup.addElement(viewport.getAlignment().getSequenceAt(i));\r
+ }\r
+\r
+ SequenceI[] seqs1 = sg.toArray(new SequenceI[sg.size()]);\r
+\r
+ SequenceI[] seqs2 = invertGroup.toArray(new SequenceI[invertGroup.size()]);\r
+ for (int i = 0; i < invertGroup.size(); i++)\r
+ seqs2[i] = invertGroup.elementAt(i);\r
+\r
+ SlideSequencesCommand ssc;\r
+ if (right)\r
+ ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,\r
+ size, viewport.getGapCharacter());\r
+ else\r
+ ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,\r
+ size, viewport.getGapCharacter());\r
+\r
+ int groupAdjustment = 0;\r
+ if (ssc.getGapsInsertedBegin() && right)\r
+ {\r
+ if (viewport.cursorMode)\r
+ alignPanel.seqPanel.moveCursor(size, 0);\r
+ else\r
+ groupAdjustment = size;\r
+ }\r
+ else if (!ssc.getGapsInsertedBegin() && !right)\r
+ {\r
+ if (viewport.cursorMode)\r
+ alignPanel.seqPanel.moveCursor(-size, 0);\r
+ else\r
+ groupAdjustment = -size;\r
+ }\r
+\r
+ if (groupAdjustment != 0)\r
+ {\r
+ viewport.getSelectionGroup().setStartRes(\r
+ viewport.getSelectionGroup().getStartRes() + groupAdjustment);\r
+ viewport.getSelectionGroup().setEndRes(\r
+ viewport.getSelectionGroup().getEndRes() + groupAdjustment);\r
+ }\r
+\r
+ boolean appendHistoryItem = false;\r
+ if (viewport.historyList != null && viewport.historyList.size() > 0\r
+ && viewport.historyList.peek() instanceof SlideSequencesCommand)\r
+ {\r
+ appendHistoryItem = ssc\r
+ .appendSlideCommand((SlideSequencesCommand) viewport.historyList\r
+ .peek());\r
+ }\r
+\r
+ if (!appendHistoryItem)\r
+ addHistoryItem(ssc);\r
+\r
+ repaint();\r
+ }\r
+\r
+ static StringBuffer copiedSequences;\r
+\r
+ static Vector copiedHiddenColumns;\r
+\r
+ protected void copy_actionPerformed()\r
+ {\r
+ if (viewport.getSelectionGroup() == null)\r
+ {\r
+ return;\r
+ }\r