+ 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
+\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+ copiedSequences = new StringBuffer();\r
+ Hashtable orderedSeqs = new Hashtable();\r
+ for (int i = 0; i < sg.getSize(); i++)\r
+ {\r
+ SequenceI seq = sg.getSequenceAt(i);\r
+ int index = viewport.getAlignment().findIndex(seq);\r
+ orderedSeqs.put(index + "", seq);\r
+ }\r
+\r
+ int index = 0, startRes, endRes;\r
+ char ch;\r
+\r
+ if (viewport.hasHiddenColumns() && viewport.getSelectionGroup() != null)\r
+ {\r
+ copiedHiddenColumns = new Vector();\r
+ int hiddenOffset = viewport.getSelectionGroup().getStartRes();\r
+ for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()\r
+ .size(); i++)\r
+ {\r
+ int[] region = (int[]) viewport.getColumnSelection()\r
+ .getHiddenColumns().elementAt(i);\r
+\r
+ copiedHiddenColumns.addElement(new int[]\r
+ { region[0] - hiddenOffset, region[1] - hiddenOffset });\r
+ }\r
+ }\r
+ else\r
+ {\r
+ copiedHiddenColumns = null;\r
+ }\r
+\r
+ for (int i = 0; i < sg.getSize(); i++)\r
+ {\r
+ SequenceI seq = null;\r
+\r
+ while (seq == null)\r
+ {\r
+ if (orderedSeqs.containsKey(index + ""))\r
+ {\r
+ seq = (SequenceI) orderedSeqs.get(index + "");\r
+ index++;\r
+\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ index++;\r
+ }\r
+ }\r
+\r
+ // FIND START RES\r
+ // Returns residue following index if gap\r
+ startRes = seq.findPosition(sg.getStartRes());\r
+\r
+ // FIND END RES\r
+ // Need to find the residue preceeding index if gap\r
+ endRes = 0;\r
+\r
+ for (int j = 0; j < sg.getEndRes() + 1 && j < seq.getLength(); j++)\r
+ {\r
+ ch = seq.getCharAt(j);\r
+ if (!jalview.util.Comparison.isGap((ch)))\r
+ {\r
+ endRes++;\r
+ }\r
+ }\r
+\r
+ if (endRes > 0)\r
+ {\r
+ endRes += seq.getStart() - 1;\r
+ }\r
+\r
+ copiedSequences.append(seq.getName()\r
+ + "\t"\r
+ + startRes\r
+ + "\t"\r
+ + endRes\r
+ + "\t"\r
+ + seq.getSequenceAsString(sg.getStartRes(),\r
+ sg.getEndRes() + 1) + "\n");\r
+ }\r
+\r
+ }\r
+\r
+ protected void pasteNew_actionPerformed()\r
+ {\r
+ paste(true);\r
+ }\r
+\r
+ protected void pasteThis_actionPerformed()\r
+ {\r
+ paste(false);\r
+ }\r
+\r
+ void paste(boolean newAlignment)\r
+ {\r
+ try\r
+ {\r
+\r
+ if (copiedSequences == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ StringTokenizer st = new StringTokenizer(copiedSequences.toString());\r
+ Vector seqs = new Vector();\r
+ while (st.hasMoreElements())\r
+ {\r
+ String name = st.nextToken();\r
+ int start = Integer.parseInt(st.nextToken());\r
+ int end = Integer.parseInt(st.nextToken());\r
+ seqs.addElement(new Sequence(name, st.nextToken(), start, end));\r
+ }\r
+ SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
+ for (int i = 0; i < seqs.size(); i++)\r
+ {\r
+ newSeqs[i] = (SequenceI) seqs.elementAt(i);\r
+ }\r
+\r
+ if (newAlignment)\r
+ {\r
+ String newtitle = new String("Copied sequences");\r
+ if (getTitle().startsWith("Copied sequences"))\r
+ {\r
+ newtitle = getTitle();\r
+ }\r
+ else\r
+ {\r
+ newtitle = newtitle.concat("- from " + getTitle());\r
+ }\r
+ AlignFrame af = new AlignFrame(new Alignment(newSeqs),\r
+ viewport.applet, newtitle, false);\r
+ if (copiedHiddenColumns != null)\r
+ {\r
+ for (int i = 0; i < copiedHiddenColumns.size(); i++)\r
+ {\r
+ int[] region = (int[]) copiedHiddenColumns.elementAt(i);\r
+ af.viewport.hideColumns(region[0], region[1]);\r
+ }\r
+ }\r
+\r
+ jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,\r
+ DEFAULT_HEIGHT);\r
+ }\r
+ else\r
+ {\r
+ addSequences(newSeqs);\r
+ }\r
+\r
+ } catch (Exception ex)\r
+ {\r
+ } // could be anything being pasted in here\r
+\r
+ }\r
+\r
+ void addSequences(SequenceI[] seqs)\r
+ {\r
+ for (int i = 0; i < seqs.length; i++)\r
+ {\r
+ viewport.getAlignment().addSequence(seqs[i]);\r
+ }\r
+\r
+ // !newAlignment\r
+ addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,\r
+ seqs, 0, viewport.getAlignment().getWidth(), viewport.getAlignment()));\r
+\r
+ viewport.setEndSeq(viewport.getAlignment().getHeight());\r
+ viewport.getAlignment().getWidth();\r
+ viewport.firePropertyChange("alignment", null,\r
+ viewport.getAlignment().getSequences());\r
+\r
+ }\r
+\r
+ protected void cut_actionPerformed()\r
+ {\r
+ copy_actionPerformed();\r
+ delete_actionPerformed();\r
+ }\r