enabled platform dependent embedding of menuBar with EmbmenuFrame
authorjprocter <Jim Procter>
Sat, 27 Oct 2007 13:27:58 +0000 (13:27 +0000)
committerjprocter <Jim Procter>
Sat, 27 Oct 2007 13:27:58 +0000 (13:27 +0000)
src/MCview/AppletPDBViewer.java
src/jalview/appletgui/AppletJmol.java
src/jalview/appletgui/PCAPanel.java
src/jalview/appletgui/TreePanel.java

index 2471f32..fc8478d 100755 (executable)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2007 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
-package MCview;\r
-\r
-import java.awt.*;\r
-import java.awt.event.*;\r
-\r
-import jalview.appletgui.*;\r
-import jalview.datamodel.*;\r
-import jalview.schemes.*;\r
-\r
-\r
-public class AppletPDBViewer\r
-    extends Frame implements ActionListener, ItemListener\r
-{\r
-  AppletPDBCanvas pdbcanvas;\r
-\r
-  public AppletPDBViewer(PDBEntry pdbentry,\r
-                         SequenceI[] seq,\r
-                         String [] chains,\r
-                         AlignmentPanel ap,\r
-                         String protocol)\r
-  {\r
-    try\r
-    {\r
-      jbInit();\r
-    }\r
-    catch (Exception ex)\r
-    {\r
-      ex.printStackTrace();\r
-    }\r
-\r
-    pdbcanvas = new AppletPDBCanvas(pdbentry, seq, chains, ap, protocol);\r
-\r
-\r
-    add(pdbcanvas, BorderLayout.CENTER);\r
-\r
-    StringBuffer title = new StringBuffer(seq[0].getName()\r
-                                          + ":"\r
-                                          + pdbcanvas.pdbentry.getFile());\r
-\r
-    jalview.bin.JalviewLite.addFrame(this, title.toString(), 400, 400);\r
-\r
-  }\r
-\r
-\r
-\r
-  public void actionPerformed(ActionEvent evt)\r
-  {\r
-    if (evt.getSource() == mapping)\r
-    {\r
-      jalview.appletgui.CutAndPasteTransfer cap\r
-          = new jalview.appletgui.CutAndPasteTransfer(false, null);\r
-      Frame frame = new Frame();\r
-      frame.add(cap);\r
-      jalview.bin.JalviewLite.addFrame(frame, "PDB - Sequence Mapping", 500,\r
-                                       600);\r
-      cap.setText(pdbcanvas.mappingDetails.toString());\r
-\r
-    }\r
-    else if (evt.getSource() == charge)\r
-    {\r
-      pdbcanvas.bysequence = false;\r
-      pdbcanvas.pdb.setChargeColours();\r
-    }\r
-\r
-    else if (evt.getSource() == chain)\r
-    {\r
-      pdbcanvas.bysequence = false;\r
-      pdbcanvas.pdb.setChainColours();\r
-    }\r
-    else if (evt.getSource() == seqButton)\r
-    {\r
-      pdbcanvas.bysequence = true;\r
-      pdbcanvas.colourBySequence();\r
-\r
-    }\r
-    else if (evt.getSource() == zappo)\r
-    {\r
-      pdbcanvas.setColours(new ZappoColourScheme());\r
-    }\r
-    else if (evt.getSource() == taylor)\r
-    {\r
-      pdbcanvas.setColours(new TaylorColourScheme());\r
-    }\r
-    else if (evt.getSource() == hydro)\r
-    {\r
-      pdbcanvas.setColours(new HydrophobicColourScheme());\r
-    }\r
-    else if (evt.getSource() == helix)\r
-    {\r
-      pdbcanvas.setColours(new HelixColourScheme());\r
-    }\r
-    else if (evt.getSource() == strand)\r
-    {\r
-      pdbcanvas.setColours(new StrandColourScheme());\r
-    }\r
-    else if (evt.getSource() == turn)\r
-    {\r
-      pdbcanvas.setColours(new TurnColourScheme());\r
-    }\r
-    else if (evt.getSource() == buried)\r
-    {\r
-      pdbcanvas.setColours(new BuriedColourScheme());\r
-    }\r
-    else if (evt.getSource() == user)\r
-    {\r
-      pdbcanvas.bysequence = false;\r
-      new jalview.appletgui.UserDefinedColours(pdbcanvas);\r
-    }\r
-\r
-    pdbcanvas.redrawneeded = true;\r
-    pdbcanvas.repaint();\r
-\r
-  }\r
-\r
-  public void itemStateChanged(ItemEvent evt)\r
-  {\r
-    if (evt.getSource() == allchains)\r
-    {\r
-      pdbcanvas.setAllchainsVisible(allchains.getState());\r
-    }\r
-    else if (evt.getSource() == wire)\r
-    {\r
-          pdbcanvas.wire = !pdbcanvas.wire;\r
-    }\r
-    else if (evt.getSource() == depth)\r
-    {\r
-      pdbcanvas.depthcue = !pdbcanvas.depthcue;\r
-    }\r
-    else if (evt.getSource() == zbuffer)\r
-    {\r
-      pdbcanvas.zbuffer = !pdbcanvas.zbuffer;\r
-    }\r
-    pdbcanvas.redrawneeded = true;\r
-    pdbcanvas.repaint();\r
-  }\r
-\r
-  private void jbInit()\r
-      throws Exception\r
-  {\r
-    setMenuBar(jMenuBar1);\r
-    fileMenu.setLabel("File");\r
-    coloursMenu.setLabel("Colours");\r
-    mapping.setLabel("View Mapping");\r
-    mapping.addActionListener(this);\r
-    wire.setLabel("Wireframe");\r
-    wire.addItemListener(this);\r
-    depth.setState(true);\r
-    depth.setLabel("Depthcue");\r
-    depth.addItemListener(this);\r
-    zbuffer.setState(true);\r
-    zbuffer.setLabel("Z Buffering");\r
-    zbuffer.addItemListener(this);\r
-    charge.setLabel("Charge & Cysteine");\r
-    charge.addActionListener(this);\r
-    hydro.setLabel("Hydrophobicity");\r
-    hydro.addActionListener(this);\r
-    chain.setLabel("By Chain");\r
-    chain.addActionListener(this);\r
-    seqButton.setLabel("By Sequence");\r
-    seqButton.addActionListener(this);\r
-    allchains.setLabel("All Chains Visible");\r
-    allchains.addItemListener(this);\r
-    viewMenu.setLabel("View");\r
-    zappo.setLabel("Zappo");\r
-    zappo.addActionListener(this);\r
-    taylor.setLabel("Taylor");\r
-    taylor.addActionListener(this);\r
-    helix.setLabel("Helix Propensity");\r
-    helix.addActionListener(this);\r
-    strand.setLabel("Strand Propensity");\r
-    strand.addActionListener(this);\r
-    turn.setLabel("Turn Propensity");\r
-    turn.addActionListener(this);\r
-    buried.setLabel("Buried Index");\r
-    buried.addActionListener(this);\r
-    user.setLabel("User Defined...");\r
-    user.addActionListener(this);\r
-    jMenuBar1.add(fileMenu);\r
-    jMenuBar1.add(coloursMenu);\r
-    jMenuBar1.add(viewMenu);\r
-    fileMenu.add(mapping); ;\r
-\r
-    coloursMenu.add(seqButton);\r
-    coloursMenu.add(chain);\r
-    coloursMenu.add(charge);\r
-    coloursMenu.add(zappo);\r
-    coloursMenu.add(taylor);\r
-    coloursMenu.add(hydro);\r
-    coloursMenu.add(helix);\r
-    coloursMenu.add(strand);\r
-    coloursMenu.add(turn);\r
-    coloursMenu.add(buried);\r
-    coloursMenu.add(user);\r
-    viewMenu.add(wire);\r
-    viewMenu.add(depth);\r
-    viewMenu.add(zbuffer);\r
-    viewMenu.add(allchains);\r
-    allchains.setState(true);\r
-  }\r
-\r
-  MenuBar jMenuBar1 = new MenuBar();\r
-  Menu fileMenu = new Menu();\r
-  Menu coloursMenu = new Menu();\r
-  MenuItem mapping = new MenuItem();\r
-  CheckboxGroup bg = new CheckboxGroup();\r
-  CheckboxMenuItem wire = new CheckboxMenuItem();\r
-  CheckboxMenuItem depth = new CheckboxMenuItem();\r
-  CheckboxMenuItem zbuffer = new CheckboxMenuItem();\r
-\r
-  MenuItem charge = new MenuItem();\r
-  MenuItem hydro = new MenuItem();\r
-  MenuItem chain = new MenuItem();\r
-  MenuItem seqButton = new MenuItem();\r
-\r
-  CheckboxMenuItem allchains = new CheckboxMenuItem();\r
-  Menu viewMenu = new Menu();\r
-  MenuItem turn = new MenuItem();\r
-  MenuItem strand = new MenuItem();\r
-  MenuItem helix = new MenuItem();\r
-  MenuItem taylor = new MenuItem();\r
-  MenuItem zappo = new MenuItem();\r
-  MenuItem buried = new MenuItem();\r
-  MenuItem user = new MenuItem();\r
-\r
-\r
-//End StructureListener\r
-////////////////////////////\r
-\r
-\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
+ * This program 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 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+package MCview;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import jalview.appletgui.*;
+import jalview.datamodel.*;
+import jalview.schemes.*;
+
+
+public class AppletPDBViewer
+    extends EmbmenuFrame implements ActionListener, ItemListener
+{
+  AppletPDBCanvas pdbcanvas;
+
+  public AppletPDBViewer(PDBEntry pdbentry,
+                         SequenceI[] seq,
+                         String [] chains,
+                         AlignmentPanel ap,
+                         String protocol)
+  {
+    try
+    {
+      jbInit();
+    }
+    catch (Exception ex)
+    {
+      ex.printStackTrace();
+    }
+
+    pdbcanvas = new AppletPDBCanvas(pdbentry, seq, chains, ap, protocol);
+
+    embedMenuIfNeeded(pdbcanvas);
+    add(pdbcanvas, BorderLayout.CENTER);
+
+    StringBuffer title = new StringBuffer(seq[0].getName()
+                                          + ":"
+                                          + pdbcanvas.pdbentry.getFile());
+
+    jalview.bin.JalviewLite.addFrame(this, title.toString(), 400, 400);
+
+  }
+
+
+
+  public void actionPerformed(ActionEvent evt)
+  {
+    if (evt.getSource() == mapping)
+    {
+      jalview.appletgui.CutAndPasteTransfer cap
+          = new jalview.appletgui.CutAndPasteTransfer(false, null);
+      Frame frame = new Frame();
+      frame.add(cap);
+      jalview.bin.JalviewLite.addFrame(frame, "PDB - Sequence Mapping", 500,
+                                       600);
+      cap.setText(pdbcanvas.mappingDetails.toString());
+
+    }
+    else if (evt.getSource() == charge)
+    {
+      pdbcanvas.bysequence = false;
+      pdbcanvas.pdb.setChargeColours();
+    }
+
+    else if (evt.getSource() == chain)
+    {
+      pdbcanvas.bysequence = false;
+      pdbcanvas.pdb.setChainColours();
+    }
+    else if (evt.getSource() == seqButton)
+    {
+      pdbcanvas.bysequence = true;
+      pdbcanvas.colourBySequence();
+
+    }
+    else if (evt.getSource() == zappo)
+    {
+      pdbcanvas.setColours(new ZappoColourScheme());
+    }
+    else if (evt.getSource() == taylor)
+    {
+      pdbcanvas.setColours(new TaylorColourScheme());
+    }
+    else if (evt.getSource() == hydro)
+    {
+      pdbcanvas.setColours(new HydrophobicColourScheme());
+    }
+    else if (evt.getSource() == helix)
+    {
+      pdbcanvas.setColours(new HelixColourScheme());
+    }
+    else if (evt.getSource() == strand)
+    {
+      pdbcanvas.setColours(new StrandColourScheme());
+    }
+    else if (evt.getSource() == turn)
+    {
+      pdbcanvas.setColours(new TurnColourScheme());
+    }
+    else if (evt.getSource() == buried)
+    {
+      pdbcanvas.setColours(new BuriedColourScheme());
+    }
+    else if (evt.getSource() == user)
+    {
+      pdbcanvas.bysequence = false;
+      new jalview.appletgui.UserDefinedColours(pdbcanvas);
+    }
+
+    pdbcanvas.redrawneeded = true;
+    pdbcanvas.repaint();
+
+  }
+
+  public void itemStateChanged(ItemEvent evt)
+  {
+    if (evt.getSource() == allchains)
+    {
+      pdbcanvas.setAllchainsVisible(allchains.getState());
+    }
+    else if (evt.getSource() == wire)
+    {
+          pdbcanvas.wire = !pdbcanvas.wire;
+    }
+    else if (evt.getSource() == depth)
+    {
+      pdbcanvas.depthcue = !pdbcanvas.depthcue;
+    }
+    else if (evt.getSource() == zbuffer)
+    {
+      pdbcanvas.zbuffer = !pdbcanvas.zbuffer;
+    }
+    pdbcanvas.redrawneeded = true;
+    pdbcanvas.repaint();
+  }
+
+  private void jbInit()
+      throws Exception
+  {
+    setMenuBar(jMenuBar1);
+    fileMenu.setLabel("File");
+    coloursMenu.setLabel("Colours");
+    mapping.setLabel("View Mapping");
+    mapping.addActionListener(this);
+    wire.setLabel("Wireframe");
+    wire.addItemListener(this);
+    depth.setState(true);
+    depth.setLabel("Depthcue");
+    depth.addItemListener(this);
+    zbuffer.setState(true);
+    zbuffer.setLabel("Z Buffering");
+    zbuffer.addItemListener(this);
+    charge.setLabel("Charge & Cysteine");
+    charge.addActionListener(this);
+    hydro.setLabel("Hydrophobicity");
+    hydro.addActionListener(this);
+    chain.setLabel("By Chain");
+    chain.addActionListener(this);
+    seqButton.setLabel("By Sequence");
+    seqButton.addActionListener(this);
+    allchains.setLabel("All Chains Visible");
+    allchains.addItemListener(this);
+    viewMenu.setLabel("View");
+    zappo.setLabel("Zappo");
+    zappo.addActionListener(this);
+    taylor.setLabel("Taylor");
+    taylor.addActionListener(this);
+    helix.setLabel("Helix Propensity");
+    helix.addActionListener(this);
+    strand.setLabel("Strand Propensity");
+    strand.addActionListener(this);
+    turn.setLabel("Turn Propensity");
+    turn.addActionListener(this);
+    buried.setLabel("Buried Index");
+    buried.addActionListener(this);
+    user.setLabel("User Defined...");
+    user.addActionListener(this);
+    jMenuBar1.add(fileMenu);
+    jMenuBar1.add(coloursMenu);
+    jMenuBar1.add(viewMenu);
+    fileMenu.add(mapping); ;
+
+    coloursMenu.add(seqButton);
+    coloursMenu.add(chain);
+    coloursMenu.add(charge);
+    coloursMenu.add(zappo);
+    coloursMenu.add(taylor);
+    coloursMenu.add(hydro);
+    coloursMenu.add(helix);
+    coloursMenu.add(strand);
+    coloursMenu.add(turn);
+    coloursMenu.add(buried);
+    coloursMenu.add(user);
+    viewMenu.add(wire);
+    viewMenu.add(depth);
+    viewMenu.add(zbuffer);
+    viewMenu.add(allchains);
+    allchains.setState(true);
+  }
+
+  MenuBar jMenuBar1 = new MenuBar();
+  Menu fileMenu = new Menu();
+  Menu coloursMenu = new Menu();
+  MenuItem mapping = new MenuItem();
+  CheckboxGroup bg = new CheckboxGroup();
+  CheckboxMenuItem wire = new CheckboxMenuItem();
+  CheckboxMenuItem depth = new CheckboxMenuItem();
+  CheckboxMenuItem zbuffer = new CheckboxMenuItem();
+
+  MenuItem charge = new MenuItem();
+  MenuItem hydro = new MenuItem();
+  MenuItem chain = new MenuItem();
+  MenuItem seqButton = new MenuItem();
+
+  CheckboxMenuItem allchains = new CheckboxMenuItem();
+  Menu viewMenu = new Menu();
+  MenuItem turn = new MenuItem();
+  MenuItem strand = new MenuItem();
+  MenuItem helix = new MenuItem();
+  MenuItem taylor = new MenuItem();
+  MenuItem zappo = new MenuItem();
+  MenuItem buried = new MenuItem();
+  MenuItem user = new MenuItem();
+
+
+//End StructureListener
+////////////////////////////
+
+
+}
index f64014b..26fc708 100644 (file)
@@ -34,7 +34,7 @@ import org.jmol.popup.*;
 import jalview.schemes.*;
 
 
-public class AppletJmol extends Frame
+public class AppletJmol extends EmbmenuFrame
     implements  StructureListener, JmolStatusListener,
     KeyListener, ActionListener, ItemListener
 
@@ -99,29 +99,6 @@ public class AppletJmol extends Frame
        //PROMPT USER HERE TO ADD TO NEW OR EXISTING VIEW?
        //FOR NOW, LETS JUST OPEN A NEW WINDOW
     }
