+ final TreePanel tp;\r
+\r
+ if ( (viewport.getSelectionGroup() != null) &&\r
+ (viewport.getSelectionGroup().getSize() > 3))\r
+ {\r
+ int s = 0;\r
+ SequenceGroup sg = viewport.getSelectionGroup();\r
+\r
+ /* Decide if the selection is a column region */\r
+ while (s < sg.sequences.size())\r
+ {\r
+ if ( ( (SequenceI) sg.sequences.elementAt(s++)).getLength() <\r
+ sg.getEndRes())\r
+ {\r
+ JOptionPane.showMessageDialog(Desktop.desktop,\r
+ "The selected region to create a tree may\nonly contain residues or gaps.\n" +\r
+ "Try using the Pad function in the edit menu,\n" +\r
+ "or one of the multiple sequence alignment web services.",\r
+ "Sequences in selection are not aligned",\r
+ JOptionPane.WARNING_MESSAGE);\r
+\r
+ return;\r
+ }\r
+ }\r
+\r
+ title = title + " on region";\r
+ tp = new TreePanel(viewport,\r
+ viewport.getSelectionGroup().sequences, type, pwType,\r
+ sg.getStartRes(), sg.getEndRes());\r
+ }\r
+ else\r
+ {\r
+ //are the sequences aligned?\r
+ if (!viewport.alignment.isAligned())\r
+ {\r
+ JOptionPane.showMessageDialog(Desktop.desktop,\r
+ "The sequences must be aligned before creating a tree.\n" +\r
+ "Try using the Pad function in the edit menu,\n" +\r
+ "or one of the multiple sequence alignment web services.",\r
+ "Sequences not aligned",\r
+ JOptionPane.WARNING_MESSAGE);\r
+\r
+ return;\r
+ }\r
+\r
+ tp = new TreePanel(viewport,\r
+ viewport.getAlignment().getSequences(), type, pwType,\r
+ 0,\r
+ viewport.alignment.getWidth());\r
+ }\r
+\r
+ addTreeMenuItem(tp, title);\r
+ viewport.setCurrentTree(tp.getTree());\r
+\r
+ Desktop.addInternalFrame(tp, title + " from " + this.title, 600, 500);\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param title DOCUMENT ME!\r
+ * @param order DOCUMENT ME!\r
+ */\r
+ public void addSortByOrderMenuItem(String title, final AlignmentOrder order)\r
+ {\r
+ final JMenuItem item = new JMenuItem("by " + title);\r
+ sort.add(item);\r
+ item.addActionListener(new java.awt.event.ActionListener()\r
+ {\r
+ public void actionPerformed(ActionEvent e)\r
+ {\r
+ addHistoryItem(new HistoryItem("Sort", viewport.alignment,\r
+ HistoryItem.SORT));\r
+\r
+ // TODO: JBPNote - have to map order entries to curent SequenceI pointers\r
+ AlignmentSorter.sortBy(viewport.getAlignment(), order);\r
+ alignPanel.repaint();\r
+ }\r
+ });\r
+ }\r
+\r
+ /**\r
+ * Maintain the Order by->Displayed Tree menu.\r
+ * Creates a new menu item for a TreePanel with an appropriate\r
+ * <code>jalview.analysis.AlignmentSorter</code> call. Listeners are added\r
+ * to remove the menu item when the treePanel is closed, and adjust\r
+ * the tree leaf to sequence mapping when the alignment is modified.\r
+ * @param treePanel Displayed tree window.\r
+ * @param title SortBy menu item title.\r
+ */\r
+ void addTreeMenuItem(final TreePanel treePanel, String title)\r
+ {\r
+ final JMenuItem item = new JMenuItem(title);\r
+\r
+ treeCount++;\r
+\r
+ if (treeCount == 1)\r
+ {\r
+ sort.add(sortByTreeMenu);\r
+ }\r
+\r
+ sortByTreeMenu.add(item);\r
+ item.addActionListener(new java.awt.event.ActionListener()\r
+ {\r
+ public void actionPerformed(ActionEvent e)\r
+ {\r
+ addHistoryItem(new HistoryItem("Tree Sort",\r
+ viewport.alignment, HistoryItem.SORT));\r
+ AlignmentSorter.sortByTree(viewport.getAlignment(),\r
+ treePanel.getTree());\r
+ alignPanel.repaint();\r
+ }\r
+ });\r
+\r
+ treePanel.addInternalFrameListener(new javax.swing.event.\r
+ InternalFrameAdapter()\r
+ {\r
+ public void internalFrameClosed(\r
+ javax.swing.event.InternalFrameEvent evt)\r
+ {\r
+ treeCount--;\r
+ sortByTreeMenu.remove(item);\r
+\r
+ if (treeCount == 0)\r
+ {\r
+ sort.remove(sortByTreeMenu);\r
+ }\r
+ }\r
+ ;\r
+ });\r
+ }\r
+\r
+ /**\r
+ * Work out whether the whole set of sequences\r
+ * or just the selected set will be submitted for multiple alignment.\r
+ *\r
+ */\r
+ private SequenceI[] gatherSequencesForAlignment()\r
+ {\r
+ // Now, check we have enough sequences\r
+ SequenceI[] msa = null;\r
+\r
+ if ( (viewport.getSelectionGroup() != null) &&\r
+ (viewport.getSelectionGroup().getSize() > 1))\r
+ {\r
+ // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
+ SequenceGroup seqs = viewport.getSelectionGroup();\r
+ int sz;\r
+ msa = new SequenceI[sz = seqs.getSize()];\r
+\r
+ for (int i = 0; i < sz; i++)\r
+ {\r
+ msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Vector seqs = viewport.getAlignment().getSequences();\r
+\r
+ if (seqs.size() > 1)\r
+ {\r
+ msa = new SequenceI[seqs.size()];\r
+\r
+ for (int i = 0; i < seqs.size(); i++)\r
+ {\r
+ msa[i] = (SequenceI) seqs.elementAt(i);\r
+ }\r
+ }\r
+ }\r
+ return msa;\r
+ }\r
+\r
+ /**\r
+ * Decides what is submitted to a secondary structure prediction service,\r
+ * the currently selected sequence, or the currently selected alignment\r
+ * (where the first sequence in the set is the one that the prediction\r
+ * will be for).\r
+ */\r
+ SequenceI[] gatherSeqOrMsaForSecStrPrediction()\r
+ {\r
+ SequenceI seq = null;\r
+ SequenceI[] msa = null;\r
+\r
+ if ( (viewport.getSelectionGroup() != null) &&\r
+ (viewport.getSelectionGroup().getSize() > 0))\r
+ {\r
+ // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
+ SequenceGroup seqs = viewport.getSelectionGroup();\r
+\r
+ if ( (seqs.getSize() == 1) || !viewport.alignment.isAligned())\r
+ {\r
+ seq = (SequenceI) seqs.getSequenceAt(0);\r
+ }\r
+ else\r
+ {\r
+ int sz;\r
+ msa = new SequenceI[sz = seqs.getSize()];\r
+\r
+ for (int i = 0; i < sz; i++)\r
+ {\r
+ msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Vector seqs = viewport.getAlignment().getSequences();\r
+\r
+ if ( (seqs.size() == 1) || !viewport.alignment.isAligned())\r
+ {\r
+ seq = (SequenceI) seqs.elementAt(0);\r
+ }\r
+ else\r
+ {\r
+ msa = new SequenceI[seqs.size()];\r
+\r
+ for (int i = 0; i < seqs.size(); i++)\r
+ {\r
+ msa[i] = (SequenceI) seqs.elementAt(i);\r
+ }\r
+ }\r
+ }\r
+ if (msa != null)\r
+ {\r
+ return msa;\r
+ }\r
+ else\r
+ {\r
+ if (seq != null)\r
+ {\r
+ return new SequenceI[]\r
+ {\r
+ seq};\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param e DOCUMENT ME!\r
+ */\r
+ protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)\r
+ {\r
+ // Pick the tree file\r
+ JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
+ getProperty(\r
+ "LAST_DIRECTORY"));\r
+ chooser.setFileView(new JalviewFileView());\r
+ chooser.setDialogTitle("Select a newick-like tree file");\r
+ chooser.setToolTipText("Load a tree file");\r
+\r
+ int value = chooser.showOpenDialog(null);\r
+\r
+ if (value == JalviewFileChooser.APPROVE_OPTION)\r
+ {\r
+ String choice = chooser.getSelectedFile().getPath();\r
+ jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
+\r
+ try\r
+ {\r
+ jalview.io.NewickFile fin = new jalview.io.NewickFile(choice,\r
+ "File");\r
+ viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ JOptionPane.showMessageDialog(Desktop.desktop,\r
+ "Problem reading tree file",\r
+ ex.getMessage(),\r
+ JOptionPane.WARNING_MESSAGE);\r
+ ex.printStackTrace();\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ public TreePanel ShowNewickTree(NewickFile nf, String title)\r
+ {\r
+ return ShowNewickTree(nf,title,600,500,4,5);\r
+ }\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param nf DOCUMENT ME!\r
+ * @param title DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public TreePanel ShowNewickTree(NewickFile nf, String title, int w,int h,int x, int y)\r
+ {\r
+ TreePanel tp = null;\r
+\r
+ try\r
+ {\r
+ nf.parse();\r
+\r
+ if (nf.getTree() != null)\r
+ {\r
+ tp = new TreePanel(viewport,\r
+ viewport.getAlignment().getSequences(), nf,\r
+ "FromFile",\r
+ title);\r
+\r
+ tp.setSize(w,h);\r
+\r
+ if(x>0 && y>0)\r
+ tp.setLocation(x,y);\r
+\r
+\r
+ Desktop.addInternalFrame(tp, title, w, h);\r
+ addTreeMenuItem(tp, title);\r
+ }\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ ex.printStackTrace();\r
+ }\r
+\r
+ return tp;\r
+ }\r
+\r
+ class PrintThread\r
+ extends Thread\r
+ {\r
+ public void run()\r
+ {\r
+ PrinterJob printJob = PrinterJob.getPrinterJob();\r
+ PageFormat pf = printJob.pageDialog(printJob.defaultPage());\r
+ printJob.setPrintable(alignPanel, pf);\r
+\r
+ if (printJob.printDialog())\r
+ {\r
+ try\r
+ {\r
+ printJob.print();\r
+ }\r
+ catch (Exception PrintException)\r
+ {\r
+ PrintException.printStackTrace();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Generates menu items and listener event actions for web service clients\r
+ *\r
+ */\r
+ public void BuildWebServiceMenu()\r
+ {\r
+ if ( (Discoverer.services != null)\r
+ && (Discoverer.services.size() > 0))\r
+ {\r
+ Vector msaws = (Vector) Discoverer.services.get("MsaWS");\r
+ Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred");\r
+ Vector wsmenu = new Vector();\r
+ if (msaws != null)\r
+ {\r
+ // Add any Multiple Sequence Alignment Services\r
+ final JMenu msawsmenu = new JMenu("Alignment");\r
+ for (int i = 0, j = msaws.size(); i < j; i++)\r
+ {\r
+ final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws.\r
+ get(i);\r
+ final JMenuItem method = new JMenuItem(sh.getName());\r
+ method.addActionListener(new ActionListener()\r
+ {\r
+ public void actionPerformed(ActionEvent e)\r
+ {\r
+ SequenceI[] msa = gatherSequencesForAlignment();\r
+ new jalview.ws.MsaWSClient(sh, title, msa,\r
+ false, true, viewport.getAlignment().getDataset());\r
+\r
+ }\r
+\r
+ });\r
+ msawsmenu.add(method);\r
+ // Deal with services that we know accept partial alignments.\r
+ if (sh.getName().indexOf("lustal") > -1)\r
+ {\r
+ // We know that ClustalWS can accept partial alignments for refinement.\r
+ final JMenuItem methodR = new JMenuItem(sh.getName()+" Realign");\r
+ methodR.addActionListener(new ActionListener()\r
+ {\r
+ public void actionPerformed(ActionEvent e)\r
+ {\r
+ SequenceI[] msa = gatherSequencesForAlignment();\r
+ new jalview.ws.MsaWSClient(sh, title, msa,\r
+ true, true, viewport.getAlignment().getDataset());\r
+\r
+ }\r
+\r
+ });\r
+ msawsmenu.add(methodR);\r
+\r
+ }\r
+ }\r
+ wsmenu.add(msawsmenu);\r
+ }\r
+ if (secstrpr != null)\r
+ {\r
+ // Add any secondary structure prediction services\r
+ final JMenu secstrmenu = new JMenu("Secondary Structure Prediction");\r
+ for (int i = 0, j = secstrpr.size(); i < j; i++)\r
+ {\r
+ final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle)\r
+ secstrpr.get(i);\r
+ final JMenuItem method = new JMenuItem(sh.getName());\r
+ method.addActionListener(new ActionListener()\r
+ {\r
+ public void actionPerformed(ActionEvent e)\r
+ {\r
+ SequenceI[] msa = gatherSeqOrMsaForSecStrPrediction();\r
+ if (msa.length == 1)\r
+ {\r
+ // Single Sequence prediction\r
+ new jalview.ws.JPredClient(sh,title, msa[0]);\r
+ }\r
+ else\r
+ {\r
+ if (msa.length > 1)\r
+ {\r
+ // Single Sequence prediction\r
+ jalview.ws.JPredClient ct = new jalview.ws.JPredClient(sh,\r
+ title, msa);\r
+ }\r
+ }\r
+ }\r
+ });\r
+ secstrmenu.add(method);\r
+ }\r
+ wsmenu.add(secstrmenu);\r
+ }\r
+ this.webService.removeAll();\r
+ for (int i = 0, j = wsmenu.size(); i < j; i++)\r
+ {\r
+ webService.add( (JMenu) wsmenu.get(i));\r
+ }\r
+ }\r
+ else\r
+ {\r
+ this.webService.removeAll();\r
+ this.webService.add(this.webServiceNoServices);\r
+ }\r
+ // TODO: add in rediscovery function\r
+ // TODO: reduce code redundancy.\r
+ // TODO: group services by location as well as function.\r
+ }\r
+\r
+ /* public void vamsasStore_actionPerformed(ActionEvent e)\r
+ {\r
+ JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
+ getProperty("LAST_DIRECTORY"));\r
+\r
+ chooser.setFileView(new JalviewFileView());\r
+ chooser.setDialogTitle("Export to Vamsas file");\r
+ chooser.setToolTipText("Export");\r
+\r
+ int value = chooser.showSaveDialog(this);\r
+\r
+ if (value == JalviewFileChooser.APPROVE_OPTION)\r
+ {\r
+ jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);\r
+ //vs.store(chooser.getSelectedFile().getAbsolutePath() );\r
+ vs.storeJalview( chooser.getSelectedFile().getAbsolutePath(), this);\r
+ }\r
+ }*/\r
+\r
+ public void featureSettings_actionPerformed(ActionEvent e)\r
+ {\r
+ new FeatureSettings(viewport, alignPanel);\r
+ }\r
+\r
+\r
+\r
+public void showTranslation_actionPerformed(ActionEvent e)\r
+{\r
+ int s, sSize = viewport.alignment.getHeight();\r
+ SequenceI [] newSeq = new SequenceI[sSize];\r