+ if (value == JalviewFileChooser.APPROVE_OPTION)\r
+ {\r
+ currentFileFormat = chooser.getSelectedFormat();\r
+ jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",\r
+ currentFileFormat);\r
+\r
+ String choice = chooser.getSelectedFile().getPath();\r
+ jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
+\r
+ saveAlignment(choice, currentFileFormat);\r
+ }\r
+ }\r
+\r
+ public boolean saveAlignment(String file, String format)\r
+ {\r
+ if (format.equalsIgnoreCase("Jalview"))\r
+ {\r
+ String shortName = title;\r
+\r
+ if (shortName.indexOf(java.io.File.separatorChar) > -1)\r
+ {\r
+ shortName = shortName.substring(shortName.lastIndexOf(\r
+ java.io.File.separatorChar) + 1);\r
+ }\r
+\r
+ Jalview2XML.SaveAlignment(this, file, shortName);\r
+\r
+ // USE Jalview2XML to save this file\r
+ return true;\r
+ }\r
+ else\r
+ {\r
+ String output = FormatAdapter.formatSequences(format,\r
+ viewport.getAlignment().\r
+ getSequences());\r
+ if (output == null)\r
+ {\r
+ return false;\r
+ }\r
+\r
+ try\r
+ {\r
+ java.io.PrintWriter out = new java.io.PrintWriter(\r
+ new java.io.FileWriter(file));\r
+\r
+ out.print(output);\r
+ out.close();\r
+ return true;\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ ex.printStackTrace();\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void outputText_actionPerformed(ActionEvent e)\r
+ {\r
+ CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
+ Desktop.addInternalFrame(cap,\r
+ "Alignment output - " + e.getActionCommand(), 600,\r
+ 500);\r
+ cap.setText(FormatAdapter.formatSequences(e.getActionCommand(),\r
+ viewport.getAlignment().\r
+ getSequences()));\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ new HTMLOutput(viewport);\r
+ }\r
+\r
+ public void createImageMap(File file, String image)\r
+ {\r
+ alignPanel.makePNGImageMap(file, image);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void createPNG(File f)\r
+ {\r
+ alignPanel.makePNG(f);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void createEPS(File f)\r
+ {\r
+ alignPanel.makeEPS(f);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void printMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ //Putting in a thread avoids Swing painting problems\r
+ PrintThread thread = new PrintThread();\r
+ thread.start();\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void closeMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ try\r
+ {\r
+ PaintRefresher.components.remove(viewport.alignment);\r
+ this.setClosed(true);\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ }\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ */\r
+ void updateEditMenuBar()\r
+ {\r
+ if (historyList.size() > 0)\r
+ {\r
+ undoMenuItem.setEnabled(true);\r
+\r
+ HistoryItem hi = (HistoryItem) historyList.peek();\r
+ undoMenuItem.setText("Undo " + hi.getDescription());\r
+ }\r
+ else\r
+ {\r
+ undoMenuItem.setEnabled(false);\r
+ undoMenuItem.setText("Undo");\r
+ }\r
+\r
+ if (redoList.size() > 0)\r
+ {\r
+ redoMenuItem.setEnabled(true);\r
+\r
+ HistoryItem hi = (HistoryItem) redoList.peek();\r
+ redoMenuItem.setText("Redo " + hi.getDescription());\r
+ }\r
+ else\r
+ {\r
+ redoMenuItem.setEnabled(false);\r
+ redoMenuItem.setText("Redo");\r
+ }\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param hi DOCUMENT ME!\r
+ */\r
+ public void addHistoryItem(HistoryItem hi)\r
+ {\r
+ historyList.push(hi);\r
+ updateEditMenuBar();\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void undoMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ HistoryItem hi = (HistoryItem) historyList.pop();\r
+ redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment,\r
+ HistoryItem.HIDE));\r
+ restoreHistoryItem(hi);\r
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void redoMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ HistoryItem hi = (HistoryItem) redoList.pop();\r
+ restoreHistoryItem(hi);\r
+ updateEditMenuBar();\r
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
+ }\r
+\r
+ // used by undo and redo\r
+ void restoreHistoryItem(HistoryItem hi)\r
+ {\r
+ if (hi.getType() == HistoryItem.SORT)\r
+ {\r
+ for (int i = 0; i < hi.getSequences().size(); i++)\r
+ {\r
+ viewport.alignment.getSequences().setElementAt(hi.getSequences()\r
+ .elementAt(i),\r
+ i);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (int i = 0; i < hi.getSequences().size(); i++)\r
+ {\r
+ SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);\r
+\r
+ if (restore.getLength() == 0)\r
+ {\r
+ restore.setSequence(hi.getHidden().elementAt(i).toString());\r
+ viewport.alignment.getSequences().insertElementAt(restore,\r
+ hi.getAlignIndex(i));\r
+ }\r
+ else\r
+ {\r
+ restore.setSequence(hi.getHidden().elementAt(i).toString());\r
+ }\r
+ }\r
+\r
+ if (hi.getType() == HistoryItem.PASTE)\r
+ {\r
+ for (int i = viewport.alignment.getHeight() - 1;\r
+ i > (hi.getSequences().size() - 1); i--)\r
+ {\r
+ viewport.alignment.deleteSequence(i);\r
+ }\r
+ }\r
+ }\r
+\r
+ updateEditMenuBar();\r
+\r
+ viewport.firePropertyChange("alignment", null,\r
+ viewport.getAlignment().getSequences());\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param up DOCUMENT ME!\r
+ */\r
+ public void moveSelectedSequences(boolean up)\r
+ {\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+\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
+\r
+ if (!sg.sequences.contains(seq))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
+\r
+ if (sg.sequences.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
+\r
+ if (!sg.sequences.contains(seq))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
+\r
+ if (sg.sequences.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.repaint();\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void copy_actionPerformed(ActionEvent e)\r
+ {\r
+ if (viewport.getSelectionGroup() == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+\r
+ Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
+ StringBuffer buffer = new StringBuffer();\r
+\r
+ Hashtable orderedSeqs = new Hashtable();\r
+\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
+ 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
+ //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
+ buffer.append(seq.getName() + "\t" +\r
+ startRes + "\t" +\r
+ endRes + "\t" +\r
+ seq.getSequence(sg.getStartRes(),\r
+ sg.getEndRes() + 1) + "\n");\r
+ }\r
+\r
+ c.setContents(new StringSelection(buffer.toString()), null);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void pasteNew_actionPerformed(ActionEvent e)\r
+ {\r
+ paste(true);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void pasteThis_actionPerformed(ActionEvent e)\r
+ {\r
+ addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment,\r
+ HistoryItem.PASTE));\r
+ paste(false);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param newAlignment DOCUMENT ME!\r
+ */\r
+ void paste(boolean newAlignment)\r
+ {\r
+ try\r
+ {\r
+ Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
+ Transferable contents = c.getContents(this);\r
+\r
+ if (contents == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ String str = (String) contents.getTransferData(DataFlavor.stringFlavor);\r
+ StringTokenizer st = new StringTokenizer(str);\r
+ ArrayList seqs = new ArrayList();\r
+\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
+ Sequence sequence = new Sequence(name, st.nextToken(), start,\r
+ end);\r
+\r
+ if (!newAlignment)\r
+ {\r
+ viewport.alignment.addSequence(sequence);\r
+ }\r
+ else\r
+ {\r
+ seqs.add(sequence);\r
+ }\r
+ }\r
+\r
+ if (newAlignment)\r
+ {\r
+ SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
+ seqs.toArray(newSeqs);\r
+\r
+ AlignFrame af = new AlignFrame(new Alignment(newSeqs));\r
+ String newtitle = new String("Copied sequences");\r
+\r
+ if (title.startsWith("Copied sequences"))\r
+ {\r
+ newtitle = title;\r
+ }\r
+ else\r
+ {\r
+ newtitle = newtitle.concat("- from " + title);\r
+ }\r
+\r
+ Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH,\r
+ NEW_WINDOW_HEIGHT);\r
+ }\r
+ else\r
+ {\r
+ viewport.setEndSeq(viewport.alignment.getHeight());\r
+ viewport.alignment.getWidth();\r
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
+ }\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ // could be anything being pasted in here\r
+ }\r
+\r
+\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void cut_actionPerformed(ActionEvent e)\r
+ {\r
+ copy_actionPerformed(null);\r
+ delete_actionPerformed(null);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void delete_actionPerformed(ActionEvent e)\r
+ {\r
+\r
+ if (viewport.getSelectionGroup() == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment,\r
+ HistoryItem.HIDE));\r
+\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+ boolean allSequences = false;\r
+ if (sg.sequences.size() == viewport.alignment.getHeight())\r
+ {\r
+ allSequences = true;\r
+ }\r
+\r
+ for (int i = 0; i < sg.sequences.size(); i++)\r
+ {\r
+ SequenceI seq = sg.getSequenceAt(i);\r
+ int index = viewport.getAlignment().findIndex(seq);\r
+ seq.deleteChars(sg.getStartRes(), sg.getEndRes() + 1);\r
+\r
+ // If the cut affects all sequences, remove highlighted columns\r
+ if (allSequences)\r
+ {\r
+ viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
+ sg.getEndRes() + 1);\r
+ }\r
+\r
+ if (seq.getSequence().length() < 1)\r
+ {\r
+ viewport.getAlignment().deleteSequence(seq);\r
+ }\r
+ else\r
+ {\r
+ viewport.getAlignment().getSequences().setElementAt(seq, index);\r
+ }\r
+ }\r
+\r
+ viewport.setSelectionGroup(null);\r
+ viewport.alignment.deleteGroup(sg);\r
+\r
+ viewport.firePropertyChange("alignment", null,\r
+ viewport.getAlignment().getSequences());\r
+\r
+\r
+\r
+ if (viewport.getAlignment().getHeight() < 1)\r
+ {\r
+ try\r
+ {\r
+ this.setClosed(true);\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void deleteGroups_actionPerformed(ActionEvent e)\r
+ {\r
+ viewport.alignment.deleteAllGroups();\r
+ viewport.setSelectionGroup(null);\r
+ alignPanel.repaint();\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ SequenceGroup sg = new SequenceGroup();\r
+\r
+ for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
+ i++)\r
+ {\r
+ sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
+ }\r
+\r
+ sg.setEndRes(viewport.alignment.getWidth() - 1);\r
+ viewport.setSelectionGroup(sg);\r
+ PaintRefresher.Refresh(null, viewport.alignment);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ viewport.setSelectionGroup(null);\r
+ viewport.getColumnSelection().clear();\r
+ viewport.setSelectionGroup(null);\r
+ alignPanel.annotationPanel.activeRes = null;\r
+ PaintRefresher.Refresh(null, viewport.alignment);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+\r
+ if (sg == null)\r
+ {\r
+ selectAllSequenceMenuItem_actionPerformed(null);\r
+\r
+ return;\r
+ }\r
+\r
+ for (int i = 0; i < viewport.getAlignment().getSequences().size();\r
+ i++)\r
+ {\r
+ sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
+ }\r
+\r
+ PaintRefresher.Refresh(null, viewport.alignment);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ ColumnSelection colSel = viewport.getColumnSelection();\r
+\r
+ if (colSel.size() > 0)\r
+ {\r
+ addHistoryItem(new HistoryItem("Remove Left", viewport.alignment,\r
+ HistoryItem.HIDE));\r
+\r
+ int min = colSel.getMin();\r
+ viewport.getAlignment().trimLeft(min);\r
+ colSel.compensateForEdit(0, min);\r
+\r
+ if (viewport.getSelectionGroup() != null)\r
+ {\r
+ viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
+ }\r
+\r
+ Vector groups = viewport.alignment.getGroups();\r
+\r
+ for (int i = 0; i < groups.size(); i++)\r
+ {\r
+ SequenceGroup sg = (SequenceGroup) groups.get(i);\r
+\r
+ if (!sg.adjustForRemoveLeft(min))\r
+ {\r
+ viewport.alignment.deleteGroup(sg);\r
+ }\r
+ }\r
+\r
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
+ }\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ ColumnSelection colSel = viewport.getColumnSelection();\r
+\r
+ if (colSel.size() > 0)\r
+ {\r
+ addHistoryItem(new HistoryItem("Remove Right", viewport.alignment,\r
+ HistoryItem.HIDE));\r
+\r
+ int max = colSel.getMax();\r
+ viewport.getAlignment().trimRight(max);\r
+\r
+ if (viewport.getSelectionGroup() != null)\r
+ {\r
+ viewport.getSelectionGroup().adjustForRemoveRight(max);\r
+ }\r
+\r
+ Vector groups = viewport.alignment.getGroups();\r
+\r
+ for (int i = 0; i < groups.size(); i++)\r
+ {\r
+ SequenceGroup sg = (SequenceGroup) groups.get(i);\r
+\r
+ if (!sg.adjustForRemoveRight(max))\r
+ {\r
+ viewport.alignment.deleteGroup(sg);\r
+ }\r
+ }\r
+\r
+ viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());\r
+ }\r
+ }\r