+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)\r
+ * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle\r
+ * \r
+ * 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 java.net.*;\r
+import java.util.*;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+import jalview.analysis.*;\r
+import jalview.api.SequenceStructureBinding;\r
+import jalview.bin.JalviewLite;\r
+import jalview.commands.*;\r
+import jalview.datamodel.*;\r
+import jalview.io.*;\r
+import jalview.schemes.*;\r
+import jalview.structure.StructureSelectionManager;\r
+\r
+public class AlignFrame extends EmbmenuFrame implements ActionListener,\r
+ 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
+ public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,\r
+ String title, boolean embedded)\r
+ {\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.showGroupConsensus);\r
+ showGroupConservation.setState(viewport.showGroupConservation);\r
+ showConsensusHistogram.setState(viewport.showConsensusHistogram);\r
+ showSequenceLogo.setState(viewport.showSequenceLogo);\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
+\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
+ * DOCUMENT ME!\r
+ * \r
+ * @param String\r
+ * DOCUMENT ME!\r
+ */\r
+\r
+ public void parseFeaturesFile(String file, String type)\r
+ {\r
+ Hashtable featureLinks = new Hashtable();\r
+ boolean featuresFile = false;\r
+ try\r
+ {\r
+ featuresFile = new jalview.io.FeaturesFile(file, type)\r
+ .parse(viewport.alignment,\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
+ viewport.showSequenceFeatures = true;\r
+ sequenceFeatures.setState(true);\r
+ if (viewport.featureSettings != null)\r
+ {\r
+ viewport.featureSettings.refreshTable();\r
+ }\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ }\r
+\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.colSel != null && viewport.colSel.getSelected() != null && viewport.colSel\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.alignment.getHeight())\r
+ {\r
+ hide = true;\r
+ viewport.hideAllSelectedSeqs();\r
+ }\r
+ else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))\r
+ {\r
+ viewport.showAllHiddenSeqs();\r
+ }\r
+ }\r
+\r
+ if (toggleCols)\r
+ {\r
+ if (viewport.colSel.getSelected().size() > 0)\r
+ {\r
+ viewport.hideSelectedColumns();\r
+ if (!toggleSeqs)\r
+ {\r
+ viewport.selectionGroup = sg;\r
+ }\r
+ }\r
+ else if (!hide)\r
+ {\r
+ viewport.showAllHiddenColumns();\r
+ }\r
+ }\r
+ }\r
+\r
+ public void keyReleased(KeyEvent evt)\r
+ {\r
+ }\r
+\r
+ public void keyTyped(KeyEvent evt)\r
+ {\r
+ }\r
+\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() == 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
+ 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.alignment).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(\r
+ viewport.alignment.getSequences(),\r
+ viewport.alignment.getWidth()));\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 == 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 == 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 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.alignment\r
+ .getAlignmentAnnotation() : null, viewport.alignment\r
+ .getGroups(),\r
+ ((Alignment) viewport.alignment).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)\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.alignment.getSequencesArray(),\r
+ getDisplayedFeatureCols());\r
+ }\r
+ else\r
+ {\r
+ features = new FeaturesFile().printGFFFormat(\r
+ viewport.alignment.getSequencesArray(),\r
+ getDisplayedFeatureCols());\r
+ }\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, "Features", 600, 500);\r
+\r
+ cap.setText(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
+ PaintRefresher.RemoveComponent(alignPanel.seqPanel.seqCanvas);\r
+ PaintRefresher.RemoveComponent(alignPanel.idPanel.idCanvas);\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
+ * DOCUMENT ME!\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
+ 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.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;\r
+ }\r
+ }\r
+\r
+ /**\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
+\r
+ originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;\r
+ updateEditMenuBar();\r
+ originalSource.firePropertyChange("alignment", null,\r
+ originalSource.alignment.getSequences());\r
+ }\r
+\r
+ /**\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
+ originalSource.hasHiddenColumns = viewport.colSel.getHiddenColumns() != null;\r
+\r
+ updateEditMenuBar();\r
+ originalSource.firePropertyChange("alignment", null,\r
+ originalSource.alignment.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.alignment)\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.alignment);\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
+\r
+ if (up)\r
+ {\r
+ for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
+ {\r
+ SequenceI seq = viewport.alignment.getSequenceAt(i);\r
+ if (!sg.getSequences(null).contains(seq))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
+ if (sg.getSequences(null).contains(temp))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ viewport.alignment.getSequences().setElementAt(temp, i);\r
+ viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
+ {\r
+ SequenceI seq = viewport.alignment.getSequenceAt(i);\r
+ if (!sg.getSequences(viewport.hiddenRepSequences).contains(seq))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
+ if (sg.getSequences(viewport.hiddenRepSequences).contains(temp))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ viewport.alignment.getSequences().setElementAt(temp, i);\r
+ viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
+ }\r
+ }\r
+\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ synchronized void slideSequences(boolean right, int size)\r
+ {\r
+ Vector sg = new Vector();\r
+ if (viewport.cursorMode)\r
+ {\r
+ sg.addElement(viewport.alignment\r
+ .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));\r
+ }\r
+ else if (viewport.getSelectionGroup() != null\r
+ && viewport.getSelectionGroup().getSize() != viewport.alignment\r
+ .getHeight())\r
+ {\r
+ sg = viewport.getSelectionGroup().getSequences(\r
+ viewport.hiddenRepSequences);\r
+ }\r
+\r
+ if (sg.size() < 1)\r
+ {\r
+ return;\r
+ }\r
+\r
+ Vector invertGroup = new Vector();\r
+\r
+ for (int i = 0; i < viewport.alignment.getHeight(); i++)\r
+ {\r
+ if (!sg.contains(viewport.alignment.getSequenceAt(i)))\r
+ invertGroup.addElement(viewport.alignment.getSequenceAt(i));\r
+ }\r
+\r
+ SequenceI[] seqs1 = new SequenceI[sg.size()];\r
+ for (int i = 0; i < sg.size(); i++)\r
+ seqs1[i] = (SequenceI) sg.elementAt(i);\r
+\r
+ SequenceI[] seqs2 = new SequenceI[invertGroup.size()];\r
+ for (int i = 0; i < invertGroup.size(); i++)\r
+ seqs2[i] = (SequenceI) 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