-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\r
- */\r
-\r
-package jalview.appletgui;\r
-\r
-import java.util.*;\r
-\r
-import java.awt.event.*;\r
-import java.awt.*;\r
-\r
-import jalview.analysis.*;\r
-import jalview.datamodel.*;\r
-import jalview.io.*;\r
-\r
-public class TreePanel extends Frame implements ActionListener, ItemListener\r
-{\r
- SequenceI[] seq;\r
- String type;\r
- String pwtype;\r
- int start;\r
- int end;\r
- TreeCanvas treeCanvas;\r
- NJTree tree;\r
- AlignViewport av;\r
-\r
- public NJTree getTree()\r
- {\r
- return tree;\r
- }\r
-\r
- /**\r
- * Creates a new TreePanel object.\r
- *\r
- * @param av DOCUMENT ME!\r
- * @param seqVector DOCUMENT ME!\r
- * @param type DOCUMENT ME!\r
- * @param pwtype DOCUMENT ME!\r
- * @param s DOCUMENT ME!\r
- * @param e DOCUMENT ME!\r
- */\r
- public TreePanel(AlignViewport av, String type, String pwtype)\r
- {\r
- try\r
- {\r
- jbInit();\r
- this.setMenuBar(jMenuBar1);\r
- }\r
- catch (Exception ex)\r
- {\r
- ex.printStackTrace();\r
- }\r
-\r
- initTreePanel(av, type, pwtype, null);\r
- }\r
-\r
- /**\r
- * Creates a new TreePanel object.\r
- *\r
- * @param av DOCUMENT ME!\r
- * @param seqVector DOCUMENT ME!\r
- * @param newtree DOCUMENT ME!\r
- * @param type DOCUMENT ME!\r
- * @param pwtype DOCUMENT ME!\r
- */\r
- public TreePanel(AlignViewport av,\r
- String type,\r
- String pwtype,\r
- NewickFile newtree)\r
- {\r
- try\r
- {\r
- jbInit();\r
- this.setMenuBar(jMenuBar1);\r
- }\r
- catch (Exception e)\r
- {\r
- e.printStackTrace();\r
- }\r
-\r
- initTreePanel(av, type, pwtype, newtree);\r
- }\r
-\r
-\r
- void initTreePanel(AlignViewport av,\r
- String type,\r
- String pwtype,\r
- NewickFile newTree)\r
- {\r
-\r
- this.av = av;\r
- this.type = type;\r
- this.pwtype = pwtype;\r
-\r
- treeCanvas = new TreeCanvas(av, scrollPane);\r
- scrollPane.add(treeCanvas);\r
-\r
-\r
- TreeLoader tl = new TreeLoader(newTree);\r
- tl.start();\r
-\r
- }\r
-\r
- class TreeLoader extends Thread\r
- {\r
- NewickFile newtree;\r
-\r
- public TreeLoader(NewickFile newtree)\r
- {\r
- this.newtree = newtree;\r
- }\r
-\r
- public void run()\r
- {\r
- if (newtree != null)\r
- tree = new NJTree(av.alignment.getSequencesArray(),\r
- newtree);\r
- else\r
- {\r
- int start, end;\r
- SequenceI [] seqs;\r
- String[] seqStrings = null;\r
-// if (av.hasHiddenColumns)\r
- // {\r
- // seqStrings = av.getAlignmentView(av.getSelectionGroup()!=null); // av.getSelectionAsString();\r
- // }\r
-\r
- if(av.getSelectionGroup()==null)\r
- {\r
- start = 0;\r
- end = av.alignment.getWidth();\r
- seqs = av.alignment.getSequencesArray();\r
- }\r
- else\r
- {\r
- start = av.getSelectionGroup().getStartRes();\r
- end = av.getSelectionGroup().getEndRes()+1;\r
- seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);\r
- }\r
-\r
- tree = new NJTree(seqs, null, type, pwtype, start, end);\r
- }\r
-\r
- tree.reCount(tree.getTopNode());\r
- tree.findHeight(tree.getTopNode());\r
- treeCanvas.setTree(tree);\r
- if(newtree!=null)\r
- {\r
- distanceMenu.setState(newtree.HasDistances());\r
- bootstrapMenu.setState(newtree.HasBootstrap());\r
- treeCanvas.setShowBootstrap(newtree.HasBootstrap());\r
- treeCanvas.setShowDistances(newtree.HasDistances());\r
- }\r
-\r
-\r
- treeCanvas.repaint();\r
-\r
- av.setCurrentTree(tree);\r
-\r
- }\r
- }\r
-\r
- public void actionPerformed(ActionEvent evt)\r
- {\r
- if(evt.getSource()==newickOutput)\r
- newickOutput_actionPerformed();\r
- else if(evt.getSource()==fontSize)\r
- fontSize_actionPerformed();\r
- }\r
-\r
- public void itemStateChanged(ItemEvent evt)\r
- {\r
- if(evt.getSource()==fitToWindow)\r
- treeCanvas.fitToWindow = fitToWindow.getState();\r
-\r
- else if(evt.getSource()==distanceMenu)\r
- treeCanvas.setShowDistances(distanceMenu.getState());\r
-\r
- else if(evt.getSource()==bootstrapMenu)\r
- treeCanvas.setShowBootstrap(bootstrapMenu.getState());\r
-\r
- else if(evt.getSource()==placeholdersMenu)\r
- treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());\r
-\r
- treeCanvas.repaint();\r
- }\r
-\r
-\r
- public void newickOutput_actionPerformed()\r
- {\r
- jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
- String output = fout.print(false, true);\r
- CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);\r
- cap.setText(output);\r
- java.awt.Frame frame = new java.awt.Frame();\r
- frame.add(cap);\r
- jalview.bin.JalviewLite.addFrame(frame, type + " " + pwtype, 500, 100);\r
- }\r
-\r
- public java.awt.Font getTreeFont()\r
- {\r
- return treeCanvas.font;\r
- }\r
-\r
- public void setTreeFont(java.awt.Font font)\r
- {\r
- treeCanvas.font = font;\r
- treeCanvas.repaint();\r
- }\r
-\r
- protected void fontSize_actionPerformed()\r
- {\r
- if( treeCanvas==null )\r
- return;\r
-\r
- new FontChooser(this);\r
- }\r
-\r
-\r
-\r
-\r
- BorderLayout borderLayout1 = new BorderLayout();\r
- protected ScrollPane scrollPane = new ScrollPane();\r
- MenuBar jMenuBar1 = new MenuBar();\r
- Menu jMenu2 = new Menu();\r
- protected MenuItem fontSize = new MenuItem();\r
- protected CheckboxMenuItem bootstrapMenu = new CheckboxMenuItem();\r
- protected CheckboxMenuItem distanceMenu = new CheckboxMenuItem();\r
- protected CheckboxMenuItem placeholdersMenu = new CheckboxMenuItem();\r
- protected CheckboxMenuItem fitToWindow = new CheckboxMenuItem();\r
- Menu fileMenu = new Menu();\r
- MenuItem newickOutput = new MenuItem();\r
-\r
- private void jbInit() throws Exception {\r
- setLayout(borderLayout1);\r
- this.setBackground(Color.white);\r
- this.setFont(new java.awt.Font("Verdana", 0, 12));\r
- jMenu2.setLabel("View");\r
- fontSize.setLabel("Font...");\r
- fontSize.addActionListener(this);\r
- bootstrapMenu.setLabel("Show Bootstrap Values");\r
- bootstrapMenu.addItemListener(this);\r
- distanceMenu.setLabel("Show Distances");\r
- distanceMenu.addItemListener(this);\r
- placeholdersMenu.setLabel("Mark Unassociated Leaves");\r
- placeholdersMenu.addItemListener(this);\r
- fitToWindow.setState(true);\r
- fitToWindow.setLabel("Fit To Window");\r
- fitToWindow.addItemListener(this);\r
- fileMenu.setLabel("File");\r
- newickOutput.setLabel("Newick Format");\r
- newickOutput.addActionListener(this);\r
-\r
- add(scrollPane, BorderLayout.CENTER);\r
- jMenuBar1.add(fileMenu);\r
- jMenuBar1.add(jMenu2);\r
- jMenu2.add(fitToWindow);\r
- jMenu2.add(fontSize);\r
- jMenu2.add(distanceMenu);\r
- jMenu2.add(bootstrapMenu);\r
- jMenu2.add(placeholdersMenu);\r
- fileMenu.add(newickOutput);\r
- }\r
-\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.appletgui;
+
+import jalview.analysis.AverageDistanceTree;
+import jalview.analysis.NJTree;
+import jalview.analysis.TreeBuilder;
+import jalview.analysis.TreeModel;
+import jalview.analysis.scoremodels.ScoreModels;
+import jalview.analysis.scoremodels.SimilarityParams;
+import jalview.api.analysis.ScoreModelI;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.SequenceI;
+import jalview.io.NewickFile;
+import jalview.util.MessageManager;
+
+import java.awt.BorderLayout;
+import java.awt.CheckboxMenuItem;
+import java.awt.Color;
+import java.awt.Menu;
+import java.awt.MenuBar;
+import java.awt.MenuItem;
+import java.awt.ScrollPane;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+public class TreePanel extends EmbmenuFrame
+ implements ActionListener, ItemListener
+{
+ SequenceI[] seq;
+
+ String type;
+
+ String pwtype;
+
+ int start;
+
+ int end;
+
+ TreeCanvas treeCanvas;
+
+ TreeModel tree;
+
+ AlignmentPanel ap;
+
+ AlignViewport av;
+
+ public TreeModel getTree()
+ {
+ return tree;
+ }
+
+ @Override
+ public void finalize() throws Throwable
+ {
+ ap = null;
+ av = null;
+ super.finalize();
+ }
+
+ /**
+ * Creates a new TreePanel object.
+ */
+ public TreePanel(AlignmentPanel alignPanel, String type, String pwtype)
+ {
+ try
+ {
+ jbInit();
+ this.setMenuBar(jMenuBar1);
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+
+ initTreePanel(alignPanel, type, pwtype, null);
+ }
+
+ /**
+ * Creates a new TreePanel object.
+ *
+ */
+ public TreePanel(AlignmentPanel ap, String type, String pwtype,
+ NewickFile newtree)
+ {
+ try
+ {
+ jbInit();
+ this.setMenuBar(jMenuBar1);
+ } catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ initTreePanel(ap, type, pwtype, newtree);
+ }
+
+ void initTreePanel(AlignmentPanel ap, String type, String pwtype,
+ NewickFile newTree)
+ {
+
+ this.ap = ap;
+ this.av = ap.av;
+ this.type = type;
+ this.pwtype = pwtype;
+
+ treeCanvas = new TreeCanvas(ap, scrollPane);
+ TreeLoader tl = new TreeLoader(newTree);
+ tl.start();
+ embedMenuIfNeeded(treeCanvas);
+ scrollPane.add(treeCanvas, BorderLayout.CENTER);
+ }
+
+ void showOriginalData()
+ {
+ // decide if av alignment is sufficiently different to original data to
+ // warrant a new window to be created
+ // create new alignmnt window with hidden regions (unhiding hidden regions
+ // yields unaligned seqs)
+ // or create a selection box around columns in alignment view
+ // test Alignment(SeqCigar[])
+ if (tree.getOriginalData() != null)
+ {
+ char gc = '-';
+ try
+ {
+ // we try to get the associated view's gap character
+ // but this may fail if the view was closed...
+ gc = av.getGapCharacter();
+ } catch (Exception ex)
+ {
+ }
+
+ Object[] alAndColsel = tree.getOriginalData()
+ .getAlignmentAndHiddenColumns(gc);
+
+ if (alAndColsel != null && alAndColsel[0] != null)
+ {
+ Alignment al = new Alignment((SequenceI[]) alAndColsel[0]);
+ AlignFrame af = new AlignFrame(al, av.applet,
+ "Original Data for Tree", false);
+
+ af.viewport.getAlignment()
+ .setHiddenColumns((HiddenColumns) alAndColsel[1]);
+ }
+ }
+ else
+ {
+ System.out.println("Original Tree Data not available");
+ }
+ }
+
+ class TreeLoader extends Thread
+ {
+ NewickFile newtree;
+
+ jalview.datamodel.AlignmentView odata = null;
+
+ public TreeLoader(NewickFile newtree)
+ {
+ this.newtree = newtree;
+ }
+
+ @Override
+ public void run()
+ {
+ if (newtree != null)
+ {
+ tree = new TreeModel(av.getAlignment().getSequencesArray(), odata,
+ newtree);
+ }
+ else
+ {
+ ScoreModelI sm1 = ScoreModels.getInstance().getScoreModel(pwtype,
+ treeCanvas.ap);
+ ScoreModelI sm = sm1;
+ TreeBuilder njtree = type.equals(TreeBuilder.NEIGHBOUR_JOINING)
+ ? new NJTree(av, sm, SimilarityParams.Jalview)
+ : new AverageDistanceTree(av, sm, SimilarityParams.Jalview);
+ tree = new TreeModel(njtree);
+ }
+
+ tree.reCount(tree.getTopNode());
+ tree.findHeight(tree.getTopNode());
+ treeCanvas.setTree(tree);
+ if (newtree != null)
+ {
+ // Set default view, paying lip service to any overriding tree view
+ // parameter settings
+ boolean showDist = newtree.HasDistances()
+ && av.applet.getDefaultParameter("showTreeDistances",
+ newtree.HasDistances());
+ boolean showBoots = newtree.HasBootstrap()
+ && av.applet.getDefaultParameter("showTreeBootstraps",
+ newtree.HasBootstrap());
+ distanceMenu.setState(showDist);
+ bootstrapMenu.setState(showBoots);
+ treeCanvas.setShowBootstrap(showBoots);
+ treeCanvas.setShowDistances(showDist);
+ treeCanvas.setMarkPlaceholders(av.applet
+ .getDefaultParameter("showUnlinkedTreeNodes", false));
+ }
+
+ treeCanvas.repaint();
+
+ av.setCurrentTree(tree);
+
+ }
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent evt)
+ {
+ if (evt.getSource() == newickOutput)
+ {
+ newickOutput_actionPerformed();
+ }
+ else if (evt.getSource() == fontSize)
+ {
+ fontSize_actionPerformed();
+ }
+ else if (evt.getSource() == inputData)
+ {
+ showOriginalData();
+ }
+ }
+
+ @Override
+ public void itemStateChanged(ItemEvent evt)
+ {
+ if (evt.getSource() == fitToWindow)
+ {
+ treeCanvas.fitToWindow = fitToWindow.getState();
+ }
+
+ else if (evt.getSource() == distanceMenu)
+ {
+ treeCanvas.setShowDistances(distanceMenu.getState());
+ }
+
+ else if (evt.getSource() == bootstrapMenu)
+ {
+ treeCanvas.setShowBootstrap(bootstrapMenu.getState());
+ }
+
+ else if (evt.getSource() == placeholdersMenu)
+ {
+ treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());
+ }
+
+ treeCanvas.repaint();
+ }
+
+ public void newickOutput_actionPerformed()
+ {
+ jalview.io.NewickFile fout = new jalview.io.NewickFile(
+ tree.getTopNode());
+ String output = fout.print(false, true);
+ CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);
+ cap.setText(output);
+ java.awt.Frame frame = new java.awt.Frame();
+ frame.add(cap);
+ jalview.bin.JalviewLite.addFrame(frame, type + " " + pwtype, 500, 100);
+ }
+
+ public java.awt.Font getTreeFont()
+ {
+ return treeCanvas.font;
+ }
+
+ public void setTreeFont(java.awt.Font font)
+ {
+ treeCanvas.font = font;
+ treeCanvas.repaint();
+ }
+
+ protected void fontSize_actionPerformed()
+ {
+ if (treeCanvas == null)
+ {
+ return;
+ }
+
+ new FontChooser(this);
+ }
+
+ BorderLayout borderLayout1 = new BorderLayout();
+
+ protected ScrollPane scrollPane = new ScrollPane();
+
+ MenuBar jMenuBar1 = new MenuBar();
+
+ Menu jMenu2 = new Menu();
+
+ protected MenuItem fontSize = new MenuItem();
+
+ protected CheckboxMenuItem bootstrapMenu = new CheckboxMenuItem();
+
+ protected CheckboxMenuItem distanceMenu = new CheckboxMenuItem();
+
+ protected CheckboxMenuItem placeholdersMenu = new CheckboxMenuItem();
+
+ protected CheckboxMenuItem fitToWindow = new CheckboxMenuItem();
+
+ Menu fileMenu = new Menu();
+
+ MenuItem newickOutput = new MenuItem();
+
+ MenuItem inputData = new MenuItem();
+
+ private void jbInit() throws Exception
+ {
+ setLayout(borderLayout1);
+ this.setBackground(Color.white);
+ this.setFont(new java.awt.Font("Verdana", 0, 12));
+ jMenu2.setLabel(MessageManager.getString("action.view"));
+ fontSize.setLabel(MessageManager.getString("action.font"));
+ fontSize.addActionListener(this);
+ bootstrapMenu.setLabel(
+ MessageManager.getString("label.show_bootstrap_values"));
+ bootstrapMenu.addItemListener(this);
+ distanceMenu.setLabel(MessageManager.getString("label.show_distances"));
+ distanceMenu.addItemListener(this);
+ placeholdersMenu.setLabel(
+ MessageManager.getString("label.mark_unassociated_leaves"));
+ placeholdersMenu.addItemListener(this);
+ fitToWindow.setState(true);
+ fitToWindow.setLabel(MessageManager.getString("label.fit_to_window"));
+ fitToWindow.addItemListener(this);
+ fileMenu.setLabel(MessageManager.getString("action.file"));
+ newickOutput.setLabel(MessageManager.getString("label.newick_format"));
+ newickOutput.addActionListener(this);
+ inputData.setLabel(MessageManager.getString("label.input_data"));
+
+ add(scrollPane, BorderLayout.CENTER);
+ jMenuBar1.add(fileMenu);
+ jMenuBar1.add(jMenu2);
+ jMenu2.add(fitToWindow);
+ jMenu2.add(fontSize);
+ jMenu2.add(distanceMenu);
+ jMenu2.add(bootstrapMenu);
+ jMenu2.add(placeholdersMenu);
+ fileMenu.add(newickOutput);
+ fileMenu.add(inputData);
+ inputData.addActionListener(this);
+ }
+
+}