GPL license added
[jalview.git] / src / jalview / gui / AlignFrame.java
index b504538..8cb12d1 100755 (executable)
-/********************\r
- * 2004 Jalview Reengineered\r
- * Barton Group\r
- * Dundee University\r
- *\r
- * AM Waterhouse\r
- *******************/\r
-\r
-\r
-\r
-\r
-package jalview.gui;\r
-\r
-import jalview.jbgui.GAlignFrame;\r
-import jalview.schemes.*;\r
-import jalview.datamodel.*;\r
-import jalview.analysis.*;\r
-import jalview.io.*;\r
-import java.awt.event.*;\r
-import java.awt.*;\r
-import javax.swing.*;\r
-import java.util.*;\r
-\r
-public class AlignFrame extends GAlignFrame\r
-{\r
-  final AlignmentPanel alignPanel;\r
-  final AlignViewport viewport;\r
-  public AlignFrame(AlignmentI al)\r
-  {\r
-    super();\r
-    viewport = new AlignViewport(al,true,true,true,false);\r
-    alignPanel = new AlignmentPanel(this, viewport);\r
-    getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);\r
-    fontNameMenuItem.setText(viewport.getFont().getName());\r
-    fontSizeMenuItem.setText(viewport.getFont().getSize()+"");\r
-  }\r
-\r
-  protected void saveAs_actionPerformed(ActionEvent e)\r
-  {\r
-    JFileChooser chooser = new JFileChooser(jalview.bin.Cache.LAST_DIRECTORY);\r
-    chooser.setDialogTitle("Save Alignment to file - "+e.getActionCommand() +" format.");\r
-    chooser.setToolTipText("Save");\r
-    int value = chooser.showSaveDialog(this);\r
-    if(value == JFileChooser.APPROVE_OPTION)\r
-    {\r
-      String choice =  chooser.getSelectedFile().getPath();\r
-      jalview.bin.Cache.LAST_DIRECTORY = choice;\r
-      String output = FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences());\r
-      try{\r
-        java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
-        out.println(output);\r
-        out.close();\r
-      }\r
-      catch(Exception ex){}\r
-    }\r
-\r
-  }\r
-\r
-  protected void outputText_actionPerformed(ActionEvent e)\r
-  {\r
-     CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
-     JInternalFrame frame = new JInternalFrame();\r
-     cap.formatForOutput();\r
-     frame.setContentPane(cap);\r
-     Desktop.addInternalFrame(frame, "Alignment output - "+e.getActionCommand(), 600, 500);\r
-     cap.setText( FormatAdapter.get(e.getActionCommand(), viewport.getAlignment().getSequences()));\r
-  }\r
-\r
-  protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    HTMLOutput htmlOutput = new HTMLOutput(viewport.getAlignment(), alignPanel.seqPanel.getColourScheme());\r
-    htmlOutput = null;\r
-  }\r
-\r
-  public void saveAsPostscriptMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-\r
-  }\r
-\r
-  public void closeMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    try{\r
-      this.setClosed(true);\r
-    }catch(Exception ex){}\r
-  }\r
-\r
-  ArrayList  historyList = new ArrayList();\r
-  ArrayList redoList = new ArrayList();\r
-\r
-  void updateEditMenuBar()\r
-  {\r
-    if(historyList.size()>0)\r
-     {\r
-       undoMenuItem.setEnabled(true);\r
-       Object [] history = (Object[])historyList.get(0);\r
-       undoMenuItem.setText("Undo "+history[0]);\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
-       Object [] history = (Object[])redoList.get(0);\r
-       redoMenuItem.setText("Redo "+history[0]);\r
-     }\r
-    else\r
-    {\r
-      redoMenuItem.setEnabled(false);\r
-      redoMenuItem.setText("Redo");\r
-    }\r
-  }\r
-\r
-  public void addHistoryItem(String type)\r
-  {\r
-    // must make sure we add new sequence objects her, not refs to the existing sequences\r
-    redoList.clear();\r
-    SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
-    for(int i=0; i<viewport.getAlignment().getHeight(); i++)\r
-    {\r
-      seq[i] = new Sequence( viewport.getAlignment().getSequenceAt(i).getName(),\r
-                             viewport.getAlignment().getSequenceAt(i).getSequence());\r
-    }\r
-\r
-    historyList.add(0, new Object[]{type,  seq} );\r
-    updateEditMenuBar();\r
-  }\r
-\r
-  protected void undoMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    Object [] history = (Object[])historyList.remove(0);\r
-    // add the redo state before continuing!!\r
-    SequenceI[] seq = new SequenceI[viewport.getAlignment().getHeight()];\r
-    for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
-    {\r
-      seq[i] = new Sequence(viewport.getAlignment().getSequenceAt(i).getName(),\r
-                            viewport.getAlignment().getSequenceAt(i).\r
-                            getSequence());\r
-    }\r
-    /////////\r
-\r
-    redoList.add(0, new Object[] {history[0], seq});\r
-\r
-      seq = (SequenceI[]) history[1];\r
-      viewport.setAlignment( new Alignment(seq) );\r
-      updateEditMenuBar();\r
-      alignPanel.RefreshPanels();\r
-  }\r
-\r
-\r
-  protected void redoMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-     Object [] history = (Object[])redoList.remove(0);\r
-     SequenceI[] seq = (SequenceI[]) history[1];\r
-     viewport.setAlignment( new Alignment(seq) );\r
-     updateEditMenuBar();\r
-     alignPanel.RefreshPanels();\r
-  }\r
-\r
-\r
-\r
-  public void groupsMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    GroupEditor geditor = new GroupEditor(viewport, alignPanel);\r
-    JInternalFrame frame = new JInternalFrame();\r
-    frame.setContentPane(geditor);\r
-    Desktop.addInternalFrame(frame, "Group editor", 710, 410);\r
-    frame.setResizable(false);\r
-  }\r
-\r
-  public void groupEditingMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    viewport.setGroupEdit( groupEditingMenuItem.isSelected() );\r
-  }\r
-\r
-  public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    Selection sel = viewport.getSelection();\r
-    for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
-      sel.addElement( viewport.getAlignment().getSequenceAt(i));\r
-    PaintRefresher.Refresh(null);\r
-  }\r
-\r
-  public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    viewport.getSelection().clear();\r
-    PaintRefresher.Refresh(null);\r
-  }\r
-\r
-  public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    Selection sel = viewport.getSelection();\r
-    for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
-    {\r
-      if (sel.contains(viewport.getAlignment().getSequenceAt(i)))\r
-        sel.removeElement(viewport.getAlignment().getSequenceAt(i));\r
-      else\r
-        sel.addElement(viewport.getAlignment().getSequenceAt(i));\r
-    }\r
-    PaintRefresher.Refresh(null);\r
-  }\r
-\r
-  public void deleteSelectedMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    addHistoryItem("delete selection");\r
-\r
-    for (int i=0;i < viewport.getSelection().size(); i++)\r
-            viewport.getAlignment().deleteSequence(viewport.getSelection().sequenceAt(i));\r
-\r
-    viewport.getSelection().clear();\r
-    viewport.resetSeqLimits(alignPanel.seqPanel.seqCanvas.getHeight());\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-  public void moveSelectedMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    copySelectedMenuItem_actionPerformed(null);\r
-    deleteSelectedMenuItem_actionPerformed(null);\r
-    alignPanel.repaint();\r
-  }\r
-\r
-  public void copySelectedMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    if(viewport.getSelection().size()==0)\r
-      return;\r
-\r
-   SequenceI[] s = new Sequence[viewport.getSelection().size()];\r
-   for (int i=0; i < viewport.getSelection().size(); i++) {\r
-     s[i] = new Sequence(viewport.getSelection().sequenceAt(i));\r
-    }\r
-    AlignFrame af = new AlignFrame(new Alignment(s));\r
-    int newHeight = s.length * af.viewport.getCharHeight() + 200;\r
-    if(newHeight>500)\r
-      newHeight=500;\r
-    Desktop.addInternalFrame(af, "Copied sequences", 700,newHeight);\r
-  }\r
-\r
-  public void deselectAllColumnsMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    viewport.getColumnSelection().clear();\r
-    repaint();\r
-  }\r
-\r
-  public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    addHistoryItem("delete columns");\r
-    ColumnSelection colSel = viewport.getColumnSelection();\r
-    if (colSel.size() > 0)\r
-    {\r
-      int min = colSel.getMin();\r
-      viewport.getAlignment().trimLeft(min);\r
-      colSel.compensateForEdit(0,min);\r
-      alignPanel.RefreshPanels();\r
-    }\r
-  }\r
-\r
-  public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    addHistoryItem("delete columns");\r
-    ColumnSelection colSel = viewport.getColumnSelection();\r
-    if (colSel.size() > 0)\r
-    {\r
-      int max = colSel.getMax();\r
-      if(max>1)\r
-        viewport.getAlignment().trimRight(max);\r
-\r
-      alignPanel.RefreshPanels();\r
-    }\r
-\r
-  }\r
-\r
-  public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    addHistoryItem("delete gapped columns");\r
-    viewport.getAlignment().removeGaps();\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-  public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    addHistoryItem("delete all gaps");\r
-    SequenceI current;\r
-    int jSize;\r
-    for (int i=0; i < viewport.getAlignment().getSequences().size();i++)\r
-    {\r
-      current = viewport.getAlignment().getSequenceAt(i);\r
-      jSize = current.getLength();\r
-      for (int j=0; j < jSize; j++)\r
-        if (current.getCharAt(j)=='-' || current.getCharAt(j)=='.' || current.getCharAt(j)==' ')\r
-        {\r
-          current.deleteCharAt(j);\r
-          j--;\r
-          jSize--;\r
-        }\r
-    }\r
-\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-  public void setGapCharMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    String thisChar = "-";\r
-    String nextChar = ".";\r
-    if(viewport.getGapCharacter().equals("-"))\r
-    {\r
-      thisChar = ".";\r
-      nextChar = "-";\r
-    }\r
-    setGapCharMenuItem.setText("Set gap character to \""+nextChar+"\"");\r
-    viewport.setGapCharacter(thisChar);\r
-  }\r
-\r
-\r
-  public void fontNameMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    String fonts[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();\r
-\r
-\r
-    String selection = JOptionPane.showInputDialog(this,\r
-                                "Select font",\r
-                                "Font selection",\r
-                                JOptionPane.QUESTION_MESSAGE,\r
-                                null,fonts\r
-                                ,fontNameMenuItem.getText()).toString();\r
-    if(selection!=null)\r
-    {\r
-       fontNameMenuItem.setText(selection);\r
-       SetFont();\r
-     }\r
-\r
-  }\r
-\r
-  public void fontSizeMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    String selection = JOptionPane.showInputDialog(this,\r
-                                "Select font size",\r
-                                "Font size",\r
-                                JOptionPane.QUESTION_MESSAGE,\r
-                                null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
-                                ,fontSizeMenuItem.getText()).toString();\r
-    if(selection!=null)\r
-     {\r
-       fontSizeMenuItem.setText(selection);\r
-       SetFont();\r
-     }\r
-  }\r
-\r
-  public void fontStyleMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    String selection = JOptionPane.showInputDialog(this,\r
-                                "Select font style",\r
-                                "Font style",\r
-                                JOptionPane.QUESTION_MESSAGE,\r
-                                null, new String[]{"plain", "bold", "italic"}\r
-                                ,fontStyleMenuItem.getText()).toString();\r
-    if(selection!=null)\r
-    {\r
-      fontStyleMenuItem.setText(selection);\r
-      SetFont();\r
-    }\r
-\r
-  }\r
-\r
-  protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    viewport.setColourText( colourTextMenuItem.isSelected() );\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-  void SetFont()\r
-  {\r
-      int style = java.awt.Font.PLAIN;\r
-      if(fontStyleMenuItem.getText().equals("bold"))\r
-        style = java.awt.Font.BOLD;\r
-      else if(fontStyleMenuItem.getText().equals("italic"))\r
-        style = java.awt.Font.ITALIC;\r
-\r
-      viewport.setFont(new java.awt.Font(fontNameMenuItem.getText(),\r
-                                           style,\r
-                                           Integer.parseInt(fontSizeMenuItem.getText())));\r
-      alignPanel.RefreshPanels();\r
-\r
-  }\r
-\r
-  protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    viewport.setWrapAlignment( wrapMenuItem.isSelected() );\r
-    alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-  public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-  public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    viewport.setShowText( viewTextMenuItem.isSelected() );\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-\r
-  public void consensusGraphMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setGraphPanelVisible( consensusGraphMenuItem.isSelected() );\r
-  }\r
-\r
-  public void overviewMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-\r
-    JInternalFrame frame = new JInternalFrame();\r
-    OverviewPanel overview = alignPanel.getOverviewPanel();\r
-   try{\r
-     overview = new OverviewPanel(alignPanel, viewport);\r
-     frame.setContentPane(overview);\r
-    Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),\r
-                             frame.getWidth(), frame.getHeight());\r
-    frame.pack();\r
-    frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
-    { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)\r
-      {\r
-            alignPanel.setOverviewPanel(null);\r
-      };\r
-    });\r
-    alignPanel.setOverviewPanel( overview );\r
-\r
-  }catch(java.lang.OutOfMemoryError ex)\r
-   {\r
-     JOptionPane.showMessageDialog(this, "Sequence alignment too large to\nproduce overview image!!"\r
-                                   +"\nTry reducing the font size.",\r
-                                   "Out of memory", JOptionPane.WARNING_MESSAGE);\r
-   }\r
-\r
-\r
-  }\r
-\r
-  protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme(null, false);\r
-  }\r
-\r
-\r
-  public void clustalColour_actionPerformed(ActionEvent e)\r
-  {\r
-   // alignPanel.setColourScheme( new ClustalxColourScheme() );\r
-  }\r
-\r
-  public void zappoColour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new ZappoColourScheme(), conservationMenuItem.isSelected() );\r
-  }\r
-\r
-  public void taylorColour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new TaylorColourScheme(),conservationMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-  public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new HydrophobicColourScheme(),conservationMenuItem.isSelected() );\r
-  }\r
-\r
-  public void helixColour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new HelixColourScheme(),conservationMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-  public void strandColour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new StrandColourScheme() ,conservationMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-  public void turnColour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new TurnColourScheme() ,conservationMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-  public void buriedColour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new BuriedColourScheme() ,conservationMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-  protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme ( alignPanel.seqPanel.getColourScheme(),conservationMenuItem.isSelected() );\r
-    conservationColourIncMenuItem.setEnabled( conservationMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-\r
-  public void conservationColourIncMenuItem_actionPerformed(ActionEvent e)\r
- {\r
-   ConservationIncrementPanel cip = new ConservationIncrementPanel(viewport, alignPanel);\r
-   JInternalFrame frame = new JInternalFrame();\r
-   frame.setContentPane(cip);\r
-   Desktop.addInternalFrame(frame, "Conservation Colour Increment", 400,90);\r
-   frame.setMaximizable(false);\r
- }\r
-\r
-\r
-  public void abovePIDColour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new PIDColourScheme() ,conservationMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-  public void userDefinedColour_actionPerformed(ActionEvent e)\r
-  {\r
-    JInternalFrame frame = new JInternalFrame();\r
-    UserDefinedColours chooser = new UserDefinedColours( frame, alignPanel.seqPanel );\r
-    frame.setContentPane(chooser);\r
-    Desktop.addInternalFrame(frame,"User defined colours", 450,540 );\r
-    frame.setResizable(false);\r
-    frame.setIconifiable(false);\r
-    frame.setMaximizable(false);\r
-  }\r
-\r
-  public void PIDColour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new PIDColourScheme(),conservationMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-  public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
-  {\r
-    alignPanel.setColourScheme( new Blosum62ColourScheme(viewport) ,conservationMenuItem.isSelected() );\r
-  }\r
-\r
-\r
-\r
-  protected void schemeKeyMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    ColourKey colourKey = new ColourKey( alignPanel.seqPanel.getColourScheme() );\r
-    Desktop.addInternalFrame(colourKey, "Colour scheme key", 400, 320);\r
-  }\r
-\r
-\r
-  public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    addHistoryItem("sort");\r
-    AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-  public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    addHistoryItem("sort");\r
-    AlignmentSorter.sortByID( viewport.getAlignment() );\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-  public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    addHistoryItem("sort");\r
-    AlignmentSorter.sortGroups(viewport.getAlignment());\r
-    AlignmentSorter.sortGroups(viewport.getAlignment());\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-  public void sortTreeOrderMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    addHistoryItem("sort");\r
-    if(viewport.getCurrentTree()==null)\r
-      return;\r
-\r
-    AlignmentSorter.sortByTree(viewport.getAlignment(), viewport.getCurrentTree());\r
-    alignPanel.RefreshPanels();\r
-  }\r
-\r
-  public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-\r
-  }\r
-\r
-  public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    if(viewport.getSelection().size()<2)\r
-      JOptionPane.showMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);\r
-    else\r
-    {\r
-      JInternalFrame frame = new JInternalFrame();\r
-      frame.setContentPane(new PairwiseAlignPanel(viewport));\r
-      Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);\r
-    }\r
-  }\r
-\r
-  public void PCAMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    if( (viewport.getSelection().size()<4 && viewport.getSelection().size()>0)\r
-       || viewport.getAlignment().getHeight()<4)\r
-    {\r
-      JOptionPane.showMessageDialog(this, "Principal component analysis must take\n"\r
-                                    +"at least 4 input sequences.",\r
-                                    "Sequence selection insufficient",\r
-                                    JOptionPane.WARNING_MESSAGE);\r
-      return;\r
-    }\r
-\r
-    try{\r
-      PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
-      JInternalFrame frame = new JInternalFrame();\r
-      frame.setContentPane(pcaPanel);\r
-      Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);\r
-   }catch(java.lang.OutOfMemoryError ex)\r
-   {\r
-     JOptionPane.showMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",\r
-                                   "Out of memory", JOptionPane.WARNING_MESSAGE);\r
-   }\r
-\r
-\r
-  }\r
-\r
-  public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    NewTreePanel("AV", "PID", "Average distance tree using PID");\r
-  }\r
-\r
-  public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
-  }\r
-\r
-\r
-  protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
-  }\r
-\r
-  protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62PID");\r
-  }\r
-\r
-  void NewTreePanel(String type, String pwType, String title)\r
-  {\r
-    JInternalFrame frame = new javax.swing.JInternalFrame();\r
-    TreePanel tp=null;\r
-   if (viewport.getSelection() != null && viewport.getSelection().size() > 3)\r
-   {\r
-     tp = new TreePanel(viewport, viewport.getSelection().asVector(),type, pwType,\r
-                         viewport.getStartRes(), viewport.getEndRes());\r
-   }\r
-   else\r
-   {\r
-     tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
-                         type, pwType, viewport.getStartRes(),\r
-                         viewport.getEndRes());\r
-   }\r
-\r
-   frame.setContentPane(tp);\r
-   Desktop.addInternalFrame(frame, title, 600, 500);\r
-  }\r
-\r
-\r
-\r
-  public void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
-  {\r
-    JOptionPane.showMessageDialog(this, "Jalview is currently being reengineered"\r
-                                  +"\nwithin the Barton Group, Dundee University."\r
-                                  +"\nThis will be available as a web service 2005",\r
-                                  "Web service", JOptionPane.INFORMATION_MESSAGE);\r
-  }\r
-\r
-}\r
+/*
+* Jalview - A Sequence Alignment Editor and Viewer
+* Copyright (C) 2005 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.gui;
+
+import java.util.*;
+
+import java.awt.*;
+import java.awt.datatransfer.*;
+import java.awt.event.*;
+import java.awt.print.*;
+import javax.swing.*;
+import javax.swing.event.*;
+
+import jalview.analysis.*;
+import jalview.datamodel.*;
+import jalview.io.*;
+import jalview.jbgui.*;
+import jalview.schemes.*;
+import jalview.ws.*;
+import java.beans.PropertyChangeEvent;
+
+public class AlignFrame extends GAlignFrame
+{
+  final AlignmentPanel alignPanel;
+  final AlignViewport viewport;
+  public static final int NEW_WINDOW_WIDTH = 700;
+  public static final int NEW_WINDOW_HEIGHT = 500;
+  public String currentFileFormat = "Jalview";
+
+  public AlignFrame(AlignmentI al)
+  {
+    viewport = new AlignViewport(al);
+
+    alignPanel = new AlignmentPanel(this, viewport);
+    alignPanel.annotationPanel.adjustPanelHeight();
+    alignPanel.annotationSpaceFillerHolder.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());
+    alignPanel.annotationScroller.setPreferredSize(alignPanel.annotationPanel.getPreferredSize());
+    alignPanel.setAnnotationVisible( viewport.getShowAnnotation() );
+
+    getContentPane().add(alignPanel, java.awt.BorderLayout.CENTER);
+
+    addInternalFrameListener(new InternalFrameAdapter()
+   {
+     public void internalFrameActivated(InternalFrameEvent evt)
+     {
+          javax.swing.SwingUtilities.invokeLater(new Runnable()
+          {
+            public void run()
+            {      alignPanel.requestFocus();    }
+          });
+
+     }
+   });
+
+  }
+
+  public void saveAlignmentMenu_actionPerformed(ActionEvent e)
+  {
+    JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty("LAST_DIRECTORY")
+        ,  new String[]{"fa, fasta, fastq", "aln",  "pfam", "msf", "pir","blc","jar"},
+          new String[]{"Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "Jalview"},
+          currentFileFormat);
+
+    chooser.setAcceptAllFileFilterUsed(false);
+    chooser.setFileView(new JalviewFileView());
+    chooser.setDialogTitle("Save Alignment to file");
+    chooser.setToolTipText("Save");
+    int value = chooser.showSaveDialog(this);
+    if(value == JalviewFileChooser.APPROVE_OPTION)
+    {
+      currentFileFormat  = chooser.getSelectedFormat();
+      jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat);
+
+      if (currentFileFormat.equals("Jalview"))
+      {
+        String shortName = title;
+        if(shortName.indexOf(java.io.File.separatorChar)>-1)
+              shortName = shortName.substring(
+                    shortName.lastIndexOf(java.io.File.separatorChar)+1);
+
+        String choice = chooser.getSelectedFile().getPath();
+        Jalview2XML.SaveState(this, choice, shortName);
+        // USE Jalview2XML to save this file
+        return;
+      }
+
+      String choice =  chooser.getSelectedFile().getPath();
+      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
+      String output = FormatAdapter.formatSequences(currentFileFormat, viewport.getAlignment().getSequences());
+      try{
+        java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );
+        out.println(output);
+        out.close();
+      }
+      catch(Exception ex){}
+    }
+
+  }
+
+  protected void outputText_actionPerformed(ActionEvent e)
+  {
+     CutAndPasteTransfer cap = new CutAndPasteTransfer();
+     Desktop.addInternalFrame(cap, "Alignment output - "+e.getActionCommand(), 600, 500);
+     cap.setText( FormatAdapter.formatSequences(e.getActionCommand(), viewport.getAlignment().getSequences()));
+  }
+
+  protected void htmlMenuItem_actionPerformed(ActionEvent e)
+  {
+    new HTMLOutput(viewport);
+  }
+
+  protected void createPNG_actionPerformed(ActionEvent e)
+  {
+    alignPanel.makePNG();
+  }
+
+  protected void epsFile_actionPerformed(ActionEvent e)
+  {
+    alignPanel.makeEPS();
+  }
+
+
+  public void printMenuItem_actionPerformed(ActionEvent e)
+  {
+    //Putting in a thread avoids Swing painting problems
+    PrintThread thread = new PrintThread();
+    thread.start();
+  }
+
+  class PrintThread extends Thread
+  {
+    public void run()
+    {
+      PrinterJob printJob = PrinterJob.getPrinterJob();
+      PageFormat pf = printJob.pageDialog(printJob.defaultPage());
+      printJob.setPrintable(alignPanel, pf);
+      if (printJob.printDialog())
+      {
+        try
+        {
+          printJob.print();
+        }
+        catch (Exception PrintException)
+        {
+          PrintException.printStackTrace();
+        }
+      }
+    }
+
+  }
+
+
+
+
+  public void closeMenuItem_actionPerformed(ActionEvent e)
+  {
+    try{
+      this.setClosed(true);
+    }catch(Exception ex){}
+  }
+
+  Stack historyList = new Stack();
+  Stack redoList = new Stack();
+  private int treeCount = 0;
+
+  void updateEditMenuBar()
+   {
+     if(historyList.size()>0)
+      {
+        undoMenuItem.setEnabled(true);
+        HistoryItem hi = (HistoryItem)historyList.peek();
+        undoMenuItem.setText("Undo "+hi.getDescription());
+      }
+     else
+     {
+       undoMenuItem.setEnabled(false);
+       undoMenuItem.setText("Undo");
+     }
+
+     if(redoList.size()>0)
+      {
+        redoMenuItem.setEnabled(true);
+        HistoryItem hi = (HistoryItem)redoList.peek();
+        redoMenuItem.setText("Redo "+hi.getDescription());
+      }
+     else
+     {
+       redoMenuItem.setEnabled(false);
+       redoMenuItem.setText("Redo");
+     }
+   }
+
+   public void addHistoryItem(HistoryItem hi)
+   {
+     historyList.push(hi);
+     updateEditMenuBar();
+   }
+
+   protected void undoMenuItem_actionPerformed(ActionEvent e)
+   {
+       HistoryItem hi = (HistoryItem)historyList.pop();
+       redoList.push(new HistoryItem(hi.getDescription(), viewport.alignment, HistoryItem.HIDE));
+       restoreHistoryItem(hi);
+   }
+
+
+   protected void redoMenuItem_actionPerformed(ActionEvent e)
+   {
+      HistoryItem hi = (HistoryItem)redoList.pop();
+      restoreHistoryItem(hi);
+      updateEditMenuBar();
+      viewport.updateConsensus();
+      alignPanel.repaint();
+      alignPanel.repaint();
+   }
+
+
+   // used by undo and redo
+   void restoreHistoryItem(HistoryItem hi)
+   {
+      if(hi.getType()== HistoryItem.SORT)
+      {
+           for(int i=0; i<hi.getSequences().size(); i++)
+             viewport.alignment.getSequences().setElementAt(hi.getSequences().elementAt(i), i);
+      }
+      else
+      {
+        for (int i = 0; i < hi.getSequences().size(); i++)
+        {
+          SequenceI restore = (SequenceI) hi.getSequences().elementAt(i);
+          if(restore.getLength()==0)
+          {
+            restore.setSequence(hi.getHidden().elementAt(i).toString());
+            viewport.alignment.getSequences().insertElementAt(
+               restore,
+               hi.getAlignIndex(i));
+          }
+          else
+            restore.setSequence(hi.getHidden().elementAt(i).toString());
+        }
+        if(hi.getType()==HistoryItem.PASTE)
+        {
+          for(int i=viewport.alignment.getHeight()-1;i>hi.getSequences().size()-1; i--)
+            viewport.alignment.deleteSequence(i);
+        }
+      }
+      updateEditMenuBar();
+
+      viewport.updateConsensus();
+      viewport.updateConservation();
+      alignPanel.repaint();
+      viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
+  }
+
+  public void moveSelectedSequences(boolean up)
+  {
+    SequenceGroup sg = viewport.getSelectionGroup();
+    if (sg == null)
+      return;
+
+    if (up)
+    {
+      for (int i = 1; i < viewport.alignment.getHeight(); i++)
+      {
+        SequenceI seq = viewport.alignment.getSequenceAt(i);
+        if (!sg.sequences.contains(seq))
+          continue;
+
+        SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
+        if (sg.sequences.contains(temp))
+          continue;
+
+        viewport.alignment.getSequences().setElementAt(temp, i);
+        viewport.alignment.getSequences().setElementAt(seq, i - 1);
+      }
+    }
+    else
+    {
+      for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
+      {
+        SequenceI seq = viewport.alignment.getSequenceAt(i);
+        if (!sg.sequences.contains(seq))
+          continue;
+
+        SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
+        if (sg.sequences.contains(temp))
+          continue;
+
+        viewport.alignment.getSequences().setElementAt(temp, i);
+        viewport.alignment.getSequences().setElementAt(seq, i + 1);
+      }
+    }
+
+    alignPanel.repaint();
+  }
+
+
+
+  protected void copy_actionPerformed(ActionEvent e)
+  {
+     if(viewport.getSelectionGroup()==null)
+       return;
+
+     SequenceGroup sg = viewport.getSelectionGroup();
+
+     Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
+     StringBuffer buffer= new StringBuffer();
+
+     Hashtable orderedSeqs = new Hashtable();
+     for(int i=0; i<sg.getSize(); i++)
+     {
+        SequenceI seq = sg.getSequenceAt(i);
+        int index = viewport.alignment.findIndex(seq);
+        orderedSeqs.put(index+"", seq);
+     }
+
+     int index=0;
+     for(int i=0; i<sg.getSize(); i++)
+     {
+       SequenceI seq = null;
+       while( seq == null )
+       {
+         if(orderedSeqs.containsKey(index+""))
+         {
+           seq = (SequenceI) orderedSeqs.get(index + "");
+           index++;
+           break;
+         }
+         else
+           index++;
+       }
+
+         buffer.append( seq.getName()+"\t"+seq.findPosition( sg.getStartRes() ) +"\t"
+                        +seq.findPosition( sg.getEndRes() )+ "\t"
+                        +sg.getSequenceAt(i).getSequence(sg.getStartRes(), sg.getEndRes()+1)+"\n");
+     }
+     c.setContents( new StringSelection( buffer.toString()) , null ) ;
+
+  }
+
+
+  protected void pasteNew_actionPerformed(ActionEvent e)
+  {
+    paste(true);
+  }
+
+  protected void pasteThis_actionPerformed(ActionEvent e)
+  {
+    addHistoryItem(new HistoryItem("Paste Sequences", viewport.alignment, HistoryItem.PASTE));
+    paste(false);
+  }
+
+  void paste(boolean newAlignment)
+  {
+    try{
+      Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
+      Transferable contents = c.getContents(this);
+      if (contents == null)
+        return;
+
+      String str = (String) contents.getTransferData(DataFlavor.stringFlavor);
+      StringTokenizer st = new StringTokenizer(str);
+      ArrayList seqs = new ArrayList();
+      while (st.hasMoreElements())
+      {
+        String name = st.nextToken();
+        int start = Integer.parseInt(st.nextToken());
+        int end = Integer.parseInt(st.nextToken());
+        Sequence sequence = new Sequence(name,st.nextToken(), start, end);
+
+        if(!newAlignment)
+          viewport.alignment.addSequence(sequence);
+        else
+          seqs.add(sequence);
+      }
+
+      if(newAlignment)
+      {
+        SequenceI[] newSeqs = new SequenceI[seqs.size()];
+        seqs.toArray(newSeqs);
+        AlignFrame af = new AlignFrame(new Alignment(newSeqs));
+        String newtitle = new String("Copied sequences");
+        if( title.startsWith("Copied sequences"))
+         newtitle = title;
+       else
+         newtitle = newtitle.concat("- from "+title);
+
+        Desktop.addInternalFrame(af, newtitle, NEW_WINDOW_WIDTH, NEW_WINDOW_HEIGHT);
+      }
+      else
+      {
+        viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
+        viewport.setEndSeq(viewport.alignment.getHeight());
+        viewport.alignment.getWidth();
+        viewport.updateConservation();
+        viewport.updateConsensus();
+        alignPanel.repaint();
+      }
+
+    }catch(Exception ex){}// could be anything being pasted in here
+
+  }
+
+
+  protected void cut_actionPerformed(ActionEvent e)
+  {
+    copy_actionPerformed(null);
+    delete_actionPerformed(null);
+  }
+
+  protected void delete_actionPerformed(ActionEvent e)
+  {
+    boolean seqsdeleted=false;
+
+    if (viewport.getSelectionGroup() == null)
+      return;
+
+    addHistoryItem(new HistoryItem("Delete Sequences", viewport.alignment, HistoryItem.HIDE));
+
+     SequenceGroup sg = viewport.getSelectionGroup();
+     for (int i=0;i < sg.sequences.size(); i++)
+     {
+       SequenceI seq = sg.getSequenceAt(i);
+       int index = viewport.getAlignment().findIndex(seq);
+       seq.deleteChars(sg.getStartRes(),sg.getEndRes()+1);
+
+       if(seq.getSequence().length()<1) {
+         seqsdeleted=true;
+         viewport.getAlignment().deleteSequence(seq);
+        } else {
+         viewport.getAlignment().getSequences().setElementAt(seq, index);
+       }
+     }
+
+     viewport.setSelectionGroup(null);
+     viewport.alignment.deleteGroup(sg);
+     if (seqsdeleted)
+       viewport.firePropertyChange("alignment", null, viewport.getAlignment().getSequences());
+     viewport.resetSeqLimits( alignPanel.seqPanel.seqCanvas.getHeight());
+     if(viewport.getAlignment().getHeight()<1)
+     try
+     {
+       this.setClosed(true);
+     }catch(Exception ex){}
+   viewport.updateConservation();
+   viewport.updateConsensus();
+   alignPanel.repaint();
+ }
+
+
+  protected void deleteGroups_actionPerformed(ActionEvent e)
+  {
+    viewport.alignment.deleteAllGroups();
+    viewport.setSelectionGroup(null);
+    alignPanel.repaint();
+  }
+
+
+
+  public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
+  {
+    SequenceGroup sg = new SequenceGroup();
+    for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
+      sg.addSequence( viewport.getAlignment().getSequenceAt(i));
+    sg.setEndRes(viewport.alignment.getWidth());
+    viewport.setSelectionGroup(sg);
+    PaintRefresher.Refresh(null);
+  }
+
+  public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
+  {
+    viewport.setSelectionGroup(null);
+    viewport.getColumnSelection().clear();
+    viewport.setSelectionGroup(null);
+    PaintRefresher.Refresh(null);
+  }
+
+  public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
+  {
+    SequenceGroup sg = viewport.getSelectionGroup();
+    for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)
+      sg.addOrRemove (viewport.getAlignment().getSequenceAt(i));
+
+    PaintRefresher.Refresh(null);
+  }
+
+  public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
+  {
+    ColumnSelection colSel = viewport.getColumnSelection();
+    if (colSel.size() > 0)
+    {
+      addHistoryItem(new HistoryItem("Remove Left",viewport.alignment,
+                                     HistoryItem.HIDE));
+      int min = colSel.getMin();
+      viewport.getAlignment().trimLeft(min);
+      colSel.compensateForEdit(0,min);
+
+      if(viewport.getSelectionGroup()!=null)
+        viewport.getSelectionGroup().adjustForRemoveLeft(min);
+
+      Vector groups = viewport.alignment.getGroups();
+      for(int i=0; i<groups.size(); i++)
+      {
+        SequenceGroup sg = (SequenceGroup) groups.get(i);
+        if(!sg.adjustForRemoveLeft(min))
+          viewport.alignment.deleteGroup(sg);
+      }
+
+      alignPanel.repaint();
+    }
+  }
+
+  public void remove2RightMenuItem_actionPerformed(ActionEvent e)
+  {
+    ColumnSelection colSel = viewport.getColumnSelection();
+    if (colSel.size() > 0)
+    {
+      addHistoryItem(new HistoryItem("Remove Right",viewport.alignment,
+                                     HistoryItem.HIDE));
+
+      int max = colSel.getMax();
+      viewport.getAlignment().trimRight(max);
+      if(viewport.getSelectionGroup()!=null)
+        viewport.getSelectionGroup().adjustForRemoveRight(max);
+
+      Vector groups = viewport.alignment.getGroups();
+      for(int i=0; i<groups.size(); i++)
+      {
+        SequenceGroup sg = (SequenceGroup) groups.get(i);
+        if(!sg.adjustForRemoveRight(max))
+          viewport.alignment.deleteGroup(sg);
+      }
+
+
+
+      alignPanel.repaint();
+    }
+
+  }
+
+  public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
+  {
+    addHistoryItem(new HistoryItem("Remove Gapped Columns",
+                                   viewport.alignment,
+                                   HistoryItem.HIDE));
+
+    viewport.getAlignment().removeGaps();
+    viewport.updateConservation();
+    viewport.updateConsensus();
+    alignPanel.repaint();
+  }
+
+  public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
+  {
+    addHistoryItem(new HistoryItem("Remove Gaps",
+                                   viewport.alignment,
+                                   HistoryItem.HIDE));
+    SequenceI current;
+    int jSize;
+    for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
+    {
+      current = viewport.getAlignment().getSequenceAt(i);
+      jSize = current.getLength();
+      for (int j=0; j < jSize; j++)
+        if(jalview.util.Comparison.isGap(current.getCharAt(j)))
+        {
+          current.deleteCharAt(j);
+          j--;
+          jSize--;
+        }
+    }
+    viewport.updateConservation();
+    viewport.updateConsensus();
+    alignPanel.repaint();
+  }
+
+
+  public void padGapsMenuitem_actionPerformed(ActionEvent e)
+    {
+      addHistoryItem(new HistoryItem("Pad Gaps",
+                                     viewport.alignment,
+                                     HistoryItem.HIDE));
+      SequenceI current;
+      int Width = viewport.getAlignment().getWidth()-1;
+      for (int i=0; i < viewport.getAlignment().getSequences().size();i++)
+      {
+        current = viewport.getAlignment().getSequenceAt(i);
+
+        if (current.getLength()<Width)
+          current.insertCharAt(Width, viewport.getGapCharacter());
+      }
+      viewport.updateConservation();
+      viewport.updateConsensus();
+      alignPanel.repaint();
+  }
+
+
+  public void findMenuItem_actionPerformed(ActionEvent e)
+  {
+    JInternalFrame frame = new JInternalFrame();
+    Finder finder = new Finder(viewport, alignPanel, frame);
+    frame.setContentPane(finder);
+    Desktop.addInternalFrame(frame, "Find", 340,110);
+    frame.setLayer(JLayeredPane.PALETTE_LAYER);
+
+  }
+
+
+  public void font_actionPerformed(ActionEvent e)
+  {
+    FontChooser fc = new FontChooser( alignPanel );
+  }
+
+  protected void fullSeqId_actionPerformed(ActionEvent e)
+  {
+    viewport.setShowFullId( fullSeqId.isSelected() );
+
+    alignPanel.idPanel.idCanvas.setPreferredSize( alignPanel.calculateIdWidth() );
+    alignPanel.repaint();
+  }
+
+  protected void colourTextMenuItem_actionPerformed(ActionEvent e)
+  {
+      viewport.setColourText( colourTextMenuItem.isSelected() );
+      alignPanel.repaint();
+  }
+
+  protected void wrapMenuItem_actionPerformed(ActionEvent e)
+  {
+    viewport.setWrapAlignment( wrapMenuItem.isSelected() );
+    alignPanel.setWrapAlignment( wrapMenuItem.isSelected() );
+    scaleAbove.setVisible( wrapMenuItem.isSelected() );
+    scaleLeft.setVisible( wrapMenuItem.isSelected() );
+    scaleRight.setVisible( wrapMenuItem.isSelected() );
+    alignPanel.repaint();
+  }
+
+  protected void scaleAbove_actionPerformed(ActionEvent e)
+  {
+    viewport.setScaleAboveWrapped(scaleAbove.isSelected());
+    alignPanel.repaint();
+  }
+
+  protected void scaleLeft_actionPerformed(ActionEvent e)
+  {
+    viewport.setScaleLeftWrapped(scaleLeft.isSelected());
+    alignPanel.repaint();
+  }
+
+  protected void scaleRight_actionPerformed(ActionEvent e)
+  {
+    viewport.setScaleRightWrapped(scaleRight.isSelected());
+    alignPanel.repaint();
+  }
+
+
+
+  public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
+  {
+    viewport.setShowBoxes( viewBoxesMenuItem.isSelected() );
+    alignPanel.repaint();
+  }
+
+  public void viewTextMenuItem_actionPerformed(ActionEvent e)
+  {
+    viewport.setShowText( viewTextMenuItem.isSelected() );
+    alignPanel.repaint();
+  }
+
+
+  protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
+  {
+    viewport.setRenderGaps(renderGapsMenuItem.isSelected());
+    alignPanel.repaint();
+  }
+
+  public void sequenceFeatures_actionPerformed(ActionEvent evt)
+  {
+    viewport.showSequenceFeatures(sequenceFeatures.isSelected());
+    if(viewport.showSequenceFeatures && !((Alignment)viewport.alignment).featuresAdded)
+    {
+         SequenceFeatureFetcher sft = new SequenceFeatureFetcher(viewport.alignment, alignPanel);
+         ((Alignment)viewport.alignment).featuresAdded = true;
+    }
+    alignPanel.repaint();
+  }
+
+  public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
+  {
+    if(annotationPanelMenuItem.isSelected() && viewport.getWrapAlignment())
+    {
+      annotationPanelMenuItem.setSelected(false);
+      return;
+    }
+    viewport.setShowAnnotation( annotationPanelMenuItem.isSelected() );
+    alignPanel.setAnnotationVisible( annotationPanelMenuItem.isSelected() );
+  }
+
+  public void overviewMenuItem_actionPerformed(ActionEvent e)
+  {
+    if (alignPanel.overviewPanel != null)
+      return;
+
+    JInternalFrame frame = new JInternalFrame();
+    OverviewPanel overview = new OverviewPanel(alignPanel);
+     frame.setContentPane(overview);
+    Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
+                             frame.getWidth(), frame.getHeight());
+    frame.pack();
+    frame.setLayer(JLayeredPane.PALETTE_LAYER);
+    frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
+    { public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
+      {
+            alignPanel.setOverviewPanel(null);
+      };
+    });
+
+    alignPanel.setOverviewPanel( overview );
+
+
+  }
+
+  protected void noColourmenuItem_actionPerformed(ActionEvent e)
+  {
+    changeColour( null );
+  }
+
+
+  public void clustalColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));
+  }
+
+  public void zappoColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new ZappoColourScheme());
+  }
+
+  public void taylorColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new TaylorColourScheme());
+  }
+
+
+  public void hydrophobicityColour_actionPerformed(ActionEvent e)
+  {
+    changeColour( new HydrophobicColourScheme() );
+  }
+
+  public void helixColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new HelixColourScheme() );
+  }
+
+
+  public void strandColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new StrandColourScheme());
+  }
+
+
+  public void turnColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new TurnColourScheme());
+  }
+
+
+  public void buriedColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new BuriedColourScheme() );
+  }
+
+  public void nucleotideColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new NucleotideColourScheme());
+  }
+
+
+  protected void applyToAllGroups_actionPerformed(ActionEvent e)
+  {
+    viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
+  }
+
+
+
+  void changeColour(ColourSchemeI cs)
+  {
+    int threshold = 0;
+
+    if ( viewport.getAbovePIDThreshold() )
+    {
+      threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");
+
+      if (cs instanceof ResidueColourScheme)
+        ( (ResidueColourScheme) cs).setThreshold(threshold);
+      else if (cs instanceof ScoreColourScheme)
+        ( (ScoreColourScheme) cs).setThreshold(threshold);
+
+      viewport.setGlobalColourScheme(cs);
+    }
+    else if (cs instanceof ResidueColourScheme)
+      ( (ResidueColourScheme) cs).setThreshold(0);
+    else if (cs instanceof ScoreColourScheme)
+      ( (ScoreColourScheme) cs).setThreshold(0);
+
+
+
+    if (viewport.getConservationSelected())
+    {
+      ConservationColourScheme ccs = null;
+
+      Alignment al = (Alignment) viewport.alignment;
+      Conservation c = new Conservation("All",
+                                        ResidueProperties.propHash, 3,
+                                        al.getSequences(), 0,
+                                        al.getWidth() - 1);
+
+      c.calculate();
+      c.verdict(false, viewport.ConsPercGaps);
+
+      ccs = new ConservationColourScheme(c, cs);
+
+      // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
+      ccs.setConsensus( viewport.vconsensus );
+      viewport.setGlobalColourScheme(ccs);
+
+      ccs.inc = SliderPanel.setConservationSlider(alignPanel, ccs, "Background");
+
+    }
+    else
+    {
+        // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
+        if (cs != null)
+          cs.setConsensus(viewport.vconsensus);
+        viewport.setGlobalColourScheme(cs);
+    }
+
+
+    if(viewport.getColourAppliesToAllGroups())
+    {
+      Vector groups = viewport.alignment.getGroups();
+      for(int i=0; i<groups.size(); i++)
+      {
+        SequenceGroup sg = (SequenceGroup)groups.elementAt(i);
+
+        if(cs==null)
+          sg.cs = null;
+        else if (cs instanceof ClustalxColourScheme)
+          sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());
+        else if (cs instanceof UserColourScheme)
+          sg.cs = new UserColourScheme( ((UserColourScheme)cs).getColours());
+        else
+          try{
+            sg.cs = (ColourSchemeI) cs.getClass().newInstance();
+          }catch(Exception ex){}
+
+        if(viewport.getAbovePIDThreshold())
+        {
+          if (sg.cs instanceof ResidueColourScheme)
+            ( (ResidueColourScheme) sg.cs).setThreshold(threshold);
+          else if (sg.cs instanceof ScoreColourScheme)
+            ( (ScoreColourScheme) sg.cs).setThreshold(threshold);
+
+           sg.cs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()) );
+        }
+
+        if( viewport.getConservationSelected() )
+        {
+          Conservation c = new Conservation("Group",
+                                            ResidueProperties.propHash, 3,
+                                            sg.sequences, 0, viewport.alignment.getWidth()-1);
+          c.calculate();
+          c.verdict(false, viewport.ConsPercGaps);
+          ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);
+
+          // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
+          ccs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
+          sg.cs = ccs;
+        }
+        else if(cs!=null)
+        {
+          // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!
+          sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));
+        }
+
+      }
+    }
+
+    if(alignPanel.getOverviewPanel()!=null)
+      alignPanel.getOverviewPanel().updateOverviewImage();
+    alignPanel.repaint();
+  }
+
+  protected void modifyPID_actionPerformed(ActionEvent e)
+  {
+      if(viewport.getAbovePIDThreshold())
+      {
+        SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),
+                                   "Background");
+        SliderPanel.showPIDSlider();
+      }
+  }
+
+  protected void modifyConservation_actionPerformed(ActionEvent e)
+  {
+    if(viewport.getConservationSelected())
+    {
+      SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,
+                                        "Background");
+      SliderPanel.showConservationSlider();
+    }
+  }
+
+
+  protected  void conservationMenuItem_actionPerformed(ActionEvent e)
+  {
+    viewport.setConservationSelected(conservationMenuItem.isSelected());
+
+    viewport.setAbovePIDThreshold(false);
+    abovePIDThreshold.setSelected(false);
+
+   ColourSchemeI cs = viewport.getGlobalColourScheme();
+   if(cs instanceof ConservationColourScheme )
+     changeColour( ((ConservationColourScheme)cs).cs );
+    else
+      changeColour( cs );
+
+    modifyConservation_actionPerformed(null);
+  }
+
+  public void abovePIDThreshold_actionPerformed(ActionEvent e)
+  {
+    viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
+
+    conservationMenuItem.setSelected(false);
+    viewport.setConservationSelected(false);
+
+    ColourSchemeI cs = viewport.getGlobalColourScheme();
+
+    if(cs instanceof ConservationColourScheme )
+        changeColour( ((ConservationColourScheme)cs).cs );
+    else
+        changeColour( cs );
+
+    modifyPID_actionPerformed(null);
+  }
+
+
+
+  public void userDefinedColour_actionPerformed(ActionEvent e)
+  {
+    new UserDefinedColours( alignPanel, null);
+  }
+
+  public void PIDColour_actionPerformed(ActionEvent e)
+  {
+    changeColour( new PIDColourScheme() );
+  }
+
+
+  public void BLOSUM62Colour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new Blosum62ColourScheme() );
+  }
+
+
+
+  public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
+  {
+    addHistoryItem(new HistoryItem("Pairwise Sort", viewport.alignment, HistoryItem.SORT));
+    AlignmentSorter.sortByPID(viewport.getAlignment(), viewport.getAlignment().getSequenceAt(0));
+    alignPanel.repaint();
+  }
+
+  public void sortIDMenuItem_actionPerformed(ActionEvent e)
+  {
+    addHistoryItem(new HistoryItem("ID Sort", viewport.alignment, HistoryItem.SORT));
+    AlignmentSorter.sortByID( viewport.getAlignment() );
+    alignPanel.repaint();
+  }
+
+  public void sortGroupMenuItem_actionPerformed(ActionEvent e)
+  {
+    addHistoryItem(new HistoryItem("Group Sort", viewport.alignment, HistoryItem.SORT));
+  //  AlignmentSorter.sortByGroup(viewport.getAlignment());
+    AlignmentSorter.sortGroups(viewport.getAlignment());
+    alignPanel.repaint();
+  }
+
+  public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
+  {
+    RedundancyPanel sp = new RedundancyPanel(alignPanel,this);
+    JInternalFrame frame = new JInternalFrame();
+    frame.setContentPane(sp);
+    Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400, 100, false);
+
+  }
+
+  public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
+  {
+    if((viewport.getSelectionGroup()==null) ||
+       viewport.getSelectionGroup().getSize()<2)
+      JOptionPane.showInternalMessageDialog(this, "You must select at least 2 sequences.", "Invalid Selection", JOptionPane.WARNING_MESSAGE);
+    else
+    {
+      JInternalFrame frame = new JInternalFrame();
+      frame.setContentPane(new PairwiseAlignPanel(viewport));
+      Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
+    }
+  }
+
+  public void PCAMenuItem_actionPerformed(ActionEvent e)
+  {
+
+    if( (viewport.getSelectionGroup()!=null && viewport.getSelectionGroup().getSize()<4 && viewport.getSelectionGroup().getSize()>0)
+       || viewport.getAlignment().getHeight()<4)
+    {
+      JOptionPane.showInternalMessageDialog(this, "Principal component analysis must take\n"
+                                    +"at least 4 input sequences.",
+                                    "Sequence selection insufficient",
+                                    JOptionPane.WARNING_MESSAGE);
+      return;
+    }
+
+    try{
+      PCAPanel pcaPanel = new PCAPanel(viewport, null);
+      JInternalFrame frame = new JInternalFrame();
+      frame.setContentPane(pcaPanel);
+      Desktop.addInternalFrame(frame, "Principal component analysis", 400, 400);
+   }catch(java.lang.OutOfMemoryError ex)
+   {
+     JOptionPane.showInternalMessageDialog(this, "Too many sequences selected\nfor Principal Component Analysis!!",
+                                   "Out of memory", JOptionPane.WARNING_MESSAGE);
+   }
+
+
+  }
+
+  public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
+  {
+    NewTreePanel("AV", "PID", "Average distance tree using PID");
+  }
+
+  public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
+  {
+    NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
+  }
+
+
+  protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
+  {
+    NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
+  }
+
+  protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
+  {
+    NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
+  }
+
+  void NewTreePanel(String type, String pwType, String title)
+  {
+    String ltitle;
+    final TreePanel tp;
+    if (viewport.getSelectionGroup() != null &&
+        viewport.getSelectionGroup().getSize() > 3)
+    {
+      int s=0;
+      SequenceGroup sg = viewport.getSelectionGroup();
+
+      /* Decide if the selection is a column region */
+      while (s<sg.sequences.size()) {
+        if (((SequenceI) sg.sequences.elementAt(s++)).getLength()<sg.getEndRes()) {
+          JOptionPane.showMessageDialog(Desktop.desktop,
+                                        "The selected region to create a tree may\nonly contain residues or gaps.\n"
+                                       +"Try using the Pad function in the edit menu,\n"
+                                      +"or one of the multiple sequence alignment web services.",
+                                        "Sequences in selection are not aligned", JOptionPane.WARNING_MESSAGE);
+          return;
+        }
+
+      }
+      title=title+" on region";
+      tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,
+                         pwType,
+                         sg.getStartRes(), sg.getEndRes());
+    }
+    else
+    {
+
+     //are the sequences aligned?
+     if(!viewport.alignment.isAligned())
+     {
+       JOptionPane.showMessageDialog(Desktop.desktop, "The sequences must be aligned before creating a tree.\n"
+                                     +"Try using the Pad function in the edit menu,\n"
+                                     +"or one of the multiple sequence alignment web services.",
+                                     "Sequences not aligned", JOptionPane.WARNING_MESSAGE);
+       return;
+     }
+     tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),
+                        type, pwType, 0, viewport.alignment.getWidth());
+   }
+
+   addTreeMenuItem(tp, title);
+   viewport.setCurrentTree(tp.getTree());
+
+   Desktop.addInternalFrame(tp, title+" from "+this.title, 600, 500);
+  }
+
+  public void addSortByOrderMenuItem(String title, final AlignmentOrder order) {
+    final JMenuItem item = new JMenuItem("by "+title);
+    sort.add(item);
+    item.addActionListener(new java.awt.event.ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        addHistoryItem(new HistoryItem("Sort", viewport.alignment,
+                                       HistoryItem.SORT));
+        // TODO: JBPNote - have to map order entries to curent SequenceI pointers
+        AlignmentSorter.sortBy(viewport.getAlignment(), order);
+        alignPanel.repaint();
+      }
+    });
+  }
+
+  void addTreeMenuItem(final TreePanel treePanel, String title)
+  {
+    final JMenuItem item = new JMenuItem(title);
+
+    treeCount++;
+
+    if (treeCount==1)
+      sort.add(sortByTreeMenu);
+
+    sortByTreeMenu.add(item);
+    item.addActionListener(new java.awt.event.ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        addHistoryItem(new HistoryItem("Tree Sort", viewport.alignment,
+                                       HistoryItem.SORT));
+        AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());
+        alignPanel.repaint();
+      }
+    });
+
+    treePanel.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
+    {
+      public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt)
+      {
+        treeCount--;
+        sortByTreeMenu.remove(item);
+        if (treeCount==0)
+          sort.remove(sortByTreeMenu);
+      };
+    });
+    viewport.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
+      public void propertyChange(PropertyChangeEvent evt)
+      {
+        if (evt.getPropertyName().equals("alignment")) {
+          treePanel.getTree().UpdatePlaceHolders( (Vector) evt.getNewValue());
+          treePanel.repaint();
+        }
+      }
+
+    }
+    );
+  }
+
+
+  public void clustalAlignMenuItem_actionPerformed(ActionEvent e)
+  {
+      // TODO:resolve which menu item was actually selected
+      // Now, check we have enough sequences
+        SequenceI[] msa=null;
+        if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
+        {
+          // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
+          SequenceGroup seqs = viewport.getSelectionGroup();
+          int sz;
+          msa = new SequenceI[sz=seqs.getSize()];
+          for (int i = 0; i < sz; i++)
+          {
+            msa[i] = (SequenceI) seqs.getSequenceAt(i);
+          }
+
+          }
+        else
+        {
+          Vector seqs = viewport.getAlignment().getSequences();
+
+          if (seqs.size() > 1) {
+            msa = new SequenceI[seqs.size()];
+            for (int i = 0; i < seqs.size(); i++)
+            {
+              msa[i] = (SequenceI) seqs.elementAt(i);
+            }
+
+          }
+
+        }
+        if (msa!=null) {
+          jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS", title, msa, false, true);
+        }
+  }
+  public void ClustalRealign_actionPerformed(ActionEvent e)
+  {
+      // TODO:resolve which menu item was actually selected
+      // Now, check we have enough sequences
+        SequenceI[] msa=null;
+        if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
+        {
+          // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
+          SequenceGroup seqs = viewport.getSelectionGroup();
+          int sz;
+          msa = new SequenceI[sz=seqs.getSize()];
+          for (int i = 0; i < sz; i++)
+          {
+            msa[i] = (SequenceI) seqs.getSequenceAt(i);
+          }
+
+          }
+        else
+        {
+          Vector seqs = viewport.getAlignment().getSequences();
+
+          if (seqs.size() > 1) {
+            msa = new SequenceI[seqs.size()];
+            for (int i = 0; i < seqs.size(); i++)
+            {
+              msa[i] = (SequenceI) seqs.elementAt(i);
+            }
+
+          }
+
+        }
+        if (msa!=null) {
+          jalview.ws.MsaWSClient ct = new jalview.ws.MsaWSClient("ClustalWS", title, msa, true, true);
+        }
+  }
+
+
+  protected void jpred_actionPerformed(ActionEvent e)
+{
+    SequenceI seq=null;
+    SequenceI[] msa=null;
+
+    if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)
+    {
+      // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
+      SequenceGroup seqs = viewport.getSelectionGroup();
+      if (seqs.getSize() == 1 || !viewport.alignment.isAligned())
+      {
+        seq = (SequenceI)seqs.getSequenceAt(0);
+      }
+      else
+      {
+        int sz;
+        msa = new SequenceI[sz=seqs.getSize()];
+        for (int i = 0; i < sz; i++)
+        {
+          msa[i] = (SequenceI) seqs.getSequenceAt(i);
+        }
+      }
+    }
+    else
+    {
+      Vector seqs = viewport.getAlignment().getSequences();
+
+      if (seqs.size() == 1 || !viewport.alignment.isAligned())
+      {
+        seq = (SequenceI) seqs.elementAt(0);
+      }
+      else
+      {
+        msa = new SequenceI[seqs.size()];
+        for (int i = 0; i < seqs.size(); i++)
+        {
+          msa[i] = (SequenceI) seqs.elementAt(i);
+        }
+      }
+    }
+    if (msa!=null) {
+      JPredClient ct = new JPredClient(title, msa);
+    } else
+    if (seq!=null) {
+      JPredClient ct = new JPredClient(title, seq);
+    } else {
+      System.err.print("JALVIEW ERROR! - Unexpected JPred selection state!\n");
+    }
+  }
+  protected void msaAlignMenuItem_actionPerformed(ActionEvent e)
+  {
+    // TODO:resolve which menu item was actually selected
+    // Now, check we have enough sequences
+    SequenceI[] msa=null;
+    if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>1)
+      {
+        // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!
+        SequenceGroup seqs = viewport.getSelectionGroup();
+        int sz;
+        msa = new SequenceI[sz=seqs.getSize()];
+        for (int i = 0; i < sz; i++)
+        {
+          msa[i] = (SequenceI) seqs.getSequenceAt(i);
+        }
+
+
+      }
+      else
+      {
+        Vector seqs = viewport.getAlignment().getSequences();
+
+        if (seqs.size() > 1) {
+          msa = new SequenceI[seqs.size()];
+          for (int i = 0; i < seqs.size(); i++)
+          {
+            msa[i] = (SequenceI) seqs.elementAt(i);
+          }
+
+        }
+
+      }
+      if (msa!=null) {
+        MsaWSClient ct = new jalview.ws.MsaWSClient("MuscleWS",title, msa, false, true);
+      }
+  }
+    protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {
+    // Pick the tree file
+    JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
+        getProperty("LAST_DIRECTORY"));
+    chooser.setFileView(new JalviewFileView());
+    chooser.setDialogTitle("Select a newick-like tree file");
+    chooser.setToolTipText("Load a tree file");
+    int value = chooser.showOpenDialog(null);
+    if (value == JalviewFileChooser.APPROVE_OPTION)
+    {
+      String choice = chooser.getSelectedFile().getPath();
+      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
+      try
+      {
+        jalview.io.NewickFile fin = new jalview.io.NewickFile(choice, "File");
+        ShowNewickTree(fin, choice);
+      }
+      catch (Exception ex)
+      {
+        JOptionPane.showMessageDialog(Desktop.desktop,
+                                      "Problem reading tree file",
+                                      ex.getMessage(),
+                                      JOptionPane.WARNING_MESSAGE);
+        ex.printStackTrace();
+      }
+    }
+  }
+
+  public void ShowNewickTree(NewickFile nf, String title)
+  {
+    try{
+      nf.parse();
+      if (nf.getTree() != null)
+      {
+        TreePanel tp = new TreePanel(viewport,
+                                     viewport.getAlignment().getSequences(),
+                                     nf, "FromFile", title);
+        Desktop.addInternalFrame(tp, title, 600, 500);
+        addTreeMenuItem(tp, title);
+        viewport.setCurrentTree(tp.getTree());
+      }
+     }catch(Exception ex){ex.printStackTrace();}
+  }
+
+}