+ 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
+\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.alignment.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.alignment.addSequence(seqs[i]);\r
+ }\r
+\r
+ // !newAlignment\r
+ addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,\r
+ seqs, 0, viewport.alignment.getWidth(), viewport.alignment));\r
+\r
+ viewport.setEndSeq(viewport.alignment.getHeight());\r
+ viewport.alignment.getWidth();\r
+ viewport.firePropertyChange("alignment", null,\r
+ viewport.alignment.getSequences());\r
+\r
+ }\r
+\r
+ protected void cut_actionPerformed()\r
+ {\r
+ copy_actionPerformed();\r
+ delete_actionPerformed();\r
+ }\r
+\r
+ protected void delete_actionPerformed()\r
+ {\r
+\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+ if (sg == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ Vector seqs = new Vector();\r
+ SequenceI seq;\r
+ for (int i = 0; i < sg.getSize(); i++)\r
+ {\r
+ seq = sg.getSequenceAt(i);\r
+ seqs.addElement(seq);\r
+ }\r
+\r
+ // If the cut affects all sequences, remove highlighted columns\r
+ if (sg.getSize() == viewport.alignment.getHeight())\r
+ {\r
+ viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
+ sg.getEndRes() + 1);\r
+ }\r
+\r
+ SequenceI[] cut = new SequenceI[seqs.size()];\r
+ for (int i = 0; i < seqs.size(); i++)\r
+ {\r
+ cut[i] = (SequenceI) seqs.elementAt(i);\r
+ }\r
+\r
+ /*\r
+ * //ADD HISTORY ITEM\r
+ */\r
+ addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,\r
+ sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,\r
+ viewport.alignment));\r
+\r
+ viewport.setSelectionGroup(null);\r
+ viewport.alignment.deleteGroup(sg);\r
+\r
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
+ .getSequences());\r
+\r
+ if (viewport.getAlignment().getHeight() < 1)\r
+ {\r
+ this.setVisible(false);\r
+ }\r
+ viewport.sendSelection();\r
+ }\r
+\r
+ /**\r
+ * group consensus toggled\r
+ * \r
+ */\r
+ protected void showGroupConsensus_actionPerformed()\r
+ {\r
+ viewport.setShowGroupConsensus(showGroupConsensus.getState());\r
+ alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
+\r
+ }\r
+\r
+ /**\r
+ * group conservation toggled.\r
+ */\r
+ protected void showGroupConservation_actionPerformed()\r
+ {\r
+ viewport.setShowGroupConservation(showGroupConservation.getState());\r
+ alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt\r
+ * .event.ActionEvent)\r
+ */\r
+ protected void showConsensusHistogram_actionPerformed()\r
+ {\r
+ viewport.setShowConsensusHistogram(showConsensusHistogram.getState());\r
+ alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
+ }\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt\r
+ * .event.ActionEvent)\r
+ */\r
+ protected void showSequenceLogo_actionPerformed()\r
+ {\r
+ viewport.setShowSequenceLogo(showSequenceLogo.getState());\r
+ alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
+ }\r
+\r
+ protected void applyAutoAnnotationSettings_actionPerformed()\r
+ {\r
+ alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
+ }\r
+\r
+ protected void makeGrpsFromSelection_actionPerformed()\r
+ {\r
+ if (viewport.getSelectionGroup() != null)\r
+ {\r
+ SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(\r
+ viewport.getSequenceSelection(),\r
+ viewport.getAlignmentView(true).getSequenceStrings(\r
+ viewport.getGapCharacter()),\r
+ viewport.alignment.getGroups());\r
+ viewport.alignment.deleteAllGroups();\r
+ viewport.sequenceColours = null;\r
+ viewport.setSelectionGroup(null);\r
+ // set view properties for each group\r
+ for (int g = 0; g < gps.length; g++)\r
+ {\r
+ // gps[g].setShowunconserved(viewport.getShowUnconserved());\r
+ gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());\r
+ viewport.alignment.addGroup(gps[g]);\r
+ Color col = new Color((int) (Math.random() * 255),\r
+ (int) (Math.random() * 255), (int) (Math.random() * 255));\r
+ col = col.brighter();\r
+ for (Enumeration sq = gps[g].getSequences(null).elements(); sq\r
+ .hasMoreElements(); viewport.setSequenceColour(\r
+ (SequenceI) sq.nextElement(), col))\r
+ ;\r
+ }\r
+ PaintRefresher.Refresh(this, viewport.getSequenceSetId());\r
+ alignPanel.updateAnnotation();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+ }\r
+\r
+ protected void deleteGroups_actionPerformed()\r
+ {\r
+ viewport.alignment.deleteAllGroups();\r
+ viewport.sequenceColours = null;\r
+ viewport.setSelectionGroup(null);\r
+\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ public void selectAllSequenceMenuItem_actionPerformed()\r
+ {\r
+ SequenceGroup sg = new SequenceGroup();\r
+ for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
+ {\r
+ sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
+ }\r
+ sg.setEndRes(viewport.alignment.getWidth() - 1);\r
+ viewport.setSelectionGroup(sg);\r
+ alignPanel.paintAlignment(true);\r
+ PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
+ viewport.sendSelection();\r
+ }\r
+\r
+ public void deselectAllSequenceMenuItem_actionPerformed()\r
+ {\r
+ if (viewport.cursorMode)\r
+ {\r
+ alignPanel.seqPanel.keyboardNo1 = null;\r
+ alignPanel.seqPanel.keyboardNo2 = null;\r
+ }\r
+ viewport.setSelectionGroup(null);\r
+ viewport.getColumnSelection().clear();\r
+ viewport.setSelectionGroup(null);\r
+ alignPanel.idPanel.idCanvas.searchResults = null;\r
+ alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);\r
+ alignPanel.paintAlignment(true);\r
+ PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
+ viewport.sendSelection();\r
+ }\r
+\r
+ public void invertSequenceMenuItem_actionPerformed()\r
+ {\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+ for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
+ {\r
+ sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
+ }\r
+\r
+ PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
+ viewport.sendSelection();\r
+ }\r
+\r
+ public void invertColSel_actionPerformed()\r
+ {\r
+ viewport.invertColumnSelection();\r
+ alignPanel.paintAlignment(true);\r
+ PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
+ viewport.sendSelection();\r
+ }\r
+\r
+ void trimAlignment(boolean trimLeft)\r
+ {\r
+ ColumnSelection colSel = viewport.getColumnSelection();\r
+ int column;\r
+\r
+ if (colSel.size() > 0)\r
+ {\r
+ if (trimLeft)\r
+ {\r
+ column = colSel.getMin();\r
+ }\r
+ else\r
+ {\r
+ column = colSel.getMax();\r
+ }\r
+\r
+ SequenceI[] seqs;\r
+ if (viewport.getSelectionGroup() != null)\r
+ {\r
+ seqs = viewport.getSelectionGroup().getSequencesAsArray(\r
+ viewport.hiddenRepSequences);\r
+ }\r
+ else\r
+ {\r
+ seqs = viewport.alignment.getSequencesArray();\r
+ }\r
+\r
+ TrimRegionCommand trimRegion;\r
+ if (trimLeft)\r
+ {\r
+ trimRegion = new TrimRegionCommand("Remove Left",\r
+ TrimRegionCommand.TRIM_LEFT, seqs, column,\r
+ viewport.alignment, viewport.colSel,\r
+ viewport.selectionGroup);\r
+ viewport.setStartRes(0);\r
+ }\r
+ else\r
+ {\r
+ trimRegion = new TrimRegionCommand("Remove Right",\r
+ TrimRegionCommand.TRIM_RIGHT, seqs, column,\r
+ viewport.alignment, viewport.colSel,\r
+ viewport.selectionGroup);\r
+ }\r
+\r
+ statusBar.setText("Removed " + trimRegion.getSize() + " columns.");\r
+\r
+ addHistoryItem(trimRegion);\r
+\r
+ Vector groups = viewport.alignment.getGroups();\r
+\r
+ for (int i = 0; i < groups.size(); i++)\r
+ {\r
+ SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
+\r
+ if ((trimLeft && !sg.adjustForRemoveLeft(column))\r
+ || (!trimLeft && !sg.adjustForRemoveRight(column)))\r
+ {\r
+ viewport.alignment.deleteGroup(sg);\r
+ }\r
+ }\r
+\r
+ viewport.firePropertyChange("alignment", null, viewport\r
+ .getAlignment().getSequences());\r
+ }\r
+ }\r
+\r
+ public void removeGappedColumnMenuItem_actionPerformed()\r
+ {\r
+ int start = 0, end = viewport.alignment.getWidth() - 1;\r
+\r
+ SequenceI[] seqs;\r
+ if (viewport.getSelectionGroup() != null)\r
+ {\r
+ seqs = viewport.getSelectionGroup().getSequencesAsArray(\r
+ viewport.hiddenRepSequences);\r
+ start = viewport.getSelectionGroup().getStartRes();\r
+ end = viewport.getSelectionGroup().getEndRes();\r
+ }\r
+ else\r
+ {\r
+ seqs = viewport.alignment.getSequencesArray();\r
+ }\r
+\r
+ RemoveGapColCommand removeGapCols = new RemoveGapColCommand(\r
+ "Remove Gapped Columns", seqs, start, end, viewport.alignment);\r
+\r
+ addHistoryItem(removeGapCols);\r
+\r
+ statusBar.setText("Removed " + removeGapCols.getSize()\r
+ + " empty columns.");\r
+\r
+ // This is to maintain viewport position on first residue\r
+ // of first sequence\r
+ SequenceI seq = viewport.alignment.getSequenceAt(0);\r
+ int startRes = seq.findPosition(viewport.startRes);\r
+ // ShiftList shifts;\r
+ // viewport.getAlignment().removeGaps(shifts=new ShiftList());\r
+ // edit.alColumnChanges=shifts.getInverse();\r
+ // if (viewport.hasHiddenColumns)\r
+ // viewport.getColumnSelection().compensateForEdits(shifts);\r
+ viewport.setStartRes(seq.findIndex(startRes) - 1);\r
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
+ .getSequences());\r
+\r
+ }\r
+\r
+ public void removeAllGapsMenuItem_actionPerformed()\r
+ {\r
+ int start = 0, end = viewport.alignment.getWidth() - 1;\r
+\r
+ SequenceI[] seqs;\r
+ if (viewport.getSelectionGroup() != null)\r
+ {\r
+ seqs = viewport.getSelectionGroup().getSequencesAsArray(\r
+ viewport.hiddenRepSequences);\r
+ start = viewport.getSelectionGroup().getStartRes();\r
+ end = viewport.getSelectionGroup().getEndRes();\r
+ }\r
+ else\r
+ {\r
+ seqs = viewport.alignment.getSequencesArray();\r
+ }\r
+\r
+ // This is to maintain viewport position on first residue\r
+ // of first sequence\r
+ SequenceI seq = viewport.alignment.getSequenceAt(0);\r
+ int startRes = seq.findPosition(viewport.startRes);\r
+\r
+ addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,\r
+ viewport.alignment));\r
+\r
+ viewport.setStartRes(seq.findIndex(startRes) - 1);\r
+\r
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
+ .getSequences());\r
+\r
+ }\r
+\r
+ public void findMenuItem_actionPerformed()\r
+ {\r
+ new Finder(alignPanel);\r
+ }\r
+\r
+ /**\r
+ * create a new view derived from the current view\r
+ * \r
+ * @param viewtitle\r
+ * @return frame for the new view\r
+ */\r
+ public AlignFrame newView(String viewtitle)\r
+ {\r
+ AlignmentI newal;\r
+ if (viewport.hasHiddenRows)\r
+ {\r
+ newal = new Alignment(viewport.getAlignment().getHiddenSequences()\r
+ .getFullAlignment().getSequencesArray());\r
+ }\r
+ else\r
+ {\r
+ newal = new Alignment(viewport.alignment.getSequencesArray());\r
+ }\r
+\r
+ if (viewport.alignment.getAlignmentAnnotation() != null)\r
+ {\r
+ for (int i = 0; i < viewport.alignment.getAlignmentAnnotation().length; i++)\r
+ {\r
+ if (!viewport.alignment.getAlignmentAnnotation()[i].autoCalculated)\r
+ {\r
+ newal.addAnnotation(viewport.alignment.getAlignmentAnnotation()[i]);\r
+ }\r
+ }\r
+ }\r
+\r
+ AlignFrame newaf = new AlignFrame(newal, viewport.applet, "", false);\r
+\r
+ newaf.viewport.sequenceSetID = alignPanel.av.getSequenceSetId();\r
+ PaintRefresher.Register(alignPanel, alignPanel.av.getSequenceSetId());\r
+ PaintRefresher.Register(newaf.alignPanel,\r
+ newaf.alignPanel.av.getSequenceSetId());\r
+\r
+ PaintRefresher.Register(newaf.alignPanel.idPanel.idCanvas,\r
+ newaf.alignPanel.av.getSequenceSetId());\r
+ PaintRefresher.Register(newaf.alignPanel.seqPanel.seqCanvas,\r
+ newaf.alignPanel.av.getSequenceSetId());\r
+\r
+ Vector comps = (Vector) PaintRefresher.components.get(viewport\r
+ .getSequenceSetId());\r
+ int viewSize = -1;\r
+ for (int i = 0; i < comps.size(); i++)\r
+ {\r
+ if (comps.elementAt(i) instanceof AlignmentPanel)\r
+ {\r
+ viewSize++;\r
+ }\r
+ }\r
+\r
+ String title = new String(this.getTitle());\r
+ if (viewtitle != null)\r
+ {\r
+ title = viewtitle + " ( " + title + ")";\r
+ }\r
+ else\r
+ {\r
+ if (title.indexOf("(View") > -1)\r
+ {\r
+ title = title.substring(0, title.indexOf("(View"));\r
+ }\r
+ title += "(View " + viewSize + ")";\r
+ }\r
+\r
+ newaf.setTitle(title.toString());\r
+\r
+ newaf.viewport.historyList = viewport.historyList;\r
+ newaf.viewport.redoList = viewport.redoList;\r
+ return newaf;\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @return list of feature groups on the view\r
+ */\r
+ public String[] getFeatureGroups()\r
+ {\r
+ FeatureRenderer fr = null;\r
+ if (alignPanel != null\r
+ && (fr = alignPanel.getFeatureRenderer()) != null)\r
+ {\r
+ return fr.getGroups();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * get sequence feature groups that are hidden or shown\r
+ * \r
+ * @param visible\r
+ * true is visible\r
+ * @return list\r
+ */\r
+ public String[] getFeatureGroupsOfState(boolean visible)\r
+ {\r
+ FeatureRenderer fr = null;\r
+ if (alignPanel != null\r
+ && (fr = alignPanel.getFeatureRenderer()) != null)\r
+ {\r
+ return fr.getGroups(visible);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * Change the display state for the given feature groups\r
+ * \r
+ * @param groups\r
+ * list of group strings\r
+ * @param state\r
+ * visible or invisible\r
+ */\r
+ public void setFeatureGroupState(String[] groups, boolean state)\r
+ {\r
+ FeatureRenderer fr = null;\r
+ this.sequenceFeatures.setState(true);\r
+ viewport.showSequenceFeatures(true);\r
+ if (alignPanel != null\r
+ && (fr = alignPanel.getFeatureRenderer()) != null)\r
+ {\r
+ fr.setGroupState(groups, state);\r
+ alignPanel.seqPanel.seqCanvas.repaint();\r
+ if (alignPanel.overviewPanel != null)\r
+ {\r
+ alignPanel.overviewPanel.updateOverviewImage();\r
+ }\r
+ }\r
+ }\r
+\r
+ public void seqLimits_itemStateChanged()\r
+ {\r
+ viewport.setShowJVSuffix(seqLimits.getState());\r
+ alignPanel.fontChanged();\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ protected void colourTextMenuItem_actionPerformed()\r
+ {\r
+ viewport.setColourText(colourTextMenuItem.getState());\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ protected void displayNonconservedMenuItem_actionPerformed()\r
+ {\r
+ viewport.setShowunconserved(displayNonconservedMenuItem.getState());\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ protected void wrapMenuItem_actionPerformed()\r
+ {\r
+ viewport.setWrapAlignment(wrapMenuItem.getState());\r
+ alignPanel.setWrapAlignment(wrapMenuItem.getState());\r
+ scaleAbove.setEnabled(wrapMenuItem.getState());\r
+ scaleLeft.setEnabled(wrapMenuItem.getState());\r
+ scaleRight.setEnabled(wrapMenuItem.getState());\r
+ alignPanel.paintAlignment(true);\r
+ }\r
+\r
+ public void overviewMenuItem_actionPerformed()\r
+ {\r
+ if (alignPanel.overviewPanel != null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ Frame frame = new Frame();\r
+ OverviewPanel overview = new OverviewPanel(alignPanel);\r
+ frame.add(overview);\r
+ // +50 must allow for applet frame window\r
+ jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
+ overview.getPreferredSize().width,\r
+ overview.getPreferredSize().height + 50);\r
+\r
+ frame.pack();\r
+ frame.addWindowListener(new WindowAdapter()\r
+ {\r
+ public void windowClosing(WindowEvent e)\r
+ {\r
+ alignPanel.setOverviewPanel(null);\r
+ };\r
+ });\r
+\r
+ alignPanel.setOverviewPanel(overview);\r
+\r