-
-    renderPanel = new RenderPanel();
-
-    this.add(renderPanel, BorderLayout.CENTER);
-    viewer = JmolViewer.allocateViewer(renderPanel, new SmarterJmolAdapter());
-
-    viewer.setAppletContext("jalview",
-                       ap.av.applet.getDocumentBase(),
-                            ap.av.applet.getCodeBase(),
-                            null);
-
-    viewer.setJmolStatusListener(this);
-
-    jmolpopup = JmolPopup.newJmolPopup(viewer);
-
-    this.addWindowListener(new WindowAdapter()
-        {
-          public void windowClosing(WindowEvent evt)
-          {
-            closeViewer();
-          }
-        });
-
     MenuBar menuBar = new MenuBar();
     menuBar.add(fileMenu);
     fileMenu.add(mappingMenuItem);
@@ -159,7 +136,30 @@ public class AppletJmol extends Frame
 
     helpMenu.add(jmolHelp);
 
-    this.setMenuBar(menuBar);
+    setMenuBar(menuBar);
+
+    renderPanel = new RenderPanel();
+    embedMenuIfNeeded(renderPanel);
+    this.add(renderPanel, BorderLayout.CENTER);
+    viewer = JmolViewer.allocateViewer(renderPanel, new SmarterJmolAdapter());
+
+    viewer.setAppletContext("jalview",
+                       ap.av.applet.getDocumentBase(),
+                            ap.av.applet.getCodeBase(),
+                            null);
+
+    viewer.setJmolStatusListener(this);
+
+    jmolpopup = JmolPopup.newJmolPopup(viewer);
+
+    this.addWindowListener(new WindowAdapter()
+        {
+          public void windowClosing(WindowEvent evt)
+          {
+            closeViewer();
+          }
+        });
+
 
     if(pdbentry.getFile()!=null)
     {
index b121828..a5268bf 100755 (executable)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2007 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.*;\r
-import java.awt.event.*;\r
-\r
-import jalview.analysis.*;\r
-import jalview.datamodel.*;\r
-\r
-public class PCAPanel\r
-    extends Frame implements Runnable, ActionListener, ItemListener\r
-{\r
-  PCA pca;\r
-  int top;\r
-  RotatableCanvas rc;\r
-  AlignViewport av;\r
-  SequenceI[] seqs;\r
-  AlignmentView seqstrings;\r
-\r
-  public PCAPanel(AlignViewport av)\r
-  {\r
-    try\r
-    {\r
-      jbInit();\r
-    }\r
-    catch (Exception e)\r
-    {\r
-      e.printStackTrace();\r
-    }\r
-\r
-    for (int i = 1; i < 8; i++)\r
-    {\r
-      xCombobox.addItem("dim " + i);\r
-      yCombobox.addItem("dim " + i);\r
-      zCombobox.addItem("dim " + i);\r
-    }\r
-\r
-    this.av = av;\r
-    seqstrings = av.getAlignmentView(av.getSelectionGroup() != null);\r
-    if (av.getSelectionGroup() == null)\r
-    {\r
-      seqs = av.alignment.getSequencesArray();\r
-    }\r
-    else\r
-    {\r
-      seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);\r
-    }\r
-    SeqCigar sq[] = seqstrings.getSequences();\r
-    int length = sq[0].getWidth();\r
-\r
-    for (int i = 0; i < seqs.length; i++)\r
-    {\r
-      if (sq[i].getWidth() != length)\r
-      {\r
-        System.out.println("Sequences must be equal length for PCA analysis");\r
-        return;\r
-      }\r
-    }\r
-\r
-    rc = new RotatableCanvas(av);\r
-    add(rc, BorderLayout.CENTER);\r
-\r
-    jalview.bin.JalviewLite.addFrame(this, "Principal component analysis",\r
-                                     400, 400);\r
-\r
-    Thread worker = new Thread(this);\r
-    worker.start();\r
-  }\r
-\r
-  /**\r
-   * DOCUMENT ME!\r
-   */\r
-  public void run()\r
-  {\r
-    pca = new PCA(seqstrings.getSequenceStrings(' '));\r
-    pca.run();\r
-\r
-    // Now find the component coordinates\r
-    int ii = 0;\r
-\r
-    while ( (ii < seqs.length) && (seqs[ii] != null))\r
-    {\r
-      ii++;\r
-    }\r
-\r
-    double[][] comps = new double[ii][ii];\r
-\r
-    for (int i = 0; i < ii; i++)\r
-    {\r
-      if (pca.getEigenvalue(i) > 1e-4)\r
-      {\r
-        comps[i] = pca.component(i);\r
-      }\r
-    }\r
-\r
-    //////////////////\r
-    xCombobox.select(0);\r
-    yCombobox.select(1);\r
-    zCombobox.select(2);\r
-\r
-    top = pca.getM().rows - 1;\r
-\r
-    Vector points = new Vector();\r
-    float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);\r
-\r
-    for (int i = 0; i < pca.getM().rows; i++)\r
-    {\r
-      SequencePoint sp = new SequencePoint(seqs[i], scores[i]);\r
-      points.addElement(sp);\r
-    }\r
-\r
-    rc.setPoints(points, pca.getM().rows);\r
-    rc.repaint();\r
-    seqs = null;\r
-    this.repaint();\r
-  }\r
-\r
-  void doDimensionChange()\r
-  {\r
-    if (top == 0)\r
-    {\r
-      return;\r
-    }\r
-\r
-    int dim1 = top - xCombobox.getSelectedIndex();\r
-    int dim2 = top - yCombobox.getSelectedIndex();\r
-    int dim3 = top - zCombobox.getSelectedIndex();\r
-\r
-    float[][] scores = pca.getComponents(dim1, dim2, dim3, 100);\r
-    for (int i = 0; i < pca.getM().rows; i++)\r
-    {\r
-      ( (SequencePoint) rc.points.elementAt(i)).coord = scores[i];\r
-    }\r
-\r
-    rc.img = null;\r
-    rc.rotmat.setIdentity();\r
-    rc.initAxes();\r
-    rc.paint(rc.getGraphics());\r
-  }\r
-\r
-  public void actionPerformed(ActionEvent evt)\r
-  {\r
-    if (evt.getSource() == inputData)\r
-    {\r
-      showOriginalData();\r
-    }\r
-    else\r
-    {\r
-      values_actionPerformed();\r
-    }\r
-  }\r
-\r
-  public void itemStateChanged(ItemEvent evt)\r
-  {\r
-    if (evt.getSource() == xCombobox)\r
-    {\r
-      xCombobox_actionPerformed();\r
-    }\r
-    else if (evt.getSource() == yCombobox)\r
-    {\r
-      yCombobox_actionPerformed();\r
-    }\r
-    else if (evt.getSource() == zCombobox)\r
-    {\r
-      zCombobox_actionPerformed();\r
-    }\r
-  }\r
-\r
-  protected void xCombobox_actionPerformed()\r
-  {\r
-    doDimensionChange();\r
-  }\r
-\r
-  protected void yCombobox_actionPerformed()\r
-  {\r
-    doDimensionChange();\r
-  }\r
-\r
-  protected void zCombobox_actionPerformed()\r
-  {\r
-    doDimensionChange();\r
-  }\r
-\r
-  public void values_actionPerformed()\r
-  {\r
-\r
-    CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);\r
-    Frame frame = new Frame();\r
-    frame.add(cap);\r
-    jalview.bin.JalviewLite.addFrame(frame, "PCA details", 500, 500);\r
-\r
-    cap.setText(pca.getDetails());\r
-  }\r
-\r
-  void showOriginalData()\r
-  {\r
-    // decide if av alignment is sufficiently different to original data to warrant a new window to be created\r
-    // create new alignmnt window with hidden regions (unhiding hidden regions yields unaligned seqs)\r
-    // or create a selection box around columns in alignment view\r
-    // test Alignment(SeqCigar[])\r
-    Object[] alAndColsel = seqstrings.getAlignmentAndColumnSelection(av.\r
-        getGapCharacter());\r
-\r
-    if (alAndColsel != null && alAndColsel[0] != null)\r
-    {\r
-      Alignment al = new Alignment( (SequenceI[]) alAndColsel[0]);\r
-      AlignFrame af = new AlignFrame(al,\r
-                                     av.applet,\r
-                                     "Original Data for PCA",\r
-                                     false);\r
-\r
-      af.viewport.setHiddenColumns( (ColumnSelection) alAndColsel[1]);\r
-    }\r
-  }\r
-\r
-  public void labels_itemStateChanged(ItemEvent itemEvent)\r
-  {\r
-    rc.showLabels(labels.getState());\r
-  }\r
-\r
-  Panel jPanel2 = new Panel();\r
-  Label jLabel1 = new Label();\r
-  Label jLabel2 = new Label();\r
-  Label jLabel3 = new Label();\r
-  protected Choice xCombobox = new Choice();\r
-  protected Choice yCombobox = new Choice();\r
-  protected Choice zCombobox = new Choice();\r
-  FlowLayout flowLayout1 = new FlowLayout();\r
-  BorderLayout borderLayout1 = new BorderLayout();\r
-  MenuBar menuBar1 = new MenuBar();\r
-  Menu menu1 = new Menu();\r
-  Menu menu2 = new Menu();\r
-  protected CheckboxMenuItem labels = new CheckboxMenuItem();\r
-  MenuItem values = new MenuItem();\r
-  MenuItem inputData = new MenuItem();\r
-\r
-  private void jbInit()\r
-      throws Exception\r
-  {\r
-    this.setLayout(borderLayout1);\r
-    jPanel2.setLayout(flowLayout1);\r
-    jLabel1.setFont(new java.awt.Font("Verdana", 0, 12));\r
-    jLabel1.setText("x=");\r
-    jLabel2.setFont(new java.awt.Font("Verdana", 0, 12));\r
-    jLabel2.setText("y=");\r
-    jLabel3.setFont(new java.awt.Font("Verdana", 0, 12));\r
-    jLabel3.setText("z=");\r
-    jPanel2.setBackground(Color.white);\r
-    zCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
-    zCombobox.addItemListener(this);\r
-    yCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
-    yCombobox.addItemListener(this);\r
-    xCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
-    xCombobox.addItemListener(this);\r
-    this.setMenuBar(menuBar1);\r
-    menu1.setLabel("File");\r
-    menu2.setLabel("View");\r
-    labels.setLabel("Labels");\r
-    labels.addItemListener(this);\r
-    values.setLabel("Output Values...");\r
-    values.addActionListener(this);\r
-    inputData.setLabel("Input Data...");\r
-    this.add(jPanel2, BorderLayout.SOUTH);\r
-    jPanel2.add(jLabel1, null);\r
-    jPanel2.add(xCombobox, null);\r
-    jPanel2.add(jLabel2, null);\r
-    jPanel2.add(yCombobox, null);\r
-    jPanel2.add(jLabel3, null);\r
-    jPanel2.add(zCombobox, null);\r
-    menuBar1.add(menu1);\r
-    menuBar1.add(menu2);\r
-    menu2.add(labels);\r
-    menu1.add(values);\r
-    menu1.add(inputData);\r
-    inputData.addActionListener(this);\r
-  }\r
-\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
+ * This program 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 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+package jalview.appletgui;
+
+import java.util.*;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import jalview.analysis.*;
+import jalview.datamodel.*;
+
+public class PCAPanel
+    extends EmbmenuFrame implements Runnable, ActionListener, ItemListener
+{
+  PCA pca;
+  int top;
+  RotatableCanvas rc;
+  AlignViewport av;
+  SequenceI[] seqs;
+  AlignmentView seqstrings;
+
+  public PCAPanel(AlignViewport av)
+  {
+    try
+    {
+      jbInit();
+    }
+    catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+
+    for (int i = 1; i < 8; i++)
+    {
+      xCombobox.addItem("dim " + i);
+      yCombobox.addItem("dim " + i);
+      zCombobox.addItem("dim " + i);
+    }
+
+    this.av = av;
+    seqstrings = av.getAlignmentView(av.getSelectionGroup() != null);
+    if (av.getSelectionGroup() == null)
+    {
+      seqs = av.alignment.getSequencesArray();
+    }
+    else
+    {
+      seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);
+    }
+    SeqCigar sq[] = seqstrings.getSequences();
+    int length = sq[0].getWidth();
+
+    for (int i = 0; i < seqs.length; i++)
+    {
+      if (sq[i].getWidth() != length)
+      {
+        System.out.println("Sequences must be equal length for PCA analysis");
+        return;
+      }
+    }
+
+    rc = new RotatableCanvas(av);
+    embedMenuIfNeeded(rc);
+    add(rc, BorderLayout.CENTER);
+
+    jalview.bin.JalviewLite.addFrame(this, "Principal component analysis",
+                                     400, 400);
+
+    Thread worker = new Thread(this);
+    worker.start();
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  public void run()
+  {
+    pca = new PCA(seqstrings.getSequenceStrings(' '));
+    pca.run();
+
+    // Now find the component coordinates
+    int ii = 0;
+
+    while ( (ii < seqs.length) && (seqs[ii] != null))
+    {
+      ii++;
+    }
+
+    double[][] comps = new double[ii][ii];
+
+    for (int i = 0; i < ii; i++)
+    {
+      if (pca.getEigenvalue(i) > 1e-4)
+      {
+        comps[i] = pca.component(i);
+      }
+    }
+
+    //////////////////
+    xCombobox.select(0);
+    yCombobox.select(1);
+    zCombobox.select(2);
+
+    top = pca.getM().rows - 1;
+
+    Vector points = new Vector();
+    float[][] scores = pca.getComponents(top - 1, top - 2, top - 3, 100);
+
+    for (int i = 0; i < pca.getM().rows; i++)
+    {
+      SequencePoint sp = new SequencePoint(seqs[i], scores[i]);
+      points.addElement(sp);
+    }
+
+    rc.setPoints(points, pca.getM().rows);
+    rc.repaint();
+    seqs = null;
+    this.repaint();
+  }
+
+  void doDimensionChange()
+  {
+    if (top == 0)
+    {
+      return;
+    }
+
+    int dim1 = top - xCombobox.getSelectedIndex();
+    int dim2 = top - yCombobox.getSelectedIndex();
+    int dim3 = top - zCombobox.getSelectedIndex();
+
+    float[][] scores = pca.getComponents(dim1, dim2, dim3, 100);
+    for (int i = 0; i < pca.getM().rows; i++)
+    {
+      ( (SequencePoint) rc.points.elementAt(i)).coord = scores[i];
+    }
+
+    rc.img = null;
+    rc.rotmat.setIdentity();
+    rc.initAxes();
+    rc.paint(rc.getGraphics());
+  }
+
+  public void actionPerformed(ActionEvent evt)
+  {
+    if (evt.getSource() == inputData)
+    {
+      showOriginalData();
+    }
+    else
+    {
+      values_actionPerformed();
+    }
+  }
+
+  public void itemStateChanged(ItemEvent evt)
+  {
+    if (evt.getSource() == xCombobox)
+    {
+      xCombobox_actionPerformed();
+    }
+    else if (evt.getSource() == yCombobox)
+    {
+      yCombobox_actionPerformed();
+    }
+    else if (evt.getSource() == zCombobox)
+    {
+      zCombobox_actionPerformed();
+    }
+  }
+
+  protected void xCombobox_actionPerformed()
+  {
+    doDimensionChange();
+  }
+
+  protected void yCombobox_actionPerformed()
+  {
+    doDimensionChange();
+  }
+
+  protected void zCombobox_actionPerformed()
+  {
+    doDimensionChange();
+  }
+
+  public void values_actionPerformed()
+  {
+
+    CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);
+    Frame frame = new Frame();
+    frame.add(cap);
+    jalview.bin.JalviewLite.addFrame(frame, "PCA details", 500, 500);
+
+    cap.setText(pca.getDetails());
+  }
+
+  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[])
+    Object[] alAndColsel = seqstrings.getAlignmentAndColumnSelection(av.
+        getGapCharacter());
+
+    if (alAndColsel != null && alAndColsel[0] != null)
+    {
+      Alignment al = new Alignment( (SequenceI[]) alAndColsel[0]);
+      AlignFrame af = new AlignFrame(al,
+                                     av.applet,
+                                     "Original Data for PCA",
+                                     false);
+
+      af.viewport.setHiddenColumns( (ColumnSelection) alAndColsel[1]);
+    }
+  }
+
+  public void labels_itemStateChanged(ItemEvent itemEvent)
+  {
+    rc.showLabels(labels.getState());
+  }
+
+  Panel jPanel2 = new Panel();
+  Label jLabel1 = new Label();
+  Label jLabel2 = new Label();
+  Label jLabel3 = new Label();
+  protected Choice xCombobox = new Choice();
+  protected Choice yCombobox = new Choice();
+  protected Choice zCombobox = new Choice();
+  FlowLayout flowLayout1 = new FlowLayout();
+  BorderLayout borderLayout1 = new BorderLayout();
+  MenuBar menuBar1 = new MenuBar();
+  Menu menu1 = new Menu();
+  Menu menu2 = new Menu();
+  protected CheckboxMenuItem labels = new CheckboxMenuItem();
+  MenuItem values = new MenuItem();
+  MenuItem inputData = new MenuItem();
+
+  private void jbInit()
+      throws Exception
+  {
+    this.setLayout(borderLayout1);
+    jPanel2.setLayout(flowLayout1);
+    jLabel1.setFont(new java.awt.Font("Verdana", 0, 12));
+    jLabel1.setText("x=");
+    jLabel2.setFont(new java.awt.Font("Verdana", 0, 12));
+    jLabel2.setText("y=");
+    jLabel3.setFont(new java.awt.Font("Verdana", 0, 12));
+    jLabel3.setText("z=");
+    jPanel2.setBackground(Color.white);
+    zCombobox.setFont(new java.awt.Font("Verdana", 0, 12));
+    zCombobox.addItemListener(this);
+    yCombobox.setFont(new java.awt.Font("Verdana", 0, 12));
+    yCombobox.addItemListener(this);
+    xCombobox.setFont(new java.awt.Font("Verdana", 0, 12));
+    xCombobox.addItemListener(this);
+    this.setMenuBar(menuBar1);
+    menu1.setLabel("File");
+    menu2.setLabel("View");
+    labels.setLabel("Labels");
+    labels.addItemListener(this);
+    values.setLabel("Output Values...");
+    values.addActionListener(this);
+    inputData.setLabel("Input Data...");
+    this.add(jPanel2, BorderLayout.SOUTH);
+    jPanel2.add(jLabel1, null);
+    jPanel2.add(xCombobox, null);
+    jPanel2.add(jLabel2, null);
+    jPanel2.add(yCombobox, null);
+    jPanel2.add(jLabel3, null);
+    jPanel2.add(zCombobox, null);
+    menuBar1.add(menu1);
+    menuBar1.add(menu2);
+    menu2.add(labels);
+    menu1.add(values);
+    menu1.add(inputData);
+    inputData.addActionListener(this);
+  }
+
+}
index 6bb96f1..f865bbd 100755 (executable)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2007 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.awt.*;\r
-import java.awt.event.*;\r
-\r
-import jalview.analysis.*;\r
-import jalview.datamodel.*;\r
-import jalview.io.*;\r
-\r
-public class TreePanel\r
-    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
-  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
-    TreeLoader tl = new TreeLoader(newTree);\r
-    tl.start();\r
-\r
-  }\r
-\r
-  void showOriginalData()\r
-  {\r
-    // decide if av alignment is sufficiently different to original data to warrant a new window to be created\r
-    // create new alignmnt window with hidden regions (unhiding hidden regions yields unaligned seqs)\r
-    // or create a selection box around columns in alignment view\r
-    // test Alignment(SeqCigar[])\r
-    if (tree.seqData != null)\r
-    {\r
-      Object[] alAndColsel = tree.seqData.getAlignmentAndColumnSelection(av.\r
-          getGapCharacter());\r
-\r
-      if (alAndColsel != null && alAndColsel[0] != null)\r
-      {\r
-        Alignment al = new Alignment( (SequenceI[]) alAndColsel[0]);\r
-        AlignFrame af = new AlignFrame(al,\r
-                                       av.applet,\r
-                                       "Original Data for Tree",\r
-                                       false);\r
-\r
-        af.viewport.setHiddenColumns( (ColumnSelection) alAndColsel[1]);\r
-      }\r
-    }\r
-    else\r
-    {\r
-      System.out.println("Original Tree Data not available");\r
-    }\r
-  }\r
-\r
-  class TreeLoader\r
-      extends Thread\r
-  {\r
-    NewickFile newtree;\r
-    jalview.datamodel.AlignmentView odata = null;\r
-\r
-    public TreeLoader(NewickFile newtree)\r
-    {\r
-      this.newtree = newtree;\r
-    }\r
-\r
-    public void run()\r
-    {\r
-      if (newtree != null)\r
-      {\r
-        if (odata == null)\r
-        {\r
-          tree = new NJTree(av.alignment.getSequencesArray(),\r
-                            newtree);\r
-        }\r
-        else\r
-        {\r
-          tree = new NJTree(av.alignment.getSequencesArray(), odata, newtree);\r
-        }\r
-\r
-      }\r
-      else\r
-      {\r
-        int start, end;\r
-        SequenceI[] seqs;\r
-        AlignmentView seqStrings = av.getAlignmentView(av.getSelectionGroup() != null);\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, seqStrings, 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
-      treeCanvas.repaint();\r
-\r
-      av.setCurrentTree(tree);\r
-\r
-    }\r
-  }\r
-\r
-  public void actionPerformed(ActionEvent evt)\r
-  {\r
-    if (evt.getSource() == newickOutput)\r
-    {\r
-      newickOutput_actionPerformed();\r
-    }\r
-    else if (evt.getSource() == fontSize)\r
-    {\r
-      fontSize_actionPerformed();\r
-    }\r
-    else if (evt.getSource() == inputData)\r
-    {\r
-      showOriginalData();\r
-    }\r
-  }\r
-\r
-  public void itemStateChanged(ItemEvent evt)\r
-  {\r
-    if (evt.getSource() == fitToWindow)\r
-    {\r
-      treeCanvas.fitToWindow = fitToWindow.getState();\r
-    }\r
-\r
-    else if (evt.getSource() == distanceMenu)\r
-    {\r
-      treeCanvas.setShowDistances(distanceMenu.getState());\r
-    }\r
-\r
-    else if (evt.getSource() == bootstrapMenu)\r
-    {\r
-      treeCanvas.setShowBootstrap(bootstrapMenu.getState());\r
-    }\r
-\r
-    else if (evt.getSource() == placeholdersMenu)\r
-    {\r
-      treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());\r
-    }\r
-\r
-    treeCanvas.repaint();\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
-    {\r
-      return;\r
-    }\r
-\r
-    new FontChooser(this);\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
-  MenuItem inputData = new MenuItem();\r
-\r
-  private void jbInit()\r
-      throws Exception\r
-  {\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
-    inputData.setLabel("Input Data...");\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
-    fileMenu.add(inputData);\r
-    inputData.addActionListener(this);\r
-  }\r
-\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
+ * This program 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 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+package jalview.appletgui;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.Hashtable;
+
+import jalview.analysis.*;
+import jalview.datamodel.*;
+import jalview.io.*;
+
+public class TreePanel
+    extends EmbmenuFrame implements ActionListener, ItemListener
+{
+  SequenceI[] seq;
+  String type;
+  String pwtype;
+  int start;
+  int end;
+  TreeCanvas treeCanvas;
+  NJTree tree;
+  AlignViewport av;
+
+  public NJTree getTree()
+  {
+    return tree;
+  }
+
+  /**
+   * Creates a new TreePanel object.
+   *
+   * @param av DOCUMENT ME!
+   * @param seqVector DOCUMENT ME!
+   * @param type DOCUMENT ME!
+   * @param pwtype DOCUMENT ME!
+   * @param s DOCUMENT ME!
+   * @param e DOCUMENT ME!
+   */
+  public TreePanel(AlignViewport av, String type, String pwtype)
+  {
+    try
+    {
+      jbInit();
+      this.setMenuBar(jMenuBar1);
+    }
+    catch (Exception ex)
+    {
+      ex.printStackTrace();
+    }
+
+    initTreePanel(av, type, pwtype, null);
+  }
+
+  /**
+   * Creates a new TreePanel object.
+   *
+   * @param av DOCUMENT ME!
+   * @param seqVector DOCUMENT ME!
+   * @param newtree DOCUMENT ME!
+   * @param type DOCUMENT ME!
+   * @param pwtype DOCUMENT ME!
+   */
+  public TreePanel(AlignViewport av,
+                   String type,
+                   String pwtype,
+                   NewickFile newtree)
+  {
+    try
+    {
+      jbInit();
+      this.setMenuBar(jMenuBar1);
+    }
+    catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+
+    initTreePanel(av, type, pwtype, newtree);
+  }
+  void initTreePanel(AlignViewport av,
+                     String type,
+                     String pwtype,
+                     NewickFile newTree)
+  {
+
+    this.av = av;
+    this.type = type;
+    this.pwtype = pwtype;
+
+
+    TreeLoader tl = new TreeLoader(newTree);
+    tl.start();
+    treeCanvas = new TreeCanvas(av, scrollPane);
+    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.seqData != null)
+    {
+      Object[] alAndColsel = tree.seqData.getAlignmentAndColumnSelection(av.
+          getGapCharacter());
+
+      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.setHiddenColumns( (ColumnSelection) 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;
+    }
+
+    public void run()
+    {
+      if (newtree != null)
+      {
+        if (odata == null)
+        {
+          tree = new NJTree(av.alignment.getSequencesArray(),
+                            newtree);
+        }
+        else
+        {
+          tree = new NJTree(av.alignment.getSequencesArray(), odata, newtree);
+        }
+
+      }
+      else
+      {
+        int start, end;
+        SequenceI[] seqs;
+        AlignmentView seqStrings = av.getAlignmentView(av.getSelectionGroup() != null);
+        if (av.getSelectionGroup() == null)
+        {
+          start = 0;
+          end = av.alignment.getWidth();
+          seqs = av.alignment.getSequencesArray();
+        }
+        else
+        {
+          start = av.getSelectionGroup().getStartRes();
+          end = av.getSelectionGroup().getEndRes() + 1;
+          seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);
+        }
+
+        tree = new NJTree(seqs, seqStrings, type, pwtype, start, end);
+      }
+
+      tree.reCount(tree.getTopNode());
+      tree.findHeight(tree.getTopNode());
+      treeCanvas.setTree(tree);
+      if (newtree != null)
+      {
+        distanceMenu.setState(newtree.HasDistances());
+        bootstrapMenu.setState(newtree.HasBootstrap());
+        treeCanvas.setShowBootstrap(newtree.HasBootstrap());
+        treeCanvas.setShowDistances(newtree.HasDistances());
+      }
+
+      treeCanvas.repaint();
+
+      av.setCurrentTree(tree);
+
+    }
+  }
+
+  public void actionPerformed(ActionEvent evt)
+  {
+    if (evt.getSource() == newickOutput)
+    {
+      newickOutput_actionPerformed();
+    }
+    else if (evt.getSource() == fontSize)
+    {
+      fontSize_actionPerformed();
+    }
+    else if (evt.getSource() == inputData)
+    {
+      showOriginalData();
+    }
+  }
+
+  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("View");
+    fontSize.setLabel("Font...");
+    fontSize.addActionListener(this);
+    bootstrapMenu.setLabel("Show Bootstrap Values");
+    bootstrapMenu.addItemListener(this);
+    distanceMenu.setLabel("Show Distances");
+    distanceMenu.addItemListener(this);
+    placeholdersMenu.setLabel("Mark Unassociated Leaves");
+    placeholdersMenu.addItemListener(this);
+    fitToWindow.setState(true);
+    fitToWindow.setLabel("Fit To Window");
+    fitToWindow.addItemListener(this);
+    fileMenu.setLabel("File");
+    newickOutput.setLabel("Newick Format");
+    newickOutput.addActionListener(this);
+    inputData.setLabel("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);
+  }
+
+}