Applet files
authoramwaterhouse <Andrew Waterhouse>
Wed, 4 May 2005 15:10:21 +0000 (15:10 +0000)
committeramwaterhouse <Andrew Waterhouse>
Wed, 4 May 2005 15:10:21 +0000 (15:10 +0000)
39 files changed:
src/jalview/appletgui/APopupMenu.java [new file with mode: 0755]
src/jalview/appletgui/AlignFrame.java [new file with mode: 0755]
src/jalview/appletgui/AlignViewport.java [new file with mode: 0755]
src/jalview/appletgui/AlignmentPanel.java [new file with mode: 0755]
src/jalview/appletgui/AnnotationLabels.java [new file with mode: 0755]
src/jalview/appletgui/AnnotationPanel.java [new file with mode: 0755]
src/jalview/appletgui/ColumnSelection.java [new file with mode: 0755]
src/jalview/appletgui/CutAndPasteTransfer.java [new file with mode: 0755]
src/jalview/appletgui/FeatureRenderer.java [new file with mode: 0755]
src/jalview/appletgui/Finder.java [new file with mode: 0755]
src/jalview/appletgui/FontChooser.java [new file with mode: 0755]
src/jalview/appletgui/IdCanvas.java [new file with mode: 0755]
src/jalview/appletgui/IdPanel.java [new file with mode: 0755]
src/jalview/appletgui/IdwidthAdjuster.java [new file with mode: 0755]
src/jalview/appletgui/OverviewPanel.java [new file with mode: 0755]
src/jalview/appletgui/PCAPanel.java [new file with mode: 0755]
src/jalview/appletgui/PaintRefresher.java [new file with mode: 0755]
src/jalview/appletgui/PairwiseAlignPanel.java [new file with mode: 0755]
src/jalview/appletgui/RedundancyPanel.java [new file with mode: 0755]
src/jalview/appletgui/RotatableCanvas.java [new file with mode: 0755]
src/jalview/appletgui/ScalePanel.java [new file with mode: 0755]
src/jalview/appletgui/SeqCanvas.java [new file with mode: 0755]
src/jalview/appletgui/SeqPanel.java [new file with mode: 0755]
src/jalview/appletgui/SequenceRenderer.java [new file with mode: 0755]
src/jalview/appletgui/SliderPanel.java [new file with mode: 0755]
src/jalview/appletgui/TreeCanvas.java [new file with mode: 0755]
src/jalview/appletgui/TreePanel.java [new file with mode: 0755]
src/jalview/appletgui/UserDefinedColours.java [new file with mode: 0755]
src/jalview/bin/JalviewLite.java [new file with mode: 0755]
src/jalview/jbappletgui/GAlignFrame.java [new file with mode: 0755]
src/jalview/jbappletgui/GAlignmentPanel.java [new file with mode: 0755]
src/jalview/jbappletgui/GCutAndPasteTransfer.java [new file with mode: 0755]
src/jalview/jbappletgui/GFinder.java [new file with mode: 0755]
src/jalview/jbappletgui/GFontChooser.java [new file with mode: 0755]
src/jalview/jbappletgui/GPCAPanel.java [new file with mode: 0755]
src/jalview/jbappletgui/GPairwiseAlignPanel.java [new file with mode: 0755]
src/jalview/jbappletgui/GSliderPanel.java [new file with mode: 0755]
src/jalview/jbappletgui/GTreePanel.java [new file with mode: 0755]
src/jalview/jbappletgui/GUserDefinedColours.java [new file with mode: 0755]

diff --git a/src/jalview/appletgui/APopupMenu.java b/src/jalview/appletgui/APopupMenu.java
new file mode 100755 (executable)
index 0000000..b6d43ea
--- /dev/null
@@ -0,0 +1,530 @@
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.*;\r
+import jalview.analysis.*;\r
+import jalview.schemes.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+public class APopupMenu extends java.awt.PopupMenu\r
+{\r
+  Menu groupMenu = new Menu();\r
+  Menu analyze = new Menu();\r
+  Menu defineMenu = new Menu();\r
+  Menu groupName = new Menu();\r
+  Menu groupAnnotation = new Menu();\r
+  protected MenuItem clustalColour = new MenuItem();\r
+  protected MenuItem zappoColour = new MenuItem();\r
+  protected MenuItem taylorColour = new MenuItem();\r
+  protected MenuItem hydrophobicityColour = new MenuItem();\r
+  protected MenuItem helixColour = new MenuItem();\r
+  protected MenuItem strandColour = new MenuItem();\r
+  protected MenuItem turnColour = new MenuItem();\r
+  protected MenuItem buriedColour = new MenuItem();\r
+  protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();\r
+  protected MenuItem userDefinedColour = new MenuItem();\r
+  protected MenuItem PIDColour = new MenuItem();\r
+  protected MenuItem BLOSUM62Colour = new MenuItem();\r
+  MenuItem noColourmenuItem = new MenuItem();\r
+  protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
+\r
+\r
+  AlignmentPanel ap;\r
+  Menu sequenceMenu = new Menu();\r
+  MenuItem sequenceName = new MenuItem();\r
+  Menu residueMenu = new Menu();\r
+  MenuItem annotateResidue = new MenuItem();\r
+\r
+  Sequence sequence;\r
+  MenuItem unGroupMenuItem = new MenuItem();\r
+  MenuItem outline = new MenuItem();\r
+  MenuItem nucleotideMenuItem = new MenuItem();\r
+\r
+  public APopupMenu(AlignmentPanel ap, Sequence seq)\r
+  {\r
+    ///////////////////////////////////////////////////////////\r
+    // If this is activated from the sequence panel, the user may want to\r
+    // edit or annotate a particular residue. Therefore display the residue menu\r
+    //\r
+    // If from the IDPanel, we must display the sequence menu\r
+    //////////////////////////////////////////////////////////\r
+\r
+    this.ap = ap;\r
+    sequence = seq;\r
+\r
+    try\r
+    {     jbInit();   }\r
+    catch(Exception e)\r
+    {    e.printStackTrace();    }\r
+\r
+\r
+    if(seq!=null)\r
+      residueMenu.setEnabled(false);\r
+    else\r
+      sequenceMenu.setEnabled(false);\r
+\r
+  }\r
+  private void jbInit() throws Exception\r
+  {\r
+    groupMenu.setLabel("Group");\r
+    analyze.setLabel("Analyze");\r
+    analyze.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        analyze_actionPerformed(e);\r
+      }\r
+    });\r
+    defineMenu.setLabel("Define");\r
+    groupName.setLabel("Name");\r
+    groupName.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        groupName_actionPerformed(e);\r
+      }\r
+    });\r
+    groupAnnotation.setEnabled(false);\r
+    groupAnnotation.setLabel("Annotation");\r
+    groupAnnotation.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        groupAnnotation_actionPerformed(e);\r
+      }\r
+    });\r
+    sequenceMenu.setLabel("Sequence");\r
+    sequenceName.setLabel("Edit name");\r
+    sequenceName.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        sequenceName_actionPerformed(e);\r
+      }\r
+    });\r
+    residueMenu.setLabel("Residue");\r
+    annotateResidue.setEnabled(false);\r
+    annotateResidue.setActionCommand("annotate residue");\r
+    annotateResidue.setLabel("annotate residue???");\r
+    unGroupMenuItem.setLabel("Remove Group");\r
+    unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        unGroupMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+\r
+    outline.setLabel("Border colour");\r
+    outline.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        outline_actionPerformed(e);\r
+      }\r
+    });\r
+    nucleotideMenuItem.setLabel("Nucleotide");\r
+    nucleotideMenuItem.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        nucleotideMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+\r
+    add(groupMenu);\r
+    this.add(sequenceMenu);\r
+    this.add(residueMenu);\r
+    groupMenu.add(defineMenu);\r
+    groupMenu.add(unGroupMenuItem);\r
+    groupMenu.addSeparator();\r
+    groupMenu.add(analyze);\r
+    defineMenu.add(groupName);\r
+    defineMenu.add(groupAnnotation);\r
+    defineMenu.addSeparator();\r
+    defineMenu.add(outline);\r
+    defineMenu.addSeparator();\r
+    defineMenu.add(noColourmenuItem);\r
+    defineMenu.add(clustalColour);\r
+    defineMenu.add(BLOSUM62Colour);\r
+    defineMenu.add(PIDColour);\r
+\r
+    defineMenu.add(zappoColour);\r
+    defineMenu.add(taylorColour);\r
+    defineMenu.add(hydrophobicityColour);\r
+    defineMenu.add(helixColour);\r
+    defineMenu.add(strandColour);\r
+    defineMenu.add(turnColour);\r
+    defineMenu.add(buriedColour);\r
+    defineMenu.add(nucleotideMenuItem);\r
+\r
+    defineMenu.add(userDefinedColour);\r
+\r
+    defineMenu.addSeparator();\r
+    defineMenu.add(abovePIDColour);\r
+    defineMenu.add(conservationMenuItem);\r
+\r
+    sequenceMenu.add(sequenceName);\r
+    residueMenu.add(annotateResidue);\r
+\r
+    noColourmenuItem.setLabel("None");\r
+    noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        noColourmenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+\r
+    clustalColour.setLabel("Clustalx colours");\r
+    clustalColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        clustalColour_actionPerformed(e);\r
+      }\r
+    });\r
+    zappoColour.setLabel("Zappo");\r
+    zappoColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        zappoColour_actionPerformed(e);\r
+      }\r
+    });\r
+    taylorColour.setLabel("Taylor");\r
+    taylorColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        taylorColour_actionPerformed(e);\r
+      }\r
+    });\r
+    hydrophobicityColour.setLabel("Hydrophobicity");\r
+    hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        hydrophobicityColour_actionPerformed(e);\r
+      }\r
+    });\r
+    helixColour.setLabel("Helix propensity");\r
+    helixColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        helixColour_actionPerformed(e);\r
+      }\r
+    });\r
+    strandColour.setLabel("Strand propensity");\r
+    strandColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        strandColour_actionPerformed(e);\r
+      }\r
+    });\r
+    turnColour.setLabel("Turn propensity");\r
+    turnColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        turnColour_actionPerformed(e);\r
+      }\r
+    });\r
+    buriedColour.setLabel("Buried Index");\r
+    buriedColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        buriedColour_actionPerformed(e);\r
+      }\r
+    });\r
+    abovePIDColour.setLabel("Above % Identity");\r
+    abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        abovePIDColour_actionPerformed(e);\r
+      }\r
+    });\r
+    userDefinedColour.setLabel("User Defined");\r
+    userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        userDefinedColour_actionPerformed(e);\r
+      }\r
+    });\r
+    PIDColour.setLabel("Percentage Identity");\r
+    PIDColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        PIDColour_actionPerformed(e);\r
+      }\r
+    });\r
+    BLOSUM62Colour.setLabel("BLOSUM62");\r
+    BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        BLOSUM62Colour_actionPerformed(e);\r
+      }\r
+    });\r
+    conservationMenuItem.setLabel("Conservation");\r
+   conservationMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+   {\r
+     public void actionPerformed(ActionEvent e)\r
+     {\r
+       conservationMenuItem_actionPerformed(e);\r
+     }\r
+   });\r
+\r
+\r
+\r
+  }\r
+\r
+  void refresh()\r
+  {\r
+    SequenceGroup sg = getGroup();\r
+    SuperGroup superG = ap.av.alignment.getSuperGroup( sg );\r
+    if( superG !=null)\r
+      superG.setSuperGroupProperties( sg );\r
+\r
+    ap.seqPanel.repaint();\r
+  }\r
+\r
+  protected void clustalColour_actionPerformed(ActionEvent e)\r
+  {\r
+    SequenceGroup sg = getGroup();\r
+    sg.cs = new ClustalxColourScheme(sg.sequences, ap.av.alignment.getWidth());\r
+    refresh();\r
+  }\r
+\r
+  protected void zappoColour_actionPerformed(ActionEvent e)\r
+  {\r
+    getGroup().cs = new ZappoColourScheme();\r
+    refresh();\r
+  }\r
+\r
+  protected void taylorColour_actionPerformed(ActionEvent e)\r
+  {\r
+    getGroup().cs = new TaylorColourScheme();\r
+    refresh();\r
+  }\r
+\r
+\r
+  protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
+  {\r
+    getGroup().cs = new HydrophobicColourScheme();\r
+    refresh();\r
+  }\r
+\r
+  protected void helixColour_actionPerformed(ActionEvent e)\r
+  {\r
+    getGroup().cs = new HelixColourScheme();\r
+    refresh();\r
+  }\r
+\r
+  protected void strandColour_actionPerformed(ActionEvent e)\r
+  {\r
+    getGroup().cs = new StrandColourScheme();\r
+    refresh();\r
+  }\r
+\r
+  protected void turnColour_actionPerformed(ActionEvent e)\r
+  {\r
+    getGroup().cs = new TurnColourScheme();\r
+    refresh();\r
+  }\r
+\r
+  protected void buriedColour_actionPerformed(ActionEvent e)\r
+  {\r
+    getGroup().cs = new BuriedColourScheme();\r
+    refresh();\r
+  }\r
+\r
+  public void nucleotideMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    getGroup().cs = new NucleotideColourScheme();\r
+    refresh();\r
+  }\r
+\r
+\r
+\r
+  protected void abovePIDColour_actionPerformed(ActionEvent e)\r
+  {\r
+    SequenceGroup sg = getGroup();\r
+    if (abovePIDColour.getState())\r
+    {\r
+      sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
+                                               ap.av.alignment.getWidth()));\r
+      int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup().getName());\r
+      if (sg.cs instanceof ResidueColourScheme)\r
+        ( (ResidueColourScheme)sg. cs).setThreshold(threshold);\r
+      else if (sg.cs instanceof ScoreColourScheme)\r
+        ( (ScoreColourScheme) sg.cs).setThreshold(threshold);\r
+\r
+      SliderPanel.showPIDSlider();\r
+\r
+\r
+    }\r
+    else // remove PIDColouring\r
+    {\r
+      ResidueColourScheme rcs = (ResidueColourScheme) sg.cs;\r
+      rcs.setThreshold(0);\r
+      sg.cs = rcs;\r
+    }\r
+\r
+    refresh();\r
+\r
+  }\r
+\r
+\r
+  protected void userDefinedColour_actionPerformed(ActionEvent e)\r
+  {\r
+    UserDefinedColours chooser = new UserDefinedColours( ap, getGroup());\r
+  }\r
+\r
+  protected void PIDColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
+  {\r
+    SequenceGroup sg = getGroup();\r
+\r
+    sg.cs = new Blosum62ColourScheme();\r
+\r
+    sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0,\r
+                                               ap.av.alignment.getWidth()));\r
+\r
+    refresh();\r
+  }\r
+\r
+\r
+  protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    getGroup().cs = null;\r
+    refresh();\r
+  }\r
+\r
+  protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    SequenceGroup sg = getGroup();\r
+\r
+    if(conservationMenuItem.getState())\r
+    {\r
+\r
+        Conservation c = new Conservation("Group",\r
+                                          ResidueProperties.propHash, 3,\r
+                                          sg.sequences, 0,\r
+                                          ap.av.alignment.getWidth());\r
+\r
+        c.calculate();\r
+        c.verdict(false, ap.av.ConsPercGaps);\r
+        ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
+\r
+\r
+      sg.cs = ccs;\r
+\r
+      SliderPanel.setConservationSlider(ap, ccs, sg.getName());\r
+      SliderPanel.showConservationSlider();\r
+    }\r
+    else // remove ConservationColouring\r
+    {\r
+        ConservationColourScheme ccs = (ConservationColourScheme)sg.cs;\r
+        sg.cs = ccs.cs;\r
+    }\r
+\r
+     refresh();\r
+  }\r
+\r
+  protected void groupAnnotation_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void groupName_actionPerformed(ActionEvent e)\r
+  {\r
+  /*  SequenceGroup sg = getGroup();\r
+    String reply = JOptionPane.showInternalInputDialog(Desktop.desktop, "Enter new group name", "Edit group name", JOptionPane.QUESTION_MESSAGE);\r
+    if(reply==null)\r
+      return;\r
+\r
+    sg.setName(reply);\r
+    groupName.setLabel(reply);*/\r
+  }\r
+\r
+\r
+  protected void analyze_actionPerformed(ActionEvent e)\r
+  {\r
+     CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
+     Frame frame = new Frame();\r
+     frame.add(cap);\r
+     jalview.bin.JalviewLite.addFrame(frame, "Analyze this - ", 400, 300);\r
+     SequenceGroup sg = getGroup();\r
+     StringBuffer sb = new StringBuffer();\r
+\r
+     for(int i=0; i<sg.sequences.size(); i++)\r
+     {\r
+       Sequence tmp = (Sequence)sg.sequences.elementAt(i);\r
+       sb.append(  tmp.getSequence(sg.getStartRes(), sg.getEndRes()+1));\r
+       sb.append("\n");\r
+     }\r
+\r
+     sb.append("Something amazing will happen soon");\r
+     cap.setText( sb.toString() );\r
+\r
+  }\r
+\r
+  SequenceGroup getGroup()\r
+  {\r
+    SequenceGroup sg = ap.av.getSelectionGroup();\r
+\r
+    // this method won't add a new group if it already exists\r
+    ap.av.alignment.addGroup(sg);\r
+\r
+    return sg;\r
+  }\r
+\r
+  void sequenceName_actionPerformed(ActionEvent e)\r
+  {\r
+  /*  String id = sequence.getName();\r
+    String s = (String)JOptionPane.showInternalInputDialog(\r
+                ap,\r
+                "Edit sequence name",\r
+                "Edit sequence name ("+sequence.getName()+")",\r
+                JOptionPane.PLAIN_MESSAGE,\r
+                null,\r
+                null,\r
+                id);\r
+\r
+    if(s!=null)\r
+    {\r
+      sequence.setName(s);\r
+      ap.repaint();\r
+    }*/\r
+\r
+  }\r
+\r
+  void unGroupMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+     SequenceGroup sg = ap.av.getSelectionGroup();\r
+     ap.av.alignment.deleteGroup(sg);\r
+     ap.av.setSelectionGroup(null);\r
+     ap.repaint();\r
+  }\r
+\r
+\r
+  protected void outline_actionPerformed(ActionEvent e)\r
+  {\r
+  /*  SequenceGroup sg = getGroup();\r
+    Color col = JColorChooser.showDialog(this, "Select Outline Colour", Color.BLUE);\r
+    if(col!=null)\r
+      sg.setOutlineColour(col);*/\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/AlignFrame.java b/src/jalview/appletgui/AlignFrame.java
new file mode 100755 (executable)
index 0000000..28b7cb5
--- /dev/null
@@ -0,0 +1,978 @@
+/********************\r
+ * 2004 Jalview Reengineered\r
+ * Barton Group\r
+ * Dundee University\r
+ *\r
+ * AM Waterhouse\r
+ *******************/\r
+\r
+\r
+\r
+\r
+package jalview.appletgui;\r
+\r
+import jalview.jbappletgui.GAlignFrame;\r
+import jalview.schemes.*;\r
+import jalview.datamodel.*;\r
+import jalview.analysis.*;\r
+import jalview.io.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+\r
+public class AlignFrame extends GAlignFrame\r
+{\r
+  final AlignmentPanel alignPanel;\r
+  final AlignViewport  viewport;\r
+  public static final int NEW_WINDOW_WIDTH = 700;\r
+  public static final int NEW_WINDOW_HEIGHT = 500;\r
+  jalview.bin.JalviewLite applet;\r
+\r
+  public AlignFrame(AlignmentI al)\r
+  {\r
+    this.applet = null;\r
+    viewport = new AlignViewport(al, null);\r
+    alignPanel = new AlignmentPanel(this, viewport);\r
+    add(alignPanel);\r
+    alignPanel.validate();\r
+  }\r
+\r
+  public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet)\r
+  {\r
+    this.applet = applet;\r
+    viewport = new AlignViewport(al, applet);\r
+    alignPanel = new AlignmentPanel(this, viewport);\r
+    add(alignPanel);\r
+    alignPanel.validate();\r
+  }\r
+\r
+  public void inputText_actionPerformed(ActionEvent e)\r
+  {\r
+     CutAndPasteTransfer cap = new CutAndPasteTransfer(true);\r
+     Frame frame = new Frame();\r
+     frame.add(cap);\r
+     jalview.bin.JalviewLite.addFrame(frame, "Cut & Paste Input", 500,500);\r
+  }\r
+\r
+\r
+  protected void outputText_actionPerformed(ActionEvent e)\r
+  {\r
+     CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
+     Frame frame = new Frame();\r
+     frame.add(cap);\r
+     jalview.bin.JalviewLite.addFrame(frame,"Alignment output - "+e.getActionCommand(),600, 500);\r
+     cap.setText( FormatAdapter.formatSequences(e.getActionCommand(), viewport.getAlignment().getSequences()));\r
+  }\r
+\r
+  public void closeMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    dispose();\r
+  }\r
+\r
+  Stack historyList = new Stack();\r
+  Stack redoList = new Stack();\r
+\r
+  void updateEditMenuBar()\r
+  {\r
+    if(historyList.size()>0)\r
+     {\r
+       undoMenuItem.setEnabled(true);\r
+       Object [] history = (Object[])historyList.elementAt(0);\r
+       undoMenuItem.setLabel("Undo "+history[0]);\r
+     }\r
+    else\r
+    {\r
+      undoMenuItem.setEnabled(false);\r
+      undoMenuItem.setLabel("Undo");\r
+    }\r
+\r
+    if(redoList.size()>0)\r
+     {\r
+       redoMenuItem.setEnabled(true);\r
+       Object [] history = (Object[])redoList.elementAt(0);\r
+       redoMenuItem.setLabel("Redo "+history[0]);\r
+     }\r
+    else\r
+    {\r
+      redoMenuItem.setEnabled(false);\r
+      redoMenuItem.setLabel("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.removeAllElements();\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.addElement(new Object[]{type,  seq} );\r
+    updateEditMenuBar();\r
+  }\r
+\r
+  protected void undoMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    Object [] history = (Object[])historyList.elementAt(0);\r
+    historyList.removeElementAt(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.addElement(new Object[] {history[0], seq});\r
+\r
+      seq = (SequenceI[]) history[1];\r
+\r
+      AlignmentAnnotation[] old = viewport.alignment.getAlignmentAnnotation();\r
+      viewport.setAlignment(new Alignment(seq));\r
+      updateEditMenuBar();\r
+      for (int i = 0; i < old.length; i++)\r
+        viewport.alignment.addAnnotation(old[i]);\r
+\r
+      viewport.updateConservation();\r
+      viewport.updateConsensus();\r
+      alignPanel.repaint();\r
+  }\r
+\r
+  public void moveSelectedSequences(boolean up)\r
+  {\r
+    SequenceGroup sg = viewport.getSelectionGroup();\r
+    if (sg == null)\r
+      return;\r
+\r
+    if (up)\r
+    {\r
+      for (int i = 1; i < viewport.alignment.getHeight(); i++)\r
+      {\r
+        SequenceI seq = viewport.alignment.getSequenceAt(i);\r
+        if (!sg.sequences.contains(seq))\r
+          continue;\r
+\r
+        SequenceI temp = viewport.alignment.getSequenceAt(i - 1);\r
+        if (sg.sequences.contains(temp))\r
+          continue;\r
+\r
+        viewport.alignment.getSequences().setElementAt(temp, i);\r
+        viewport.alignment.getSequences().setElementAt(seq, i - 1);\r
+      }\r
+    }\r
+    else\r
+    {\r
+      for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)\r
+      {\r
+        SequenceI seq = viewport.alignment.getSequenceAt(i);\r
+        if (!sg.sequences.contains(seq))\r
+          continue;\r
+\r
+        SequenceI temp = viewport.alignment.getSequenceAt(i + 1);\r
+        if (sg.sequences.contains(temp))\r
+          continue;\r
+\r
+        viewport.alignment.getSequences().setElementAt(temp, i);\r
+        viewport.alignment.getSequences().setElementAt(seq, i + 1);\r
+      }\r
+    }\r
+\r
+    alignPanel.repaint();\r
+  }\r
+\r
+\r
+  StringBuffer copiedSequences;\r
+  protected void copy_actionPerformed(ActionEvent e)\r
+  {\r
+   if(viewport.getSelectionGroup()==null)\r
+     return;\r
+\r
+   SequenceGroup sg = viewport.getSelectionGroup();\r
+   copiedSequences = new StringBuffer();\r
+\r
+       for(int i=0; i<sg.getSize(); i++)\r
+       {\r
+         SequenceI seq = sg.getSequenceAt(i);\r
+         copiedSequences.append( seq.getName()+"\t"+seq.findPosition( sg.getStartRes() ) +"\t"\r
+                        +seq.findPosition( sg.getEndRes() )+ "\t"\r
+                        +sg.getSequenceAt(i).getSequence(sg.getStartRes(), sg.getEndRes()+1)+"\n");\r
+       }\r
+\r
+  }\r
+\r
+\r
+  protected void pasteNew_actionPerformed(ActionEvent e)\r
+  {\r
+    paste(true);\r
+  }\r
+\r
+  protected void pasteThis_actionPerformed(ActionEvent e)\r
+  {\r
+    addHistoryItem("Paste");\r
+    paste(false);\r
+  }\r
+\r
+  void paste(boolean newAlignment)\r
+  {\r
+    try{\r
+      if (copiedSequences == null)\r
+        return;\r
+\r
+      StringTokenizer st = new StringTokenizer(copiedSequences.toString());\r
+      Vector seqs = new Vector();\r
+      while (st.hasMoreElements())\r
+      {\r
+        String name = st.nextToken();\r
+        int start = Integer.parseInt(st.nextToken());\r
+        int end = Integer.parseInt(st.nextToken());\r
+        Sequence sequence = new Sequence(name,st.nextToken(), start, end);\r
+\r
+        if(!newAlignment)\r
+          viewport.alignment.addSequence(sequence);\r
+        else\r
+          seqs.addElement(sequence);\r
+      }\r
+\r
+      if(newAlignment)\r
+      {\r
+        SequenceI[] newSeqs = new SequenceI[seqs.size()];\r
+        for(int i=0; i<seqs.size(); i++)\r
+         newSeqs[i] = (SequenceI)seqs.elementAt(i);\r
+\r
+        AlignFrame af = new AlignFrame(new Alignment(newSeqs), applet);\r
+        jalview.bin.JalviewLite.addFrame(af, "Copied sequences", NEW_WINDOW_WIDTH, NEW_WINDOW_HEIGHT);\r
+      }\r
+      else\r
+      {\r
+        viewport.setEndSeq(viewport.alignment.getHeight());\r
+        viewport.alignment.getWidth();\r
+        viewport.updateConservation();\r
+        viewport.updateConsensus();\r
+        alignPanel.repaint();\r
+      }\r
+\r
+    }catch(Exception ex){}// could be anything being pasted in here\r
+\r
+  }\r
+\r
+\r
+  protected void cut_actionPerformed(ActionEvent e)\r
+  {\r
+    copy_actionPerformed(null);\r
+    delete_actionPerformed(null);\r
+  }\r
+\r
+  protected void delete_actionPerformed(ActionEvent e)\r
+  {\r
+    addHistoryItem("Delete");\r
+    if (viewport.getSelectionGroup() == null)\r
+      return;\r
+\r
+     SequenceGroup sg = viewport.getSelectionGroup();\r
+     for (int i=0;i < sg.sequences.size(); i++)\r
+     {\r
+       SequenceI seq = sg.getSequenceAt(i);\r
+       int index = viewport.getAlignment().findIndex(seq);\r
+       seq.deleteChars(sg.getStartRes(), sg.getEndRes()+1);\r
+\r
+       if(seq.getSequence().length()<1)\r
+          viewport.getAlignment().deleteSequence(seq);\r
+      else\r
+          viewport.getAlignment().getSequences().setElementAt(seq, index);\r
+     }\r
+\r
+     viewport.setSelectionGroup(null);\r
+     viewport.alignment.deleteGroup(sg);\r
+     viewport.resetSeqLimits( alignPanel.seqPanel.seqCanvas.getSize().height);\r
+     if(viewport.getAlignment().getHeight()<1)\r
+     try\r
+     {\r
+       this.setVisible(false);\r
+     }catch(Exception ex){}\r
+   viewport.updateConservation();\r
+   viewport.updateConsensus();\r
+     alignPanel.repaint();\r
+\r
+  }\r
+\r
+\r
+\r
+  protected void redoMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+     Object [] history = (Object[])redoList.pop();\r
+     SequenceI[] seq = (SequenceI[]) history[1];\r
+\r
+     AlignmentAnnotation[] old = viewport.alignment.getAlignmentAnnotation();\r
+     viewport.setAlignment(new Alignment(seq));\r
+     for (int i = 0; i < old.length; i++)\r
+       viewport.alignment.addAnnotation(old[i]);\r
+\r
+     viewport.updateConservation();\r
+     viewport.updateConsensus();\r
+     updateEditMenuBar();\r
+     alignPanel.repaint();\r
+  }\r
+\r
+\r
+  protected void deleteGroups_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.alignment.deleteAllGroups();\r
+    viewport.setSelectionGroup(null);\r
+\r
+    alignPanel.repaint();\r
+  }\r
+\r
+\r
+\r
+  public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    SequenceGroup sg = new SequenceGroup();\r
+    for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
+      sg.addSequence( viewport.getAlignment().getSequenceAt(i));\r
+    sg.setEndRes(viewport.alignment.getWidth());\r
+    viewport.setSelectionGroup(sg);\r
+    alignPanel.repaint();\r
+    PaintRefresher.Refresh(null);\r
+  }\r
+\r
+  public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setSelectionGroup(null);\r
+    viewport.getColumnSelection().clear();\r
+    viewport.setSelectionGroup(null);\r
+    PaintRefresher.Refresh(null);\r
+  }\r
+\r
+  public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    SequenceGroup sg = viewport.getSelectionGroup();\r
+    for (int i=0; i<viewport.getAlignment().getSequences().size(); i++)\r
+      sg.addOrRemove (viewport.getAlignment().getSequenceAt(i));\r
+\r
+    PaintRefresher.Refresh(null);\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
+\r
+      if(viewport.getSelectionGroup()!=null)\r
+        viewport.getSelectionGroup().adjustForRemoveLeft(min);\r
+\r
+      Vector groups = viewport.alignment.getGroups();\r
+      for(int i=0; i<groups.size(); i++)\r
+      {\r
+        SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
+        if(!sg.adjustForRemoveLeft(min))\r
+          viewport.alignment.deleteGroup(sg);\r
+      }\r
+\r
+      alignPanel.repaint();\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
+      viewport.getAlignment().trimRight(max);\r
+      if(viewport.getSelectionGroup()!=null)\r
+        viewport.getSelectionGroup().adjustForRemoveRight(max);\r
+\r
+      Vector groups = viewport.alignment.getGroups();\r
+      for(int i=0; i<groups.size(); i++)\r
+      {\r
+        SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
+        if(!sg.adjustForRemoveRight(max))\r
+          viewport.alignment.deleteGroup(sg);\r
+      }\r
+\r
+\r
+\r
+      alignPanel.repaint();\r
+    }\r
+\r
+  }\r
+\r
+  public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    addHistoryItem("delete gapped columns");\r
+    viewport.getAlignment().removeGaps();\r
+    viewport.updateConservation();\r
+    viewport.updateConsensus();\r
+    alignPanel.repaint();\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(jalview.util.Comparison.isGap(current.getCharAt(j)))\r
+        {\r
+          current.deleteCharAt(j);\r
+          j--;\r
+          jSize--;\r
+        }\r
+    }\r
+    viewport.updateConservation();\r
+    viewport.updateConsensus();\r
+    alignPanel.repaint();\r
+  }\r
+\r
+\r
+  public void findMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    Finder finder = new Finder(alignPanel);\r
+  }\r
+\r
+\r
+  public void font_actionPerformed(ActionEvent e)\r
+  {\r
+    Frame frame = new Frame();\r
+    FontChooser fc = new FontChooser( alignPanel, frame);\r
+    frame.add(fc);\r
+    jalview.bin.JalviewLite.addFrame(frame, "Change Font", 440,100);\r
+\r
+  }\r
+\r
+  protected void fullSeqId_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setShowFullId( fullSeqId.getState() );\r
+    alignPanel.idPanel.idCanvas.setSize( alignPanel.calculateIdWidth() );\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+      viewport.setColourText( colourTextMenuItem.getState() );\r
+      alignPanel.repaint();\r
+  }\r
+\r
+  protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setWrapAlignment( wrapMenuItem.getState() );\r
+    alignPanel.setWrapAlignment( wrapMenuItem.getState() );\r
+    scaleAbove.setEnabled( wrapMenuItem.getState() );\r
+    scaleLeft.setEnabled( wrapMenuItem.getState());\r
+    scaleRight.setEnabled( wrapMenuItem.getState());\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  protected void scaleAbove_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setScaleAboveWrapped(scaleAbove.getState());\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  protected void scaleLeft_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setScaleLeftWrapped(scaleLeft.getState());\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  protected void scaleRight_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setScaleRightWrapped(scaleRight.getState());\r
+    alignPanel.repaint();\r
+  }\r
+\r
+\r
+\r
+  public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setShowBoxes( viewBoxesMenuItem.getState() );\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setShowText( viewTextMenuItem.getState() );\r
+    alignPanel.repaint();\r
+  }\r
+\r
+\r
+  protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setRenderGaps(renderGapsMenuItem.getState());\r
+    alignPanel.repaint();\r
+  }\r
+\r
+\r
+  public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    if(annotationPanelMenuItem.getState() && viewport.getWrapAlignment())\r
+    {\r
+      annotationPanelMenuItem.setState(false);\r
+      return;\r
+    }\r
+    viewport.setShowAnnotation( annotationPanelMenuItem.getState() );\r
+    alignPanel.setAnnotationVisible( annotationPanelMenuItem.getState() );\r
+  }\r
+\r
+  public void overviewMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+   if (alignPanel.overviewPanel != null)\r
+      return;\r
+\r
+    Frame frame = new Frame();\r
+    OverviewPanel overview = new OverviewPanel(alignPanel);\r
+    frame.add(overview);\r
+    // +50 must allow for applet frame window\r
+    jalview.bin.JalviewLite.addFrame(frame, "Overview " + this.getTitle(),\r
+                             overview.preferredSize().width, overview.preferredSize().height+50);\r
+\r
+    frame.pack();\r
+    frame.addWindowListener(new WindowAdapter()\r
+    { public void windowClosing(WindowEvent e)\r
+      {\r
+            alignPanel.setOverviewPanel(null);\r
+      };\r
+    });\r
+\r
+    alignPanel.setOverviewPanel( overview );\r
+\r
+\r
+  }\r
+\r
+  protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour( null );\r
+  }\r
+\r
+\r
+  public void clustalColour_actionPerformed(ActionEvent e)\r
+  {\r
+    abovePIDThreshold.setState(false);\r
+    changeColour(new ClustalxColourScheme(viewport.alignment.getSequences(), viewport.alignment.getWidth()));\r
+  }\r
+\r
+  public void zappoColour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour(new ZappoColourScheme());\r
+  }\r
+\r
+  public void taylorColour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour(new TaylorColourScheme());\r
+  }\r
+\r
+\r
+  public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour( new HydrophobicColourScheme() );\r
+  }\r
+\r
+  public void helixColour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour(new HelixColourScheme() );\r
+  }\r
+\r
+\r
+  public void strandColour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour(new StrandColourScheme());\r
+  }\r
+\r
+\r
+  public void turnColour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour(new TurnColourScheme());\r
+  }\r
+\r
+\r
+  public void buriedColour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour(new BuriedColourScheme() );\r
+  }\r
+\r
+  public void nucleotideColour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour(new NucleotideColourScheme());\r
+  }\r
+\r
+\r
+  protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());\r
+  }\r
+\r
+\r
+\r
+  void changeColour(ColourSchemeI cs)\r
+  {\r
+    int threshold = 0;\r
+\r
+    if ( viewport.getAbovePIDThreshold() )\r
+    {\r
+      threshold = SliderPanel.setPIDSliderSource(alignPanel, cs, "Background");\r
+\r
+      if (cs instanceof ResidueColourScheme)\r
+        ( (ResidueColourScheme) cs).setThreshold(threshold);\r
+      else if (cs instanceof ScoreColourScheme)\r
+        ( (ScoreColourScheme) cs).setThreshold(threshold);\r
+\r
+      viewport.setGlobalColourScheme(cs);\r
+    }\r
+    else if (cs instanceof ResidueColourScheme)\r
+      ( (ResidueColourScheme) cs).setThreshold(0);\r
+    else if (cs instanceof ScoreColourScheme)\r
+      ( (ScoreColourScheme) cs).setThreshold(0);\r
+\r
+\r
+\r
+    if (viewport.getConservationSelected())\r
+    {\r
+      ConservationColourScheme ccs = null;\r
+\r
+      Alignment al = (Alignment) viewport.alignment;\r
+      Conservation c = new Conservation("All",\r
+                                        ResidueProperties.propHash, 3,\r
+                                        al.getSequences(), 0,\r
+                                        al.getWidth() - 1);\r
+\r
+      c.calculate();\r
+      c.verdict(false, viewport.ConsPercGaps);\r
+\r
+      ccs = new ConservationColourScheme(c, cs);\r
+\r
+      // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
+      ccs.setConsensus( viewport.vconsensus );\r
+      viewport.setGlobalColourScheme(ccs);\r
+\r
+      SliderPanel.setConservationSlider(alignPanel, ccs, "Background");\r
+\r
+    }\r
+    else\r
+    {\r
+        // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
+        if (cs != null)\r
+          cs.setConsensus(viewport.vconsensus);\r
+        viewport.setGlobalColourScheme(cs);\r
+    }\r
+\r
+\r
+    if(viewport.getColourAppliesToAllGroups())\r
+    {\r
+      Vector groups = viewport.alignment.getGroups();\r
+      for(int i=0; i<groups.size(); i++)\r
+      {\r
+        SequenceGroup sg = (SequenceGroup)groups.elementAt(i);\r
+\r
+        if (cs instanceof ClustalxColourScheme)\r
+        {\r
+          sg.cs = new ClustalxColourScheme(sg.sequences, sg.getWidth());\r
+        }\r
+        else\r
+          try\r
+          {\r
+            sg.cs = (ColourSchemeI) cs.getClass().newInstance();\r
+          }\r
+          catch (Exception ex)\r
+          {\r
+            ex.printStackTrace();\r
+            sg.cs = cs;\r
+          }\r
+\r
+        if(viewport.getAbovePIDThreshold())\r
+        {\r
+          if (sg.cs instanceof ResidueColourScheme)\r
+            ( (ResidueColourScheme) sg.cs).setThreshold(threshold);\r
+          else if (sg.cs instanceof ScoreColourScheme)\r
+            ( (ScoreColourScheme) sg.cs).setThreshold(threshold);\r
+\r
+           sg.cs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()) );\r
+        }\r
+\r
+        if( viewport.getConservationSelected() )\r
+        {\r
+          Conservation c = new Conservation("Group",\r
+                                            ResidueProperties.propHash, 3,\r
+                                            sg.sequences, 0, viewport.alignment.getWidth()-1);\r
+          c.calculate();\r
+          c.verdict(false, viewport.ConsPercGaps);\r
+          ConservationColourScheme ccs = new ConservationColourScheme(c, sg.cs);\r
+\r
+          // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
+          ccs.setConsensus( AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
+          sg.cs = ccs;\r
+        }\r
+        else\r
+        {\r
+          // MUST NOTIFY THE COLOURSCHEME OF CONSENSUS!\r
+          sg.cs.setConsensus(AAFrequency.calculate(sg.sequences, 0, sg.getWidth()));\r
+        }\r
+\r
+      }\r
+    }\r
+\r
+    if(alignPanel.getOverviewPanel()!=null)\r
+      alignPanel.getOverviewPanel().updateOverviewImage();\r
+\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  protected void modifyPID_actionPerformed(ActionEvent e)\r
+  {\r
+      if(viewport.getAbovePIDThreshold())\r
+      {\r
+        SliderPanel.setPIDSliderSource(alignPanel, viewport.getGlobalColourScheme(),\r
+                                   "Background");\r
+        SliderPanel.showPIDSlider();\r
+      }\r
+  }\r
+\r
+  protected void modifyConservation_actionPerformed(ActionEvent e)\r
+  {\r
+    if(viewport.getConservationSelected())\r
+    {\r
+      SliderPanel.setConservationSlider(alignPanel, viewport.globalColourScheme,\r
+                                        "Background");\r
+      SliderPanel.showConservationSlider();\r
+    }\r
+  }\r
+\r
+\r
+  protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setConservationSelected(conservationMenuItem.getState());\r
+\r
+    viewport.setAbovePIDThreshold(false);\r
+    abovePIDThreshold.setState(false);\r
+\r
+   ColourSchemeI cs = viewport.getGlobalColourScheme();\r
+   if(cs instanceof ConservationColourScheme )\r
+     changeColour( ((ConservationColourScheme)cs).cs );\r
+    else\r
+      changeColour( cs );\r
+\r
+    modifyConservation_actionPerformed(null);\r
+  }\r
+\r
+  public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
+  {\r
+    viewport.setAbovePIDThreshold(abovePIDThreshold.getState());\r
+\r
+    conservationMenuItem.setState(false);\r
+    viewport.setConservationSelected(false);\r
+\r
+    ColourSchemeI cs = viewport.getGlobalColourScheme();\r
+\r
+    if(cs instanceof ConservationColourScheme )\r
+        changeColour( ((ConservationColourScheme)cs).cs );\r
+    else\r
+        changeColour( cs );\r
+\r
+    modifyPID_actionPerformed(null);\r
+  }\r
+\r
+\r
+\r
+  public void userDefinedColour_actionPerformed(ActionEvent e)\r
+  {\r
+    UserDefinedColours chooser = new UserDefinedColours( alignPanel, null);\r
+  }\r
+\r
+  public void PIDColour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour( new PIDColourScheme() );\r
+  }\r
+\r
+\r
+  public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
+  {\r
+    changeColour(new Blosum62ColourScheme() );\r
+  }\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.repaint();\r
+  }\r
+\r
+  public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    addHistoryItem("sort");\r
+    AlignmentSorter.sortByID( viewport.getAlignment() );\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    addHistoryItem("sort");\r
+    AlignmentSorter.sortByGroup(viewport.getAlignment());\r
+    AlignmentSorter.sortGroups(viewport.getAlignment());\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    RedundancyPanel sp = new RedundancyPanel(alignPanel);\r
+    Frame frame = new Frame();\r
+    frame.add(sp);\r
+    jalview.bin.JalviewLite.addFrame(frame, "Redundancy threshold selection", 400, 120);\r
+\r
+  }\r
+\r
+  public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+    if(viewport.getSelectionGroup().getSize()>1)\r
+    {\r
+      Frame frame = new Frame();\r
+      frame.add(new PairwiseAlignPanel(viewport));\r
+      jalview.bin.JalviewLite.addFrame(frame, "Pairwise Alignment", 600, 500);\r
+    }\r
+  }\r
+\r
+  public void PCAMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+    if( (viewport.getSelectionGroup()!=null && viewport.getSelectionGroup().getSize()<4 && viewport.getSelectionGroup().getSize()>0)\r
+       || viewport.getAlignment().getHeight()<4)\r
+    {\r
+      return;\r
+    }\r
+\r
+    try{\r
+      PCAPanel pcaPanel = new PCAPanel(viewport, null);\r
+      Frame frame = new Frame();\r
+      frame.add(pcaPanel);\r
+      jalview.bin.JalviewLite.addFrame(frame, "Principal component analysis", 400, 400);\r
+   }catch(java.lang.OutOfMemoryError ex)\r
+   {\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
+    //are the sequences aligned?\r
+    if(!viewport.alignment.isAligned())\r
+    {\r
+      return;\r
+    }\r
+\r
+    final TreePanel tp;\r
+    if (viewport.getSelectionGroup() != null &&\r
+        viewport.getSelectionGroup().getSize() > 3)\r
+    {\r
+      tp = new TreePanel(viewport, viewport.getSelectionGroup().sequences, type,\r
+                         pwType,\r
+                         0, viewport.alignment.getWidth());\r
+    }\r
+    else\r
+    {\r
+      tp = new TreePanel(viewport, viewport.getAlignment().getSequences(),\r
+                         type, pwType, 0, viewport.alignment.getWidth());\r
+    }\r
+\r
+   addTreeMenuItem(tp, title);\r
+\r
+   jalview.bin.JalviewLite.addFrame(tp, title, 600, 500);\r
+  }\r
+\r
+  void addTreeMenuItem(final TreePanel treePanel, String title)\r
+  {\r
+    final MenuItem item = new MenuItem(title);\r
+    sortByTreeMenu.add(item);\r
+    item.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        addHistoryItem("sort");\r
+        AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel.getTree());\r
+        alignPanel.repaint();\r
+      }\r
+    });\r
+\r
+    treePanel.addWindowListener(new WindowAdapter()\r
+    {\r
+      public void windowClosing(WindowEvent e)\r
+      {\r
+        sortByTreeMenu.remove(item);\r
+      };\r
+    });\r
+  }\r
+\r
+  protected void documentation_actionPerformed(ActionEvent e) {\r
+\r
+    jalview.bin.JalviewLite.showURL("http://www.jalview.org");\r
+\r
+  }\r
+\r
+  protected void about_actionPerformed(ActionEvent e)\r
+  {\r
+    class AboutPanel extends Canvas\r
+    {\r
+      public void paint(Graphics g)\r
+      {\r
+        g.setColor(Color.white);\r
+        g.fillRect(0,0,getSize().width, getSize().height);\r
+        g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
+        FontMetrics fm = g.getFontMetrics();\r
+        int fh = fm.getHeight();\r
+        int y=20, x=7;\r
+        g.setColor(Color.black);\r
+        g.setFont(new Font("Helvetica", Font.BOLD, 14));\r
+        g.drawString("JalView 2005", 200,y+=fh);\r
+        g.setFont(new Font("Helvetica", Font.PLAIN, 12));\r
+        g.drawString("Authors:  Michele Clamp, James Cuff, Steve Searle, Andrew Waterhouse, Jim Procter & Geoff Barton.",x,y+=fh*2);\r
+        g.drawString("Current development managed by Andrew Waterhouse; Barton Group, University of Dundee.",x,y+=fh);\r
+        g.drawString("If  you use JalView, please cite:",x,y+=fh+8);\r
+        g.drawString("\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",x,y+=fh);\r
+        g.drawString("Bioinformatics,  2004 12;426-7.",x,y+=fh);\r
+      }\r
+    }\r
+    Frame frame = new Frame();\r
+    frame.add(new AboutPanel());\r
+    jalview.bin.JalviewLite.addFrame(frame, "Jalview 2005", 580,200);\r
+\r
+\r
+\r
+  }\r
+}\r
diff --git a/src/jalview/appletgui/AlignViewport.java b/src/jalview/appletgui/AlignViewport.java
new file mode 100755 (executable)
index 0000000..0b6ec1a
--- /dev/null
@@ -0,0 +1,505 @@
+package jalview.appletgui;\r
+\r
+import java.awt.*;\r
+import jalview.bin.*;\r
+import jalview.analysis.*;\r
+import jalview.datamodel.*;\r
+import jalview.schemes.*;\r
+import java.util.*;\r
+\r
+public class AlignViewport\r
+{\r
+  int startRes;\r
+  int endRes;\r
+\r
+  int startSeq;\r
+  int endSeq;\r
+\r
+  boolean showFullId = true;\r
+  boolean showText=true;\r
+  boolean showColourText=false;\r
+  boolean showBoxes=true;\r
+  boolean wrapAlignment=false;\r
+  boolean renderGaps = true;\r
+  boolean showSequenceFeatures = false;\r
+  boolean showAnnotation = true;\r
+  boolean showConservation = true;\r
+  boolean showQuality = true;\r
+  boolean showConsensus = true;\r
+\r
+  boolean colourAppliesToAllGroups = true;\r
+  ColourSchemeI globalColourScheme = null;\r
+  boolean conservationColourSelected = false;\r
+  boolean abovePIDThreshold = false;\r
+\r
+  SequenceGroup selectionGroup = new SequenceGroup();\r
+\r
+  int             charHeight;\r
+  int             charWidth;\r
+  int             chunkWidth;\r
+  int             chunkHeight;\r
+\r
+  Font            font = new Font("SansSerif",Font.PLAIN,10);\r
+  AlignmentI      alignment;\r
+\r
+  ColumnSelection colSel = new ColumnSelection();\r
+\r
+  int threshold;\r
+  int increment;\r
+\r
+  NJTree currentTree = null;\r
+\r
+  boolean scaleAboveWrapped = true;\r
+  boolean scaleLeftWrapped  = true;\r
+  boolean scaleRightWrapped = true;\r
+\r
+  public AlignViewport(AlignmentI al, JalviewLite applet)\r
+  {\r
+    setAlignment(al);\r
+    this.startRes = 0;\r
+    this.endRes = al.getWidth()-1;\r
+    this.startSeq = 0;\r
+    this.endSeq = al.getHeight()-1;\r
+    setFont(font);\r
+\r
+\r
+    if(applet!=null)\r
+    {\r
+      String param = applet.getParameter("showFullId");\r
+      if (param != null)\r
+        showFullId = Boolean.valueOf(param).booleanValue();\r
+\r
+      param = applet.getParameter("showAnnotation");\r
+      if (param != null)\r
+        showAnnotation = Boolean.valueOf(param).booleanValue();\r
+\r
+      param = applet.getParameter("showConservation");\r
+      if (param != null)\r
+        showConservation = Boolean.valueOf(param).booleanValue();\r
+\r
+      param = applet.getParameter("showQuality");\r
+      if (param != null)\r
+        showQuality = Boolean.valueOf(param).booleanValue();\r
+\r
+      param = applet.getParameter("showConsensus");\r
+      if (param != null)\r
+        showConsensus = Boolean.valueOf(param).booleanValue();\r
+    }\r
+    // We must set conservation and consensus before setting colour,\r
+    // as Blosum and Clustal require this to be done\r
+    updateConservation();\r
+    updateConsensus();\r
+\r
+    if(applet!=null && applet.getParameter("defaultColour")!=null)\r
+    {\r
+      globalColourScheme = ColourSchemeProperty.getColour(alignment,\r
+          applet.getParameter("defaultColour"));\r
+      if(globalColourScheme!=null)\r
+        globalColourScheme.setConsensus( vconsensus );\r
+   }\r
+ }\r
+\r
+\r
+ public void showSequenceFeatures(boolean b)\r
+ {\r
+   showSequenceFeatures = b;\r
+ }\r
+\r
+  public Vector vconsensus;\r
+  AlignmentAnnotation consensus;\r
+  AlignmentAnnotation conservation;\r
+  AlignmentAnnotation quality;\r
+\r
+  public int ConsPercGaps = 25; // JBPNote : This should be a scalable property!\r
+\r
+  public void updateConservation()\r
+  {\r
+    Conservation cons = new jalview.analysis.Conservation("All",\r
+        jalview.schemes.ResidueProperties.propHash, 3,\r
+        alignment.getSequences(), 0,\r
+        alignment.getWidth()-1);\r
+    cons.calculate();\r
+    cons.verdict(false, ConsPercGaps);\r
+    cons.findQuality();\r
+    int alWidth = alignment.getWidth();\r
+    Annotation [] annotations = new Annotation[alWidth];\r
+    Annotation [] qannotations = new Annotation[alWidth];\r
+    String sequence = cons.getConsSequence().getSequence();\r
+    float minR,minG,minB, maxR,maxG,maxB;\r
+    minR = 0.3f;\r
+    minG = 0.0f;\r
+    minB = 0f;\r
+    maxR = 1.0f-minR; maxG=0.9f-minG; maxB=0f-minB; // scalable range for colouring both Conservation and Quality\r
+    float min = 0f;\r
+    float max = 11f;\r
+    float qmin = cons.qualityRange[0].floatValue();\r
+    float qmax = cons.qualityRange[1].floatValue();\r
+\r
+    for (int i = 0; i < alWidth; i++)\r
+    {\r
+      float value = 0;\r
+      try\r
+        {\r
+          value = Integer.parseInt(sequence.charAt(i) + "");\r
+        }\r
+      catch (Exception ex)\r
+        {\r
+          if (sequence.charAt(i) == '*') value = 11;\r
+          if (sequence.charAt(i) == '+') value = 10;\r
+        }\r
+      float vprop = value-min;\r
+      vprop/=max;\r
+      annotations[i] = new Annotation(sequence.charAt(i) + "",\r
+                                      "Conservation graph", ' ', value, new Color(minR+maxR*vprop, minG+maxG*vprop, minB+maxB*vprop));\r
+      // Quality calc\r
+      value = ((Double) cons.quality.elementAt(i)).floatValue();\r
+      vprop = value - qmin;\r
+      vprop/=qmax;\r
+      qannotations[i] = new Annotation(" ",\r
+                                      String.valueOf(value), ' ', value, new Color(minR+maxR*vprop, minG+maxG*vprop, minB+maxB*vprop));\r
+    }\r
+\r
+    if(conservation==null)\r
+    {\r
+      conservation = new AlignmentAnnotation("Conservation",\r
+                                             "Conservation of total alignment less than "+ConsPercGaps+"% gaps",\r
+                                             annotations,\r
+                                             0f, // cons.qualityRange[0].floatValue(),\r
+                                             11f, // cons.qualityRange[1].floatValue()\r
+                                             1);\r
+      if(showConservation)\r
+      alignment.addAnnotation(conservation);\r
+      quality = new AlignmentAnnotation("Quality",\r
+                                        "Alignment Quality based on Blosum62 scores",\r
+                                        qannotations,\r
+                                        cons.qualityRange[0].floatValue(),\r
+                                        cons.qualityRange[1].floatValue(),\r
+                                        1);\r
+      if(showQuality)\r
+        alignment.addAnnotation(quality);\r
+    }\r
+    else {\r
+      conservation.annotations = annotations;\r
+      quality.annotations = qannotations;\r
+      quality.graphMax = cons.qualityRange[1].floatValue();\r
+    }\r
+\r
+\r
+  }\r
+\r
+  public void updateConsensus()\r
+  {\r
+    Annotation [] annotations = new Annotation[alignment.getWidth()];\r
+\r
+    // this routine prevents vconsensus becoming a new object each time\r
+    // consenus is calculated. Important for speed of Blosum62\r
+    // and PID colouring of alignment\r
+    if(vconsensus == null)\r
+        vconsensus = alignment.getAAFrequency();\r
+    else\r
+    {\r
+        Vector temp = alignment.getAAFrequency();\r
+        vconsensus.removeAllElements();\r
+        Enumeration e = temp.elements();\r
+        while(e.hasMoreElements())\r
+        {\r
+          vconsensus.addElement(e.nextElement());\r
+        }\r
+    }\r
+    Hashtable hash = null;\r
+    for (int i = 0; i<alignment.getWidth(); i++)\r
+    {\r
+        hash = (Hashtable) vconsensus.elementAt(i);\r
+        float value = new Float(hash.get("maxCount").toString()).floatValue();\r
+        value /= new Float(hash.get("size").toString()).floatValue();\r
+\r
+        value *= 100;\r
+        String maxRes = hash.get("maxResidue")+" ";\r
+        String mouseOver = hash.get("maxResidue")+" ";\r
+        if(maxRes.length()>2)\r
+        {\r
+          mouseOver = "["+maxRes+"] ";\r
+          maxRes = "+ ";\r
+        }\r
+\r
+        mouseOver += (int)value+"%";\r
+        annotations[i] = new Annotation(maxRes, mouseOver, ' ', value);\r
+\r
+    }\r
+\r
+     if(consensus==null)\r
+     {\r
+       consensus = new AlignmentAnnotation("Consensus",\r
+                                           "PID", annotations, 0f, 100f, 1);\r
+       if(showConsensus)\r
+         alignment.addAnnotation(consensus);\r
+     }\r
+     else\r
+       consensus.annotations = annotations;\r
+\r
+  }\r
+\r
+\r
+  public SequenceGroup getSelectionGroup()\r
+  {\r
+    return selectionGroup;\r
+  }\r
+\r
+  public void setSelectionGroup(SequenceGroup sg)\r
+  {\r
+    selectionGroup = sg;\r
+  }\r
+\r
+\r
+ public boolean getConservationSelected()\r
+ {\r
+   return conservationColourSelected;\r
+ }\r
+\r
+ public void setConservationSelected(boolean b)\r
+ {\r
+   conservationColourSelected = b;\r
+ }\r
+\r
+ public boolean getAbovePIDThreshold()\r
+ {\r
+   return abovePIDThreshold;\r
+ }\r
+\r
+ public void setAbovePIDThreshold(boolean b)\r
+ {\r
+   abovePIDThreshold = b;\r
+ }\r
+\r
+  public int getStartRes() {\r
+    return startRes;\r
+  }\r
+\r
+  public int getEndRes() {\r
+    return endRes;\r
+  }\r
+\r
+  public int getStartSeq() {\r
+    return startSeq;\r
+  }\r
+\r
+  public void setGlobalColourScheme(ColourSchemeI cs)\r
+  {\r
+     globalColourScheme = cs;\r
+  }\r
+\r
+  public ColourSchemeI getGlobalColourScheme()\r
+  {\r
+    return globalColourScheme;\r
+  }\r
+\r
+\r
+  public void setStartRes(int res) {\r
+    this.startRes = res;\r
+  }\r
+  public void setStartSeq(int seq) {\r
+    this.startSeq = seq;\r
+  }\r
+  public void setEndRes(int res) {\r
+    if (res > alignment.getWidth()-1) {\r
+      System.out.println(" Corrected res from " + res + " to maximum " + (alignment.getWidth()-1));\r
+       res = alignment.getWidth()-1;\r
+    }\r
+    if (res < 0) {\r
+      res = 0;\r
+    }\r
+    this.endRes = res;\r
+  }\r
+  public void setEndSeq(int seq) {\r
+    if (seq > alignment.getHeight()) {\r
+      seq = alignment.getHeight();\r
+    }\r
+    if (seq < 0) {\r
+      seq = 0;\r
+    }\r
+    this.endSeq = seq;\r
+  }\r
+  public int getEndSeq() {\r
+    return endSeq;\r
+  }\r
+\r
+  public void setFont(Font f) {\r
+    font = f;\r
+    java.awt.Frame temp = new java.awt.Frame();\r
+    temp.addNotify();\r
+    java.awt.FontMetrics fm = temp.getGraphics().getFontMetrics(font);\r
+    setCharHeight(fm.getHeight());\r
+    setCharWidth(fm.charWidth('M'));\r
+  }\r
+\r
+  public Font getFont() {\r
+    return font;\r
+  }\r
+  public void setCharWidth(int w) {\r
+    this.charWidth = w;\r
+  }\r
+  public int getCharWidth() {\r
+    return charWidth;\r
+  }\r
+  public void setCharHeight(int h) {\r
+    this.charHeight = h;\r
+  }\r
+  public int getCharHeight() {\r
+    return charHeight;\r
+  }\r
+  public void setChunkWidth(int w) {\r
+    this.chunkWidth = w;\r
+  }\r
+  public int getChunkWidth() {\r
+    return chunkWidth;\r
+  }\r
+  public void setChunkHeight(int h) {\r
+    this.chunkHeight = h;\r
+  }\r
+  public int getChunkHeight() {\r
+    return chunkHeight;\r
+  }\r
+  public AlignmentI getAlignment() {\r
+    return alignment;\r
+  }\r
+  public void setAlignment(AlignmentI align) {\r
+    this.alignment = align;\r
+  }\r
+\r
+  public void setWrapAlignment(boolean state) {\r
+    wrapAlignment = state;\r
+  }\r
+  public void setShowText(boolean state) {\r
+    showText = state;\r
+  }\r
+\r
+  public void setRenderGaps(boolean state){\r
+    renderGaps = state;\r
+  }\r
+\r
+\r
+  public boolean getColourText()\r
+  {\r
+    return showColourText;\r
+  }\r
+\r
+  public void setColourText(boolean state)\r
+  {\r
+    showColourText = state;\r
+  }\r
+\r
+  public void setShowBoxes(boolean state) {\r
+    showBoxes = state;\r
+  }\r
+\r
+  public boolean getWrapAlignment() {\r
+      return wrapAlignment;\r
+  }\r
+  public boolean getShowText() {\r
+    return showText;\r
+  }\r
+  public boolean getShowBoxes() {\r
+    return showBoxes;\r
+  }\r
+\r
+  public char getGapCharacter() {\r
+    return getAlignment().getGapCharacter();\r
+  }\r
+  public void setGapCharacter(char gap) {\r
+    if (getAlignment() != null) {\r
+      getAlignment().setGapCharacter(gap);\r
+    }\r
+  }\r
+  public void setThreshold(int thresh) {\r
+    threshold = thresh;\r
+  }\r
+  public int getThreshold() {\r
+    return threshold;\r
+  }\r
+  public void setIncrement(int inc) {\r
+    increment = inc;\r
+  }\r
+  public int getIncrement() {\r
+    return increment;\r
+  }\r
+  public int getIndex(int y) {\r
+    int y1     = 0;\r
+    int starty = getStartSeq();\r
+    int endy   = getEndSeq();\r
+\r
+    for (int i = starty; i <= endy; i++) {\r
+      if (i < alignment.getHeight() && alignment.getSequenceAt(i) != null) {\r
+        int y2 = y1 + getCharHeight();\r
+\r
+        if (y>=y1 && y <=y2) {\r
+          return i;\r
+        }\r
+        y1  = y2;\r
+      } else {\r
+        return -1;\r
+      }\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  public ColumnSelection getColumnSelection() {\r
+    return colSel;\r
+  }\r
+\r
+  public void resetSeqLimits(int height) {\r
+    setEndSeq(height/getCharHeight());\r
+  }\r
+  public void setCurrentTree(NJTree tree) {\r
+      currentTree = tree;\r
+  }\r
+  public NJTree getCurrentTree() {\r
+    return currentTree;\r
+  }\r
+\r
+\r
+  public void setColourAppliesToAllGroups(boolean b)\r
+  {   colourAppliesToAllGroups = b; }\r
+\r
+  public boolean getColourAppliesToAllGroups()\r
+  {return colourAppliesToAllGroups; }\r
+\r
+  public boolean getShowFullId()\r
+  {\r
+    return showFullId;\r
+  }\r
+\r
+  public void setShowFullId(boolean b)\r
+  {\r
+    showFullId = b;\r
+  }\r
+\r
+  public boolean getShowAnnotation()\r
+  {\r
+    return showAnnotation;\r
+  }\r
+\r
+  public void setShowAnnotation(boolean b)\r
+  {\r
+    showAnnotation = b;\r
+  }\r
+\r
+  public boolean getScaleAboveWrapped()\r
+  { return scaleAboveWrapped;}\r
+\r
+  public boolean getScaleLeftWrapped()\r
+  { return scaleLeftWrapped; }\r
+\r
+  public boolean getScaleRightWrapped()\r
+  { return scaleRightWrapped; }\r
+\r
+  public void setScaleAboveWrapped(boolean b)\r
+  { scaleAboveWrapped = b; }\r
+\r
+  public void setScaleLeftWrapped(boolean b)\r
+  { scaleLeftWrapped = b; }\r
+\r
+  public void setScaleRightWrapped(boolean b)\r
+  { scaleRightWrapped = b; }\r
+\r
+\r
+}\r
diff --git a/src/jalview/appletgui/AlignmentPanel.java b/src/jalview/appletgui/AlignmentPanel.java
new file mode 100755 (executable)
index 0000000..2b101fd
--- /dev/null
@@ -0,0 +1,430 @@
+package jalview.appletgui;\r
+\r
+import jalview.jbappletgui.GAlignmentPanel;\r
+import jalview.schemes.*;\r
+import jalview.analysis.*;\r
+import jalview.datamodel.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+public class AlignmentPanel extends GAlignmentPanel implements AdjustmentListener\r
+{\r
+\r
+  AlignViewport     av;\r
+  OverviewPanel overviewPanel;\r
+  SeqPanel   seqPanel;\r
+  IdPanel    idPanel;\r
+  IdwidthAdjuster idwidthAdjuster;\r
+  public AlignFrame alignFrame;\r
+  ScalePanel scalePanel;\r
+  AnnotationPanel annotationPanel;\r
+  AnnotationLabels alabels;\r
+\r
+  // this value is set false when selection area being dragged\r
+  boolean fastPaint = true;\r
+\r
+  public AlignmentPanel(AlignFrame af, final AlignViewport av)\r
+  {\r
+    alignFrame = af;\r
+    this.av         = av;\r
+    seqPanel        = new SeqPanel  (av, this);\r
+    idPanel         = new IdPanel   (av, this);\r
+    scalePanel      = new ScalePanel(av, this);\r
+    idwidthAdjuster = new IdwidthAdjuster(this);\r
+    annotationPanel = new AnnotationPanel(this);\r
+    alabels         = new AnnotationLabels(this);\r
+\r
+\r
+    idPanelHolder.add(idPanel, BorderLayout.CENTER);\r
+    idSpaceFillerPanel1.add(idwidthAdjuster, BorderLayout.CENTER);\r
+    annotationScroller.add(annotationPanel);\r
+    annotationSpaceFillerHolder.add(alabels, BorderLayout.CENTER);\r
+    scalePanelHolder.add(scalePanel, BorderLayout.CENTER);\r
+    seqPanelHolder.add(seqPanel, BorderLayout.CENTER);\r
+\r
+    fontChanged();\r
+    setScrollValues(0, 0);\r
+\r
+    hscroll.addAdjustmentListener(this);\r
+    vscroll.addAdjustmentListener(this);\r
+\r
+   seqPanel.seqCanvas.addKeyListener( new MyKeyAdapter() );\r
+   idPanel.idCanvas.addKeyListener( new MyKeyAdapter() );\r
+\r
+   addComponentListener(new ComponentAdapter()\r
+     {\r
+       public void componentResized(ComponentEvent evt)\r
+       {\r
+         setScrollValues(av.getStartRes(), av.getStartSeq());\r
+         repaint();\r
+       }\r
+     });\r
+\r
+     Dimension d = calculateIdWidth();\r
+     idPanel.idCanvas.setSize(d);\r
+\r
+     hscrollFillerPanel.setSize(d.width, annotationPanel.getSize().height);\r
+     annotationScroller.setSize(annotationPanel.getSize());\r
+\r
+     idPanel.idCanvas.setSize(d.width, seqPanel.seqCanvas.getSize().height);\r
+     annotationSpaceFillerHolder.setSize(d.width,annotationPanel.getSize().height);\r
+     alabels.setSize(d.width,annotationPanel.getSize().height);\r
+\r
+  }\r
+\r
+  class MyKeyAdapter extends KeyAdapter\r
+  {\r
+     public void keyPressed(KeyEvent evt)\r
+     {\r
+       switch(evt.getKeyCode())\r
+       {\r
+         case  27: // escape key\r
+           av.setSelectionGroup(null);\r
+           alignFrame.alignPanel.repaint();\r
+           break;\r
+         case KeyEvent.VK_X:\r
+           if(evt.isControlDown())\r
+           alignFrame.cut_actionPerformed(null);\r
+           break;\r
+         case KeyEvent.VK_C:\r
+         if(evt.isControlDown())\r
+           alignFrame.copy_actionPerformed(null);\r
+           break;\r
+         case KeyEvent.VK_V:\r
+          if(evt.isControlDown())\r
+           alignFrame.paste(true);\r
+           break;\r
+         case KeyEvent.VK_A:\r
+         if(evt.isControlDown())\r
+           alignFrame.selectAllSequenceMenuItem_actionPerformed(null);\r
+           break;\r
+        case KeyEvent.VK_DOWN:\r
+          alignFrame.moveSelectedSequences(false);\r
+          break;\r
+        case KeyEvent.VK_UP:\r
+          alignFrame.moveSelectedSequences(true);\r
+          break;\r
+        case KeyEvent.VK_F:\r
+         if(evt.isControlDown())\r
+          alignFrame.findMenuItem_actionPerformed(null);\r
+          break;\r
+       }\r
+     }\r
+  }\r
+\r
+  public void fontChanged()\r
+  {\r
+    // set idCanvas bufferedImage to null\r
+    // to prevent drawing old image\r
+    FontMetrics fm = getFontMetrics(av.getFont());\r
+\r
+    scalePanel.setSize(new Dimension(10, av.charHeight+fm.getDescent()));\r
+    idwidthAdjuster.setSize(new Dimension(10, av.charHeight+fm.getDescent()));\r
+\r
+    annotationPanel.adjustPanelHeight();\r
+    annotationPanel.repaint();\r
+    Dimension d = calculateIdWidth();\r
+    d.setSize(d.width + 4, seqPanel.seqCanvas.getSize().height);\r
+    idPanel.idCanvas.setSize(d);\r
+    hscrollFillerPanel.setSize(d);\r
+\r
+    alignFrame.pack();\r
+  }\r
+\r
+  public void setIdWidth(int w, int h)\r
+  {\r
+    idPanel.idCanvas.setSize(w,h);\r
+    idPanelHolder.setSize(w,idPanelHolder.getSize().height);\r
+    alabels.setSize(w,alabels.getSize().height);\r
+    validate();\r
+  }\r
+  Dimension calculateIdWidth()\r
+  {\r
+    Frame frame = new Frame();\r
+    frame.addNotify();\r
+    Graphics g = frame.getGraphics();\r
+    if(g==null)\r
+    {\r
+      Frame f = new Frame();\r
+      f.addNotify();\r
+      g = f.getGraphics();\r
+    }\r
+\r
+    FontMetrics fm = g.getFontMetrics(av.font);\r
+    AlignmentI al = av.getAlignment();\r
+\r
+       int i   = 0;\r
+       int idWidth = 0;\r
+       String id;\r
+       while (i < al.getHeight() && al.getSequenceAt(i) != null)\r
+       {\r
+         SequenceI s   = al.getSequenceAt(i);\r
+         if(av.getShowFullId())\r
+           id   = s.getDisplayId();\r
+         else\r
+           id = s.getName();\r
+\r
+         if (fm.stringWidth(id) > idWidth)\r
+           idWidth = fm.stringWidth(id);\r
+         i++;\r
+       }\r
+\r
+       // Also check annotation label widths\r
+       i=0;\r
+       if(al.getAlignmentAnnotation()!=null)\r
+       {\r
+         fm = g.getFontMetrics(frame.getFont());\r
+         while (i < al.getAlignmentAnnotation().length)\r
+         {\r
+           String label = al.getAlignmentAnnotation()[i].label;\r
+           if (fm.stringWidth(label) > idWidth)\r
+             idWidth = fm.stringWidth(label);\r
+           i++;\r
+         }\r
+       }\r
+\r
+       return new Dimension(idWidth, idPanel.idCanvas.getSize().height);\r
+  }\r
+\r
+\r
+ public void highlightSearchResults(int [] results)\r
+ {\r
+   seqPanel.seqCanvas.highlightSearchResults( results );\r
+\r
+   // do we need to scroll the panel?\r
+   if(results!=null && (av.getStartSeq()>results[0]\r
+                        || av.getEndSeq()<results[0]\r
+                        || av.getStartRes()>results[1]\r
+                        || av.getEndRes()<results[2]))\r
+       setScrollValues(results[1], results[0]);\r
+\r
+\r
+ }\r
+\r
+\r
+ public OverviewPanel getOverviewPanel()\r
+ {\r
+   return overviewPanel;\r
+ }\r
+\r
+ public void setOverviewPanel(OverviewPanel op)\r
+ {\r
+   overviewPanel = op;\r
+ }\r
+\r
+\r
+  public void setAnnotationVisible(boolean b)\r
+  {\r
+    annotationSpaceFillerHolder.setVisible(b);\r
+    annotationScroller.setVisible(b);\r
+  }\r
+\r
+\r
+  public void setWrapAlignment(boolean wrap)\r
+  {\r
+    scalePanelHolder.setVisible(!wrap);\r
+    hscroll.setVisible(!wrap);\r
+    idwidthAdjuster.setVisible(!wrap);\r
+\r
+    av.setShowAnnotation(!wrap);\r
+    annotationScroller.setVisible(!wrap);\r
+    annotationSpaceFillerHolder.setVisible(!wrap);\r
+    idSpaceFillerPanel1.setVisible(!wrap);\r
+\r
+    repaint();\r
+\r
+  }\r
+\r
+\r
+  public void setColourScheme()\r
+  {\r
+    ColourSchemeI cs = av.getGlobalColourScheme();\r
+\r
+    if(av.getConservationSelected())\r
+    {\r
+\r
+       Alignment al = (Alignment)av.getAlignment();\r
+       Conservation c = new Conservation("All",\r
+                            ResidueProperties.propHash, 3, al.getSequences(), 0,\r
+                            al.getWidth() );\r
+\r
+       c.calculate();\r
+       c.verdict(false, av.ConsPercGaps);\r
+       ConservationColourScheme ccs = new ConservationColourScheme(c, cs);\r
+\r
+       av.setGlobalColourScheme( ccs );\r
+\r
+    }\r
+\r
+    repaint();\r
+  }\r
+\r
+\r
+  int hextent = 0;\r
+  int vextent = 0;\r
+\r
+  // return value is true if the scroll is valid\r
+  public boolean scrollUp(boolean up)\r
+  {\r
+    if(up)\r
+    {\r
+      if(vscroll.getValue()<1)\r
+        return false;\r
+      fastPaint  = false;\r
+      vscroll.setValue(vscroll.getValue() - 1);\r
+    }\r
+    else\r
+    {\r
+     if(vextent+vscroll.getValue() >= av.getAlignment().getHeight())\r
+       return false;\r
+      fastPaint  = false;\r
+      vscroll.setValue(vscroll.getValue() + 1);\r
+    }\r
+    fastPaint = true;\r
+    return true;\r
+  }\r
+\r
+  public boolean scrollRight(boolean right)\r
+  {\r
+\r
+    if (right)\r
+    {\r
+      if (hscroll.getValue() < 1)\r
+        return false;\r
+      fastPaint = false;\r
+      hscroll.setValue(hscroll.getValue() - 1);\r
+    }\r
+    else\r
+    {\r
+      if (hextent + hscroll.getValue() >= av.getAlignment().getWidth())\r
+        return false;\r
+      fastPaint = false;\r
+      hscroll.setValue(hscroll.getValue() + 1);\r
+    }\r
+    fastPaint = true;\r
+    return true;\r
+  }\r
+\r
+\r
+  public void setScrollValues(int x, int y)\r
+  {\r
+\r
+    av.setStartRes(x);\r
+    av.setStartSeq(y);\r
+    av.setEndRes(x + seqPanel.seqCanvas.getSize().width/av.getCharWidth()-1);\r
+\r
+    hextent = seqPanel.seqCanvas.getSize().width/av.charWidth;\r
+    vextent = seqPanel.seqCanvas.getSize().height/av.charHeight;\r
+\r
+    if(hextent > av.alignment.getWidth())\r
+      hextent = av.alignment.getWidth();\r
+    if(vextent > av.alignment.getHeight())\r
+      vextent = av.alignment.getHeight();\r
+\r
+    if(hextent+x  >  av.getAlignment().getWidth())\r
+      x =  av.getAlignment().getWidth()- hextent;\r
+\r
+    if(vextent+y > av.getAlignment().getHeight())\r
+      y = av.getAlignment().getHeight() - vextent;\r
+\r
+    if(y<0)\r
+      y = 0;\r
+\r
+    if(x<0)\r
+      x=0;\r
+\r
+\r
+    int endSeq = y + vextent;\r
+    if(endSeq>av.alignment.getHeight())\r
+      endSeq = av.alignment.getHeight();\r
+\r
+\r
+    av.setEndSeq( endSeq );\r
+    hscroll.setValues(x,hextent,0,av.getAlignment().getWidth());\r
+    vscroll.setValues(y,vextent,0,av.getAlignment().getHeight() );\r
+\r
+  }\r
+\r
+\r
+  public void adjustmentValueChanged(AdjustmentEvent evt)\r
+  {\r
+    int oldX = av.getStartRes();\r
+    int oldY = av.getStartSeq();\r
+\r
+    if (evt.getSource() == hscroll)\r
+    {\r
+      int x = hscroll.getValue();\r
+      av.setStartRes(x);\r
+      av.setEndRes(x + seqPanel.seqCanvas.getSize().width/av.getCharWidth()-1);\r
+    }\r
+\r
+    if (evt.getSource() == vscroll)\r
+    {\r
+      int offy = vscroll.getValue();\r
+      if (av.getWrapAlignment())\r
+      {\r
+        int rowSize = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);\r
+        av.setStartRes( vscroll.getValue() * rowSize );\r
+        av.setEndRes( (vscroll.getValue()+1) * rowSize );\r
+      }\r
+      else\r
+      {\r
+        av.setStartSeq(offy);\r
+        av.setEndSeq(offy + seqPanel.seqCanvas.getSize().height / av.getCharHeight());\r
+      }\r
+    }\r
+\r
+    if(overviewPanel!=null)\r
+      overviewPanel.setBoxPosition();\r
+\r
+    if(av.getWrapAlignment() || !fastPaint)\r
+      repaint();\r
+    else\r
+    {\r
+      idPanel.idCanvas.fastPaint(av.getStartSeq() - oldY);\r
+      seqPanel.seqCanvas.fastPaint(av.getStartRes() - oldX,\r
+                                   av.getStartSeq() - oldY);\r
+\r
+      scalePanel.repaint();\r
+      if (av.getShowAnnotation())\r
+        annotationPanel.fastPaint(av.getStartRes() - oldX);\r
+    }\r
+\r
+  }\r
+\r
+  public void update(Graphics g)\r
+  {\r
+    paint (g);\r
+  }\r
+\r
+\r
+  public void paint(Graphics g)\r
+  {\r
+    Dimension d = idPanel.idCanvas.getSize();\r
+    idPanel.idCanvas.setSize(d.width, seqPanel.seqCanvas.getSize().height);\r
+    annotationSpaceFillerHolder.setSize(d.width,annotationPanel.getSize().height);\r
+    alabels.setSize(d.width,annotationPanel.getSize().height);\r
+\r
+    alabels.repaint();\r
+    idPanel.idCanvas.repaint();\r
+    seqPanel.seqCanvas.repaint();\r
+    scalePanel.repaint();\r
+    annotationPanel.repaint();\r
+\r
+\r
+    if (av.getWrapAlignment())\r
+    {\r
+      int max = av.alignment.getWidth() / seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);\r
+      vscroll.setMaximum(max);\r
+      vscroll.setUnitIncrement(1);\r
+      vscroll.setVisibleAmount(1);\r
+    }\r
+    else\r
+    {\r
+      setScrollValues(av.getStartRes(), av.getStartSeq());\r
+    }\r
+\r
+\r
+\r
+  }\r
+}\r
diff --git a/src/jalview/appletgui/AnnotationLabels.java b/src/jalview/appletgui/AnnotationLabels.java
new file mode 100755 (executable)
index 0000000..f51f465
--- /dev/null
@@ -0,0 +1,99 @@
+\r
+package jalview.appletgui;\r
+\r
+import java.awt.event.*;\r
+import java.awt.*;\r
+import jalview.datamodel.*;\r
+\r
+public class AnnotationLabels extends Panel\r
+{\r
+  boolean active = false;\r
+  Image image;\r
+  AlignmentPanel ap ;\r
+  boolean resizing = false;\r
+  int oldY, mouseX;\r
+  static String ADDNEW = "Add new row";\r
+  static String HIDE = "Hide this row";\r
+  static String DELETE = "Delete this row";\r
+  static String SHOWALL="Show all hidden rows";\r
+  int selectedRow = 0;\r
+  int scrollOffset = 0;\r
+\r
+  public AnnotationLabels(AlignmentPanel ap)\r
+  {\r
+    this.ap = ap;\r
+    setLayout(null);\r
+\r
+    java.net.URL url = getClass().getResource("/images/idwidth.gif");\r
+    if (url != null)\r
+      image = java.awt.Toolkit.getDefaultToolkit().getImage(url);\r
+\r
+    try\r
+    {\r
+      MediaTracker mt = new MediaTracker(this);\r
+      mt.addImage(image, 0);\r
+      mt.waitForID(0);\r
+    }\r
+    catch (Exception ex) {}\r
+  }\r
+\r
+  public void setScrollOffset(int y)\r
+  {\r
+    scrollOffset = y;\r
+    repaint();\r
+  }\r
+\r
+  public void paint(Graphics g)\r
+  {\r
+    drawComponent(g);\r
+  }\r
+\r
+  public void drawComponent(Graphics g)\r
+  {\r
+    FontMetrics fm = g.getFontMetrics(g.getFont());\r
+    g.setColor(Color.white);\r
+    g.fillRect(0,0, getSize().width, getSize().height);\r
+\r
+    g.translate(0, scrollOffset);\r
+    g.setColor(Color.black);\r
+\r
+   AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
+   int y = g.getFont().getSize();\r
+   int x = 0;\r
+\r
+   if(aa!=null)\r
+   for(int i=0; i<aa.length; i++)\r
+   {\r
+     if(!aa[i].visible)\r
+       continue;\r
+\r
+     x = getSize().width - fm.stringWidth(aa[i].label)-3;\r
+\r
+     if(aa[i].isGraph)\r
+       y+=(aa[i].height/3);\r
+\r
+     g.drawString(aa[i].label, x, y);\r
+\r
+     if(aa[i].isGraph)\r
+       y+=(2*aa[i].height/3);\r
+    else\r
+       y+=aa[i].height;\r
+   }\r
+\r
+   if (active)\r
+   {\r
+     if (image != null)\r
+       g.drawImage(image, 2, 0, this);\r
+   }\r
+\r
+   if (aa == null || aa.length<1)\r
+   {\r
+     g.drawString("Right click", 2, 8);\r
+     g.drawString("to add annotation", 2, 18);\r
+   }\r
+\r
+\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/AnnotationPanel.java b/src/jalview/appletgui/AnnotationPanel.java
new file mode 100755 (executable)
index 0000000..78b9a51
--- /dev/null
@@ -0,0 +1,364 @@
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.*;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+public class AnnotationPanel extends Panel implements AdjustmentListener\r
+{\r
+  AlignViewport av;\r
+  AlignmentPanel ap;\r
+  int activeRow =-1;\r
+\r
+  Vector activeRes;\r
+  static String HELIX ="Helix";\r
+  static String SHEET ="Sheet";\r
+  static String LABEL ="Label";\r
+  static String REMOVE="Remove Annotation";\r
+  static String COLOUR="Colour";\r
+  static Color HELIX_COLOUR = Color.red.darker();\r
+  static Color SHEET_COLOUR = Color.green.darker().darker();\r
+\r
+\r
+  Image image;\r
+  Graphics gg;\r
+  FontMetrics fm;\r
+  int imgWidth=0;\r
+\r
+  boolean fastPaint = false;\r
+\r
+  public static int GRAPH_HEIGHT = 40;\r
+\r
+\r
+\r
+  public AnnotationPanel(AlignmentPanel ap)\r
+  {\r
+    this.ap = ap;\r
+    av = ap.av;\r
+    this.setLayout(null);\r
+    adjustPanelHeight();\r
+\r
+\r
+    ap.annotationScroller.getVAdjustable().addAdjustmentListener( this );\r
+  }\r
+\r
+  public void adjustmentValueChanged(AdjustmentEvent evt)\r
+  {\r
+    ap.alabels.setScrollOffset( -evt.getValue() );\r
+  }\r
+\r
+  public void adjustPanelHeight()\r
+  {\r
+    // setHeight of panels\r
+    AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
+    int height = 0;\r
+    if(aa!=null)\r
+    for (int i = 0; i < aa.length; i++)\r
+    {\r
+      if(!aa[i].visible)\r
+        continue;\r
+\r
+      aa[i].height = 0;\r
+\r
+      if(aa[i].hasText)\r
+        aa[i].height += av.charHeight;\r
+      if (aa[i].hasIcons)\r
+        aa[i].height += 16;\r
+\r
+      if (aa[i].isGraph)\r
+        aa[i].height += GRAPH_HEIGHT;\r
+\r
+      if(aa[i].height==0)\r
+        aa[i].height = 20;\r
+      height += aa[i].height;\r
+    }\r
+  else height=20;\r
+   this.setSize(new Dimension(1, height));\r
+\r
+  }\r
+\r
+  public void addEditableColumn(int i)\r
+  {\r
+    if(activeRow==-1)\r
+    {\r
+      AlignmentAnnotation [] aa = av.alignment.getAlignmentAnnotation();\r
+      for(int j=0; j<aa.length; j++)\r
+        if(aa[j].editable)\r
+        {\r
+          activeRow = j;\r
+          break;\r
+        }\r
+    }\r
+\r
+    if(activeRes==null)\r
+    {\r
+      activeRes = new Vector();\r
+      activeRes.addElement(String.valueOf(i));\r
+      return;\r
+    }\r
+\r
+    activeRes.addElement(String.valueOf(i));\r
+\r
+  }\r
+\r
+  public void update(Graphics g)\r
+  {\r
+    paint(g);\r
+  }\r
+\r
+  public void paint(Graphics g)\r
+  {\r
+    imgWidth = (av.endRes-av.startRes+1) *av.charWidth;\r
+\r
+    if(image==null || imgWidth != image.getWidth(this))\r
+      {\r
+        image = createImage(imgWidth, ap.annotationPanel.getSize().height);\r
+        gg = image.getGraphics();\r
+        gg.setFont(av.getFont());\r
+        fm = gg.getFontMetrics();\r
+        fastPaint = false;\r
+    }\r
+\r
+    if(fastPaint)\r
+    {\r
+      g.drawImage(image, 0, 0, this);\r
+      fastPaint = false;\r
+      return;\r
+    }\r
+\r
+    drawComponent( gg, av.startRes, av.endRes+1);\r
+    g.drawImage( image, 0, 0, this);\r
+\r
+  }\r
+\r
+  public void fastPaint(int horizontal)\r
+{\r
+  if( horizontal == 0\r
+     || av.alignment.getAlignmentAnnotation()==null\r
+     || av.alignment.getAlignmentAnnotation().length<1\r
+    )\r
+  {\r
+    repaint();\r
+    return;\r
+  }\r
+\r
+  gg.copyArea( 0,0, imgWidth, getSize().height, -horizontal*av.charWidth, 0 );\r
+  int sr=av.startRes, er=av.endRes+1, transX=0;\r
+\r
+  if(horizontal>0) // scrollbar pulled right, image to the left\r
+  {\r
+    transX =  (er-sr-horizontal)*av.charWidth;\r
+    sr = er - horizontal ;\r
+  }\r
+  else if(horizontal<0)\r
+  {\r
+    er = sr-horizontal;\r
+  }\r
+\r
+\r
+  gg.translate(transX, 0);\r
+\r
+  drawComponent(gg, sr, er);\r
+\r
+  gg.translate( -transX, 0 );\r
+\r
+  fastPaint = true;\r
+  repaint();\r
+}\r
+\r
+\r
+  public void drawComponent(Graphics g, int startRes, int endRes)\r
+  {\r
+    g.setColor(Color.white);\r
+    g.fillRect(0,0,(endRes-startRes) *av.charWidth, getSize().height);\r
+    if(av.alignment.getAlignmentAnnotation()==null || av.alignment.getAlignmentAnnotation().length<1)\r
+    {\r
+      g.setColor(Color.white);\r
+      g.fillRect(0,0,getSize().width, getSize().height);\r
+      g.setColor(Color.black);\r
+      g.drawString("Alignment has no annotations",20,15);\r
+      return;\r
+    }\r
+\r
+    AlignmentAnnotation [] aa = av.alignment.getAlignmentAnnotation();\r
+\r
+    int j, x=0, y=0;\r
+    char [] lastSS = new char[aa.length];\r
+    int  [] lastSSX= new int[aa.length] ;\r
+    int iconOffset = av.charHeight/2;\r
+    boolean validRes = false;\r
+    //\u03B2 \u03B1\r
+\r
+    for(int i=0; i<aa.length; i++)\r
+    {\r
+      AlignmentAnnotation row = aa[i];\r
+      if(!row.visible)\r
+        continue;\r
+\r
+      if(row.isGraph)\r
+      {\r
+        // this is so that we draw the characters below the graph\r
+        y += row.height;\r
+        if(row.hasText)\r
+          y -= av.charHeight;\r
+      }\r
+      if(row.hasText)\r
+        iconOffset = av.charHeight/2;\r
+      else\r
+        iconOffset = 0;\r
+\r
+      for(j=startRes; j<endRes; j++)\r
+      {\r
+        validRes = row.annotations[j]==null?false:true;\r
+\r
+       x = (j-startRes)*av.charWidth;\r
+\r
+\r
+       if(activeRow==i)\r
+       {\r
+\r
+         g.setColor(Color.red);\r
+\r
+         if(activeRes!=null)\r
+           for (int n = 0; n < activeRes.size(); n++)\r
+           {\r
+             int v = Integer.parseInt(activeRes.elementAt(n).toString()) ;\r
+             if (v == j)\r
+               g.fillRect( (j-startRes) * av.charWidth, y, av.charWidth, row.height);\r
+           }\r
+       }\r
+\r
+\r
+\r
+       if(validRes && row.annotations[j].displayCharacter.length()>0)\r
+       {\r
+         int charOffset = (av.charWidth - fm.charWidth(row.annotations[j].displayCharacter.charAt(0)))/2;\r
+         g.setColor( row.annotations[j].colour);\r
+          if(j==0)\r
+          {\r
+            if (row.annotations[0].secondaryStructure == 'H'\r
+                || row.annotations[0].secondaryStructure == 'E')\r
+              g.drawString(row.annotations[j].displayCharacter, x,\r
+                           y + iconOffset + 2);\r
+          }\r
+         else if( (row.annotations[j].secondaryStructure=='H'\r
+               || row.annotations[j].secondaryStructure=='E') &&\r
+               (row.annotations[j-1]==null ||\r
+                row.annotations[j].secondaryStructure!=row.annotations[j-1].secondaryStructure))\r
+\r
+        g.drawString(row.annotations[j].displayCharacter, x, y + iconOffset + 2);\r
+\r
+        if(!row.hasIcons)\r
+            g.drawString(row.annotations[j].displayCharacter, x + charOffset,\r
+                         y + iconOffset + 2);\r
+       }\r
+\r
+       if(row.hasIcons)\r
+       if(!validRes || row.annotations[j].secondaryStructure!=lastSS[i])\r
+       {\r
+         switch (lastSS[i])\r
+         {\r
+           case 'H':\r
+             g.setColor(HELIX_COLOUR);\r
+             g.fillRoundRect(lastSSX[i], y+4 + iconOffset, x-lastSSX[i], 7, 8, 8);\r
+             break;\r
+           case 'E':\r
+             g.setColor(SHEET_COLOUR);\r
+             g.fillRect(lastSSX[i], y + 4 + iconOffset, x-lastSSX[i]-4, 7);\r
+             g.fillPolygon(new int[] {x - 4, x- 4, x }\r
+                           , new int[]{y+ iconOffset, y + 14+ iconOffset, y + 8+ iconOffset}, 3);\r
+             break;\r
+           case 'C':\r
+             break;\r
+           default :\r
+             g.setColor(Color.gray);\r
+             g.fillRect(lastSSX[i], y+6+ iconOffset, x-lastSSX[i], 2);\r
+             break;\r
+         }\r
+\r
+         if(validRes)\r
+           lastSS[i] = row.annotations[j].secondaryStructure;\r
+          else\r
+            lastSS[i] = ' ';\r
+         lastSSX[i] = x;\r
+       }\r
+\r
+       if (validRes && row.isGraph)\r
+       {\r
+         g.setColor(new Color(0,0,180));\r
+         int height = (int)((row.annotations[j].value / row.graphMax)*GRAPH_HEIGHT);\r
+\r
+         if(row.windowLength>1)\r
+         {\r
+           int total =0;\r
+           for(int i2=j- (row.windowLength/2); i2<j+(row.windowLength/2); i2++)\r
+           {\r
+             if(i2<0 || i2>=av.alignment.getWidth())\r
+               continue;\r
+\r
+             total += row.annotations[i2].value;\r
+           }\r
+\r
+           total/=row.windowLength;\r
+           height = (int)( (total / row.graphMax) *GRAPH_HEIGHT);\r
+\r
+         }\r
+         g.setColor(row.annotations[j].colour);\r
+         g.fillRect(x, y-height, av.charWidth, height );\r
+       }\r
+\r
+\r
+      }\r
+\r
+      x+=av.charWidth;\r
+\r
+      if(row.hasIcons)\r
+      switch (lastSS[i])\r
+      {\r
+        case 'H':\r
+          g.setColor(HELIX_COLOUR);\r
+          g.fillRoundRect(lastSSX[i], y+4+ iconOffset, x - lastSSX[i], 7, 8, 8);\r
+          break;\r
+        case 'E':\r
+          g.setColor(SHEET_COLOUR);\r
+          g.fillRect(lastSSX[i], y + 4+ iconOffset, x - lastSSX[i] - 4, 7);\r
+          g.fillPolygon(new int[]\r
+                        {x - 4, x - 4, x}\r
+                        , new int[]\r
+                        {y + iconOffset, y + 14+ iconOffset, y + 7+ iconOffset}\r
+                        , 3);\r
+          break;\r
+        case 'C':\r
+          break;\r
+        default:\r
+          g.setColor(Color.gray);\r
+          g.fillRect(lastSSX[i], y+6+ iconOffset, x-lastSSX[i], 2);\r
+          break;\r
+\r
+      }\r
+\r
+       if(row.isGraph && row.hasText)\r
+         y+=av.charHeight;\r
+       if(!row.isGraph)\r
+          y+=aa[i].height;\r
+    }\r
+  }\r
+\r
+  // used by overview window\r
+  public void drawGraph(Graphics g, AlignmentAnnotation aa,int width, int y)\r
+  {\r
+    g.setColor(Color.white);\r
+    g.fillRect(0,0,width, y);\r
+    g.setColor(new Color(0,0,180));\r
+    int x = 0;\r
+    for(int j=0; j<aa.annotations.length; j++)\r
+    {\r
+      g.setColor(new Color(0, 0, 180));\r
+      int height = (int) ( (aa.annotations[j].value / aa.graphMax) * GRAPH_HEIGHT );\r
+      g.fillRect(x, y - height, av.charWidth, height);\r
+      x+=av.charWidth;\r
+    }\r
+  }\r
+}\r
diff --git a/src/jalview/appletgui/ColumnSelection.java b/src/jalview/appletgui/ColumnSelection.java
new file mode 100755 (executable)
index 0000000..4ec546a
--- /dev/null
@@ -0,0 +1,74 @@
+package jalview.appletgui;\r
+\r
+import java.util.*;\r
+\r
+/**\r
+ * NOTE: Columns are zero based.\r
+ */\r
+public class ColumnSelection{\r
+  Vector selected = new Vector();\r
+\r
+  public void addElement(int col) {\r
+    selected.addElement(new Integer(col));\r
+  }\r
+\r
+  public void clear() {\r
+    selected.removeAllElements();\r
+  }\r
+\r
+  public void removeElement(int col) {\r
+    Integer colInt = new Integer(col);\r
+    if (selected.contains(colInt)) {\r
+      selected.removeElement(colInt);\r
+    } else {\r
+      System.err.println("WARNING: Tried to remove Integer NOT in ColumnSelection");\r
+    }\r
+  }\r
+\r
+  public boolean contains(int col) {\r
+    return selected.contains(new Integer(col));\r
+  }\r
+\r
+  public int columnAt(int i) {\r
+    return ((Integer)selected.elementAt(i)).intValue();\r
+  }\r
+\r
+  public int size() {\r
+    return selected.size();\r
+  }\r
+\r
+  public int getMax() {\r
+    int max = -1;\r
+\r
+    for (int i=0;i<selected.size();i++) {\r
+      if (columnAt(i) > max) {\r
+        max = columnAt(i);\r
+      }\r
+    }\r
+    return max;\r
+  }\r
+\r
+  public int getMin() {\r
+    int min = 1000000000;\r
+\r
+    for (int i=0;i<selected.size();i++) {\r
+      if (columnAt(i) < min) {\r
+        min = columnAt(i);\r
+      }\r
+    }\r
+    return min;\r
+  }\r
+\r
+  public Vector asVector() {\r
+    return selected;\r
+  }\r
+\r
+  public void compensateForEdit(int start, int change) {\r
+    for (int i=0; i < size();i++) {\r
+      int temp = columnAt(i);\r
+\r
+      if (temp >= start)\r
+        selected.setElementAt(new Integer(temp-change),i);\r
+    }\r
+  }\r
+}\r
diff --git a/src/jalview/appletgui/CutAndPasteTransfer.java b/src/jalview/appletgui/CutAndPasteTransfer.java
new file mode 100755 (executable)
index 0000000..e4b8c9b
--- /dev/null
@@ -0,0 +1,72 @@
+/********************\r
+ * 2004 Jalview Reengineered\r
+ * Barton Group\r
+ * Dundee University\r
+ *\r
+ * AM Waterhouse\r
+ *******************/\r
+\r
+package jalview.appletgui;\r
+\r
+import jalview.jbappletgui.GCutAndPasteTransfer;\r
+import jalview.datamodel.*;\r
+import jalview.io.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+public class CutAndPasteTransfer extends GCutAndPasteTransfer\r
+{\r
+  public CutAndPasteTransfer(boolean forImport)\r
+  {\r
+    super();\r
+\r
+    if(!forImport)\r
+    {\r
+      buttonPanel.setVisible(false);\r
+    }\r
+  }\r
+\r
+\r
+  public String getText()\r
+  {\r
+    return textarea.getText();\r
+  }\r
+\r
+  public void setText(String text)\r
+  {\r
+    textarea.setText(text);\r
+  }\r
+\r
+\r
+  protected void ok_actionPerformed(ActionEvent e)\r
+  {\r
+    String text = getText();\r
+    SequenceI [] sequences = null;\r
+\r
+    String format = IdentifyFile.Identify(text, "Paste");\r
+\r
+  // if (FormatProperties.contains( format ))\r
+     sequences = FormatAdapter.readFile(text, "Paste", format);\r
+\r
+     if(sequences!=null)\r
+     {\r
+       AlignFrame af = new AlignFrame(new Alignment(sequences));\r
+       jalview.bin.JalviewLite.addFrame(af, "Cut & Paste input - "+format,\r
+                        AlignFrame.NEW_WINDOW_WIDTH,\r
+                        AlignFrame.NEW_WINDOW_HEIGHT);\r
+       af.statusBar.setText("Successfully pasted alignment file");\r
+     }\r
+\r
+     Frame frame = (Frame)this.getParent();\r
+     frame.setVisible(false);\r
+   }\r
+\r
+   protected void cancel_actionPerformed(ActionEvent e) {\r
+     Frame frame = (Frame)this.getParent();\r
+     frame.setVisible(false);\r
+   }\r
+\r
+\r
+\r
+\r
+}\r
diff --git a/src/jalview/appletgui/FeatureRenderer.java b/src/jalview/appletgui/FeatureRenderer.java
new file mode 100755 (executable)
index 0000000..a8412f0
--- /dev/null
@@ -0,0 +1,79 @@
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.*;\r
+import java.awt.*;\r
+import java.util.*;\r
+\r
+public class FeatureRenderer\r
+{\r
+  AlignViewport av;\r
+\r
+  SequenceGroup currentSequenceGroup = null;\r
+  SequenceGroup [] allGroups = null;\r
+  Color resBoxColour;\r
+  Graphics graphics;\r
+\r
+  public FeatureRenderer(AlignViewport av)\r
+  {\r
+    this.av = av;\r
+  }\r
+\r
+\r
+  public void drawSequence(Graphics g,SequenceI seq,SequenceGroup [] sg, int start, int end, int x1, int y1, int width, int height)\r
+  {\r
+    Vector features = seq.getSequenceFeatures();\r
+    Enumeration e = features.elements();\r
+    while( e.hasMoreElements() )\r
+    {\r
+      SequenceFeature sf = (SequenceFeature)e.nextElement();\r
+      if(sf.getStart()>seq.getEnd())\r
+        continue;\r
+\r
+      int fstart = seq.findIndex(sf.getStart())-1;\r
+      int fend = seq.findIndex(sf.getEnd())-1;\r
+\r
+      if(   (fstart<=end && fend>=start)  )\r
+      {\r
+        if(fstart<0) // fix for if the feature we have starts before the sequence start,\r
+          fstart = 0;// but the feature end is still valid!!\r
+\r
+        if(fstart==fend)\r
+        {\r
+          g.setColor(Color.red);\r
+          g.fillRoundRect( (fstart - start) * width, y1, width, height, 4,4);\r
+          g.setColor(Color.white);\r
+\r
+          char s = seq.getSequence().charAt(fstart);\r
+          FontMetrics fm = g.getFontMetrics();\r
+          int charOffset =  (width - fm.charWidth(s))/2;\r
+          int pady = height/5;\r
+          g.drawString(String.valueOf(s), charOffset + x1 + width * (fstart - start), y1 + height - pady);\r
+\r
+        }\r
+        else\r
+        {\r
+          for (int i = fstart; i <= fend; i++)\r
+          {\r
+            char s = seq.getSequence().charAt(i);\r
+            if( jalview.util.Comparison.isGap(s) )\r
+              continue;\r
+\r
+            g.setColor(Color.blue);\r
+            g.fillRect( (i-start) * width, y1, width, height);\r
+\r
+            g.setColor(Color.white);\r
+\r
+            FontMetrics fm = g.getFontMetrics();\r
+            int charOffset = (width - fm.charWidth(s)) / 2;\r
+            int pady = height / 5;\r
+            g.drawString(String.valueOf(s),\r
+                         charOffset + x1 + width * (i-start),\r
+                         y1 + height - pady);\r
+          }\r
+        }\r
+      }\r
+\r
+    }\r
+   }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/Finder.java b/src/jalview/appletgui/Finder.java
new file mode 100755 (executable)
index 0000000..0b1e319
--- /dev/null
@@ -0,0 +1,230 @@
+package jalview.appletgui;\r
+\r
+import jalview.jbappletgui.GFinder;\r
+import jalview.datamodel.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+import java.awt.*;\r
+\r
+public class Finder extends GFinder\r
+{\r
+  AlignViewport av;\r
+  AlignmentPanel ap;\r
+  Frame frame;\r
+  SuperGroup searchGroup;\r
+\r
+  int seqIndex = 0;\r
+  int resIndex = 0;\r
+  public Finder(final AlignmentPanel ap)\r
+  {\r
+    this.av = ap.av;\r
+    this.ap = ap;\r
+    frame = new Frame();\r
+    frame.add(this);\r
+    jalview.bin.JalviewLite.addFrame(frame, "Find", 340,120);\r
+    frame.repaint();\r
+    frame.addWindowListener(new WindowAdapter()\r
+        {public void windowClosing(WindowEvent evt)\r
+              { ap.highlightSearchResults( null ); }\r
+        });\r
+  }\r
+\r
+  public void textfield_actionPerformed(ActionEvent e)\r
+  {\r
+    doSearch(false);\r
+  }\r
+\r
+  public void findNext_actionPerformed(ActionEvent e)\r
+  {\r
+    doSearch(false);\r
+  }\r
+\r
+  public void findAll_actionPerformed(ActionEvent e)\r
+  {\r
+    resIndex=0;\r
+    seqIndex=0;\r
+    doSearch(true);\r
+  }\r
+\r
+  public void cancel_actionPerformed(ActionEvent e)\r
+  {\r
+    try{\r
+      // if allResults is null, this effectively switches displaySearch flag in seqCanvas\r
+      ap.highlightSearchResults( null );\r
+      ap.idPanel.highlightSearchResults( null );\r
+     // frame.setClosed(true);\r
+    }catch(Exception ex){ }\r
+  }\r
+\r
+\r
+  public void createNewGroup_actionPerformed(ActionEvent e)\r
+  {\r
+    for(int i=0; i<searchGroup.getSize(); i++)\r
+      av.alignment.addGroup( searchGroup.getGroupeAt(i));\r
+\r
+    ap.av.alignment.addSuperGroup(searchGroup);\r
+    ap.highlightSearchResults( null );\r
+  }\r
+\r
+\r
+  void doSearch(boolean findAll)\r
+  {\r
+    createNewGroup.setEnabled(false);\r
+\r
+    String searchString = textfield.getText().toUpperCase();\r
+\r
+    com.stevesoft.pat.Regex regex = new  com.stevesoft.pat.Regex(searchString);\r
+\r
+    Vector searchResults = new Vector();\r
+    int [] allResults = null;\r
+\r
+    Sequence seq;\r
+    String item=null;\r
+    boolean found = false;\r
+\r
+    ////// is the searchString a residue number?\r
+    try{\r
+      int res = Integer.parseInt(searchString);\r
+      found = true;\r
+\r
+      if(av.getSelectionGroup().getSize()>0)\r
+        seq = (Sequence)(av.getSelectionGroup().getSequenceAt(0));\r
+      else\r
+        seq = (Sequence)av.getAlignment().getSequenceAt(0);\r
+\r
+      searchResults.addElement( Integer.toString( av.getAlignment().findIndex(seq) ) );\r
+      searchResults.addElement( Integer.toString( seq.findIndex(res)-1 ) );\r
+      searchResults.addElement( Integer.toString( seq.findIndex(res)-1 ) );\r
+\r
+    }catch(NumberFormatException ex){}\r
+    ///////////////////////////////////////////////\r
+\r
+\r
+    jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();\r
+    Color [] newColors = new Color[24];\r
+    for(int i=0; i<24; i++)\r
+      newColors[i] = new Color(60,160,115);\r
+\r
+    ucs.setColourScheme(newColors);\r
+\r
+    searchGroup = new SuperGroup(searchString, ucs , true, true, false);\r
+\r
+    int end = av.alignment.getHeight();\r
+\r
+    SequenceGroup selection = av.getSelectionGroup();\r
+    if(selection!=null)\r
+     if(selection.getSize()<1 || (selection.getEndRes()-selection.getStartRes()<2))\r
+      selection = null;\r
+\r
+    while( !found && seqIndex<end)\r
+    {\r
+      seq = (Sequence)av.alignment.getSequenceAt(seqIndex);\r
+\r
+\r
+      if(selection!=null && !selection.sequences.contains(seq))\r
+      {\r
+        seqIndex++;\r
+        resIndex=0;\r
+        continue;\r
+      }\r
+\r
+      item = seq.getSequence().toUpperCase();\r
+\r
+      if(selection!=null && selection.getEndRes()<av.alignment.getWidth())\r
+          item = item.substring(0, selection.getEndRes()+1);\r
+\r
+      ///Shall we ignore gaps????\r
+      StringBuffer noGaps = new StringBuffer();\r
+      int insertCount=0;\r
+      Vector spaces = new Vector();\r
+\r
+      for (int j=0; j < item.length(); j++)\r
+      {\r
+\r
+        if(!jalview.util.Comparison.isGap(item.charAt(j)))\r
+         {\r
+           noGaps.append(item.charAt(j));\r
+           spaces.addElement(new Integer(insertCount));\r
+         }\r
+        else\r
+           insertCount++;\r
+      }\r
+\r
+\r
+\r
+      for(int r = resIndex; r<noGaps.length(); r++)\r
+      {\r
+\r
+       if( regex.searchFrom( noGaps.toString(), r ) )\r
+       {\r
+         resIndex = regex.matchedFrom();\r
+         if(selection!=null && ( resIndex+ Integer.parseInt(spaces.elementAt(resIndex).toString()) )<selection.getStartRes())\r
+           continue;\r
+\r
+         searchResults.addElement( Integer.toString( seqIndex) );\r
+         searchResults.addElement( Integer.toString( resIndex+ Integer.parseInt(spaces.elementAt(resIndex).toString()) ) );\r
+         searchResults.addElement( Integer.toString( regex.matchedTo()-1 + Integer.parseInt(spaces.elementAt(regex.matchedTo()-1).toString()) ) );\r
+\r
+         SequenceGroup sg = new SequenceGroup(searchString, ucs, true, true, false,\r
+                                             resIndex+ Integer.parseInt(spaces.elementAt(resIndex).toString()) ,\r
+                                      regex.matchedTo()-1 + Integer.parseInt(spaces.elementAt(regex.matchedTo()-1).toString())\r
+            );\r
+         sg.addSequence((Sequence)av.getAlignment().getSequenceAt(seqIndex));\r
+         searchGroup.addGroup( sg );\r
+\r
+         if(!findAll)\r
+         {\r
+           // thats enough, break and display the result\r
+           found = true;\r
+           resIndex++;\r
+           break;\r
+         }\r
+\r
+         r=resIndex;\r
+       }\r
+      }\r
+      if(!found)\r
+      {\r
+        seqIndex++;\r
+        resIndex = 0;\r
+      }\r
+    }\r
+\r
+\r
+    Vector idMatch = new Vector();\r
+    for(int id = 0; id<av.alignment.getHeight(); id++)\r
+    {\r
+      if(   regex.search( av.alignment.getSequenceAt(id).getName() ) )\r
+        idMatch.addElement( av.alignment.getSequenceAt(id) );\r
+    }\r
+\r
+    if(searchResults.size()==0 && idMatch.size()>0)\r
+      ap.idPanel.highlightSearchResults( idMatch );\r
+\r
+\r
+    if(searchResults.size()>0)\r
+    {\r
+      allResults = new int[searchResults.size()];\r
+      for(int i=0; i<searchResults.size(); i++)\r
+        allResults[i] = Integer.parseInt(searchResults.elementAt(i).toString());\r
+\r
+      createNewGroup.setEnabled(true);\r
+    }\r
+    else\r
+    {\r
+      resIndex=0;\r
+      seqIndex=0;\r
+    }\r
+\r
+    // if allResults is null, this effectively switches displaySearch flag in seqCanvas\r
+    ap.highlightSearchResults( allResults );\r
+\r
+    if (findAll)\r
+    {\r
+      String message =  (searchResults.size()/3) + " matches found.";\r
+      System.out.println(message);\r
+    }\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/FontChooser.java b/src/jalview/appletgui/FontChooser.java
new file mode 100755 (executable)
index 0000000..ba59e31
--- /dev/null
@@ -0,0 +1,87 @@
+package jalview.appletgui;\r
+\r
+import jalview.jbappletgui.GFontChooser;\r
+import jalview.appletgui.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+\r
+public class FontChooser extends GFontChooser\r
+{\r
+  AlignmentPanel ap;\r
+  Font oldFont;\r
+  boolean init = true;\r
+  Frame frame;\r
+\r
+  public FontChooser(AlignmentPanel ap, Frame frame)\r
+  {\r
+    super();\r
+    this.frame = frame;\r
+\r
+    this.ap = ap;\r
+    String fonts[] = Toolkit.getDefaultToolkit().getFontList();\r
+    for(int i=0; i<fonts.length; i++)\r
+      fontName.addItem(fonts[i]);\r
+\r
+    for(int i=1; i<31; i++)\r
+      fontSize.addItem(i+"");\r
+\r
+   fontStyle.addItem("plain");\r
+   fontStyle.addItem("bold");\r
+   fontStyle.addItem("italic");\r
+\r
+   oldFont = ap.av.getFont();\r
+   fontName.select(oldFont.getName());\r
+   fontSize.select(oldFont.getSize()+"");\r
+   fontStyle.select(oldFont.getStyle());\r
+\r
+   init = false;\r
+  }\r
+\r
+  protected void ok_actionPerformed(ActionEvent e)\r
+  {\r
+      frame.setVisible(false);\r
+   if(ap.getOverviewPanel()!=null)\r
+     ap.getOverviewPanel().updateOverviewImage();\r
+  }\r
+\r
+  protected void cancel_actionPerformed(ActionEvent e)\r
+  {\r
+    ap.av.setFont(oldFont);\r
+    ap.repaint();\r
+    fontName.select(oldFont.getName());\r
+    fontSize.select(oldFont.getSize()+"");\r
+    fontStyle.select(oldFont.getStyle());\r
+\r
+    frame.setVisible(false);\r
+  }\r
+\r
+  void changeFont()\r
+  {\r
+    Font newFont = new Font(fontName.getSelectedItem().toString(),\r
+                            fontStyle.getSelectedIndex(),\r
+                            Integer.parseInt(fontSize.getSelectedItem().toString())\r
+                            );\r
+    ap.av.setFont(newFont);\r
+    ap.fontChanged();\r
+  }\r
+\r
+  protected void fontName_actionPerformed(ItemEvent e)\r
+  {\r
+    if(init) return;\r
+    changeFont();\r
+  }\r
+\r
+  protected void fontSize_actionPerformed(ItemEvent e)\r
+  {\r
+    if(init) return;\r
+    changeFont();\r
+  }\r
+\r
+  protected void fontStyle_actionPerformed(ItemEvent e)\r
+  {\r
+    if(init) return;\r
+    changeFont();\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/IdCanvas.java b/src/jalview/appletgui/IdCanvas.java
new file mode 100755 (executable)
index 0000000..cc042ed
--- /dev/null
@@ -0,0 +1,204 @@
+package jalview.appletgui;\r
+\r
+import java.awt.*;\r
+import jalview.datamodel.*;\r
+import jalview.analysis.*;\r
+public class IdCanvas extends Panel\r
+{\r
+  protected AlignViewport av;\r
+\r
+  protected boolean showScores  = true;\r
+\r
+  protected int     maxIdLength = -1;\r
+  protected String  maxIdStr    = null;\r
+  Image image;\r
+  Graphics gg;\r
+  int imgHeight=0;\r
+  boolean fastPaint = false;\r
+\r
+  java.util.Vector searchResults;\r
+\r
+  public IdCanvas(AlignViewport av)\r
+  {\r
+    setLayout(null);\r
+    this.av         = av;\r
+    PaintRefresher.Register(this);\r
+  }\r
+\r
+  public void drawIdString(Graphics gg,SequenceI s,int i, int starty, int ypos) {\r
+      int charHeight = av.getCharHeight();\r
+\r
+      if(searchResults!=null && searchResults.contains(s))\r
+      {\r
+        gg.setColor(Color.black);\r
+        gg.fillRect(0,AlignmentUtil.getPixelHeight(starty,i,charHeight)+ ypos,getSize().width,charHeight);\r
+        gg.setColor(Color.white);\r
+      }\r
+      else if (av.getSelectionGroup()!=null && av.getSelectionGroup().sequences.contains(s)) {\r
+         gg.setColor(Color.lightGray);\r
+         gg.fillRect(0,AlignmentUtil.getPixelHeight(starty,i,charHeight)+ ypos,getSize().width,charHeight);\r
+         gg.setColor(Color.white);\r
+      } else {\r
+         gg.setColor(s.getColor());\r
+         gg.fillRect(0,AlignmentUtil.getPixelHeight(starty,i,charHeight)+ ypos,getSize().width,charHeight);\r
+         gg.setColor(Color.black);\r
+      }\r
+\r
+      String string = s.getName();\r
+      if(av.getShowFullId())\r
+        string = s.getDisplayId();\r
+\r
+      gg.drawString(string,0,AlignmentUtil.getPixelHeight(starty,i,charHeight) + ypos + charHeight-   (charHeight/5));\r
+\r
+  }\r
+\r
+  public void fastPaint(int vertical)\r
+  {\r
+    if(gg==null)\r
+    {  repaint(); return;}\r
+\r
+    gg.copyArea( 0,0, getSize().width, imgHeight, 0, -vertical*av.charHeight );\r
+\r
+    int ss=av.startSeq, es=av.endSeq, transY = 0;\r
+    if (vertical > 0) // scroll down\r
+     {\r
+       ss = es - vertical;\r
+       if(ss<av.startSeq) // ie scrolling too fast, more than a page at a time\r
+         ss = av.startSeq;\r
+       else\r
+         transY = imgHeight - vertical * av.charHeight;\r
+     }\r
+     else if (vertical < 0)\r
+     {\r
+       es = ss - vertical;\r
+       if(es > av.endSeq)\r
+         es = av.endSeq;\r
+     }\r
+\r
+\r
+\r
+        gg.translate(0, transY);\r
+\r
+        drawIds(ss, es);\r
+\r
+        gg.translate( 0, -transY );\r
+\r
+\r
+      fastPaint = true;\r
+      repaint();\r
+  }\r
+\r
+  public void update(Graphics g)\r
+  {\r
+    paint(g);\r
+  }\r
+  public void paint(Graphics g)\r
+  {\r
+    if(getSize().height<0 || getSize().width<0)\r
+      return;\r
+    if (fastPaint)\r
+    {\r
+      fastPaint = false;\r
+      g.drawImage(image, 0, 0, this);\r
+      return;\r
+    }\r
+\r
+    imgHeight = getSize().height;\r
+    imgHeight -= imgHeight % av.charHeight;\r
+\r
+    if(image==null || imgHeight!=image.getHeight(this))\r
+    {\r
+      image = createImage(getSize().width, imgHeight);\r
+      gg = image.getGraphics();\r
+      gg.setFont(av.getFont());\r
+    }\r
+\r
+      //Fill in the background\r
+      gg.setColor(Color.white);\r
+      Font italic = new Font(av.getFont().getName(), Font.ITALIC,\r
+                           av.getFont().getSize());\r
+      gg.setFont(italic);\r
+\r
+    gg.fillRect(0, 0, getSize().width, getSize().height);\r
+    drawIds( av.getStartSeq(), av.endSeq);\r
+    g.drawImage(image, 0, 0, this);\r
+  }\r
+\r
+  void drawIds(int starty, int endy)\r
+  {\r
+    Color currentColor     = Color.white;\r
+    Color currentTextColor = Color.black;\r
+\r
+    if (av.getWrapAlignment())\r
+    {\r
+\r
+          int rowSize =  av.getEndRes() - av.getStartRes();\r
+          // Draw the rest of the panels\r
+\r
+          for(int ypos=2*av.charHeight, row=av.getEndRes()-rowSize;\r
+              ypos <= getSize().height && row<av.alignment.getWidth();\r
+              ypos += av.chunkHeight, row+=rowSize )\r
+          {\r
+            for (int i = starty; i < av.alignment.getHeight(); i++)\r
+            {\r
+              SequenceI s = av.alignment.getSequenceAt(i);\r
+              drawIdString(gg, s, i, 0, ypos);\r
+            }\r
+          }\r
+\r
+\r
+    } else\r
+    {\r
+\r
+      //Now draw the id strings\r
+      for (int i = starty; i < endy; i++)\r
+      {\r
+        // Selected sequence colours\r
+\r
+        if(searchResults!=null && searchResults.contains(av.alignment.getSequenceAt(i)))\r
+        {\r
+          gg.setColor(Color.black);\r
+          currentColor = Color.black;\r
+          currentTextColor = Color.white;\r
+      }\r
+      else if (av.getSelectionGroup()!= null\r
+            && av.getSelectionGroup().sequences.contains(av.alignment.getSequenceAt(i)))\r
+        {\r
+          currentColor = Color.lightGray;\r
+          currentTextColor = Color.black;\r
+        }\r
+        else\r
+        {\r
+          currentColor = av.alignment.getSequenceAt(i).getColor();\r
+          currentTextColor = Color.black;\r
+        }\r
+\r
+        gg.setColor(currentColor);\r
+\r
+        gg.fillRect(0,\r
+                    AlignmentUtil.getPixelHeight(starty, i, av.charHeight),\r
+                    getSize().width,\r
+                    av.charHeight);\r
+\r
+        gg.setColor(currentTextColor);\r
+        String string = av.alignment.getSequenceAt(i).getName();\r
+        if(av.getShowFullId())\r
+          string = av.alignment.getSequenceAt(i).getDisplayId();\r
+        gg.drawString(string, 0,\r
+                      AlignmentUtil.getPixelHeight(starty, i, av.charHeight) +\r
+                      av.charHeight - (av.charHeight / 5));\r
+      }\r
+\r
+      // add a border\r
+      gg.setColor(Color.white);\r
+      gg.fillRect(getSize().width-4,0,4,getSize().height);\r
+    }\r
+\r
+  }\r
+\r
+  public void setHighlighted(java.util.Vector found)\r
+  {\r
+    searchResults = found;\r
+    repaint();\r
+  }\r
+}\r
diff --git a/src/jalview/appletgui/IdPanel.java b/src/jalview/appletgui/IdPanel.java
new file mode 100755 (executable)
index 0000000..b6a5b47
--- /dev/null
@@ -0,0 +1,242 @@
+package jalview.appletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+import jalview.datamodel.*;\r
+\r
+public class IdPanel extends Panel implements MouseListener, MouseMotionListener {\r
+\r
+  protected IdCanvas       idCanvas;\r
+  protected AlignViewport  av;\r
+  protected AlignmentPanel alignPanel;\r
+  ScrollThread scrollThread = null;\r
+\r
+  int            offy;\r
+  int            width;\r
+  int lastid = -1;\r
+  boolean mouseDragging = false;\r
+\r
+  public IdPanel(AlignViewport av, AlignmentPanel parent)\r
+  {\r
+    this.av         = av;\r
+    alignPanel = parent;\r
+    idCanvas = new IdCanvas(av);\r
+    setLayout(new BorderLayout());\r
+    add(idCanvas, BorderLayout.CENTER);\r
+    idCanvas.addMouseListener(this);\r
+    idCanvas.addMouseMotionListener(this);\r
+  }\r
+\r
+  public void mouseMoved(MouseEvent e) {}\r
+\r
+\r
+  public void mouseDragged(MouseEvent e) {\r
+    mouseDragging = true;\r
+\r
+    int y = e.getY();\r
+    if(av.getWrapAlignment())\r
+      y-=2*av.charHeight;\r
+    int seq = av.getIndex(y);\r
+\r
+    if(seq<0)\r
+      return;\r
+\r
+    if (seq < lastid)\r
+      selectSeqs(lastid - 1, seq);\r
+    else if (seq > lastid)\r
+      selectSeqs(lastid + 1, seq);\r
+\r
+    lastid = seq;\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  public void mouseClicked(MouseEvent e)\r
+  {\r
+    if (e.getClickCount() == 2)\r
+    {\r
+       int y = e.getY();\r
+       if(av.getWrapAlignment())\r
+         y-=2*av.charHeight;\r
+\r
+       int seq = av.getIndex(y);\r
+       String id = av.getAlignment().getSequenceAt(seq).getName();\r
+\r
+       try{\r
+         jalview.bin.JalviewLite.showURL(\r
+             "http://srs.ebi.ac.uk/srs7bin/cgi-bin/wgetz?-e+[swall-id:" + id +\r
+             "]+-vn+2");\r
+       }catch(Exception ex){ex.printStackTrace();}\r
+    }\r
+\r
+  }\r
+  public void mouseEntered(MouseEvent e)\r
+  {\r
+    if(scrollThread!=null)\r
+      scrollThread.running = false;\r
+  }\r
+\r
+  public void mouseExited (MouseEvent e)\r
+  {\r
+    if(av.getWrapAlignment())\r
+      return;\r
+\r
+    if(mouseDragging && e.getY()<0 && av.getStartSeq()>0)\r
+    {\r
+      scrollThread = new ScrollThread(true);\r
+    }\r
+\r
+    if(mouseDragging && e.getY()>=getSize().height && av.alignment.getHeight()>av.getEndSeq())\r
+    {\r
+      scrollThread = new ScrollThread(false);\r
+    }\r
+  }\r
+\r
+\r
+  public void mousePressed(MouseEvent e) {\r
+    if (e.getClickCount() == 2)\r
+      return;\r
+\r
+    int y = e.getY();\r
+    if(av.getWrapAlignment())\r
+      y-=2*av.charHeight;\r
+\r
+    int seq = av.getIndex(y);\r
+    if (seq == -1)\r
+      return;\r
+\r
+    if ( (e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)\r
+    {\r
+      APopupMenu popup = new APopupMenu(alignPanel, null);\r
+      this.add(popup);\r
+      popup.show(this, e.getX(), e.getY());\r
+      return;\r
+    }\r
+\r
+\r
+    if(!e.isControlDown() && !e.isShiftDown() && av.alignment.findGroup( av.alignment.getSequenceAt(seq))!=null)\r
+    {\r
+\r
+      SequenceGroup selection = new SequenceGroup();\r
+      SequenceGroup sg = av.alignment.findGroup(av.alignment.getSequenceAt(seq));\r
+      selection.setStartRes(0);\r
+      selection.setEndRes(av.alignment.getWidth()-1);\r
+      for (int i =0; i< sg.getSize(); i++)\r
+        selection.addSequence(sg.getSequenceAt(i));\r
+\r
+      av.setSelectionGroup(selection);\r
+      return;\r
+    }\r
+\r
+    if(av.getSelectionGroup()==null || ( !e.isControlDown() && av.getSelectionGroup()!=null))\r
+      av.setSelectionGroup(new SequenceGroup());\r
+\r
+    av.getSelectionGroup().setStartRes(0);\r
+    av.getSelectionGroup().setEndRes(av.alignment.getWidth()-1);\r
+\r
+    if(e.isShiftDown() && lastid!=-1)\r
+      selectSeqs(lastid, seq);\r
+    else\r
+      selectSeq(seq);\r
+\r
+    alignPanel.repaint();\r
+  }\r
+\r
+  void selectSeq(int seq)\r
+  {\r
+    lastid = seq;\r
+    SequenceI pickedSeq = av.getAlignment().getSequenceAt(seq);\r
+    av.getSelectionGroup().addOrRemove(pickedSeq);\r
+  }\r
+\r
+  void selectSeqs(int start, int end) {\r
+\r
+    lastid = start;\r
+    if (end < start)\r
+     {\r
+       int tmp = start;\r
+       start = end;\r
+       end   = tmp;\r
+       lastid = end;\r
+     }\r
+\r
+     for (int i = start; i <= end; i++)\r
+        av.getSelectionGroup().addSequence(av.getAlignment().getSequenceAt(i));\r
+\r
+   }\r
+\r
+\r
+  public void mouseReleased(MouseEvent e)\r
+  {\r
+    if(scrollThread!=null)\r
+      scrollThread.running = false;\r
+\r
+    mouseDragging = false;\r
+    PaintRefresher.Refresh(this);\r
+  }\r
+\r
+  public void highlightSearchResults( java.util.Vector found )\r
+  {\r
+    idCanvas.setHighlighted( found );\r
+\r
+    if(found == null)\r
+      return;\r
+\r
+    int index = av.alignment.findIndex( (SequenceI)found.elementAt(0));\r
+\r
+    // do we need to scroll the panel?\r
+    if(av.getStartSeq()>index || av.getEndSeq()<index)\r
+        alignPanel.setScrollValues( av.getStartRes(), index);\r
+  }\r
+\r
+  // this class allows scrolling off the bottom of the visible alignment\r
+  class ScrollThread\r
+      extends Thread\r
+  {\r
+    boolean running = false;\r
+    boolean up = true;\r
+    public ScrollThread(boolean up)\r
+    {\r
+      this.up = up;\r
+      start();\r
+    }\r
+\r
+    public void stopScrolling()\r
+    {\r
+      running = false;\r
+    }\r
+\r
+    public void run()\r
+    {\r
+      running = true;\r
+      while (running)\r
+      {\r
+        if(alignPanel.scrollUp(up))\r
+        {\r
+          // scroll was ok, so add new sequence to selection\r
+          int seq = av.getStartSeq();\r
+          if(!up)\r
+            seq = av.getEndSeq();\r
+\r
+          if (seq < lastid)\r
+            selectSeqs(lastid - 1, seq);\r
+          else if (seq > lastid)\r
+            selectSeqs(lastid + 1, seq);\r
+\r
+          lastid = seq;\r
+        }\r
+        else\r
+          running = false;\r
+\r
+        alignPanel.repaint();\r
+        try\r
+        {\r
+          Thread.sleep(100);\r
+        }\r
+        catch (Exception ex)\r
+        {}\r
+      }\r
+    }\r
+}\r
+\r
+}\r
diff --git a/src/jalview/appletgui/IdwidthAdjuster.java b/src/jalview/appletgui/IdwidthAdjuster.java
new file mode 100755 (executable)
index 0000000..e748697
--- /dev/null
@@ -0,0 +1,61 @@
+package jalview.appletgui;\r
+\r
+import java.awt.event.*;\r
+import java.awt.*;\r
+\r
+\r
+public class IdwidthAdjuster extends Panel implements MouseListener, MouseMotionListener\r
+{\r
+  boolean active = false;\r
+  int oldX=0;\r
+  Image image;\r
+  AlignmentPanel ap ;\r
+\r
+  public IdwidthAdjuster(AlignmentPanel ap)\r
+  {\r
+    setLayout(null);\r
+    this.ap = ap;\r
+    java.net.URL url = getClass().getResource("/images/idwidth.gif");\r
+       if (url != null)\r
+         image = java.awt.Toolkit.getDefaultToolkit().getImage(url);\r
+\r
+    addMouseListener(this);\r
+    addMouseMotionListener(this);\r
+  }\r
+\r
+  public void mousePressed(MouseEvent evt)\r
+  { oldX = evt.getX(); }\r
+\r
+  public void mouseReleased(MouseEvent evt){ active = false; repaint(); }\r
+  public void mouseEntered(MouseEvent evt) { active = true;  repaint();}\r
+  public void mouseExited(MouseEvent evt)  { active = false; repaint();}\r
+  public void mouseDragged(MouseEvent evt)\r
+  {\r
+    active = true;\r
+    Dimension d = ap.idPanel.idCanvas.getSize();\r
+    int dif = evt.getX() - oldX;\r
+\r
+    if(d.width+dif>20 || dif>0)\r
+    {\r
+      ap.setIdWidth(d.width + dif,d.height);\r
+      this.setSize(d.width + dif, getSize().height);\r
+    }\r
+\r
+    oldX = evt.getX();\r
+  }\r
+\r
+  public void mouseMoved(MouseEvent evt)   {}\r
+  public void mouseClicked(MouseEvent evt) {}\r
+\r
+  public void paint(Graphics g)\r
+  {\r
+    g.setColor(Color.white);\r
+    g.fillRect(0,0, getSize().width, getSize().height);\r
+    if(active)\r
+    {\r
+      if(image!=null)\r
+        g.drawImage(image, getSize().width-20, 2, this);\r
+    }\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/OverviewPanel.java b/src/jalview/appletgui/OverviewPanel.java
new file mode 100755 (executable)
index 0000000..3ba88b4
--- /dev/null
@@ -0,0 +1,264 @@
+package jalview.appletgui;\r
+\r
+import java.awt.event.*;\r
+import java.awt.*;\r
+\r
+public class OverviewPanel extends Panel implements Runnable\r
+{\r
+  Image miniMe;\r
+  AlignViewport av;\r
+  AlignmentPanel ap;\r
+  float scalew = 1f;\r
+  float scaleh = 1f;\r
+\r
+  public int width, sequencesHeight;\r
+  int graphHeight=30;\r
+  int boxX=-1, boxY=-1, boxWidth=-1, boxHeight=-1;\r
+\r
+  boolean resizing = false;\r
+\r
+  Frame nullFrame;\r
+\r
+  public OverviewPanel(AlignmentPanel ap)\r
+  {\r
+    this.av = ap.av;\r
+    this.ap = ap;\r
+    setLayout(null);\r
+    nullFrame = new Frame();\r
+    nullFrame.addNotify();\r
+\r
+    // scale the initial size of overviewpanel to shape of alignment\r
+    float initialScale = (float)av.alignment.getWidth()/(float)av.alignment.getHeight();\r
+    if(av.alignment.getWidth() > av.alignment.getHeight())\r
+    {\r
+      // wider\r
+      width = 400;\r
+      sequencesHeight = (int)(400f/initialScale);\r
+    }\r
+    else\r
+    {\r
+      // taller\r
+      width = (int)(400f*initialScale);\r
+      sequencesHeight = 300;\r
+      if(width<120)\r
+        width = 120;\r
+    }\r
+\r
+    setSize (new Dimension(width, sequencesHeight+graphHeight));\r
+    addComponentListener(new ComponentAdapter()\r
+   {\r
+\r
+       public void componentResized(ComponentEvent evt)\r
+       {\r
+         if( getSize().width!=width || getSize().height!=sequencesHeight+graphHeight)\r
+         {\r
+           updateOverviewImage();\r
+         }\r
+       }\r
+   });\r
+\r
+    addMouseMotionListener(new MouseMotionAdapter()\r
+           {\r
+             public void mouseDragged(MouseEvent evt)\r
+             { doMouseDragged(evt);}\r
+           });\r
+\r
+    addMouseListener(new MouseAdapter()\r
+    {\r
+      public void mousePressed(MouseEvent evt)\r
+      { doMousePressed(evt);}\r
+      public void mouseReleased(MouseEvent evt)\r
+      { doMouseReleased(evt);}\r
+    });\r
+\r
+    updateOverviewImage();\r
+\r
+  }\r
+\r
+  public void doMousePressed(MouseEvent evt)\r
+  {\r
+    boxX = evt.getX();\r
+    boxY = evt.getY();\r
+\r
+    checkValid();\r
+    repaint();\r
+  }\r
+\r
+  public void doMouseReleased(MouseEvent evt)\r
+  {\r
+    boxX = evt.getX();\r
+    boxY = evt.getY();\r
+    checkValid();\r
+    if(!resizing)\r
+    ap.setScrollValues( (int)(boxX/scalew/av.getCharWidth()),\r
+                        (int)(boxY/scaleh/av.getCharHeight()) );\r
+  }\r
+\r
+  public void doMouseDragged(MouseEvent evt)\r
+  {\r
+    boxX = evt.getX();\r
+    boxY = evt.getY();\r
+    checkValid();\r
+    if(!resizing)\r
+    ap.setScrollValues( (int)(boxX/scalew/av.getCharWidth()),\r
+                        (int)(boxY/scaleh/av.getCharHeight()) );\r
+    repaint();\r
+    ap.repaint();\r
+  }\r
+\r
+  void checkValid()\r
+  {\r
+    if (boxY < 0)\r
+      boxY = 0;\r
+\r
+    if (boxY > sequencesHeight - boxHeight)\r
+      boxY = sequencesHeight - boxHeight+1;\r
+\r
+    if (boxX < 0)\r
+      boxX = 0;\r
+\r
+    if (boxX > width - boxWidth)\r
+      boxX = width - boxWidth;\r
+  }\r
+\r
+  public void updateOverviewImage()\r
+  {\r
+    if(resizing)\r
+    {\r
+      return;\r
+    }\r
+\r
+    resizing = true;\r
+    Thread thread = new Thread(this);\r
+    thread.start();\r
+    repaint();\r
+  }\r
+\r
+  public void run()\r
+  {\r
+    miniMe = null;\r
+    int alwidth = av.alignment.getWidth();\r
+    int alheight = av.alignment.getHeight();\r
+\r
+    if(getSize().width>0 && getSize().height>0)\r
+    {\r
+      width = getSize().width;\r
+      sequencesHeight = getSize().height - graphHeight;\r
+    }\r
+\r
+    setSize (new Dimension(width, sequencesHeight+graphHeight));\r
+\r
+    int fullsizeWidth  = alwidth * av.getCharWidth();\r
+    int fullsizeHeight = alheight * av.getCharHeight();\r
+\r
+    scalew = (float) width / (float) fullsizeWidth;\r
+    scaleh = (float) sequencesHeight / (float) fullsizeHeight;\r
+\r
+    miniMe = nullFrame.createImage(width, sequencesHeight + graphHeight);\r
+\r
+    Graphics mg = miniMe.getGraphics();\r
+    Image consensus = nullFrame.createImage(fullsizeWidth, 60);\r
+    Graphics g = consensus.getGraphics();\r
+    ap.annotationPanel.drawGraph(g, av.conservation, fullsizeWidth, 60);\r
+    mg.drawImage(consensus, 0, sequencesHeight, width,\r
+             sequencesHeight + graphHeight, 0, 0, fullsizeWidth, 60, this);\r
+\r
+\r
+    boolean oldRenderGaps = av.renderGaps;\r
+    try{\r
+    // We'll have to draw the full size alignment in chunks, as an image of the\r
+    // whole alignment requires too much memory\r
+\r
+      // Max size depends on the font size, the following is a\r
+      // guess at a size which works\r
+      int maxSize = 2000 /  av.getFont().getSize();\r
+      Image block;\r
+      int blockx=0, blocky=0, blockw=0, blockh=0, eRes=0, eSeq=0;\r
+\r
+      av.setRenderGaps(false);\r
+      for(int sRes=0, chunkx=0; sRes<alwidth; sRes+=maxSize, chunkx++)\r
+      {\r
+          eSeq = 0;\r
+          eRes+=maxSize;\r
+          if(eRes>alwidth)\r
+            eRes = alwidth;\r
+\r
+          for(int sSeq=0, chunky=0; sSeq<alheight; sSeq+=maxSize, chunky++)\r
+          {\r
+            eSeq+=maxSize;\r
+            if(eSeq>alheight)\r
+              eSeq = alheight;\r
+\r
+            blocky = 0;\r
+            blockx = (int)((float)sRes/(float)alwidth * width);\r
+\r
+            block = nullFrame.createImage((eRes-sRes)*av.charWidth, (eSeq-sSeq)*av.charHeight);\r
+            g = block.getGraphics();\r
+\r
+           ap.seqPanel.seqCanvas.drawPanel(g, sRes, eRes, sSeq, eSeq, sRes, sSeq, 0);\r
+\r
+           blockh = (int)( (float)(eSeq-sSeq)/(float)alheight *  sequencesHeight  )+1 ;\r
+           blockw = (int)( (float)(eRes-sRes)/(float)alwidth  *   width )+1;\r
+\r
+           blocky += (int) ((float)sSeq/(float)alheight* sequencesHeight);\r
+\r
+           mg.drawImage(block,  blockx,\r
+                              blocky ,\r
+                            blockx + blockw,\r
+                            blocky + blockh,\r
+\r
+                         0, 0, block.getWidth(null),block.getHeight(null), this);\r
+\r
+          block = null;\r
+          }\r
+\r
+      }\r
+\r
+    }catch(OutOfMemoryError error)\r
+    {     System.out.println("out of memory");   }\r
+\r
+\r
+    av.setRenderGaps(oldRenderGaps);\r
+    resizing = false;\r
+\r
+    setBoxPosition();\r
+  }\r
+\r
+  public void setBoxPosition()\r
+  {\r
+      boxX = (int) (av.getStartRes() * av.getCharWidth() * scalew);\r
+      boxY = (int) (av.getStartSeq() * av.getCharHeight() * scaleh);\r
+      boxWidth = (int) ((av.getEndRes()-av.getStartRes()+1)* av.getCharWidth() * scalew) ;\r
+      boxHeight = (int) (av.getEndSeq() * av.getCharHeight() * scaleh) - boxY;\r
+      repaint();\r
+  }\r
+\r
+ public void update(Graphics g)\r
+ {\r
+   paint(g);\r
+ }\r
+\r
+  public void paint(Graphics g)\r
+  {\r
+    if(resizing)\r
+    {\r
+      g.setColor(Color.white);\r
+      g.fillRect(0, 0, getSize().width, getSize().height);\r
+      g.setColor(Color.black);\r
+\r
+      g.setFont(new Font("Verdana", Font.BOLD, 15));\r
+      g.drawString("Recalculating", 5, sequencesHeight/2);\r
+      g.drawString("Overview.....", 5, sequencesHeight/2 +20);\r
+    }\r
+    else\r
+    {\r
+      if(miniMe!=null)\r
+        g.drawImage(miniMe, 0,0,this);\r
+\r
+      g.setColor(Color.red);\r
+      g.drawRect(boxX, boxY, boxWidth, boxHeight);\r
+      g.drawRect(boxX+1, boxY+1, boxWidth-2, boxHeight-2);\r
+    }\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/PCAPanel.java b/src/jalview/appletgui/PCAPanel.java
new file mode 100755 (executable)
index 0000000..2613df5
--- /dev/null
@@ -0,0 +1,122 @@
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.*;\r
+import jalview.analysis.PCA;\r
+import jalview.jbappletgui.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+\r
+public class PCAPanel extends GPCAPanel implements Runnable\r
+{\r
+  PCA pca;\r
+  int top;\r
+  RotatableCanvas rc;\r
+  AlignViewport av;\r
+\r
+  public void run()\r
+  {\r
+    // do stuff\r
+  }\r
+\r
+  public PCAPanel(AlignViewport av, SequenceI[] s) {\r
+\r
+    this.av = av;\r
+    if(av.getSelectionGroup().getSize()>3)\r
+    {\r
+      s = new Sequence[av.getSelectionGroup().getSize()];\r
+      for(int i=0; i<s.length; i++)\r
+        s[i] = av.getSelectionGroup().getSequenceAt(i);\r
+    }\r
+\r
+\r
+    if(s==null)\r
+    {\r
+      s = new Sequence[av.getAlignment().getHeight()];\r
+      for (int i = 0; i < av.getAlignment().getHeight(); i++)\r
+        s[i] = av.getAlignment().getSequenceAt(i);\r
+     }\r
+\r
+//////////////////////This part was done in PCATHread originally. Is it too slow???\r
+    pca = new PCA(s);\r
+    pca.run();\r
+\r
+    // Now find the component coordinates\r
+    int ii=0;\r
+    while (ii < s.length && s[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
+\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(s[i],scores[i]);\r
+      points.addElement(sp);\r
+    }\r
+\r
+    rc = new RotatableCanvas(av,points,pca.getM().rows);\r
+\r
+    //rc.printPoints();\r
+\r
+    add(rc, BorderLayout.CENTER);\r
+  }\r
+\r
+\r
+  void doDimensionChange()\r
+  {\r
+    if(top==0)\r
+      return;\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
+      ((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
+  protected void xCombobox_actionPerformed(ActionEvent e)\r
+  {\r
+    doDimensionChange();\r
+  }\r
+\r
+  protected void yCombobox_actionPerformed(ActionEvent e)\r
+  {\r
+    doDimensionChange();\r
+  }\r
+\r
+  protected void zCombobox_actionPerformed(ActionEvent e)\r
+  {\r
+    doDimensionChange();\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/PaintRefresher.java b/src/jalview/appletgui/PaintRefresher.java
new file mode 100755 (executable)
index 0000000..f696640
--- /dev/null
@@ -0,0 +1,35 @@
+package jalview.appletgui;\r
+import java.awt.*;\r
+import java.util.*;\r
+\r
+public class PaintRefresher\r
+{\r
+  static Vector components = new Vector();\r
+\r
+  public static void Register(Component c)\r
+  {\r
+    if(!components.contains(c))\r
+      components.addElement(c);\r
+    else\r
+      components.removeElement(c);\r
+  }\r
+\r
+  public static void Refresh(Component c)\r
+  {\r
+    Component temp;\r
+    Enumeration e = components.elements();\r
+    while( e.hasMoreElements() )\r
+    {\r
+      temp = (Component)e.nextElement();\r
+\r
+      if(!temp.isValid())\r
+        components.removeElement( temp );\r
+      else if( temp == c )\r
+           continue;\r
+\r
+      temp.repaint();\r
+    }\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/PairwiseAlignPanel.java b/src/jalview/appletgui/PairwiseAlignPanel.java
new file mode 100755 (executable)
index 0000000..939e2f4
--- /dev/null
@@ -0,0 +1,71 @@
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.*;\r
+import jalview.jbappletgui.GPairwiseAlignPanel;\r
+import jalview.analysis.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+\r
+public class PairwiseAlignPanel extends GPairwiseAlignPanel\r
+{\r
+    Vector sequences = new Vector();\r
+    AlignViewport av;\r
+\r
+    public PairwiseAlignPanel(AlignViewport av)\r
+    {\r
+      super();\r
+      this.av = av;\r
+      float scores[][] = new float[av.getAlignment().getHeight()][av.getAlignment().getHeight()];\r
+      double totscore = 0;\r
+      int count = av.getSelectionGroup().getSize();\r
+\r
+      int acount = 0;\r
+        for (int i = 1; i < count; i++)\r
+        {\r
+          for (int j = 0; j < i; j++)\r
+          {\r
+            acount++;\r
+            AlignSeq as = new AlignSeq(av.getSelectionGroup().getSequenceAt(i),\r
+                                       av.getSelectionGroup().getSequenceAt(j),"pep");\r
+\r
+            as.calcScoreMatrix();\r
+            as.traceAlignment();\r
+            as.printAlignment();\r
+            scores[i][j] = (float)as.getMaxScore()/(float)as.getASeq1().length;\r
+            totscore = totscore + scores[i][j];\r
+\r
+            textarea.append(as.getOutput());\r
+            sequences.addElement( new Sequence( as.getS1().getName(), as.getAStr1()) );\r
+            sequences.addElement( new Sequence( as.getS2().getName(), as.getAStr2()) );\r
+\r
+\r
+          }\r
+        }\r
+\r
+        if (count > 2)\r
+        {\r
+          for (int i = 0; i < count;i++)\r
+            for (int j = 0; j < i; j++)\r
+              jalview.util.Format.print(System.out,"%7.3f",scores[i][j]/totscore);\r
+        }\r
+      }\r
+\r
+\r
+  protected void viewInEditorButton_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+      Sequence [] seq = new Sequence[sequences.size()];\r
+\r
+      for (int i=0;i<sequences.size();i++)\r
+       seq[i] = (Sequence) sequences.elementAt(i);\r
+\r
+\r
+      AlignFrame af = new AlignFrame(new Alignment(seq));\r
+      jalview.bin.JalviewLite.addFrame(af, "Pairwise Aligned Sequences",\r
+                               AlignFrame.NEW_WINDOW_WIDTH,\r
+                               AlignFrame.NEW_WINDOW_HEIGHT);\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/RedundancyPanel.java b/src/jalview/appletgui/RedundancyPanel.java
new file mode 100755 (executable)
index 0000000..6e22ecb
--- /dev/null
@@ -0,0 +1,102 @@
+package jalview.appletgui;\r
+\r
+import jalview.jbappletgui.*;\r
+import jalview.datamodel.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+public class RedundancyPanel extends GSliderPanel\r
+{\r
+  AlignmentPanel ap;\r
+\r
+  SequenceI[] oldAlignment;\r
+\r
+\r
+  public RedundancyPanel(AlignmentPanel ap)\r
+  {\r
+    this.ap = ap;\r
+\r
+    label.setText("Enter the redundancy threshold");\r
+\r
+    slider.addAdjustmentListener(new AdjustmentListener()\r
+    {\r
+      public void adjustmentValueChanged(AdjustmentEvent evt)\r
+      {\r
+        valueField.setText( slider.getValue()+"" );\r
+      }\r
+    });\r
+\r
+    slider.setMinimum(0);\r
+    slider.setMaximum(100);\r
+    slider.setValue(100 );\r
+\r
+  }\r
+\r
+  public void applyButton_actionPerformed(ActionEvent e)\r
+  {\r
+       float threshold = slider.getValue();\r
+       Vector del;\r
+\r
+       oldAlignment = new SequenceI[ap.av.alignment.getHeight()];\r
+        for (int i = 0; i < ap.av.alignment.getHeight(); i++)\r
+        {\r
+           oldAlignment[i] = new Sequence(ap.av.alignment.getSequenceAt(i).getName(),\r
+                                ap.av.alignment.getSequenceAt(i).\r
+                                getSequence());\r
+        }\r
+\r
+        undoButton.setEnabled(true);\r
+\r
+        SequenceGroup sg = ap.av.getSelectionGroup();\r
+       if (sg != null && sg.getSize() > 1)\r
+       {\r
+\r
+         del = ap.av.alignment.removeRedundancy(threshold, sg.sequences);\r
+         for (int i = 0; i < del.size(); i++)\r
+           if (sg.sequences.contains( (SequenceI) del.elementAt(i)))\r
+             sg.deleteSequence( (SequenceI) del.elementAt(i));\r
+\r
+         }\r
+         else\r
+         {\r
+           Vector s = new Vector();\r
+           int i=0;\r
+           while(i < ap.av.alignment.getHeight())\r
+           {\r
+             s.addElement( ap.av.alignment.getSequenceAt(i) );\r
+             i++;\r
+           }\r
+            del = ap.av.alignment.removeRedundancy(threshold,s);\r
+           for (int j=0; j < del.size(); j++)\r
+           {\r
+               if (sg.sequences.contains((SequenceI)del.elementAt(j)))\r
+               sg.deleteSequence((SequenceI)del.elementAt(j));\r
+\r
+           }\r
+         }\r
+\r
+         ap.repaint();\r
+\r
+  }\r
+\r
+  public void undoButton_actionPerformed(ActionEvent e)\r
+  {\r
+      undoButton.setEnabled(false);\r
+      ap.av.setAlignment( new Alignment(oldAlignment) );\r
+      oldAlignment = null;\r
+      ap.repaint();\r
+  }\r
+\r
+\r
+  public void valueField_actionPerformed(ActionEvent e)\r
+  {\r
+    try{\r
+      int i = Integer.parseInt(valueField.getText());\r
+      slider.setValue(i);\r
+    }\r
+    catch(Exception ex)\r
+    {\r
+      valueField.setText( slider.getValue()+"" );\r
+    }\r
+  }\r
+}\r
diff --git a/src/jalview/appletgui/RotatableCanvas.java b/src/jalview/appletgui/RotatableCanvas.java
new file mode 100755 (executable)
index 0000000..51b436f
--- /dev/null
@@ -0,0 +1,514 @@
+package jalview.appletgui;\r
+\r
+import jalview.math.*;\r
+import jalview.datamodel.*;\r
+import jalview.util.*;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+\r
+public class RotatableCanvas extends Panel implements MouseListener,\r
+                                                       MouseMotionListener,\r
+                                                       KeyListener\r
+                                                       //RubberbandListener,\r
+                                                       //SequenceSelectionListener\r
+{\r
+  RotatableMatrix idmat  = new RotatableMatrix(3,3);\r
+  RotatableMatrix objmat = new RotatableMatrix(3,3);\r
+  RotatableMatrix rotmat = new RotatableMatrix(3,3);\r
+\r
+  //RubberbandRectangle rubberband;\r
+\r
+  boolean drawAxes = true;\r
+\r
+  int omx = 0;\r
+  int mx = 0;\r
+  int omy = 0;\r
+  int my = 0;\r
+\r
+  Image img;\r
+  Graphics ig;\r
+\r
+  Dimension prefsize;\r
+\r
+  float centre[] = new float[3];\r
+  float width[] = new float[3];\r
+\r
+  float max[] = new float[3];\r
+  float min[] = new float[3];\r
+\r
+  float maxwidth;\r
+  float scale;\r
+\r
+  int npoint;\r
+\r
+  Vector points;\r
+  float[][] orig;\r
+  float[][] axes;\r
+\r
+  int startx;\r
+  int starty;\r
+\r
+  int lastx;\r
+  int lasty;\r
+\r
+  int rectx1;\r
+  int recty1;\r
+  int rectx2;\r
+  int recty2;\r
+\r
+  float scalefactor = 1;\r
+\r
+  AlignViewport av;\r
+//  Controller    controller;\r
+\r
+\r
+  public RotatableCanvas(AlignViewport av,\r
+                          Vector points, int npoint) {\r
+    this.points = points;\r
+    this.npoint = npoint;\r
+    this.av = av;\r
+    PaintRefresher.Register(this);\r
+//\r
+    prefsize = getPreferredSize();\r
+    orig = new float[npoint][3];\r
+\r
+    for (int i=0; i < npoint; i++) {\r
+      SequencePoint sp = (SequencePoint)points.elementAt(i);\r
+      for (int j=0; j < 3; j++) {\r
+        orig[i][j] = sp.coord[j];\r
+      }\r
+    }\r
+    //Initialize the matrices to identity\r
+\r
+    for (int i = 0; i < 3; i++) {\r
+      for (int j = 0; j < 3 ; j++) {\r
+        if (i != j) {\r
+          idmat.addElement(i,j,0);\r
+          objmat.addElement(i,j,0);\r
+          rotmat.addElement(i,j,0);\r
+        } else {\r
+          idmat.addElement(i,j,0);\r
+          objmat.addElement(i,j,0);\r
+          rotmat.addElement(i,j,0);\r
+        }\r
+      }\r
+    }\r
+\r
+    axes = new float[3][3];\r
+    initAxes();\r
+\r
+    findCentre();\r
+    findWidth();\r
+\r
+    scale = findScale();\r
+\r
+    //    System.out.println("Scale factor = " + scale);\r
+\r
+    addMouseListener(this);\r
+    addKeyListener(this);\r
+   // if (getParent() != null) {\r
+   //   getParent().addKeyListener(this);\r
+    //}\r
+    addMouseMotionListener(this);\r
+\r
+    // Add rubberband\r
+ //   rubberband  = new RubberbandRectangle(this);\r
+  //  rubberband.setActive(true);\r
+ //   rubberband.addListener(this);\r
+  }\r
+\r
+ /* public boolean handleSequenceSelectionEvent(SequenceSelectionEvent evt) {\r
+    redrawneeded = true;\r
+    repaint();\r
+    return true;\r
+  }\r
+\r
+  public void removeNotify() {\r
+    controller.removeListener(this);\r
+    super.removeNotify();\r
+  }*/\r
+\r
+  public void initAxes() {\r
+    for (int i = 0; i < 3; i++) {\r
+      for (int j=0; j < 3; j++) {\r
+        if (i != j) {\r
+          axes[i][j] = 0;\r
+        } else {\r
+          axes[i][j] = 1;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  public void findWidth() {\r
+    max = new float[3];\r
+    min = new float[3];\r
+\r
+    max[0] = (float)-1e30;\r
+    max[1] = (float)-1e30;\r
+    max[2] = (float)-1e30;\r
+\r
+    min[0] = (float)1e30;\r
+    min[1] = (float)1e30;\r
+    min[2] = (float)1e30;\r
+\r
+    for (int i = 0; i < 3; i++) {\r
+      for (int j = 0; j < npoint; j++) {\r
+        SequencePoint sp = (SequencePoint)points.elementAt(j);\r
+        if (sp.coord[i] >= max[i]) {\r
+          max[i] = sp.coord[i];\r
+        }\r
+        if (sp.coord[i] <= min[i]) {\r
+          min[i] = sp.coord[i];\r
+        }\r
+      }\r
+    }\r
+\r
+    //    System.out.println("xmax " + max[0] + " min " + min[0]);\r
+    //System.out.println("ymax " + max[1] + " min " + min[1]);\r
+    //System.out.println("zmax " + max[2] + " min " + min[2]);\r
+\r
+    width[0] = Math.abs(max[0] - min[0]);\r
+    width[1] = Math.abs(max[1] - min[1]);\r
+    width[2] = Math.abs(max[2] - min[2]);\r
+\r
+    maxwidth = width[0];\r
+\r
+    if (width[1] > width[0])\r
+      maxwidth = width[1];\r
+    if (width[2] > width[1])\r
+      maxwidth = width[2];\r
+\r
+    //System.out.println("Maxwidth = " + maxwidth);\r
+  }\r
+\r
+  public float findScale() {\r
+    int dim, width, height;\r
+    if (getSize().width != 0) {\r
+      width = getSize().width;\r
+      height = getSize().height;\r
+    } else {\r
+      width = prefsize.width;\r
+      height = prefsize.height;\r
+    }\r
+\r
+    if (width < height) {\r
+      dim = width;\r
+    } else {\r
+      dim = height;\r
+    }\r
+\r
+    return (float)(dim*scalefactor/(2*maxwidth));\r
+  }\r
+\r
+  public void findCentre() {\r
+    //Find centre coordinate\r
+    findWidth();\r
+\r
+    centre[0] = (max[0] + min[0])/2;\r
+    centre[1] = (max[1] + min[1])/2;\r
+    centre[2] = (max[2] + min[2])/2;\r
+\r
+    //    System.out.println("Centre x " + centre[0]);\r
+    //System.out.println("Centre y " + centre[1]);\r
+    //System.out.println("Centre z " + centre[2]);\r
+  }\r
+\r
+  public Dimension getPreferredSize() {\r
+    if (prefsize != null) {\r
+      return prefsize;\r
+    } else {\r
+      return new Dimension(400,400);\r
+    }\r
+  }\r
+\r
+  public Dimension getMinimumSize() {\r
+    return getPreferredSize();\r
+  }\r
+\r
+  public void paint(Graphics g) {\r
+    //Only create the image at the beginning -\r
+    if ((img == null) || (prefsize.width != getSize().width) || (prefsize.height != getSize().height)) {\r
+      prefsize.width = getSize().width;\r
+      prefsize.height = getSize().height;\r
+\r
+      scale = findScale();\r
+\r
+      //      System.out.println("New scale = " + scale);\r
+      img = createImage(getSize().width,getSize().height);\r
+      ig = img.getGraphics();\r
+\r
+    }\r
+\r
+\r
+      drawBackground(ig,Color.black);\r
+      drawScene(ig);\r
+      if (drawAxes == true)\r
+      {\r
+        drawAxes(ig);\r
+      }\r
+\r
+\r
+    g.drawImage(img,0,0,this);\r
+  }\r
+\r
+  public void drawAxes(Graphics g) {\r
+\r
+    g.setColor(Color.yellow);\r
+    for (int i=0; i < 3 ; i++) {\r
+      g.drawLine(getSize().width/2,getSize().height/2,\r
+                 (int)(axes[i][0]*scale*max[0] + getSize().width/2),\r
+                 (int)(axes[i][1]*scale*max[1] + getSize().height/2));\r
+    }\r
+  }\r
+\r
+  public void drawBackground(Graphics g, Color col) {\r
+    g.setColor(col);\r
+    g.fillRect(0,0,prefsize.width,prefsize.height);\r
+  }\r
+\r
+\r
+  public void drawScene(Graphics g) {\r
+    boolean darker = false;\r
+\r
+    int halfwidth = getSize().width/2;\r
+    int halfheight = getSize().height/2;\r
+\r
+    for (int i = 0; i < npoint; i++) {\r
+      SequencePoint sp = (SequencePoint)points.elementAt(i);\r
+      int x = (int)((float)(sp.coord[0] - centre[0])*scale) + halfwidth;\r
+      int y = (int)((float)(sp.coord[1] - centre[1])*scale) + halfheight;\r
+      float z = sp.coord[1] - centre[2];\r
+\r
+\r
+\r
+\r
+      if (sp.sequence.getColor() == Color.black)\r
+          g.setColor(Color.white);\r
+      else\r
+          g.setColor(sp.sequence.getColor());\r
+\r
+\r
+      if (av.getSelectionGroup() != null)\r
+      {\r
+        if (av.getSelectionGroup().sequences.contains(((SequencePoint)points.elementAt(i)).sequence))\r
+          g.setColor(Color.gray);\r
+      }\r
+      if (z < 0)\r
+        g.setColor(g.getColor().darker());\r
+\r
+\r
+      g.fillRect(x-3,y-3,6,6);\r
+      g.setColor(Color.red);\r
+    }\r
+//    //Now the rectangle\r
+//    if (rectx2 != -1 && recty2 != -1) {\r
+//      g.setColor(Color.white);\r
+//\r
+//      g.drawRect(rectx1,recty1,rectx2-rectx1,recty2-recty1);\r
+//    }\r
+  }\r
+\r
+  public Dimension minimumsize() {\r
+    return prefsize;\r
+  }\r
+\r
+  public Dimension preferredsize() {\r
+    return prefsize;\r
+  }\r
+\r
+  public void keyTyped(KeyEvent evt) { }\r
+  public void keyReleased(KeyEvent evt) { }\r
+\r
+  public void keyPressed(KeyEvent evt) {\r
+    requestFocus();\r
+    if (evt.getKeyCode() == KeyEvent.VK_UP) {\r
+      scalefactor = (float)(scalefactor * 1.1);\r
+      scale = findScale();\r
+    } else if (evt.getKeyCode() == KeyEvent.VK_DOWN) {\r
+      scalefactor = (float)(scalefactor * 0.9);\r
+      scale = findScale();\r
+    } else if (evt.getKeyChar() == 's') {\r
+      System.out.println("Rectangle selection");\r
+      if (rectx2 != -1 && recty2 != -1) {\r
+        rectSelect(rectx1,recty1,rectx2,recty2);\r
+\r
+      }\r
+    }\r
+    repaint();\r
+  }\r
+\r
+  public void printPoints() {\r
+    for (int i=0; i < npoint; i++) {\r
+      SequencePoint sp = (SequencePoint)points.elementAt(i);\r
+      Format.print(System.out,"%5d ", i);\r
+      for (int j=0; j < 3;j++) {\r
+        Format.print(System.out,"%13.3f  ",sp.coord[j]);\r
+      }\r
+      System.out.println();\r
+    }\r
+  }\r
+\r
+  public void mouseClicked(MouseEvent evt) { }\r
+  public void mouseEntered(MouseEvent evt) { }\r
+  public void mouseExited(MouseEvent evt) { }\r
+  public void mouseReleased(MouseEvent evt) { }\r
+\r
+  public void mousePressed(MouseEvent evt) {\r
+    int x = evt.getX();\r
+    int y = evt.getY();\r
+\r
+    mx = x;\r
+    my = y;\r
+\r
+    omx = mx;\r
+    omy = my;\r
+\r
+    startx = x;\r
+    starty = y;\r
+\r
+    rectx1 = x;\r
+    recty1 = y;\r
+\r
+    rectx2 = -1;\r
+    recty2 = -1;\r
+\r
+    SequenceI found = findPoint(x,y);\r
+\r
+    if (found != null)\r
+    {\r
+      if (av.getSelectionGroup() != null)\r
+      {\r
+        av.getSelectionGroup().addOrRemove(found);\r
+        PaintRefresher.Refresh(this);\r
+      }\r
+      else\r
+      {\r
+          av.setSelectionGroup(new SequenceGroup());\r
+          av.getSelectionGroup().addOrRemove(found);\r
+          av.getSelectionGroup().setEndRes(av.alignment.getWidth());\r
+\r
+      }\r
+    }\r
+    repaint();\r
+  }\r
+\r
+ // private void fireSequenceSelectionEvent(Selection sel) {\r
+ //   controller.handleSequenceSelectionEvent(new SequenceSelectionEvent(this,sel));\r
+  //}\r
+\r
+  public void mouseMoved(MouseEvent evt)\r
+  {\r
+  // SequenceI found = findPoint(evt.getX(), evt.getY());\r
+  }\r
+\r
+  public void mouseDragged(MouseEvent evt) {\r
+    mx = evt.getX();\r
+    my = evt.getY();\r
+    //Check if this is a rectangle drawing drag\r
+    if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) != 0) {\r
+//      rectx2 = evt.getX();\r
+//      recty2 = evt.getY();\r
+    } else {\r
+      rotmat.setIdentity();\r
+\r
+      rotmat.rotate((float)(my-omy),'x');\r
+      rotmat.rotate((float)(mx-omx),'y');\r
+\r
+      for (int i = 0; i < npoint; i++) {\r
+        SequencePoint sp = (SequencePoint)points.elementAt(i);\r
+        sp.coord[0] -= centre[0];\r
+        sp.coord[1] -= centre[1];\r
+        sp.coord[2] -= centre[2];\r
+\r
+        //Now apply the rotation matrix\r
+        sp.coord= rotmat.vectorMultiply(sp.coord);\r
+\r
+        //Now translate back again\r
+        sp.coord[0] += centre[0];\r
+        sp.coord[1] += centre[1];\r
+        sp.coord[2] += centre[2];\r
+      }\r
+\r
+      for (int i=0; i < 3; i++) {\r
+        axes[i] = rotmat.vectorMultiply(axes[i]);\r
+      }\r
+      omx = mx;\r
+      omy = my;\r
+\r
+      paint(this.getGraphics());\r
+    }\r
+\r
+  }\r
+\r
+  public void rectSelect(int x1, int y1, int x2, int y2) {\r
+    boolean changedSel = false;\r
+    for (int i=0; i < npoint; i++) {\r
+      SequencePoint sp = (SequencePoint)points.elementAt(i);\r
+      int tmp1 = (int)((sp.coord[0] - centre[0])*scale + (float)getSize().width/2.0);\r
+      int tmp2 = (int)((sp.coord[1] - centre[1])*scale + (float)getSize().height/2.0);\r
+\r
+      if (tmp1 > x1 && tmp1 < x2 && tmp2 > y1 && tmp2 < y2) {\r
+        if (av != null) {\r
+          if (!av.getSelectionGroup().sequences.contains(sp.sequence))\r
+          {\r
+            changedSel = true;\r
+            av.getSelectionGroup().addSequence(sp.sequence);\r
+          }\r
+        }\r
+      }\r
+    }\r
+   // if (changedSel) {\r
+   //    fireSequenceSelectionEvent(av.getSelection());\r
+   // }\r
+  }\r
+  public SequenceI findPoint(int x, int y) {\r
+\r
+    int halfwidth = getSize().width/2;\r
+    int halfheight = getSize().height/2;\r
+\r
+    int found = -1;\r
+\r
+    for (int i=0; i < npoint; i++) {\r
+\r
+      SequencePoint sp = (SequencePoint)points.elementAt(i);\r
+      int px = (int)((float)(sp.coord[0] - centre[0])*scale) + halfwidth;\r
+      int py = (int)((float)(sp.coord[1] - centre[1])*scale) + halfheight;\r
+\r
+\r
+      if (Math.abs(px-x)<3 && Math.abs(py - y) < 3 ) {\r
+        found = i;\r
+      }\r
+    }\r
+    if (found != -1) {\r
+      return ((SequencePoint)points.elementAt(found)).sequence;\r
+    } else {\r
+      return null;\r
+    }\r
+  }\r
+/*  public boolean handleRubberbandEvent(RubberbandEvent evt) {\r
+    System.out.println("Rubberband handler called in RotatableCanvas with " +\r
+                       evt.getBounds());\r
+\r
+    Rubberband rb = (Rubberband)evt.getSource();\r
+\r
+    // Clear the current selection (instance variable)\r
+    //if ((rb.getModifiers() & Event.SHIFT_MASK) == 0) {\r
+    //   clearSelection();\r
+    //}\r
+\r
+    if (rb.getComponent() == this) {\r
+      Rectangle bounds = evt.getBounds();\r
+      rectSelect(bounds.x,bounds.y,bounds.x+bounds.width,bounds.y+bounds.height);\r
+    }\r
+\r
+    redrawneeded = true;\r
+    paint(this.getGraphics());\r
+\r
+    return true;\r
+  }*/\r
+\r
+}\r
diff --git a/src/jalview/appletgui/ScalePanel.java b/src/jalview/appletgui/ScalePanel.java
new file mode 100755 (executable)
index 0000000..51a03cc
--- /dev/null
@@ -0,0 +1,175 @@
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+public class ScalePanel extends Panel\r
+{\r
+\r
+  protected int offy = 4;\r
+  public    int width;\r
+\r
+  protected AlignViewport av;\r
+  AlignmentPanel ap;\r
+\r
+  boolean stretchingGroup = false;\r
+\r
+  public ScalePanel(AlignViewport av, AlignmentPanel ap)\r
+  {\r
+    setLayout(null);\r
+    this.av         = av;\r
+    this.ap = ap;\r
+\r
+    addMouseListener(new MouseAdapter()\r
+    {\r
+      public void mousePressed(MouseEvent evt)\r
+      {\r
+        doMousePressed(evt);\r
+      }\r
+      public void mouseReleased(MouseEvent evt)\r
+      {\r
+        doMouseReleased(evt);\r
+      }\r
+\r
+    });\r
+    addMouseMotionListener(new MouseMotionAdapter()\r
+    {\r
+      public void mouseDragged(MouseEvent evt)\r
+      {\r
+        doMouseDragged(evt);\r
+      }\r
+    });\r
+\r
+  }\r
+\r
+\r
+  public void doMousePressed(MouseEvent evt) {\r
+    int x = evt.getX();\r
+    int res = x/av.getCharWidth() + av.getStartRes();\r
+    SequenceGroup sg = null;\r
+\r
+    if (av.getColumnSelection().contains(res))\r
+      av.getColumnSelection().removeElement(res);\r
+    else\r
+    {\r
+      av.getColumnSelection().addElement(res);\r
+\r
+      sg = new SequenceGroup();\r
+      for (int i = 0; i < av.alignment.getSequences().size(); i++)\r
+        sg.addSequence(av.alignment.getSequenceAt(i));\r
+\r
+      sg.setStartRes(res);\r
+      sg.setEndRes(res);\r
+\r
+      ap.annotationPanel.addEditableColumn(res);\r
+    }\r
+    av.setSelectionGroup(sg);\r
+    ap.repaint();\r
+  }\r
+\r
+  public void doMouseReleased(MouseEvent evt)\r
+  {\r
+    if(!stretchingGroup)\r
+      return;\r
+\r
+    int x = evt.getX();\r
+    int res = x/av.getCharWidth() + av.getStartRes();\r
+\r
+   if (! av.getColumnSelection().contains(res))\r
+     av.getColumnSelection().addElement(res);\r
+\r
+   SequenceGroup sg = av.getSelectionGroup();\r
+\r
+   if(res>sg.getStartRes())\r
+     sg.setEndRes(res);\r
+   else if(res<sg.getStartRes())\r
+     sg.setStartRes(res);\r
+\r
+   stretchingGroup = false;\r
+   ap.repaint();\r
+  }\r
+\r
+  public void doMouseDragged(MouseEvent evt)\r
+  {\r
+    int x = evt.getX();\r
+    int res = x/av.getCharWidth() + av.getStartRes();\r
+\r
+    SequenceGroup sg = av.getSelectionGroup();\r
+    if(sg!=null)\r
+    {\r
+      stretchingGroup = true;\r
+      if (res > sg.getStartRes())\r
+        sg.setEndRes(res);\r
+      else if (res < sg.getStartRes())\r
+        sg.setStartRes(res);\r
+\r
+       ap.annotationPanel.addEditableColumn(res);\r
+      ap.repaint();\r
+    }\r
+  }\r
+\r
+  public void update(Graphics g)\r
+  {\r
+    paint(g);\r
+  }\r
+\r
+  public void paint(Graphics g)\r
+  {\r
+    drawScale(g, av.getStartRes(), av.getEndRes(), getSize().width, getSize().height);\r
+  }\r
+\r
+// scalewidth will normally be screenwidth,\r
+  public void drawScale(Graphics gg, int startx, int endx, int width, int height)\r
+  {\r
+    gg.setFont(av.getFont());\r
+\r
+    //Fill in the background\r
+    gg.setColor(Color.white);\r
+    gg.fillRect(0,0,width, height);\r
+    gg.setColor(Color.black);\r
+\r
+\r
+    //Fill the selected columns\r
+    ColumnSelection cs = av.getColumnSelection();\r
+    gg.setColor(new Color(220,0,0));\r
+    for (int i=0; i<cs.size(); i++)\r
+    {\r
+      int sel  = cs.columnAt(i);\r
+      if ( sel >= startx  && sel <= endx)\r
+        gg.fillRect((sel-startx)*av.charWidth,0,av.charWidth, getSize().height);\r
+    }\r
+\r
+\r
+    // Draw the scale numbers\r
+    gg.setColor(Color.black);\r
+    int scalestartx = (startx/10) * 10;\r
+\r
+    FontMetrics fm = gg.getFontMetrics(av.getFont());\r
+    int y = av.charHeight -fm.getDescent();\r
+\r
+    if(scalestartx%10==0)\r
+      scalestartx+=5;\r
+\r
+    for (int i=scalestartx;i < endx; i+= 5)\r
+    {\r
+      if(i%10==0)\r
+      {\r
+        gg.drawString(String.valueOf(i), (i - startx - 1) * av.charWidth, y);\r
+        gg.drawLine( (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
+                    y+2,\r
+                    (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
+                    y+fm.getDescent()*2);\r
+      }\r
+      else\r
+        gg.drawLine( (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
+                    y+fm.getDescent(),\r
+                    (int) ( (i - startx - 1) * av.charWidth + av.charWidth / 2),\r
+                   y+fm.getDescent()*2);\r
+\r
+\r
+    }\r
+  }\r
+\r
+\r
+}\r
diff --git a/src/jalview/appletgui/SeqCanvas.java b/src/jalview/appletgui/SeqCanvas.java
new file mode 100755 (executable)
index 0000000..15e3c8b
--- /dev/null
@@ -0,0 +1,486 @@
+package jalview.appletgui;\r
+\r
+import java.awt.*;\r
+import jalview.datamodel.*;\r
+import jalview.analysis.*;\r
+\r
+\r
+public class SeqCanvas extends Panel\r
+{\r
+    FeatureRenderer fr;\r
+    SequenceRenderer sr;\r
+    Image             img;\r
+    Graphics          gg;\r
+    int               imgWidth;\r
+    int               imgHeight;\r
+\r
+    AlignViewport     av;\r
+\r
+    boolean showScores = false;\r
+    boolean displaySearch = false;\r
+    int [] searchResults = null;\r
+\r
+    int chunkHeight;\r
+    int chunkWidth;\r
+\r
+    boolean fastPaint = false;\r
+\r
+\r
+    public SeqCanvas(AlignViewport av)\r
+    {\r
+       this.av         = av;\r
+       fr = new FeatureRenderer(av);\r
+       sr = new SequenceRenderer(av);\r
+       PaintRefresher.Register(this);\r
+\r
+    }\r
+\r
+  void drawNorthScale(Graphics g, int startx, int endx,int ypos) {\r
+    int scalestartx = startx - startx % 10 + 10;\r
+\r
+    g.setColor(Color.black);\r
+\r
+    // NORTH SCALE\r
+    for (int i = scalestartx; i < endx; i += 10)\r
+    {\r
+      String string = String.valueOf(i);\r
+      g.drawString(string, (i - startx - 1) * av.charWidth,\r
+                   ypos - av.charHeight / 2);\r
+\r
+      g.drawLine( (i - startx - 1) * av.charWidth + av.charWidth / 2,\r
+                 ypos + 2 - av.charHeight / 2,\r
+                 (i - startx - 1) * av.charWidth + av.charWidth / 2, ypos - 2);\r
+\r
+    }\r
+  }\r
+\r
+  void drawWestScale(Graphics g, int startx, int endx, int ypos)\r
+  {\r
+    FontMetrics fm = getFontMetrics(av.getFont());\r
+    ypos+= av.charHeight;\r
+      // EAST SCALE\r
+    for (int i = 0; i < av.alignment.getHeight(); i++)\r
+    {\r
+      SequenceI seq = av.alignment.getSequenceAt(i);\r
+      int index = startx;\r
+      int value = -1;\r
+      while (index < endx)\r
+      {\r
+        if (jalview.util.Comparison.isGap(seq.getCharAt(index)))\r
+        {\r
+          index++;\r
+          continue;\r
+        }\r
+\r
+        value = av.alignment.getSequenceAt(i).findPosition(index);\r
+        break;\r
+      }\r
+      if(value!=-1)\r
+      {\r
+        int x = LABEL_WEST - fm.stringWidth(value+"");\r
+        g.drawString(value + "", x,  ypos +  i*av.charHeight - av.charHeight/5);\r
+      }\r
+    }\r
+  }\r
+\r
+  void drawEastScale(Graphics g, int startx, int endx, int ypos)\r
+{\r
+    ypos+= av.charHeight;\r
+    // EAST SCALE\r
+  for (int i = 0; i < av.alignment.getHeight(); i++)\r
+  {\r
+    SequenceI seq = av.alignment.getSequenceAt(i);\r
+    int index = endx;\r
+    int value = -1;\r
+    while (index > startx)\r
+    {\r
+      if (jalview.util.Comparison.isGap(seq.getCharAt(index)))\r
+      {\r
+        index--;\r
+        continue;\r
+      }\r
+\r
+      value = av.alignment.getSequenceAt(i).findPosition(index);\r
+      break;\r
+    }\r
+    if(value!=-1)\r
+       g.drawString(value + "", 0,  ypos +  i*av.charHeight - av.charHeight/5);\r
+  }\r
+\r
+}\r
+\r
+\r
+\r
+public void fastPaint(int horizontal, int vertical)\r
+{\r
+    if (horizontal == 0 && vertical == 0 || gg==null)\r
+      return;\r
+\r
+    gg.copyArea(0, 0, imgWidth, imgHeight, -horizontal * av.charWidth,\r
+                -vertical * av.charHeight);\r
+\r
+    int sr = av.startRes, er = av.endRes, ss = av.startSeq, es = av.endSeq,\r
+        transX = 0, transY = 0;\r
+    if (horizontal > 0) // scrollbar pulled right, image to the left\r
+    {\r
+      transX = (er - sr - horizontal) * av.charWidth;\r
+      sr = er - horizontal;\r
+    }\r
+    else if (horizontal < 0)\r
+      er = sr - horizontal;\r
+\r
+    else if (vertical > 0) // scroll down\r
+    {\r
+      ss = es - vertical;\r
+      if(ss<av.startSeq) // ie scrolling too fast, more than a page at a time\r
+        ss = av.startSeq;\r
+      else\r
+        transY = imgHeight - vertical * av.charHeight;\r
+    }\r
+    else if (vertical < 0)\r
+    {\r
+      es = ss - vertical;\r
+      if(es > av.endSeq)\r
+        es = av.endSeq;\r
+    }\r
+\r
+\r
+    gg.translate(transX, transY);\r
+\r
+    gg.setColor(Color.white);\r
+    gg.fillRect(0,0, (er-sr)*av.charWidth, (es-ss)*av.charHeight);\r
+    drawPanel(gg, sr, er, ss, es, sr, ss, 0);\r
+    gg.translate( -transX, -transY);\r
+\r
+    fastPaint = true;\r
+    repaint();\r
+\r
+}\r
+\r
+/**\r
+ * Definitions of startx and endx (hopefully):\r
+ * SMJS This is what I'm working towards!\r
+ *   startx is the first residue (starting at 0) to display.\r
+ *   endx   is the last residue to display (starting at 0).\r
+ *   starty is the first sequence to display (starting at 0).\r
+ *   endy   is the last sequence to display (starting at 0).\r
+ * NOTE 1: The av limits are set in setFont in this class and\r
+ * in the adjustment listener in SeqPanel when the scrollbars move.\r
+ */\r
+  public void update(Graphics g)\r
+  {\r
+    paint(g);\r
+  }\r
+\r
+  public void paint(Graphics g)\r
+  {\r
+    if (fastPaint)\r
+    {\r
+      g.drawImage(img, 0, 0, this);\r
+      fastPaint = false;\r
+      return;\r
+    }\r
+\r
+    // this draws the whole of the alignment\r
+      imgWidth  = this.getSize().width;\r
+      imgHeight = this.getSize().height;\r
+      if(imgWidth<1 || imgHeight<1)\r
+        return;\r
+\r
+      imgWidth -= imgWidth%av.charWidth;\r
+      imgHeight-= imgHeight%av.charHeight;\r
+\r
+      if(img==null || imgWidth!=img.getWidth(this) || imgHeight!=img.getHeight(this))\r
+      {\r
+        img = createImage(imgWidth, imgHeight);\r
+        gg = img.getGraphics();\r
+        gg.setFont(av.getFont());\r
+      }\r
+\r
+      gg.setColor(Color.white);\r
+      gg.fillRect(0,0,imgWidth,imgHeight);\r
+\r
+    chunkWidth  =   getWrappedCanvasWidth( getSize().width );\r
+    chunkHeight =  (av.getAlignment().getHeight() + 2)*av.charHeight;\r
+\r
+    av.setChunkHeight(chunkHeight);\r
+    av.setChunkWidth(chunkWidth);\r
+\r
+\r
+    if (av.getWrapAlignment())\r
+      drawWrappedPanel(gg, getSize().width, getSize().height, av.startRes);\r
+    else\r
+      drawPanel(gg, av.startRes, av.endRes, av.startSeq, av.endSeq, av.startRes, av.startSeq, 0);\r
+\r
+    g.drawImage(img, 0, 0, this);\r
+\r
+  }\r
+\r
+  int LABEL_WEST, LABEL_EAST;\r
+  public int getWrappedCanvasWidth(int cwidth)\r
+  {\r
+    FontMetrics fm = getFontMetrics(av.getFont());\r
+\r
+    LABEL_EAST = 0;\r
+    LABEL_WEST = 0;\r
+\r
+    if(av.scaleRightWrapped)\r
+      LABEL_EAST = fm.stringWidth( av.alignment.getWidth()+"000" );\r
+\r
+    if(av.scaleLeftWrapped)\r
+      LABEL_WEST = fm.stringWidth( av.alignment.getWidth()+"" );\r
+\r
+    return  (cwidth - LABEL_EAST -LABEL_WEST)/av.charWidth;\r
+  }\r
+\r
+  public void drawWrappedPanel(Graphics g, int canvasWidth, int canvasHeight, int startRes)\r
+  {\r
+      AlignmentI al = av.getAlignment();\r
+\r
+      FontMetrics fm = getFontMetrics(av.getFont());\r
+\r
+      int LABEL_EAST = 0;\r
+      if(av.scaleRightWrapped)\r
+        LABEL_EAST = fm.stringWidth( al.getWidth()+"000" );\r
+      int LABEL_WEST = 0;\r
+      if(av.scaleLeftWrapped)\r
+        LABEL_WEST = fm.stringWidth(al.getWidth()+"0");\r
+\r
+\r
+      int cWidth  =   (canvasWidth - LABEL_EAST -LABEL_WEST)/av.charWidth;\r
+      int cHeight =  (av.getAlignment().getHeight() + 2)*av.charHeight;\r
+\r
+      int  endx   = startRes+cWidth-1;\r
+      int  ypos  = 2*av.charHeight;\r
+\r
+      while (ypos <= canvasHeight && startRes<av.alignment.getWidth() )\r
+      {\r
+        g.setColor(Color.black);\r
+\r
+        if(av.scaleLeftWrapped)\r
+          drawWestScale(g, startRes, endx, ypos);\r
+\r
+        if(av.scaleRightWrapped)\r
+        {\r
+          g.translate(canvasWidth - LABEL_EAST +av.charWidth, 0);\r
+          drawEastScale(g, startRes, endx, ypos);\r
+          g.translate( - (canvasWidth - LABEL_EAST+av.charWidth), 0);\r
+        }\r
+\r
+        g.translate(LABEL_WEST,0);\r
+        if(av.scaleAboveWrapped)\r
+          drawNorthScale(g, startRes, endx, ypos);\r
+\r
+\r
+        // When printing we have an extra clipped region,\r
+        // the Printable page which we need to account for here\r
+        Shape clip = g.getClip();\r
+        if(clip==null)\r
+          g.setClip(0, 0, cWidth*av.charWidth, canvasHeight);\r
+        else\r
+          g.setClip(0,\r
+                    (int)clip.getBounds().y,\r
+                    cWidth*av.charWidth,\r
+                    (int)clip.getBounds().height\r
+                    );\r
+\r
+        drawPanel(g, startRes, endx, 0, al.getHeight(), startRes, 0, ypos);\r
+        g.setClip(clip);\r
+        g.translate(-LABEL_WEST,0);\r
+\r
+        ypos += cHeight;\r
+        startRes += cWidth;\r
+        endx = startRes + cWidth - 1;\r
+\r
+        if (endx > al.getWidth())\r
+          endx = al.getWidth();\r
+      }\r
+\r
+  }\r
+\r
+\r
+  synchronized public void drawPanel(Graphics g,int x1,int x2, int y1, int y2,int startx, int starty,int offset) {\r
+\r
+    g.setFont(av.getFont());\r
+    sr.renderGaps(av.renderGaps);\r
+\r
+    SequenceI nextSeq;\r
+\r
+    /// First draw the sequences\r
+    /////////////////////////////\r
+    for (int i = y1 ; i < y2 ;i++)\r
+    {\r
+     nextSeq = av.alignment.getSequenceAt(i);\r
+\r
+     sr.drawSequence(g, nextSeq, av.alignment.findAllGroups( nextSeq ),x1,x2,\r
+                 (x1 - startx) * av.charWidth,\r
+                 offset + AlignmentUtil.getPixelHeight(starty, i, av.charHeight),\r
+                 av.charWidth,av.charHeight);\r
+\r
+     if(av.showSequenceFeatures)\r
+     {\r
+       fr.drawSequence(g, nextSeq, av.alignment.findAllGroups( nextSeq ), x1, x2,\r
+                       (x1 - startx) * av.charWidth,\r
+                       offset +\r
+                       AlignmentUtil.getPixelHeight(starty, i, av.charHeight),\r
+                       av.charWidth, av.charHeight);\r
+     }\r
+    }\r
+    //\r
+    /////////////////////////////////////\r
+\r
+    // Now outline any areas if necessary\r
+    /////////////////////////////////////\r
+    SequenceGroup group = av.getSelectionGroup();\r
+    java.util.Vector groups = av.alignment.getGroups();\r
+\r
+    int sx = -1, sy = -1, ex = -1;\r
+    int groupIndex = -1;\r
+    if (group == null && groups.size() > 0)\r
+    {\r
+      group = (SequenceGroup) groups.elementAt(0);\r
+      groupIndex = 0;\r
+    }\r
+\r
+    if (group != null)\r
+      do\r
+      {\r
+        int oldY = -1;\r
+        int i = 0;\r
+        boolean inGroup = false;\r
+        int top=-1, bottom =-1;\r
+        for (i = y1; i < y2; i++)\r
+        {\r
+          sx = (group.getStartRes() - startx) * av.charWidth;\r
+          sy = offset + AlignmentUtil.getPixelHeight(starty, i, av.charHeight);\r
+          ex = (group.getEndRes() + 1 - group.getStartRes()) * av.charWidth -1;\r
+\r
+          if (sx < getSize().width\r
+              && ex > 0\r
+              && group.sequences.contains(av.alignment.getSequenceAt(i)))\r
+          {\r
+            if (bottom == -1 && (i==av.alignment.getHeight()-1 ||\r
+                !group.sequences.contains(av.alignment.getSequenceAt(i + 1))))\r
+              bottom = sy + av.charHeight ;\r
+\r
+            if (!inGroup)\r
+            {\r
+              if (top == -1 && i==0 ||\r
+                  !group.sequences.contains(av.alignment.getSequenceAt(i - 1)))\r
+                top = sy;\r
+\r
+\r
+              oldY = sy;\r
+              inGroup = true;\r
+              if (group == av.getSelectionGroup())\r
+              {\r
+                    g.setColor(new Color(255,0,0));\r
+              }\r
+              else\r
+              {\r
+                    g.setColor(group.getOutlineColour());\r
+              }\r
+            }\r
+          }\r
+          else\r
+          {\r
+            if (inGroup)\r
+            {\r
+              g.drawLine(sx, oldY, sx, sy );\r
+              g.drawLine(sx+ex, oldY, sx+ex, sy );\r
+\r
+              if (top != -1)\r
+              {\r
+                g.drawLine(sx, top, sx + ex, top);\r
+                top =-1;\r
+              }\r
+              if (bottom != -1)\r
+              {\r
+                g.drawLine(sx, bottom, sx + ex, bottom);\r
+                bottom = -1;\r
+              }\r
+\r
+\r
+              inGroup = false;\r
+            }\r
+          }\r
+        }\r
+\r
+        if (inGroup)\r
+        {\r
+\r
+          if(top!=-1)\r
+          {\r
+            g.drawLine(sx, top, sx + ex, top);\r
+            top =-1;\r
+          }\r
+          if(bottom!=-1)\r
+           {\r
+             g.drawLine(sx, bottom-1, sx + ex, bottom-1);\r
+             bottom = -1;\r
+\r
+           }\r
+          sy = offset + AlignmentUtil.getPixelHeight(starty, i, av.charHeight);\r
+          g.drawLine(sx, oldY, sx, sy );\r
+          g.drawLine(sx+ex, oldY, sx+ex, sy );\r
+          inGroup = false;\r
+        }\r
+        groupIndex++;\r
+        if (groupIndex >= groups.size())\r
+          break;\r
+\r
+        group = (SequenceGroup) groups.elementAt(groupIndex);\r
+\r
+      }\r
+      while (groupIndex < groups.size());\r
+\r
+\r
+    /// Highlight search Results once all sequences have been drawn\r
+    //////////////////////////////////////////////////////////\r
+    if(displaySearch)\r
+    {\r
+      for(int r=0; r<searchResults.length; r+=3)\r
+      {\r
+        int searchSeq = searchResults[r];\r
+        int searchStart = searchResults[r+1];\r
+        int searchEnd = searchResults[r+2];\r
+\r
+        if (searchSeq >= y1 && searchSeq < y2)\r
+        {\r
+          SequenceRenderer ssr = (SequenceRenderer) sr;\r
+          if(searchStart<x1)\r
+            searchStart = x1;\r
+          if(searchEnd > x2)\r
+            searchEnd = x2;\r
+          ssr.drawHighlightedText(av.getAlignment().getSequenceAt(searchSeq),\r
+                                  searchStart,\r
+                                  searchEnd,\r
+                                  (searchStart - startx) * av.charWidth,\r
+                                  offset +\r
+                                  AlignmentUtil.getPixelHeight(starty, searchSeq,\r
+              av.charHeight),\r
+                                  av.charWidth,\r
+                                  av.charHeight);\r
+        }\r
+      }\r
+    }\r
+\r
+  }\r
+\r
+\r
+\r
+  public void highlightSearchResults(int [] results)\r
+  {\r
+    // results are in the order sequence, startRes, endRes\r
+    if(results==null)\r
+      displaySearch = false;\r
+    else\r
+      displaySearch = true;\r
+\r
+    searchResults = results;\r
+\r
+    repaint();\r
+  }\r
+\r
+\r
+}\r
diff --git a/src/jalview/appletgui/SeqPanel.java b/src/jalview/appletgui/SeqPanel.java
new file mode 100755 (executable)
index 0000000..70c2f0c
--- /dev/null
@@ -0,0 +1,631 @@
+package jalview.appletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+import jalview.datamodel.*;\r
+import java.util.*;\r
+import jalview.schemes.*;\r
+\r
+\r
+public class SeqPanel extends Panel\r
+{\r
+\r
+  public    SeqCanvas         seqCanvas;\r
+  public    AlignmentPanel    ap;\r
+\r
+  protected int startres;\r
+  protected int lastres;\r
+  protected int endres;\r
+\r
+  protected int startseq;\r
+  protected int padseq;\r
+\r
+  protected AlignViewport av;\r
+\r
+  // if character is inserted or deleted, we will need to recalculate the conservation\r
+  int seqEditOccurred = -1;\r
+\r
+  ScrollThread scrollThread = null;\r
+  boolean mouseDragging = false;\r
+\r
+\r
+  public SeqPanel(AlignViewport avp, AlignmentPanel p) {\r
+    this.av         = avp;\r
+\r
+    seqCanvas  = new SeqCanvas(avp);\r
+    setLayout(new BorderLayout());\r
+    add(seqCanvas);\r
+\r
+    ap = p;\r
+\r
+    seqCanvas.addMouseMotionListener( new MouseMotionAdapter()\r
+    {\r
+      public void mouseMoved(MouseEvent evt)\r
+      {\r
+       if(av.getWrapAlignment())\r
+         return;\r
+        doMouseMoved(evt);    }\r
+\r
+      public void mouseDragged(MouseEvent evt)\r
+      {\r
+        if(av.getWrapAlignment())\r
+         return;\r
+        if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())\r
+          doMouseDragged(evt);\r
+        else\r
+          doMouseDraggedDefineMode(evt);\r
+      }\r
+    });\r
+\r
+    seqCanvas.addMouseListener( new MouseAdapter()\r
+    {\r
+      public void mouseReleased(MouseEvent evt)\r
+      {\r
+        if(av.getWrapAlignment())\r
+         return;\r
+        if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())\r
+          doMouseReleased(evt);\r
+        else\r
+          doMouseReleasedDefineMode(evt);\r
+      }\r
+      public void mousePressed(MouseEvent evt)\r
+      {\r
+        if(av.getWrapAlignment())\r
+         return;\r
+        if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())\r
+          doMousePressed(evt);\r
+        else\r
+          doMousePressedDefineMode(evt);\r
+      }\r
+      public void mouseExited(MouseEvent evt)\r
+      {\r
+        if (av.getWrapAlignment() || evt.isShiftDown() || evt.isAltDown() ||\r
+                  evt.isControlDown())\r
+                return;\r
+              doMouseExitedDefineMode(evt);\r
+\r
+      }\r
+      public void mouseEntered(MouseEvent evt)\r
+      {\r
+        if (av.getWrapAlignment() || evt.isShiftDown() || evt.isAltDown() ||\r
+            evt.isControlDown())\r
+          return;\r
+        doMouseEnteredDefineMode(evt);\r
+      }\r
+\r
+    });\r
+    seqCanvas.repaint();\r
+  }\r
+\r
+\r
+  public void doMouseReleased(MouseEvent evt) {\r
+\r
+    int x = evt.getX();\r
+    int res = x/av.getCharWidth() + av.getStartRes();\r
+\r
+    endres = res;\r
+\r
+    startseq = -1;\r
+    startres = -1;\r
+    lastres  = -1;\r
+    if(seqEditOccurred>-1)\r
+      updateConservation(seqEditOccurred);\r
+\r
+    seqEditOccurred = -1;\r
+\r
+    ap.repaint();\r
+\r
+  }\r
+\r
+  public void doMousePressed(MouseEvent evt) {\r
+    ap.alignFrame.addHistoryItem("sequence edit");\r
+    int seq;\r
+    int res;\r
+\r
+    int x = evt.getX();\r
+    int y = evt.getY();\r
+\r
+    res = x/av.getCharWidth() + av.getStartRes();\r
+    seq = y/av.getCharHeight() + av.getStartSeq();\r
+\r
+    if (seq < av.getAlignment().getHeight() &&\r
+        res < av.getAlignment().getSequenceAt(seq).getLength())\r
+    {\r
+      //char resstr = align.getSequenceAt(seq).getSequence().charAt(res);\r
+      // Find the residue's position in the sequence (res is the position\r
+      // in the alignment\r
+\r
+      startseq = seq;\r
+\r
+      if (startseq == (av.getAlignment().getHeight() - 1))\r
+        padseq = 1;\r
+      else\r
+        padseq = 1;\r
+\r
+      startres = res;\r
+      lastres = res;\r
+\r
+    }\r
+    else\r
+    {\r
+      startseq = -1;\r
+      startres = -1;\r
+      lastres = -1;\r
+    }\r
+\r
+    return;\r
+  }\r
+\r
+  public void doMouseMoved(MouseEvent evt)\r
+  {\r
+    int res=0, seq=0;\r
+    int x = evt.getX();\r
+    int y = evt.getY();\r
+    if(av.wrapAlignment)\r
+    {\r
+      y -= 2*av.charHeight;\r
+      int chunkHeight = (av.getAlignment().getHeight()+2)*av.charHeight;\r
+\r
+\r
+      res =   (int)((y/chunkHeight)*(getSize().width/av.charWidth)) +  x/av.getCharWidth() + av.getStartRes();\r
+\r
+      y %= chunkHeight;\r
+      seq =     y / av.getCharHeight() + av.getStartSeq();\r
+\r
+    }\r
+    else\r
+    {\r
+      res = x / av.getCharWidth()  + av.getStartRes();\r
+      seq = y / av.getCharHeight() + av.getStartSeq();\r
+    }\r
+\r
+\r
+    if(seq>=av.getAlignment().getHeight())\r
+      return;\r
+\r
+    SequenceI sequence = av.getAlignment().getSequenceAt(seq);\r
+    if(res>sequence.getLength())\r
+      return;\r
+\r
+    Object obj = ResidueProperties.aa2Triplet.get( sequence.getCharAt(res)+"" ) ;\r
+    String aa = "";\r
+    if(obj!=null)\r
+         aa = obj.toString();\r
+\r
+    StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+sequence.getName());\r
+    if(aa!="")\r
+      text.append("  Residue: "+aa+" ("+  av.getAlignment().getSequenceAt(seq).findPosition(res)+")");\r
+\r
+    ap.alignFrame.statusBar.setText(text.toString());\r
+\r
+    // use aa to see if the mouse pointer is on a\r
+    if(  av.showSequenceFeatures)\r
+    {\r
+      Vector features = sequence.getSequenceFeatures();\r
+      Enumeration e = features.elements();\r
+      StringBuffer sbuffer = new StringBuffer();\r
+\r
+\r
+      while (e.hasMoreElements())\r
+      {\r
+        SequenceFeature sf = (SequenceFeature) e.nextElement();\r
+        if (sf.getStart() <= sequence.findPosition(res) &&\r
+            sf.getEnd() >= sequence.findPosition(res))\r
+        {\r
+          if(sbuffer.length()>0)\r
+            sbuffer.append("; ");\r
+          sbuffer.append(sf.getType() + " " + sf.getDescription());\r
+          if(sf.getStatus().length()>0)\r
+            sbuffer.append(" ("+sf.getStatus()+")");\r
+        }\r
+\r
+      }\r
+    }\r
+\r
+\r
+  }\r
+\r
+  public void doMouseDragged(MouseEvent evt) {\r
+    // If we're dragging we're editing\r
+\r
+    if(lastres==-1)\r
+      return;\r
+\r
+    int x = evt.getX();\r
+\r
+    int res = x/av.getCharWidth() + av.getStartRes();\r
+    if (res < 0)\r
+      res = 0;\r
+\r
+    if (res != lastres)\r
+    {\r
+       // Group editing\r
+       if (evt.isAltDown() || evt.isControlDown())\r
+        {\r
+         SequenceGroup sg = av.getSelectionGroup();\r
+          if(sg==null)\r
+            av.getAlignment().findGroup(startseq);\r
+          if (sg != null)\r
+          {\r
+            boolean deleteAllowed = false;\r
+            if (res < av.getAlignment().getWidth() && res < lastres)\r
+            {\r
+              /// Are we able to delete?\r
+              boolean allGaps = true;\r
+              for (int i = 0; i < sg.getSize(); i++)\r
+              {\r
+                SequenceI s = sg.getSequenceAt(i);\r
+                for (int j = lastres-1; j >= res && allGaps; j--)\r
+                {\r
+                    if (!jalview.util.Comparison.isGap(s.getSequence().charAt(j)))\r
+                    {\r
+                      res = j + 1;\r
+                      allGaps = false;\r
+                    }\r
+                }\r
+\r
+                if(!deleteAllowed && allGaps)\r
+                  deleteAllowed = true;\r
+              }\r
+            }\r
+\r
+            // drag to right\r
+            if (res < av.getAlignment().getWidth() && res > lastres)\r
+                sg.setEndRes(sg.getEndRes() + 1);\r
+\r
+            // drag to left\r
+            else if (deleteAllowed && res < av.getAlignment().getWidth() &&\r
+                     res < lastres)\r
+                sg.setEndRes(sg.getEndRes() - 1);\r
+\r
+\r
+\r
+\r
+            for (int i = 0; i < sg.getSize(); i++)\r
+            {\r
+              SequenceI s = sg.getSequenceAt(i);\r
+              int k = av.alignment.findIndex(s);\r
+\r
+              // drag to right\r
+              if (res < av.getAlignment().getWidth() && res > lastres)\r
+                for (int j = lastres; j < res; j++)\r
+                  insertChar(j, k);\r
+\r
+              // drag to left\r
+              else if (deleteAllowed && res < av.getAlignment().getWidth() && res < lastres)\r
+              {\r
+                for (int j = res; j < lastres; j++)\r
+                {\r
+                  deleteChar(j, k);\r
+                  startres = res;\r
+                }\r
+              }\r
+            }\r
+          }\r
+        }\r
+        else /////Editing a single sequence///////////\r
+        {\r
+          if (res < av.getAlignment().getWidth() && res > lastres)\r
+          {\r
+            // dragging to the right\r
+            for (int j = lastres; j < res; j++)\r
+              insertChar(j, startseq);\r
+          }\r
+          else if (res < av.getAlignment().getWidth() && res < lastres)\r
+          {\r
+            // dragging to the left\r
+            for (int j = res; j < lastres; j++)\r
+            {\r
+              deleteChar(j, startseq);\r
+              startres = res;\r
+            }\r
+         }\r
+\r
+       }\r
+\r
+    }\r
+\r
+    lastres = res;\r
+    seqCanvas.repaint();\r
+  }\r
+\r
+  public void drawChars(int seqstart, int seqend, int start) {\r
+    seqCanvas.drawPanel(seqCanvas.gg, start,av.getEndRes(),seqstart,seqend,av.getStartRes(),av.getStartSeq(),0);\r
+    seqCanvas.repaint();\r
+  }\r
+\r
+  public void insertChar(int j, int seq)\r
+  {\r
+    av.alignment.getSequenceAt(seq).insertCharAt(j, av.getGapCharacter());\r
+    seqEditOccurred=seq;\r
+  }\r
+\r
+  public void deleteChar(int j, int seq)\r
+  {\r
+\r
+    if ( jalview.util.Comparison.isGap( av.alignment.getSequenceAt(seq).getSequence().charAt(j)))\r
+        av.alignment.getSequenceAt(seq).deleteCharAt(j);\r
+\r
+    av.alignment.getWidth();\r
+    seqCanvas.repaint();\r
+    seqEditOccurred=seq;\r
+  }\r
+\r
+\r
+  void updateConservation(int i)\r
+  {\r
+    av.updateConservation();\r
+    av.updateConsensus();\r
+  }\r
+\r
+//////////////////////////////////////////\r
+/////Everything below this is for defining the boundary of the rubberband\r
+//////////////////////////////////////////\r
+  int oldSeq = -1;\r
+  public void doMousePressedDefineMode(MouseEvent evt)\r
+  {\r
+    int res = evt.getX()/av.getCharWidth() + av.getStartRes();\r
+    int seq = evt.getY()/av.getCharHeight() + av.getStartSeq();\r
+    oldSeq = seq;\r
+\r
+    SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(seq);\r
+\r
+    if(sequence==null || res>sequence.getLength())\r
+      return;\r
+\r
+    stretchGroup = av.getSelectionGroup();\r
+\r
+    if(stretchGroup == null)\r
+     {\r
+       stretchGroup = av.alignment.findGroup( sequence );\r
+       if(stretchGroup!=null && res>stretchGroup.getStartRes() && res<stretchGroup.getEndRes())\r
+         av.setSelectionGroup(stretchGroup);\r
+       else\r
+         stretchGroup = null;\r
+     }\r
+\r
+    else if(!stretchGroup.sequences.contains(sequence)\r
+            || stretchGroup.getStartRes()>res\r
+            || stretchGroup.getEndRes()<res)\r
+     {\r
+       stretchGroup = null;\r
+\r
+       SequenceGroup[] allGroups = av.alignment.findAllGroups( sequence );\r
+\r
+       if (allGroups != null)\r
+         for (int i = 0; i < allGroups.length; i++)\r
+           if (allGroups[i].getStartRes() <= res &&\r
+               allGroups[i].getEndRes() >= res)\r
+           {\r
+             stretchGroup = allGroups[i];\r
+             av.setSelectionGroup(stretchGroup);\r
+             break;\r
+           }\r
+     }\r
+\r
+    if(stretchGroup==null)\r
+    {\r
+      // define a new group here\r
+      SequenceGroup sg = new SequenceGroup();\r
+      sg.setStartRes(res);\r
+      sg.setEndRes(res);\r
+      sg.addSequence( sequence );\r
+      av.setSelectionGroup( sg );\r
+      stretchGroup = sg;\r
+\r
+      if(av.getConservationSelected())\r
+        SliderPanel.setConservationSlider(ap, av.getGlobalColourScheme(), "Background");\r
+      if(av.getAbovePIDThreshold())\r
+        SliderPanel.setPIDSliderSource(ap, av.getGlobalColourScheme(), "Background");\r
+\r
+    }\r
+    else if( ( evt.getModifiers() & InputEvent .BUTTON3_MASK ) == InputEvent.BUTTON3_MASK )\r
+    {\r
+      APopupMenu popup = new APopupMenu(ap, null);\r
+      this.add(popup);\r
+      popup.show(this, evt.getX(), evt.getY());\r
+    }\r
+\r
+\r
+    if(stretchGroup!=null && stretchGroup.getEndRes()==res)\r
+      // Edit end res position of selected group\r
+      changeEndRes = true;\r
+\r
+   else if(stretchGroup!=null && stretchGroup.getStartRes()==res)\r
+      // Edit end res position of selected group\r
+      changeStartRes = true;\r
+\r
+  }\r
+\r
+  boolean changeEndSeq = false;\r
+  boolean changeStartSeq = false;\r
+  boolean changeEndRes = false;\r
+  boolean changeStartRes = false;\r
+  SequenceGroup stretchGroup = null;\r
+\r
+  public void doMouseReleasedDefineMode(MouseEvent evt)\r
+  {\r
+    mouseDragging = false;\r
+\r
+    if(stretchGroup==null)\r
+      return;\r
+\r
+    if(stretchGroup.cs instanceof ClustalxColourScheme)\r
+    {\r
+      stretchGroup.cs = new ClustalxColourScheme(stretchGroup.sequences, av.alignment.getWidth());\r
+      seqCanvas.repaint();\r
+    }\r
+\r
+    else if(stretchGroup.cs instanceof ConservationColourScheme)\r
+    {\r
+       ConservationColourScheme ccs = (ConservationColourScheme)stretchGroup.cs;\r
+       stretchGroup.cs = ccs;\r
+       SliderPanel.setConservationSlider(ap, stretchGroup.cs, stretchGroup.getName()) ;\r
+\r
+       seqCanvas.repaint();\r
+    }\r
+    else\r
+    {\r
+      if(stretchGroup.cs !=null && stretchGroup.cs.canThreshold())\r
+      {\r
+        ResidueColourScheme rcs =  (ResidueColourScheme) stretchGroup.cs;\r
+        SliderPanel.setPIDSliderSource(ap, stretchGroup.cs, stretchGroup.getName());\r
+      }\r
+\r
+    }\r
+\r
+\r
+    changeEndRes = false;\r
+    changeStartRes = false;\r
+    stretchGroup = null;\r
+    ap.repaint();\r
+  }\r
+\r
+\r
+  boolean remove = false;\r
+  public void doMouseDraggedDefineMode(MouseEvent evt)\r
+  {\r
+    int res = evt.getX()/av.getCharWidth() + av.getStartRes();\r
+    int y = evt.getY()/av.getCharHeight() + av.getStartSeq();\r
+\r
+    if(stretchGroup==null)\r
+      return;\r
+\r
+    if(res>av.alignment.getWidth())\r
+      res = av.alignment.getWidth()-1;\r
+\r
+\r
+    if(stretchGroup.getEndRes()==res)\r
+      // Edit end res position of selected group\r
+      changeEndRes = true;\r
+\r
+    else if(stretchGroup.getStartRes()==res)\r
+      // Edit start res position of selected group\r
+      changeStartRes = true;\r
+\r
+\r
+    if(res<av.getStartRes())\r
+      res = av.getStartRes();\r
+    else if(res>av.getEndRes())\r
+      res = av.getEndRes();\r
+\r
+    if(changeEndRes)\r
+    {\r
+      if(res>stretchGroup.getStartRes()-1)\r
+        stretchGroup.setEndRes( res );\r
+    }\r
+    else if(changeStartRes)\r
+    {\r
+      if(res<stretchGroup.getEndRes()+1)\r
+        stretchGroup.setStartRes( res );\r
+    }\r
+\r
+    int dragDirection = 0;\r
+    if (y > oldSeq)\r
+      dragDirection = 1;\r
+    else if (y < oldSeq)\r
+      dragDirection = -1;\r
+\r
+    while (y != oldSeq && oldSeq>0 && y<av.alignment.getHeight())\r
+    {\r
+      // This routine ensures we don't skip any sequences, as the\r
+      // selection is quite slow.\r
+      Sequence seq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);\r
+\r
+      oldSeq += dragDirection;\r
+      Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);\r
+\r
+      if (stretchGroup.sequences.contains(nextSeq))\r
+      {\r
+        stretchGroup.deleteSequence(seq);\r
+        stretchGroup.deleteSequence(nextSeq);\r
+      }\r
+      else\r
+      {\r
+       if(seq!=null)\r
+        stretchGroup.addSequence(seq);\r
+        stretchGroup.addSequence(nextSeq);\r
+      }\r
+    }\r
+    oldSeq = y;\r
+    mouseDragging = true;\r
+    if(scrollThread!=null)\r
+      scrollThread.setEvent(evt);\r
+\r
+    seqCanvas.repaint();\r
+  }\r
+\r
+  public void doMouseEnteredDefineMode(MouseEvent e)\r
+  {\r
+    if (scrollThread != null)\r
+      scrollThread.running = false;\r
+  }\r
+\r
+  public void doMouseExitedDefineMode(MouseEvent e)\r
+  {\r
+    if (av.getWrapAlignment())\r
+      return;\r
+\r
+    if(mouseDragging)\r
+      scrollThread = new ScrollThread();\r
+\r
+  }\r
+  // this class allows scrolling off the bottom of the visible alignment\r
+  class ScrollThread extends Thread\r
+  {\r
+    MouseEvent evt;\r
+    boolean running = false;\r
+    public ScrollThread()\r
+    {\r
+      start();\r
+    }\r
+\r
+    public void setEvent(MouseEvent e)\r
+    {\r
+      evt = e;\r
+    }\r
+\r
+    public void stopScrolling()\r
+    {\r
+      running = false;\r
+    }\r
+\r
+    public void run()\r
+    {\r
+      running = true;\r
+      while (running)\r
+      {\r
+        if(evt!=null)\r
+        {\r
+\r
+          if (mouseDragging && evt.getY() < 0 && av.getStartSeq() > 0)\r
+            running = ap.scrollUp(true);\r
+\r
+          if (mouseDragging && evt.getY() >= getSize().height &&\r
+              av.alignment.getHeight() > av.getEndSeq())\r
+            running = ap.scrollUp(false);\r
+\r
+          if (mouseDragging && evt.getX() < 0)\r
+            running = ap.scrollRight(true);\r
+\r
+          else if (mouseDragging && evt.getX() >= getSize().width)\r
+            running = ap.scrollRight(false);\r
+        }\r
+\r
+        try\r
+        {\r
+          Thread.sleep(75);\r
+        }\r
+        catch (Exception ex)\r
+        {}\r
+      }\r
+    }\r
+}\r
+\r
+\r
+\r
+}\r
+\r
+\r
+\r
+\r
diff --git a/src/jalview/appletgui/SequenceRenderer.java b/src/jalview/appletgui/SequenceRenderer.java
new file mode 100755 (executable)
index 0000000..a13b643
--- /dev/null
@@ -0,0 +1,188 @@
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.*;\r
+import jalview.schemes.*;\r
+import java.awt.*;\r
+\r
+public class SequenceRenderer\r
+{\r
+  AlignViewport av;\r
+  FontMetrics fm;\r
+  boolean renderGaps = true;\r
+  SequenceGroup currentSequenceGroup = null;\r
+  SequenceGroup [] allGroups = null;\r
+  Color resBoxColour;\r
+  Graphics graphics;\r
+\r
+  public SequenceRenderer(AlignViewport av)\r
+  {\r
+    this.av = av;\r
+  }\r
+\r
+\r
+  public void renderGaps(boolean b)\r
+  {\r
+    renderGaps = b;\r
+  }\r
+\r
+  public Color getResidueBoxColour(ColourSchemeI cs, SequenceI seq, int i)\r
+  {\r
+    getBoxColour(cs, seq, i);\r
+    return resBoxColour;\r
+  }\r
+\r
+  void getBoxColour(ColourSchemeI cs, SequenceI seq, int i)\r
+  {\r
+   if (cs != null)\r
+       resBoxColour = cs.findColour(seq.getSequence(i, i + 1), i);\r
+   else\r
+       resBoxColour = Color.white;\r
+  }\r
+\r
+  public void drawSequence(Graphics g,SequenceI seq,SequenceGroup [] sg, int start, int end, int x1, int y1, int width, int height)\r
+  {\r
+    allGroups = sg;\r
+\r
+    graphics = g;\r
+\r
+    drawBoxes(seq, start, end, x1, y1, (int) width, height);\r
+\r
+    fm = g.getFontMetrics();\r
+    drawText(seq,start,end,x1,y1,(int)width,height);\r
+\r
+  }\r
+\r
+  public void drawBoxes(SequenceI seq,int start, int end, int x1, int y1, int width, int height) {\r
+    int i      = start;\r
+    int length = seq.getLength();\r
+\r
+    int curStart = -1;\r
+    int curWidth = width;\r
+\r
+    Color tempColour = null;\r
+    while (i <= end && i < length)\r
+    {\r
+      if(inCurrentSequenceGroup(i))\r
+      {\r
+        if( currentSequenceGroup.getDisplayBoxes())\r
+             getBoxColour(currentSequenceGroup.cs, seq, i);\r
+      }\r
+      else if(av.getShowBoxes())\r
+            getBoxColour(av.getGlobalColourScheme(), seq, i);\r
+      else\r
+        resBoxColour = Color.white;\r
+\r
+\r
+      if (resBoxColour != tempColour)\r
+      {\r
+        if(tempColour!=null)\r
+          graphics.fillRect(x1+width*(curStart-start),y1,curWidth,height);\r
+        graphics.setColor(resBoxColour);\r
+\r
+        curStart = i;\r
+        curWidth = width;\r
+        tempColour = resBoxColour;\r
+\r
+      }\r
+      else\r
+        curWidth += width;\r
+\r
+      i++;\r
+    }\r
+\r
+\r
+     graphics.fillRect(x1+width*(curStart-start),y1,curWidth,height);\r
+  }\r
+\r
+  public void drawText(SequenceI seq,int start, int end, int x1, int y1, int width, int height)\r
+  {\r
+    int pady = height/5;\r
+    int charOffset=0;\r
+    char s;\r
+    // Need to find the sequence position here.\r
+\r
+    graphics.setColor(Color.black);\r
+    String sequence  = seq.getSequence();\r
+    for (int i = start; i <= end; i++)\r
+    {\r
+        if(i<sequence.length())\r
+          s = sequence.charAt(i);\r
+        else\r
+          s = ' ';\r
+\r
+        if(!renderGaps && jalview.util.Comparison.isGap(s))\r
+          continue;\r
+\r
+\r
+        if (inCurrentSequenceGroup(i))\r
+        {\r
+          if(!currentSequenceGroup.getDisplayText())\r
+            continue;\r
+\r
+            if (currentSequenceGroup.getColourText())\r
+            {\r
+              getBoxColour(currentSequenceGroup.cs, seq, i);\r
+              graphics.setColor(resBoxColour.darker());\r
+            }\r
+        }\r
+        else\r
+        {\r
+          if(!av.getShowText())\r
+            continue;\r
+\r
+          if(av.getColourText())\r
+           {\r
+             getBoxColour(av.getGlobalColourScheme(), seq, i);\r
+             if(av.getShowBoxes())\r
+              graphics.setColor(resBoxColour.darker());\r
+            else\r
+              graphics.setColor(resBoxColour);\r
+           }\r
+        }\r
+\r
+          charOffset =  (width - fm.charWidth(s))/2;\r
+          graphics.drawString(String.valueOf(s),\r
+                              charOffset + x1 + width * (i - start),\r
+                              y1 + height - pady);\r
+        }\r
+\r
+\r
+  }\r
+\r
+  boolean inCurrentSequenceGroup(int res)\r
+  {\r
+    if(allGroups ==null)\r
+      return false;\r
+\r
+    for(int i=0; i<allGroups.length; i++)\r
+      if(allGroups[i].getStartRes()<=res && allGroups[i].getEndRes()>=res)\r
+      {\r
+         currentSequenceGroup = allGroups[i];\r
+         return true;\r
+      }\r
+\r
+    return false;\r
+  }\r
+\r
+  public void drawHighlightedText(SequenceI seq,int start, int end, int x1, int y1, int width, int height)\r
+  {\r
+    int pady = height/5;\r
+    int charOffset=0;\r
+    graphics.setColor(Color.black);\r
+    graphics.fillRect(x1,y1,width*(end-start+1),height);\r
+    graphics.setColor(Color.white);\r
+\r
+    char s='~';\r
+    // Need to find the sequence position here.\r
+    for (int i = start; i <= end; i++)\r
+    {\r
+       if(i<seq.getLength())\r
+          s = seq.getSequence().charAt(i);\r
+\r
+     charOffset =  (width - fm.charWidth(s))/2;\r
+      graphics.drawString(String.valueOf(s), charOffset + x1 + width * (i - start), y1 + height - pady);\r
+    }\r
+  }\r
+\r
+\r
+}\r
diff --git a/src/jalview/appletgui/SliderPanel.java b/src/jalview/appletgui/SliderPanel.java
new file mode 100755 (executable)
index 0000000..1a3cb99
--- /dev/null
@@ -0,0 +1,222 @@
+package jalview.appletgui;\r
+\r
+import jalview.jbappletgui.*;\r
+import jalview.schemes.*;\r
+import jalview.datamodel.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+public class SliderPanel extends GSliderPanel\r
+{\r
+  AlignmentPanel ap;\r
+  boolean forConservation = true;\r
+  ColourSchemeI cs;\r
+\r
+  static Frame conservationSlider;\r
+  static Frame PIDSlider;\r
+\r
+  public static int setConservationSlider(AlignmentPanel ap, ColourSchemeI cs, String source)\r
+  {\r
+    SliderPanel sp = null;\r
+    ConservationColourScheme ccs = (ConservationColourScheme)cs;\r
+    int value = ccs.inc;\r
+\r
+    if(conservationSlider == null)\r
+    {\r
+      sp = new SliderPanel(ap, value, true, cs);\r
+      conservationSlider = new Frame();\r
+      conservationSlider.add(sp);\r
+    }\r
+    else\r
+    {\r
+        sp = (SliderPanel)conservationSlider.getComponent(0);\r
+        sp.cs = cs;\r
+        sp.setValue(value);\r
+    }\r
+\r
+    conservationSlider.setTitle("Conservation Colour Increment  ("+source+")");\r
+    if(ap.av.alignment.getGroups()!=null)\r
+      sp.setAllGroupsCheckEnabled( true );\r
+    else\r
+      sp.setAllGroupsCheckEnabled( false);\r
+\r
+    return sp.getValue();\r
+  }\r
+\r
+  public static void showConservationSlider()\r
+  {\r
+    try{\r
+      PIDSlider.setVisible(false);\r
+      PIDSlider = null;\r
+    }catch(Exception ex){}\r
+\r
+\r
+    if(!conservationSlider.isVisible())\r
+    {\r
+      jalview.bin.JalviewLite.addFrame(conservationSlider, conservationSlider.getTitle(), 420, 100);\r
+      conservationSlider.addWindowListener(new WindowAdapter()\r
+      {\r
+        public void windowClosing(WindowEvent e)\r
+        {\r
+          conservationSlider = null;\r
+        }\r
+      });\r
+\r
+    }\r
+\r
+  }\r
+\r
+  public static int setPIDSliderSource(AlignmentPanel ap, ColourSchemeI cs, String source)\r
+   {\r
+     SliderPanel pid = null;\r
+     if(PIDSlider == null)\r
+     {\r
+       pid = new SliderPanel(ap, 50, false, cs);\r
+       PIDSlider = new Frame();\r
+       PIDSlider.add(pid);\r
+     }\r
+     else\r
+     {\r
+         pid = (SliderPanel)PIDSlider.getComponent(0);\r
+         pid.cs = cs;\r
+     }\r
+     PIDSlider.setTitle("Percentage Identity Threshold ("+source+")");\r
+\r
+     if (ap.av.alignment.getGroups() != null)\r
+       pid.setAllGroupsCheckEnabled(true);\r
+     else\r
+       pid.setAllGroupsCheckEnabled(false);\r
+\r
+     return pid.getValue();\r
+\r
+   }\r
+\r
+   public static void showPIDSlider()\r
+   {\r
+     try{\r
+       conservationSlider.setVisible(false);\r
+       conservationSlider = null;\r
+     }catch(Exception ex){}\r
+\r
+     if(!PIDSlider.isVisible())\r
+    {\r
+      jalview.bin.JalviewLite.addFrame(PIDSlider, PIDSlider.getTitle(), 420, 100);\r
+      PIDSlider.addWindowListener(new WindowAdapter()\r
+      {\r
+        public void windowClosing(WindowEvent e)\r
+        {\r
+          PIDSlider = null;\r
+        }\r
+      });\r
+    }\r
+\r
+   }\r
+\r
+\r
+  public SliderPanel(AlignmentPanel ap, int value, boolean forConserve, ColourSchemeI cs)\r
+  {\r
+    this.ap = ap;\r
+    this.cs = cs;\r
+    forConservation = forConserve;\r
+    undoButton.setVisible(false);\r
+    applyButton.setVisible(false);\r
+    if(forConservation)\r
+    {\r
+      label.setText("Modify conservation visibility");\r
+      slider.setMinimum(0);\r
+      slider.setMaximum(50+slider.getVisibleAmount());\r
+      slider.setUnitIncrement(1);\r
+    }\r
+    else\r
+    {\r
+      label.setText("Colour residues above % occurence");\r
+      slider.setMinimum(0);\r
+      slider.setMaximum(100+slider.getVisibleAmount());\r
+      slider.setBlockIncrement(1);\r
+    }\r
+\r
+\r
+    slider.addAdjustmentListener( new AdjustmentListener()\r
+    {\r
+      public void adjustmentValueChanged(AdjustmentEvent evt)\r
+      {\r
+        valueField.setText( slider.getValue()+"" );\r
+        valueChanged( slider.getValue() );\r
+      }\r
+    });\r
+\r
+    slider.setValue(value);\r
+    valueField.setText(value+"");\r
+  }\r
+\r
+  public void valueChanged(int i)\r
+  {\r
+    if(cs == null)\r
+      return;\r
+\r
+    ColourSchemeI toChange = null;\r
+    Vector allGroups = null;\r
+    int groupIndex = 0;\r
+\r
+    if(allGroupsCheck.getState())\r
+    {\r
+      allGroups = ap.av.alignment.getGroups();\r
+      groupIndex = allGroups.size()-1;\r
+    }\r
+    else\r
+      toChange = cs;\r
+\r
+\r
+    while( groupIndex > -1 )\r
+    {\r
+      if(allGroups!=null)\r
+        toChange = ((SequenceGroup)allGroups.elementAt(groupIndex)).cs;\r
+\r
+      if (forConservation)\r
+      {\r
+        if (toChange instanceof ConservationColourScheme)\r
+          ( (ConservationColourScheme) toChange).inc = i;\r
+      }\r
+      else\r
+      {\r
+        if (toChange.canThreshold())\r
+          ( (ResidueColourScheme) toChange).setThreshold(i);\r
+      }\r
+\r
+      groupIndex--;\r
+    }\r
+\r
+    ap.seqPanel.seqCanvas.repaint();\r
+\r
+  }\r
+\r
+  public void setAllGroupsCheckEnabled(boolean b)\r
+  {\r
+    allGroupsCheck.setEnabled(b);\r
+  }\r
+\r
+\r
+  public void valueField_actionPerformed(ActionEvent e)\r
+  {\r
+    try{\r
+      int i = Integer.parseInt(valueField.getText());\r
+      slider.setValue(i);\r
+    }\r
+    catch(Exception ex)\r
+    {\r
+      valueField.setText( slider.getValue()+"" );\r
+    }\r
+  }\r
+\r
+  public void setValue(int value)\r
+  {\r
+    slider.setValue(value);\r
+  }\r
+  public int getValue()\r
+  {\r
+    return Integer.parseInt(valueField.getText());\r
+  }\r
+\r
+\r
+}\r
diff --git a/src/jalview/appletgui/TreeCanvas.java b/src/jalview/appletgui/TreeCanvas.java
new file mode 100755 (executable)
index 0000000..7a79492
--- /dev/null
@@ -0,0 +1,430 @@
+package jalview.appletgui;\r
+\r
+\r
+import jalview.analysis.*;\r
+import jalview.datamodel.*;\r
+import jalview.util.*;\r
+import jalview.schemes.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+\r
+public class TreeCanvas extends Panel implements MouseListener\r
+{\r
+  NJTree tree;\r
+  ScrollPane scrollPane;\r
+  AlignViewport av;\r
+\r
+  Font font;\r
+  int  fontSize = 12;\r
+\r
+  boolean fitToWindow = true;\r
+  boolean showDistances = false;\r
+  boolean showBootstrap = false;\r
+\r
+  int offx = 20;\r
+  int offy = 20;\r
+\r
+  float threshold;\r
+\r
+  String longestName;\r
+  int labelLength=-1;\r
+\r
+  //RubberbandRectangle rubberband;\r
+\r
+  Vector    listeners;\r
+\r
+  Hashtable nameHash = new Hashtable();\r
+  Hashtable nodeHash = new Hashtable();\r
+\r
+  public TreeCanvas(AlignViewport av, NJTree tree, ScrollPane scroller, String label)\r
+  {\r
+    this.av = av;\r
+    this.tree     = tree;\r
+    scrollPane = scroller;\r
+    addMouseListener(this);\r
+    tree.findHeight(tree.getTopNode());\r
+    longestName = label;\r
+    setLayout(null);\r
+\r
+    PaintRefresher.Register(this);\r
+  }\r
+  public void TreeSelectionChanged(Sequence sequence)\r
+ {\r
+    SequenceGroup selected = av.getSelectionGroup();\r
+    if(selected == null)\r
+    {\r
+      selected = new SequenceGroup();\r
+      av.setSelectionGroup(selected);\r
+    }\r
+\r
+    selected.setEndRes(av.alignment.getWidth());\r
+    selected.addOrRemove(sequence);\r
+\r
+\r
+    PaintRefresher.Refresh(this);\r
+    repaint();\r
+ }\r
+\r
+\r
+\r
+  public void setTree(NJTree tree) {\r
+    this.tree = tree;\r
+    tree.findHeight(tree.getTopNode());\r
+  }\r
+\r
+    public void drawNode(Graphics g,SequenceNode node, float chunk, float scale, int width,int offx, int offy) {\r
+    if (node == null) {\r
+      return;\r
+    }\r
+\r
+    if (node.left() == null && node.right() == null) {\r
+      // Drawing leaf node\r
+\r
+      float height = node.height;\r
+      float dist   = node.dist;\r
+\r
+      int xstart = (int)((height-dist)*scale) + offx;\r
+      int xend =   (int)(height*scale)        + offx;\r
+\r
+      int ypos = (int)(node.ycount * chunk) + offy;\r
+\r
+      if (node.element() instanceof SequenceI)\r
+      {\r
+       if ( ( (SequenceI) ( (SequenceNode) node).element()).getColor() == Color.white)\r
+       {\r
+         g.setColor(Color.black);\r
+       }\r
+       else\r
+        g.setColor( ( (SequenceI) ( (SequenceNode) node).element()).getColor().\r
+                   darker());\r
+\r
+      }\r
+      else\r
+          g.setColor(Color.black);\r
+\r
+\r
+      // Draw horizontal line\r
+      g.drawLine(xstart,ypos,xend,ypos);\r
+\r
+      String nodeLabel = "";\r
+      if (showDistances && node.dist > 0) {\r
+        nodeLabel = new Format("%5.2f").form(node.dist);\r
+      }\r
+      if (showBootstrap) {\r
+        if (showDistances) {\r
+          nodeLabel = nodeLabel + " : ";\r
+        }\r
+        nodeLabel = nodeLabel + String.valueOf(node.getBootstrap());\r
+      }\r
+      if (! nodeLabel.equals("")) {\r
+      g.drawString(nodeLabel,xstart,ypos - 10);\r
+      }\r
+\r
+      // Colour selected leaves differently\r
+      String name    = node.getName();\r
+      FontMetrics fm = g.getFontMetrics(font);\r
+      int charWidth  = fm.stringWidth(node.getName()) + 3;\r
+      int charHeight = fm.getHeight();\r
+\r
+      Rectangle rect = new Rectangle(xend+20,ypos-charHeight,\r
+                                     charWidth,charHeight);\r
+\r
+      nameHash.put((SequenceI)node.element(),rect);\r
+\r
+      SequenceGroup selected = av.getSelectionGroup();\r
+      if (selected!=null && selected.sequences.contains((SequenceI)node.element())) {\r
+        g.setColor(Color.gray);\r
+\r
+        g.fillRect(xend + 10, ypos - charHeight + 3,charWidth,charHeight);\r
+        g.setColor(Color.white);\r
+      }\r
+      g.drawString(node.getName(),xend+10,ypos);\r
+      g.setColor(Color.black);\r
+    } else {\r
+      drawNode(g,(SequenceNode)node.left(), chunk,scale,width,offx,offy);\r
+      drawNode(g,(SequenceNode)node.right(),chunk,scale,width,offx,offy);\r
+\r
+      float height = node.height;\r
+      float dist   = node.dist;\r
+\r
+      int xstart = (int)((height-dist)*scale) + offx;\r
+      int xend   = (int)(height       *scale) + offx;\r
+      int ypos   = (int)(node.ycount  *chunk) + offy;\r
+\r
+      g.setColor(((SequenceNode)node).color.darker());\r
+\r
+      // Draw horizontal line\r
+      g.drawLine(xstart,ypos,xend,ypos);\r
+      g.fillRect(xend-2, ypos-2, 4,4);\r
+\r
+      int ystart = (int)(((SequenceNode)node.left()) .ycount * chunk) + offy;\r
+      int yend   = (int)(((SequenceNode)node.right()).ycount * chunk) + offy;\r
+\r
+      Rectangle pos = new Rectangle(xend-2,ypos-2,5,5);\r
+      nodeHash.put(node,pos);\r
+\r
+      g.drawLine((int)(height*scale) + offx, ystart,\r
+                 (int)(height*scale) + offx, yend);\r
+\r
+      if (showDistances && node.dist > 0) {\r
+        g.drawString(new Format("%5.2f").form(node.dist),xstart,ypos - 5);\r
+      }\r
+\r
+    }\r
+  }\r
+  public Object findElement(int x, int y) {\r
+       Enumeration keys = nameHash.keys();\r
+\r
+    while (keys.hasMoreElements()) {\r
+            Object ob = keys.nextElement();\r
+            Rectangle rect = (Rectangle)nameHash.get(ob);\r
+\r
+            if (x >= rect.x && x <= (rect.x + rect.width) &&\r
+              y >= rect.y && y <= (rect.y + rect.height)) {\r
+              return ob;\r
+            }\r
+  }\r
+  keys = nodeHash.keys();\r
+\r
+    while (keys.hasMoreElements()) {\r
+            Object ob = keys.nextElement();\r
+            Rectangle rect = (Rectangle)nodeHash.get(ob);\r
+\r
+            if (x >= rect.x && x <= (rect.x + rect.width) &&\r
+              y >= rect.y && y <= (rect.y + rect.height)) {\r
+              return ob;\r
+            }\r
+    }\r
+      return null;\r
+\r
+  }\r
+\r
+  public void pickNodes(Rectangle pickBox) {\r
+    int width  = getSize().width;\r
+    int height = getSize().height;\r
+\r
+    SequenceNode top = tree.getTopNode();\r
+\r
+    float wscale = (float)(width*.8-offx*2)/tree.getMaxHeight()\r
+;\r
+    if (top.count == 0) {\r
+      top.count = ((SequenceNode)top.left()).count + ((SequenceNode)top.right()).count ;\r
+    }\r
+    float chunk = (float)(height-offy*2)/top.count;\r
+\r
+    pickNode(pickBox,top,chunk,wscale,width,offx,offy);\r
+  }\r
+\r
+  public void pickNode(Rectangle pickBox, SequenceNode node, float chunk, float scale, int width,int offx, int offy) {\r
+    if (node == null) {\r
+      return;\r
+    }\r
+\r
+    if (node.left() == null && node.right() == null) {\r
+      float height = node.height;\r
+      float dist   = node.dist;\r
+\r
+      int xstart = (int)((height-dist)*scale) + offx;\r
+      int xend   = (int)(height*scale) + offx;\r
+\r
+      int ypos = (int)(node.ycount * chunk) + offy;\r
+\r
+      if (pickBox.contains(new Point(xend,ypos))) {\r
+        if (node.element() instanceof SequenceI) {\r
+          SequenceI seq = (SequenceI)node.element();\r
+          SequenceGroup sg = av.getSelectionGroup();\r
+          if(sg!=null)\r
+            sg.addOrRemove(seq);\r
+        }\r
+      }\r
+    } else {\r
+      pickNode(pickBox,(SequenceNode)node.left(), chunk,scale,width,offx,offy);\r
+      pickNode(pickBox,(SequenceNode)node.right(),chunk,scale,width,offx,offy);\r
+    }\r
+  }\r
+\r
+  public void setColor(SequenceNode node, Color c)\r
+  {\r
+    if (node == null)\r
+      return;\r
+\r
+    if (node.left() == null && node.right() == null)\r
+    {\r
+      node.color = c;\r
+\r
+      if (node.element() instanceof SequenceI)\r
+          ((SequenceI)node.element()).setColor(c);\r
+    } else\r
+    {\r
+      node.color = c;\r
+      setColor((SequenceNode)node.left(),c);\r
+      setColor((SequenceNode)node.right(),c);\r
+    }\r
+  }\r
+\r
+\r
+  public void paint(Graphics g)\r
+  {\r
+\r
+    font = new Font("Verdana",Font.PLAIN,fontSize);\r
+    g.setFont(font);\r
+\r
+    FontMetrics fm = g.getFontMetrics(font);\r
+\r
+    if(nameHash.size()==0)\r
+      repaint();\r
+\r
+\r
+    if( fitToWindow || (!fitToWindow && scrollPane.getSize().height > fm.getHeight() * nameHash.size()+offy ) )\r
+     {\r
+         draw(g,scrollPane.getSize().width,scrollPane.getSize().height);\r
+     }\r
+    else\r
+     {\r
+         setSize(new Dimension(scrollPane.getSize().width, fm.getHeight() * nameHash.size()));\r
+         draw( g,scrollPane.getSize().width, fm.getHeight() * nameHash.size());\r
+     }\r
+\r
+    scrollPane.validate();\r
+  }\r
+    public int getFontSize() {\r
+        return fontSize;\r
+    }\r
+    public void setFontSize(int fontSize) {\r
+        this.fontSize = fontSize;\r
+        repaint();\r
+    }\r
+  public void draw(Graphics g, int width, int height) {\r
+\r
+      g.setColor(Color.white);\r
+      g.fillRect(0,0,width,height);\r
+\r
+\r
+      labelLength = g.getFontMetrics(font).stringWidth(longestName)+ 20;//20 allows for scrollbar\r
+\r
+      float wscale =(float)(width - labelLength -offx*2)/tree.getMaxHeight();\r
+\r
+      SequenceNode top = tree.getTopNode();\r
+\r
+      if (top.count == 0) {\r
+          top.count = ((SequenceNode)top.left()).count + ((SequenceNode)top.right()).count ;\r
+      }\r
+      float chunk = (float)(height-offy*2)/top.count ;\r
+\r
+      drawNode(g,tree.getTopNode(),chunk,wscale,width,offx,offy);\r
+\r
+      if (threshold != 0)\r
+      {\r
+        if(av.getCurrentTree() == tree)\r
+          g.setColor(Color.red);\r
+        else\r
+          g.setColor(Color.gray);\r
+\r
+          int x = (int)(    threshold * (float)(getSize().width-labelLength - 2*offx) +offx   ) ;\r
+\r
+          g.drawLine(x,0,x,getSize().height);\r
+      }\r
+\r
+  }\r
+\r
+  public void mouseReleased(MouseEvent e) { }\r
+  public void mouseEntered(MouseEvent e) { }\r
+  public void mouseExited(MouseEvent e) { }\r
+  public void mouseClicked(MouseEvent e) {\r
+  }\r
+\r
+  public void mousePressed(MouseEvent e) {\r
+\r
+      av.setCurrentTree(tree);\r
+\r
+      int x = e.getX();\r
+      int y = e.getY();\r
+\r
+      Object ob = findElement(x,y);\r
+\r
+      if (ob instanceof SequenceI)\r
+      {\r
+          TreeSelectionChanged((Sequence)ob);\r
+          repaint();\r
+          return;\r
+\r
+      } else if (ob instanceof SequenceNode) {\r
+          SequenceNode tmpnode = (SequenceNode)ob;\r
+          tree.swapNodes(tmpnode);\r
+          tree.reCount(tree.getTopNode());\r
+          tree.findHeight(tree.getTopNode());\r
+      } else {\r
+          // Find threshold\r
+\r
+          if (tree.getMaxHeight() != 0) {\r
+              threshold = (float)(x - offx)/(float)(getSize().width-labelLength - 2*offx);\r
+\r
+              tree.getGroups().removeAllElements();\r
+              tree.groupNodes(tree.getTopNode(),threshold);\r
+              setColor(tree.getTopNode(),Color.black);\r
+\r
+              av.setSelectionGroup(null);\r
+              av.alignment.deleteAllGroups();\r
+\r
+              for (int i=0; i < tree.getGroups().size(); i++)\r
+              {\r
+\r
+                  Color col = new Color((int)(Math.random()*255),\r
+                                        (int)(Math.random()*255),\r
+                                        (int)(Math.random()*255));\r
+                  setColor((SequenceNode)tree.getGroups().elementAt(i),col.brighter());\r
+\r
+                  Vector l = tree.findLeaves((SequenceNode)tree.getGroups().elementAt(i),new Vector());\r
+                  SequenceGroup sg = null;\r
+                  for (int j = 0; j < l.size(); j++)\r
+                  {\r
+                    SequenceNode sn = (SequenceNode) l.elementAt(j);\r
+                    if(sg==null)\r
+                       sg = new SequenceGroup("TreeGroup", av.getGlobalColourScheme(), true, true,false,0,av.alignment.getWidth());\r
+\r
+                    sg.addSequence( (Sequence) sn.element());\r
+                  }\r
+\r
+                  if (av.getGlobalColourScheme() instanceof ConservationColourScheme)\r
+                  {\r
+                    ConservationColourScheme ccs = (ConservationColourScheme) av.getGlobalColourScheme();\r
+                    Conservation c = new Conservation("Group",\r
+                                                      ResidueProperties.propHash, 3,\r
+                                                      sg.sequences, sg.getStartRes(),\r
+                                                      sg.getEndRes());\r
+\r
+                    c.calculate();\r
+                    c.verdict(false, av.ConsPercGaps);\r
+                    ccs = new ConservationColourScheme(c, ccs.cs);\r
+\r
+                    sg.cs = ccs;\r
+\r
+                  }\r
+\r
+\r
+\r
+                  av.alignment.addGroup(sg);\r
+\r
+              }\r
+          }\r
+      }\r
+\r
+      PaintRefresher.Refresh(this);\r
+      repaint();\r
+\r
+  }\r
+\r
+    public void setShowDistances(boolean state) {\r
+        this.showDistances = state;\r
+        repaint();\r
+    }\r
+\r
+    public void setShowBootstrap(boolean state) {\r
+      this.showBootstrap = state;\r
+      repaint();\r
+    }\r
+\r
+}\r
+\r
diff --git a/src/jalview/appletgui/TreePanel.java b/src/jalview/appletgui/TreePanel.java
new file mode 100755 (executable)
index 0000000..89ff20f
--- /dev/null
@@ -0,0 +1,101 @@
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.*;\r
+import jalview.analysis.*;\r
+import jalview.jbappletgui.GTreePanel;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+\r
+public class TreePanel extends GTreePanel\r
+{\r
+  SequenceI[] seq;\r
+  String type;\r
+  String pwtype;\r
+  AlignViewport av;\r
+  int start;\r
+  int end;\r
+  TreeCanvas treeCanvas;\r
+  NJTree tree;\r
+\r
+  public NJTree getTree()\r
+  {\r
+    return tree;\r
+  }\r
+\r
+  public TreePanel(AlignViewport av, Vector seqVector, String type, String pwtype, int s, int e)\r
+  {\r
+    super();\r
+\r
+    this.type = type;\r
+    this.pwtype = pwtype;\r
+\r
+    start = s;\r
+    end = e;\r
+\r
+    String longestName = "";\r
+    seq = new Sequence [seqVector.size()];\r
+    for (int i=0;i < seqVector.size();i++)\r
+    {\r
+      seq[i] = (Sequence) seqVector.elementAt(i);\r
+      if(seq[i].getName().length()>longestName.length())\r
+        longestName = seq[i].getName();\r
+    }\r
+\r
+    tree = new NJTree(seq, type, pwtype, start, end);\r
+\r
+    treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);\r
+\r
+    tree.reCount(tree.getTopNode());\r
+    tree.findHeight(tree.getTopNode());\r
+    scrollPane.add(treeCanvas);\r
+\r
+  }\r
+\r
+\r
+public String getText(String format) {\r
+  return null;\r
+}\r
+\r
+  protected void fitToWindow_actionPerformed(ActionEvent e)\r
+  {\r
+    treeCanvas.fitToWindow = fitToWindow.getState();\r
+    repaint();\r
+  }\r
+\r
+\r
+  protected void fontSize_actionPerformed(ActionEvent e)\r
+  {\r
+ /*   if( treeCanvas==null )\r
+     return;\r
+\r
+   String size = fontSize.getLabel().substring( fontSize.getLabel().indexOf("-")+1);\r
+\r
+   Object selection = JOptionPane.showInternalInputDialog(Desktop.desktop,\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
+                               ,"Font Size - "+size);\r
+   if(selection!=null)\r
+   {\r
+     fontSize.setText("Font Size - " + selection);\r
+\r
+     int i = Integer.parseInt(selection.toString());\r
+     treeCanvas.setFontSize(i);\r
+   }\r
+    scrollPane.setViewportView(treeCanvas);\r
+*/\r
+  }\r
+\r
+  protected void distanceMenu_actionPerformed(ActionEvent e)\r
+  {\r
+    treeCanvas.setShowDistances(distanceMenu.getState());\r
+  }\r
+\r
+  protected void bootstrapMenu_actionPerformed(ActionEvent e)\r
+  {\r
+    treeCanvas.setShowBootstrap(bootstrapMenu.getState());\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/appletgui/UserDefinedColours.java b/src/jalview/appletgui/UserDefinedColours.java
new file mode 100755 (executable)
index 0000000..9f1eb6d
--- /dev/null
@@ -0,0 +1,226 @@
+package jalview.appletgui;\r
+\r
+import jalview.jbappletgui.GUserDefinedColours;\r
+import jalview.datamodel.*;\r
+import jalview.schemes.*;\r
+import jalview.io.*;\r
+import java.io.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+import java.util.*;\r
+\r
+\r
+public class UserDefinedColours extends GUserDefinedColours\r
+{\r
+\r
+  AlignmentPanel ap;\r
+  SequenceGroup seqGroup;\r
+  Button selectedButton;\r
+  Vector oldColours = new Vector();\r
+  ColourSchemeI oldColourScheme;\r
+  Frame frame;\r
+\r
+  int R = 0, G = 0, B = 0;\r
+\r
+  public UserDefinedColours(AlignmentPanel ap, SequenceGroup sg)\r
+  {\r
+    super();\r
+    frame = new Frame();\r
+    frame.add(this);\r
+    jalview.bin.JalviewLite.addFrame(frame, "User defined colours", 420,345 );\r
+\r
+    if(sg!=null)\r
+        frame.setTitle( frame.getTitle()+ " ("+sg.getName()+")");\r
+\r
+\r
+    this.ap = ap;\r
+    seqGroup = sg;\r
+\r
+\r
+      if (seqGroup != null)\r
+        oldColourScheme = seqGroup.cs;\r
+      else\r
+        oldColourScheme = ap.av.getGlobalColourScheme();\r
+\r
+      for (int i = 0; i < 20; i++)\r
+        makeButton(ResidueProperties.aa2Triplet.get(ResidueProperties.aa[i]) +\r
+                   "", ResidueProperties.aa[i]);\r
+\r
+      makeButton("B", "B");\r
+      makeButton("Z", "Z");\r
+      makeButton("X", "X");\r
+      makeButton("Gap", "'.','-',' '");\r
+\r
+  }\r
+\r
+  protected void rText_actionPerformed(ActionEvent e) {\r
+    try{\r
+      int i = Integer.parseInt(rText.getText());\r
+      rScroller.setValue(i);\r
+    }catch(NumberFormatException ex){}\r
+  }\r
+\r
+  protected void gText_actionPerformed(ActionEvent e) {\r
+    try{\r
+      int i = Integer.parseInt(gText.getText());\r
+      gScroller.setValue(i);\r
+    }catch(NumberFormatException ex){}\r
+\r
+  }\r
+\r
+  protected void bText_actionPerformed(ActionEvent e) {\r
+    try{\r
+      int i = Integer.parseInt(bText.getText());\r
+      bScroller.setValue(i);\r
+    }catch(NumberFormatException ex){}\r
+\r
+  }\r
+\r
+\r
+  protected void rScroller_adjustmentValueChanged(AdjustmentEvent e) {\r
+    R = rScroller.getValue();\r
+    rText.setText(R+"");\r
+    colourChanged();\r
+  }\r
+\r
+  protected void gScroller_adjustmentValueChanged(AdjustmentEvent e) {\r
+    G = gScroller.getValue();\r
+    gText.setText(G+"");\r
+    colourChanged();\r
+  }\r
+\r
+  protected void bScroller_adjustmentValueChanged(AdjustmentEvent e) {\r
+    B = bScroller.getValue();\r
+    bText.setText(B+"");\r
+    colourChanged();\r
+  }\r
+\r
+ public void colourChanged()\r
+ {\r
+   Color col = new Color(R,G,B);\r
+   target.setBackground( col );\r
+\r
+   if(selectedButton!=null)\r
+     selectedButton.setBackground( col );\r
+ }\r
+\r
+  public void colourButtonPressed(MouseEvent e)\r
+  {\r
+     selectedButton = (Button)e.getSource();\r
+     Color col = selectedButton.getBackground();\r
+     R = col.getRed();\r
+     G = col.getGreen();\r
+     B = col.getBlue();\r
+     rScroller.setValue(R);\r
+     gScroller.setValue(G);\r
+     bScroller.setValue(B);\r
+     rText.setText(R+"");\r
+     gText.setText(G+"");\r
+     bText.setText(B+"");\r
+\r
+     colourChanged();\r
+  }\r
+\r
+  void makeButton(String label, String aa)\r
+  {\r
+    final Button button = new Button();\r
+    Color col = Color.white;\r
+\r
+\r
+    try{\r
+      col = oldColourScheme.findColour(aa, -1);\r
+    }catch(Exception ex){}\r
+\r
+    button.setBackground(  col );\r
+    oldColours.addElement( col );\r
+    button.setLabel( label );\r
+    button.setForeground( col.darker().darker().darker() );\r
+    button.setFont(new java.awt.Font("Verdana", 1, 10));\r
+    button.addMouseListener(new java.awt.event.MouseAdapter()\r
+    {\r
+      public void mouseClicked(MouseEvent e)\r
+      {\r
+        colourButtonPressed(e);\r
+      }\r
+    });\r
+\r
+    buttonPanel.add(button, null);\r
+  }\r
+\r
+\r
+  protected void okButton_actionPerformed(ActionEvent e)\r
+  {\r
+    applyButton_actionPerformed(null);\r
+   frame.setVisible(false);\r
+  }\r
+\r
+  protected void applyButton_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+    Color [] newColours = new Color[24];\r
+    for(int i=0; i<24; i++)\r
+    {\r
+          Button button = (Button)buttonPanel.getComponent(i);\r
+          newColours[i] = button.getBackground();\r
+    }\r
+\r
+    UserColourScheme ucs = new UserColourScheme();\r
+    ucs.setThreshold(0);\r
+    ucs.setColourScheme( newColours );\r
+\r
+    if(seqGroup!=null)\r
+      seqGroup.cs = ucs;\r
+    else\r
+      ap.av.setGlobalColourScheme(ucs);\r
+\r
+    ap.repaint();\r
+  }\r
+\r
+\r
+  public static UserColourScheme loadDefaultColours(String file)\r
+  {\r
+    UserColourScheme ucs = null;\r
+    try\r
+    {\r
+      BufferedReader in = new BufferedReader(new FileReader(file));\r
+      Color [] newColours = new Color[24];\r
+      for (int i = 0; i < 24; i++)\r
+      {\r
+        newColours[i] = new Color(Integer.parseInt(in.readLine()));\r
+      }\r
+\r
+      ucs = new UserColourScheme();\r
+      ucs.setThreshold(0);\r
+      ucs.setColourScheme(newColours);\r
+\r
+    }\r
+    catch (Exception ex)\r
+    {}\r
+\r
+    return ucs;\r
+  }\r
+\r
+\r
+  protected void cancelButton_actionPerformed(ActionEvent e)\r
+  {\r
+    UserColourScheme ucs = new UserColourScheme();\r
+    Color [] newColours = new Color[24];\r
+    for(int i=0; i<24; i++)\r
+    {\r
+          newColours[i] = (Color)oldColours.elementAt(i);\r
+          buttonPanel.getComponent(i).setBackground(newColours[i]);\r
+    }\r
+\r
+    ucs.setColourScheme( newColours );\r
+    if (seqGroup != null)\r
+      seqGroup.cs = ucs;\r
+    else\r
+      ap.av.setGlobalColourScheme(ucs);\r
+\r
+    ap.repaint();\r
+\r
+    frame.setVisible(false);\r
+  }\r
+\r
+\r
+}\r
diff --git a/src/jalview/bin/JalviewLite.java b/src/jalview/bin/JalviewLite.java
new file mode 100755 (executable)
index 0000000..1ce2066
--- /dev/null
@@ -0,0 +1,122 @@
+package jalview.bin;\r
+\r
+import java.applet.*;\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+import jalview.datamodel.*;\r
+import jalview.io.*;\r
+import jalview.appletgui.AlignFrame;\r
+\r
+public class JalviewLite extends Applet\r
+{\r
+  static int lastFrameX = 200;\r
+  static int lastFrameY = 200;\r
+  static Applet applet;\r
+  boolean fileFound = true;\r
+  String file = "No file";\r
+  Button launcher = new Button("Start Jalview");\r
+\r
+  public void init()\r
+  {\r
+    applet = this;\r
+    this.setBackground(Color.white);\r
+\r
+    file = getParameter("file");\r
+    if (file != null)\r
+    {\r
+      add(launcher);\r
+      file = applet.getCodeBase() + file;\r
+      launcher.addActionListener(new java.awt.event.ActionListener()\r
+     {\r
+       public void actionPerformed(ActionEvent e)\r
+       {\r
+         String format = jalview.io.IdentifyFile.Identify( file, "URL");\r
+         LoadFile(file, "URL", format);\r
+       }\r
+     });\r
+    }\r
+     else\r
+     {\r
+       file = "NO FILE";\r
+       fileFound = false;\r
+     }\r
+   }\r
+\r
+\r
+   public static void showURL(String url)\r
+   {\r
+     try{\r
+       applet.getAppletContext().showDocument(new java.net.URL(url), "HELP_WINDOW");\r
+     }catch(Exception ex){}\r
+   }\r
+\r
+   public void LoadFile(String file, String protocol,  String format)\r
+   {\r
+     LoadingThread loader = new LoadingThread(file, protocol, format, this);\r
+     loader.start();\r
+   }\r
+\r
+   public static void addFrame(final Frame frame, String title, int width, int height)\r
+   {\r
+     frame.setLocation(lastFrameX,lastFrameY);\r
+     lastFrameX+=40; lastFrameY+=40;\r
+     frame.setSize(width,height);\r
+     frame.setTitle(title);\r
+     frame.addWindowListener(new WindowAdapter()\r
+    {\r
+      public void windowClosing(WindowEvent e)\r
+      {\r
+        frame.dispose();\r
+      }\r
+    });\r
+    frame.setVisible(true);\r
+   }\r
+\r
+\r
+   public void paint(Graphics g)\r
+   {\r
+     if(!fileFound)\r
+     {\r
+       g.setColor(new Color(200,200,200));\r
+       g.setColor(Color.cyan);\r
+       g.fillRect(0,0,getSize().width, getSize().height);\r
+       g.setColor(Color.red);\r
+       g.drawString("Jalview can't open file", 5, 15);\r
+       g.drawString("\""+ file+"\"", 5, 30);\r
+     }\r
+   }\r
+\r
+   class LoadingThread extends Thread\r
+   {\r
+     String file, protocol, format;\r
+     JalviewLite jlapplet;\r
+\r
+     public LoadingThread(String file, String protocol,  String format, JalviewLite applet)\r
+     {\r
+       this.file = file;\r
+       this.protocol = protocol;\r
+       this.format = format;\r
+       this.jlapplet = applet;\r
+     }\r
+     public void run()\r
+     {\r
+       SequenceI [] sequences = null;\r
+       sequences = FormatAdapter.readFile(file, protocol, format);\r
+\r
+       if (sequences != null && sequences.length>0)\r
+       {\r
+         AlignFrame af = new AlignFrame(new Alignment(sequences), jlapplet );\r
+         addFrame(af, file, AlignFrame.NEW_WINDOW_WIDTH, AlignFrame.NEW_WINDOW_HEIGHT);\r
+         af.statusBar.setText("Successfully loaded file " + file);\r
+       }\r
+       else\r
+       {\r
+         fileFound = false;\r
+         remove(launcher);\r
+         repaint();\r
+       }\r
+     }\r
+   }\r
+}\r
+\r
+\r
diff --git a/src/jalview/jbappletgui/GAlignFrame.java b/src/jalview/jbappletgui/GAlignFrame.java
new file mode 100755 (executable)
index 0000000..806ca46
--- /dev/null
@@ -0,0 +1,1113 @@
+/********************\r
+ * 2004 Jalview Reengineered\r
+ * Barton Group\r
+ * Dundee University\r
+ *\r
+ * AM Waterhouse\r
+ *******************/\r
+\r
+package jalview.jbappletgui;\r
+\r
+import java.awt.event.*;\r
+import java.awt.*;\r
+\r
+public class GAlignFrame extends Frame\r
+{\r
+  protected MenuBar alignFrameMenuBar = new MenuBar();\r
+  protected Menu fileMenu = new Menu();\r
+  protected MenuItem closeMenuItem = new MenuItem();\r
+  protected Menu editMenu = new Menu();\r
+  protected Menu viewMenu = new Menu();\r
+  protected Menu colourMenu = new Menu();\r
+  protected Menu calculateMenu = new Menu();\r
+  protected MenuItem selectAllSequenceMenuItem = new MenuItem();\r
+  protected MenuItem deselectAllSequenceMenuItem = new MenuItem();\r
+  protected MenuItem invertSequenceMenuItem = new MenuItem();\r
+  protected MenuItem remove2LeftMenuItem = new MenuItem();\r
+  protected MenuItem remove2RightMenuItem = new MenuItem();\r
+  protected MenuItem removeGappedColumnMenuItem = new MenuItem();\r
+  protected MenuItem removeAllGapsMenuItem = new MenuItem();\r
+  protected CheckboxMenuItem viewBoxesMenuItem = new CheckboxMenuItem();\r
+  protected CheckboxMenuItem viewTextMenuItem = new CheckboxMenuItem();\r
+  protected MenuItem sortPairwiseMenuItem = new MenuItem();\r
+  protected MenuItem sortIDMenuItem = new MenuItem();\r
+  protected MenuItem sortGroupMenuItem = new MenuItem();\r
+  protected MenuItem removeRedundancyMenuItem = new MenuItem();\r
+  protected MenuItem pairwiseAlignmentMenuItem = new MenuItem();\r
+  protected MenuItem PCAMenuItem = new MenuItem();\r
+  protected MenuItem averageDistanceTreeMenuItem = new MenuItem();\r
+  protected MenuItem neighbourTreeMenuItem = new MenuItem();\r
+  BorderLayout borderLayout1 = new BorderLayout();\r
+  public Label statusBar = new Label();\r
+  protected Menu outputTextboxMenu = new Menu();\r
+  protected MenuItem clustalColour = new MenuItem();\r
+  protected MenuItem zappoColour = new MenuItem();\r
+  protected MenuItem taylorColour = new MenuItem();\r
+  protected MenuItem hydrophobicityColour = new MenuItem();\r
+  protected MenuItem helixColour = new MenuItem();\r
+  protected MenuItem strandColour = new MenuItem();\r
+  protected MenuItem turnColour = new MenuItem();\r
+  protected MenuItem buriedColour = new MenuItem();\r
+  protected MenuItem userDefinedColour = new MenuItem();\r
+  protected MenuItem PIDColour = new MenuItem();\r
+  protected MenuItem BLOSUM62Colour = new MenuItem();\r
+  MenuItem njTreeBlosumMenuItem = new MenuItem();\r
+  MenuItem avDistanceTreeBlosumMenuItem = new MenuItem();\r
+  protected CheckboxMenuItem annotationPanelMenuItem = new CheckboxMenuItem();\r
+  protected CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();\r
+  MenuItem overviewMenuItem = new MenuItem();\r
+  protected MenuItem undoMenuItem = new MenuItem();\r
+  protected MenuItem redoMenuItem = new MenuItem();\r
+  protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();\r
+  MenuItem noColourmenuItem = new MenuItem();\r
+  protected CheckboxMenuItem wrapMenuItem = new CheckboxMenuItem();\r
+  protected CheckboxMenuItem renderGapsMenuItem = new CheckboxMenuItem();\r
+  MenuItem findMenuItem = new MenuItem();\r
+  Menu searchMenu = new Menu();\r
+  protected CheckboxMenuItem abovePIDThreshold = new CheckboxMenuItem();\r
+  protected MenuItem nucleotideColour = new MenuItem();\r
+  MenuItem deleteGroups = new MenuItem();\r
+  MenuItem delete = new MenuItem();\r
+  MenuItem copy = new MenuItem();\r
+  MenuItem cut = new MenuItem();\r
+  Menu Menu1 = new Menu();\r
+  MenuItem pasteNew = new MenuItem();\r
+  MenuItem pasteThis = new MenuItem();\r
+  protected CheckboxMenuItem applyToAllGroups = new CheckboxMenuItem();\r
+  protected MenuItem font = new MenuItem();\r
+  protected CheckboxMenuItem fullSeqId = new CheckboxMenuItem();\r
+  protected CheckboxMenuItem scaleAbove = new CheckboxMenuItem();\r
+  protected CheckboxMenuItem scaleLeft = new CheckboxMenuItem();\r
+  protected CheckboxMenuItem scaleRight = new CheckboxMenuItem();\r
+  MenuItem modifyPID = new MenuItem();\r
+  MenuItem modifyConservation = new MenuItem();\r
+  protected Menu sortByTreeMenu = new Menu();\r
+  Menu sort = new Menu();\r
+  Menu calculate = new Menu();\r
+  MenuItem inputText = new MenuItem();\r
+  Menu helpMenu = new Menu();\r
+  MenuItem documentation = new MenuItem();\r
+  MenuItem about = new MenuItem();\r
+  public GAlignFrame()\r
+  {\r
+    try\r
+    {\r
+      jbInit();\r
+      setMenuBar(alignFrameMenuBar);\r
+\r
+      MenuItem item;\r
+      // dynamically fill save as menu with available formats\r
+      for (int i = 0; i < jalview.io.FormatAdapter.formats.size(); i++) {\r
+        item = new MenuItem((String) jalview.io.FormatAdapter.formats.elementAt(i));\r
+        item.addActionListener(new java.awt.event.ActionListener()\r
+        {\r
+          public void actionPerformed(ActionEvent e)\r
+          {\r
+            saveAs_actionPerformed(e);\r
+          }\r
+        });\r
+\r
+        item = new MenuItem((String) jalview.io.FormatAdapter.formats.elementAt(i));\r
+        item.addActionListener(new java.awt.event.ActionListener()\r
+        {\r
+          public void actionPerformed(ActionEvent e)\r
+          {\r
+            outputText_actionPerformed(e);\r
+          }\r
+        });\r
+\r
+        outputTextboxMenu.add( item );\r
+      }\r
+\r
+    }\r
+    catch(Exception e)\r
+    {\r
+      e.printStackTrace();\r
+    }\r
+\r
+  }\r
+  private void jbInit() throws Exception\r
+  {\r
+    fileMenu.setLabel("File");\r
+    closeMenuItem.setLabel("Close");\r
+    closeMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        closeMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    editMenu.setLabel("Edit");\r
+    viewMenu.setLabel("View");\r
+    colourMenu.setLabel("Colour");\r
+    calculateMenu.setLabel("Calculate");\r
+    selectAllSequenceMenuItem.setLabel("Select all");\r
+    selectAllSequenceMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        selectAllSequenceMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    deselectAllSequenceMenuItem.setLabel("Deselect All");\r
+    deselectAllSequenceMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        deselectAllSequenceMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    invertSequenceMenuItem.setLabel("Invert Selection");\r
+    invertSequenceMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        invertSequenceMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    remove2LeftMenuItem.setLabel("Remove Left");\r
+    remove2LeftMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        remove2LeftMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    remove2RightMenuItem.setLabel("Remove Right");\r
+    remove2RightMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        remove2RightMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    removeGappedColumnMenuItem.setLabel("Remove Empty Columns");\r
+    removeGappedColumnMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        removeGappedColumnMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    removeAllGapsMenuItem.setLabel("Remove All Gaps");\r
+    removeAllGapsMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        removeAllGapsMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    viewBoxesMenuItem.setLabel("Boxes");\r
+    viewBoxesMenuItem.setState(true);\r
+    viewBoxesMenuItem.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        viewBoxesMenuItem_actionPerformed(null);\r
+      }\r
+    });\r
+    viewTextMenuItem.setLabel("Text");\r
+    viewTextMenuItem.setState(true);\r
+    viewTextMenuItem.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        viewTextMenuItem_actionPerformed(null);\r
+      }\r
+    });\r
+    sortPairwiseMenuItem.setLabel("Pairwise Identity");\r
+    sortPairwiseMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        sortPairwiseMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    sortIDMenuItem.setLabel("ID");\r
+    sortIDMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        sortIDMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    sortGroupMenuItem.setLabel("Group");\r
+    sortGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        sortGroupMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    removeRedundancyMenuItem.setLabel("Remove Redundancy...");\r
+    removeRedundancyMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        removeRedundancyMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    pairwiseAlignmentMenuItem.setLabel("Pairwise Alignments...");\r
+    pairwiseAlignmentMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        pairwiseAlignmentMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    PCAMenuItem.setLabel("Principal Component Analysis...");\r
+    PCAMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        PCAMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    averageDistanceTreeMenuItem.setLabel("Average Distance Using % Identity...");\r
+    averageDistanceTreeMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        averageDistanceTreeMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    neighbourTreeMenuItem.setLabel("Neighbour Joining Using % Identity...");\r
+    neighbourTreeMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        neighbourTreeMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    statusBar.setBackground(Color.white);\r
+    statusBar.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    statusBar.setText("Status bar");\r
+    outputTextboxMenu.setLabel("Output to Textbox");\r
+    clustalColour.setLabel("Clustalx");\r
+\r
+    clustalColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        clustalColour_actionPerformed(e);\r
+      }\r
+    });\r
+    zappoColour.setLabel("Zappo");\r
+    zappoColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        zappoColour_actionPerformed(e);\r
+      }\r
+    });\r
+    taylorColour.setLabel("Taylor");\r
+    taylorColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        taylorColour_actionPerformed(e);\r
+      }\r
+    });\r
+    hydrophobicityColour.setLabel("Hydrophobicity");\r
+    hydrophobicityColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        hydrophobicityColour_actionPerformed(e);\r
+      }\r
+    });\r
+    helixColour.setLabel("Helix Propensity");\r
+    helixColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        helixColour_actionPerformed(e);\r
+      }\r
+    });\r
+    strandColour.setLabel("Strand Propensity");\r
+    strandColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        strandColour_actionPerformed(e);\r
+      }\r
+    });\r
+    turnColour.setLabel("Turn Propensity");\r
+    turnColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        turnColour_actionPerformed(e);\r
+      }\r
+    });\r
+    buriedColour.setLabel("Buried Index");\r
+    buriedColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        buriedColour_actionPerformed(e);\r
+      }\r
+    });\r
+    userDefinedColour.setLabel("User Defined...");\r
+    userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        userDefinedColour_actionPerformed(e);\r
+      }\r
+    });\r
+    PIDColour.setLabel("Percentage Identity");\r
+    PIDColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        PIDColour_actionPerformed(e);\r
+      }\r
+    });\r
+    BLOSUM62Colour.setLabel("BLOSUM62 Score");\r
+    BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        BLOSUM62Colour_actionPerformed(e);\r
+      }\r
+    });\r
+    avDistanceTreeBlosumMenuItem.setLabel("Average Distance using BLOSUM62...");\r
+    avDistanceTreeBlosumMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        avTreeBlosumMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    njTreeBlosumMenuItem.setLabel("Neighbour Joining using BLOSUM62...");\r
+    njTreeBlosumMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        njTreeBlosumMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    annotationPanelMenuItem.setActionCommand("");\r
+    annotationPanelMenuItem.setState(true);\r
+    annotationPanelMenuItem.setLabel("Show Annotations");\r
+    annotationPanelMenuItem.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        annotationPanelMenuItem_actionPerformed(null);\r
+      }\r
+    });\r
+    colourTextMenuItem.setLabel("Colour Text");\r
+    colourTextMenuItem.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        colourTextMenuItem_actionPerformed(null);\r
+      }\r
+    });\r
+    overviewMenuItem.setLabel("Overview Window...");\r
+    overviewMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        overviewMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    undoMenuItem.setEnabled(false);\r
+    undoMenuItem.setLabel("Undo");\r
+    undoMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        undoMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    redoMenuItem.setEnabled(false);\r
+    redoMenuItem.setLabel("Redo");\r
+    redoMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        redoMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    conservationMenuItem.setLabel("By Conservation");\r
+    conservationMenuItem.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        conservationMenuItem_actionPerformed(null);\r
+      }\r
+    });\r
+    noColourmenuItem.setLabel("None");\r
+    noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        noColourmenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    wrapMenuItem.setLabel("Wrap");\r
+    wrapMenuItem.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        wrapMenuItem_actionPerformed(null);\r
+      }\r
+    });\r
+    renderGapsMenuItem.setLabel("Show Gaps");\r
+    renderGapsMenuItem.setState(true);\r
+    renderGapsMenuItem.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+\r
+        renderGapsMenuItem_actionPerformed(null);\r
+      }\r
+    });\r
+    findMenuItem.setLabel("Find...");\r
+    findMenuItem.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        findMenuItem_actionPerformed(e);\r
+      }\r
+    });\r
+    searchMenu.setLabel("Search");\r
+\r
+    abovePIDThreshold.setLabel("Above Identity threshold");\r
+    abovePIDThreshold.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        abovePIDThreshold_actionPerformed(null);\r
+      }\r
+    });\r
+    nucleotideColour.setLabel("Nucleotide");\r
+    nucleotideColour.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        nucleotideColour_actionPerformed(e);\r
+      }\r
+    });\r
+    deleteGroups.setLabel("Undefine groups");\r
+    deleteGroups.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        deleteGroups_actionPerformed(e);\r
+      }\r
+    });\r
+    copy.setLabel("Copy");\r
+    copy.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        copy_actionPerformed(e);\r
+      }\r
+    });\r
+    cut.setLabel("Cut");\r
+    cut.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        cut_actionPerformed(e);\r
+      }\r
+    });\r
+    delete.setLabel("Delete");\r
+    delete.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        delete_actionPerformed(e);\r
+      }\r
+    });\r
+    Menu1.setLabel("Paste");\r
+    pasteNew.setLabel("to new alignment");\r
+    pasteNew.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        pasteNew_actionPerformed(e);\r
+      }\r
+    });\r
+    pasteThis.setLabel("add to this alignment");\r
+    pasteThis.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        pasteThis_actionPerformed(e);\r
+      }\r
+    });\r
+    applyToAllGroups.setLabel("Apply Colour To All Groups");\r
+    applyToAllGroups.setState(true);\r
+    applyToAllGroups.addItemListener(new java.awt.event.ItemListener()\r
+   {\r
+     public void itemStateChanged(ItemEvent e)\r
+     {\r
+        applyToAllGroups_actionPerformed(null);\r
+      }\r
+    });\r
+    font.setLabel("Font...");\r
+    font.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        font_actionPerformed(e);\r
+      }\r
+    });\r
+    fullSeqId.setLabel("Show Full Sequence ID");\r
+    fullSeqId.setState(true);\r
+    fullSeqId.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        fullSeqId_actionPerformed(null);\r
+      }\r
+    });\r
+    scaleAbove.setLabel("Scale Above");\r
+    scaleAbove.setState(true);\r
+    scaleAbove.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+\r
+        scaleAbove_actionPerformed(null);\r
+      }\r
+    });\r
+    scaleLeft.setEnabled(false);\r
+    scaleLeft.setState(true);\r
+    scaleLeft.setLabel("Scale Left");\r
+    scaleLeft.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+\r
+        scaleLeft_actionPerformed(null);\r
+      }\r
+    });\r
+    scaleRight.setEnabled(false);\r
+    scaleRight.setState(true);\r
+    scaleRight.setLabel("Scale Right");\r
+    scaleRight.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+\r
+        scaleRight_actionPerformed(null);\r
+      }\r
+    });\r
+    modifyPID.setLabel("Modify Identity Threshold...");\r
+    modifyPID.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        modifyPID_actionPerformed(e);\r
+      }\r
+    });\r
+    modifyConservation.setLabel("Modify Conservation Threshold...");\r
+    modifyConservation.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        modifyConservation_actionPerformed(e);\r
+      }\r
+    });\r
+    sortByTreeMenu.setLabel("Tree Order");\r
+    sort.setLabel("Sort");\r
+    calculate.setLabel("Calculate Tree");\r
+    inputText.setLabel("Input from textbox");\r
+    inputText.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        inputText_actionPerformed(e);\r
+      }\r
+    });\r
+\r
+    helpMenu.setLabel("Help");\r
+    documentation.setLabel("Documentation");\r
+    documentation.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        documentation_actionPerformed(e);\r
+      }\r
+    });\r
+\r
+    about.setLabel("About...");\r
+    about.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        about_actionPerformed(e);\r
+      }\r
+    });\r
+\r
+    alignFrameMenuBar.add(fileMenu);\r
+    alignFrameMenuBar.add(editMenu);\r
+    alignFrameMenuBar.add(searchMenu);\r
+    alignFrameMenuBar.add(viewMenu);\r
+    alignFrameMenuBar.add(colourMenu);\r
+    alignFrameMenuBar.add(calculateMenu);\r
+    alignFrameMenuBar.add(helpMenu);\r
+    fileMenu.add(inputText);\r
+    fileMenu.add(outputTextboxMenu);\r
+    fileMenu.addSeparator();\r
+    fileMenu.add(closeMenuItem);\r
+    editMenu.add(undoMenuItem);\r
+    editMenu.add(redoMenuItem);\r
+    editMenu.add(cut);\r
+    editMenu.add(copy);\r
+    editMenu.add(Menu1);\r
+    editMenu.add(delete);\r
+    editMenu.add(selectAllSequenceMenuItem);\r
+    editMenu.add(deselectAllSequenceMenuItem);\r
+    editMenu.add(invertSequenceMenuItem);\r
+    editMenu.add(deleteGroups);\r
+    editMenu.addSeparator();\r
+    editMenu.add(remove2LeftMenuItem);\r
+    editMenu.add(remove2RightMenuItem);\r
+    editMenu.add(removeGappedColumnMenuItem);\r
+    editMenu.add(removeAllGapsMenuItem);\r
+    editMenu.add(removeRedundancyMenuItem);\r
+    searchMenu.add(findMenuItem);\r
+    viewMenu.add(font);\r
+    viewMenu.add(fullSeqId);\r
+    viewMenu.addSeparator();\r
+    viewMenu.add(wrapMenuItem);\r
+    viewMenu.add(scaleAbove);\r
+    viewMenu.add(scaleLeft);\r
+    viewMenu.add(scaleRight);\r
+    viewMenu.addSeparator();\r
+    viewMenu.add(viewBoxesMenuItem);\r
+    viewMenu.add(viewTextMenuItem);\r
+    viewMenu.add(colourTextMenuItem);\r
+    viewMenu.add(renderGapsMenuItem);\r
+    viewMenu.add(annotationPanelMenuItem);\r
+    viewMenu.addSeparator();\r
+    viewMenu.add(overviewMenuItem);\r
+    colourMenu.add(applyToAllGroups);\r
+    colourMenu.add(noColourmenuItem);\r
+    colourMenu.addSeparator();\r
+    colourMenu.add(clustalColour);\r
+    colourMenu.add(BLOSUM62Colour);\r
+    colourMenu.add(PIDColour);\r
+    colourMenu.add(zappoColour);\r
+    colourMenu.add(taylorColour);\r
+    colourMenu.add(hydrophobicityColour);\r
+    colourMenu.add(helixColour);\r
+    colourMenu.add(strandColour);\r
+    colourMenu.add(turnColour);\r
+    colourMenu.add(buriedColour);\r
+    colourMenu.add(nucleotideColour);\r
+    colourMenu.add(userDefinedColour);\r
+    colourMenu.addSeparator();\r
+    colourMenu.add(conservationMenuItem);\r
+    colourMenu.add(modifyConservation);\r
+    colourMenu.add(abovePIDThreshold);\r
+    colourMenu.add(modifyPID);\r
+    calculateMenu.add(sort);\r
+    calculateMenu.add(calculate);\r
+    calculateMenu.addSeparator();\r
+    calculateMenu.add(pairwiseAlignmentMenuItem);\r
+    calculateMenu.add(PCAMenuItem);\r
+    this.add(statusBar, BorderLayout.SOUTH);\r
+    Menu1.add(pasteNew);\r
+    Menu1.add(pasteThis);\r
+    sort.add(sortIDMenuItem);\r
+    sort.add(sortGroupMenuItem);\r
+    sort.add(sortByTreeMenu);\r
+    sort.add(sortPairwiseMenuItem);\r
+    calculate.add(averageDistanceTreeMenuItem);\r
+    calculate.add(neighbourTreeMenuItem);\r
+    calculate.add(avDistanceTreeBlosumMenuItem);\r
+    calculate.add(njTreeBlosumMenuItem);\r
+    helpMenu.add(documentation);\r
+    helpMenu.add(about);\r
+  }\r
+\r
+  protected void saveAs_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void outputText_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void closeMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void redoMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void undoMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void wrapMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void viewTextMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void overviewMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void sortIDMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void PCAMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+\r
+  protected void clustalAlignMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+\r
+\r
+  protected void clustalColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void zappoColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void taylorColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void hydrophobicityColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void helixColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void strandColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void turnColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void buriedColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+\r
+  protected void userDefinedColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void PIDColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected  void conservationMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void printMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void findMenuItem_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void abovePIDThreshold_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+  public void sequenceFeatures_actionPerformed(ActionEvent actionEvent)\r
+  {\r
+\r
+  }\r
+\r
+  protected void nucleotideColour_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void deleteGroups_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+ protected void copy_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void cut_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void delete_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void pasteNew_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void pasteThis_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void createPNG_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void font_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void fullSeqId_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void epsFile_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+  protected void jpred_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void scaleAbove_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void scaleLeft_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void scaleRight_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void modifyPID_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void modifyConservation_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void preferences_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void msaAlignMenuItem_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+  protected void inputText_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+  protected void documentation_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+  protected void about_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+\r
+}\r
+\r
diff --git a/src/jalview/jbappletgui/GAlignmentPanel.java b/src/jalview/jbappletgui/GAlignmentPanel.java
new file mode 100755 (executable)
index 0000000..6a3ed74
--- /dev/null
@@ -0,0 +1,87 @@
+/********************\r
+ * 2004 Jalview Reengineered\r
+ * Barton Group\r
+ * Dundee University\r
+ *\r
+ * AM Waterhouse\r
+ *******************/\r
+\r
+package jalview.jbappletgui;\r
+\r
+import java.awt.*;\r
+\r
+public class GAlignmentPanel extends Panel\r
+{\r
+  protected Panel sequenceHolderPanel = new Panel();\r
+  protected Scrollbar vscroll = new Scrollbar();\r
+  protected  Scrollbar hscroll = new Scrollbar();\r
+  protected Panel seqPanelHolder = new Panel();\r
+  BorderLayout borderLayout1 = new BorderLayout();\r
+  BorderLayout borderLayout3 = new BorderLayout();\r
+  protected Panel scalePanelHolder = new Panel();\r
+  protected Panel idPanelHolder = new Panel();\r
+  BorderLayout borderLayout5 = new BorderLayout();\r
+  protected Panel idSpaceFillerPanel1 = new Panel();\r
+  public Panel annotationSpaceFillerHolder = new Panel();\r
+  BorderLayout borderLayout6 = new BorderLayout();\r
+  BorderLayout borderLayout7 = new BorderLayout();\r
+  Panel hscrollHolder = new Panel();\r
+  BorderLayout borderLayout10 = new BorderLayout();\r
+  protected Panel hscrollFillerPanel = new Panel();\r
+  BorderLayout borderLayout11 = new BorderLayout();\r
+  public ScrollPane annotationScroller = new ScrollPane( ScrollPane.SCROLLBARS_NEVER );\r
+  BorderLayout borderLayout4 = new BorderLayout();\r
+\r
+  public GAlignmentPanel()\r
+  {\r
+    try\r
+    {\r
+      jbInit();\r
+    }\r
+    catch(Exception e)\r
+    {\r
+      e.printStackTrace();\r
+    }\r
+  }\r
+  private void jbInit() throws Exception\r
+  {\r
+  //  idPanelHolder.setPreferredSize(new Dimension(70, 10));\r
+    this.setLayout(borderLayout7);\r
+ //   sequenceHolderPanel.setPreferredSize(new Dimension(150, 150));\r
+    sequenceHolderPanel.setLayout(borderLayout3);\r
+    seqPanelHolder.setLayout(borderLayout1);\r
+    scalePanelHolder.setBackground(Color.white);\r
+ // scalePanelHolder.setPreferredSize(new Dimension(10, 30));\r
+    scalePanelHolder.setLayout(borderLayout6);\r
+    idPanelHolder.setLayout(borderLayout5);\r
+    idSpaceFillerPanel1.setBackground(Color.white);\r
+  //  idSpaceFillerPanel1.setPreferredSize(new Dimension(10, 30));\r
+    idSpaceFillerPanel1.setLayout(borderLayout11);\r
+    annotationSpaceFillerHolder.setBackground(Color.white);\r
+  //  annotationSpaceFillerHolder.setPreferredSize(new Dimension(10, 80));\r
+    annotationSpaceFillerHolder.setLayout(borderLayout4);\r
+    hscroll.setOrientation(Scrollbar.HORIZONTAL);\r
+    hscrollHolder.setLayout(borderLayout10);\r
+    hscrollFillerPanel.setBackground(Color.white);\r
+  //  hscrollFillerPanel.setPreferredSize(new Dimension(70, 10));\r
+    hscrollHolder.setBackground(Color.white);\r
+ //    annotationScroller.setPreferredSize(new Dimension(10, 80));\r
+  //  this.setPreferredSize(new Dimension(220, 166));\r
+    seqPanelHolder.setBackground(Color.white);\r
+    idPanelHolder.setBackground(Color.white);\r
+    sequenceHolderPanel.add(scalePanelHolder,  BorderLayout.NORTH);\r
+    sequenceHolderPanel.add(seqPanelHolder,  BorderLayout.CENTER);\r
+    seqPanelHolder.add(vscroll, BorderLayout.EAST);\r
+    sequenceHolderPanel.add(annotationScroller, BorderLayout.SOUTH);\r
+  //  Panel3.add(secondaryPanelHolder,  BorderLayout.SOUTH);\r
+    this.add(idPanelHolder, BorderLayout.WEST);\r
+    idPanelHolder.add(idSpaceFillerPanel1,  BorderLayout.NORTH);\r
+    idPanelHolder.add(annotationSpaceFillerHolder, BorderLayout.SOUTH);\r
+    this.add(hscrollHolder,  BorderLayout.SOUTH);\r
+    hscrollHolder.add(hscroll, BorderLayout.CENTER);\r
+    hscrollHolder.add(hscrollFillerPanel,  BorderLayout.WEST);\r
+    this.add(sequenceHolderPanel,  BorderLayout.CENTER);\r
+  }\r
+\r
+\r
+}\r
diff --git a/src/jalview/jbappletgui/GCutAndPasteTransfer.java b/src/jalview/jbappletgui/GCutAndPasteTransfer.java
new file mode 100755 (executable)
index 0000000..94aea3f
--- /dev/null
@@ -0,0 +1,85 @@
+/********************\r
+ * 2004 Jalview Reengineered\r
+ * Barton Group\r
+ * Dundee University\r
+ *\r
+ * AM Waterhouse\r
+ *******************/\r
+\r
+package jalview.jbappletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+\r
+public class GCutAndPasteTransfer extends Panel\r
+{\r
+  protected TextArea textarea = new TextArea();\r
+  protected ScrollPane scrollPane = new ScrollPane();\r
+  Button ok = new Button();\r
+  Button cancel = new Button();\r
+  protected Panel buttonPanel = new Panel();\r
+  BorderLayout borderLayout1 = new BorderLayout();\r
+  public GCutAndPasteTransfer()\r
+  {\r
+    try\r
+    {\r
+      jbInit();\r
+    }\r
+    catch(Exception e)\r
+    {\r
+      e.printStackTrace();\r
+    }\r
+\r
+  }\r
+  private void jbInit() throws Exception\r
+  {\r
+    textarea.setFont(new java.awt.Font("Verdana", 0, 12));\r
+    textarea.setText("Paste your alignment file here");\r
+    textarea.addMouseListener(new java.awt.event.MouseAdapter()\r
+    {\r
+      public void mousePressed(MouseEvent e)\r
+      {\r
+        textarea_mousePressed(e);\r
+      }\r
+    });\r
+    this.setLayout(borderLayout1);\r
+    ok.setLabel("OK");\r
+    ok.addActionListener(new java.awt.event.ActionListener() {\r
+      public void actionPerformed(ActionEvent e) {\r
+        ok_actionPerformed(e);\r
+      }\r
+    });\r
+    cancel.setLabel("Cancel");\r
+    cancel.addActionListener(new java.awt.event.ActionListener() {\r
+      public void actionPerformed(ActionEvent e) {\r
+        cancel_actionPerformed(e);\r
+      }\r
+    });\r
+    scrollPane.setVisible(true);\r
+    this.add(scrollPane, BorderLayout.CENTER);\r
+    this.add(buttonPanel, BorderLayout.SOUTH);\r
+    buttonPanel.add(ok, null);\r
+    buttonPanel.add(cancel, null);\r
+    scrollPane.add(textarea, null);\r
+\r
+  }\r
+\r
+\r
+\r
+\r
+  void textarea_mousePressed(MouseEvent e)\r
+  {\r
+    if(textarea.getText().equals("Paste your alignment file here"))\r
+      textarea.setText("");\r
+  }\r
+\r
+  protected void ok_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+  protected void cancel_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/jbappletgui/GFinder.java b/src/jalview/jbappletgui/GFinder.java
new file mode 100755 (executable)
index 0000000..5a1afbe
--- /dev/null
@@ -0,0 +1,119 @@
+package jalview.jbappletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+\r
+public class GFinder extends Panel\r
+{\r
+  Label jLabel1 = new Label();\r
+  protected TextField textfield = new TextField();\r
+  protected Button findAll = new Button();\r
+  protected Button findNext = new Button();\r
+  Panel jPanel1 = new Panel();\r
+  GridLayout gridLayout1 = new GridLayout();\r
+  protected Button createNewGroup = new Button();\r
+\r
+  public GFinder()\r
+  {\r
+    try\r
+    {\r
+      jbInit();\r
+    }\r
+    catch(Exception e)\r
+    {\r
+      e.printStackTrace();\r
+    }\r
+  }\r
+  private void jbInit() throws Exception\r
+  {\r
+    jLabel1.setFont(new java.awt.Font("Verdana", 0, 12));\r
+    jLabel1.setText("Find");\r
+    jLabel1.setBounds(new Rectangle(3, 30, 34, 15));\r
+    this.setLayout(null);\r
+    textfield.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));\r
+    textfield.setText("");\r
+    textfield.setBounds(new Rectangle(40, 27, 133, 21));\r
+    textfield.addKeyListener(new java.awt.event.KeyAdapter()\r
+    {\r
+      public void keyTyped(KeyEvent e)\r
+      {\r
+        textfield_keyTyped(e);\r
+      }\r
+    });\r
+    textfield.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        textfield_actionPerformed(e);\r
+      }\r
+    });\r
+    findAll.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));\r
+    findAll.setLabel("Find all");\r
+    findAll.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        findAll_actionPerformed(e);\r
+      }\r
+    });\r
+    findNext.setEnabled(false);\r
+    findNext.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));\r
+    findNext.setLabel("Find Next");\r
+    findNext.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        findNext_actionPerformed(e);\r
+      }\r
+    });\r
+    jPanel1.setBounds(new Rectangle(180, 5, 141, 64));\r
+    jPanel1.setLayout(gridLayout1);\r
+    gridLayout1.setHgap(0);\r
+    gridLayout1.setRows(3);\r
+    gridLayout1.setVgap(2);\r
+    createNewGroup.setEnabled(false);\r
+    createNewGroup.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));\r
+    createNewGroup.setLabel("Create new group");\r
+    createNewGroup.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        createNewGroup_actionPerformed(e);\r
+      }\r
+    });\r
+    jPanel1.add(findNext, null);\r
+    jPanel1.add(findAll, null);\r
+    jPanel1.add(createNewGroup, null);\r
+    this.add(textfield, null);\r
+    this.add(jLabel1, null);\r
+    this.add(jPanel1, null);\r
+  }\r
+\r
+  protected void findNext_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void findAll_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+  protected void textfield_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  void textfield_keyTyped(KeyEvent e)\r
+  {\r
+    findNext.setEnabled(true);\r
+  }\r
+\r
+  public void createNewGroup_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/jbappletgui/GFontChooser.java b/src/jalview/jbappletgui/GFontChooser.java
new file mode 100755 (executable)
index 0000000..d83ed0d
--- /dev/null
@@ -0,0 +1,142 @@
+package jalview.jbappletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+\r
+public class GFontChooser extends Panel\r
+{\r
+  Label label1 = new Label();\r
+  protected Choice fontSize = new Choice();\r
+  protected Choice fontStyle = new Choice();\r
+  Label label2 = new Label();\r
+  Label label3 = new Label();\r
+  protected Choice fontName = new Choice();\r
+  Button ok = new Button();\r
+  Button cancel = new Button();\r
+  Panel panel1 = new Panel();\r
+  Panel panel2 = new Panel();\r
+  Panel panel3 = new Panel();\r
+  BorderLayout borderLayout1 = new BorderLayout();\r
+  BorderLayout borderLayout2 = new BorderLayout();\r
+  BorderLayout borderLayout3 = new BorderLayout();\r
+  Panel panel4 = new Panel();\r
+  Panel panel5 = new Panel();\r
+  BorderLayout borderLayout4 = new BorderLayout();\r
+\r
+  public GFontChooser()\r
+  {\r
+    try\r
+    {\r
+      jbInit();\r
+    }\r
+    catch(Exception e)\r
+    {\r
+      e.printStackTrace();\r
+    }\r
+  }\r
+  private void jbInit() throws Exception\r
+  {\r
+    label1.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    label1.setAlignment(Label.RIGHT);\r
+    label1.setText("Font: ");\r
+    this.setLayout(borderLayout4);\r
+    fontSize.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    fontSize.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        fontSize_actionPerformed();\r
+      }\r
+    });\r
+    fontStyle.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    fontStyle.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        fontStyle_actionPerformed();\r
+      }\r
+    });\r
+    label2.setAlignment(Label.RIGHT);\r
+    label2.setFont(new java.awt.Font("Verdana", 0, 11));\r
+     label2.setText("Size: ");\r
+      label3.setAlignment(Label.RIGHT);\r
+    label3.setFont(new java.awt.Font("Verdana", 0, 11));\r
+      label3.setText("Style: ");\r
+    fontName.setFont(new java.awt.Font("Verdana", 0, 11));\r
+     fontName.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        fontName_actionPerformed();\r
+      }\r
+    });\r
+    ok.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    ok.setLabel("OK");\r
+    ok.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        ok_actionPerformed();\r
+      }\r
+    });\r
+    cancel.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    cancel.setLabel("Cancel");\r
+    cancel.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        cancel_actionPerformed();\r
+      }\r
+    });\r
+    this.setBackground(Color.white);\r
+    panel1.setLayout(borderLayout1);\r
+    panel2.setLayout(borderLayout3);\r
+     panel3.setLayout(borderLayout2);\r
+    panel5.setBackground(Color.white);\r
+    panel4.setBackground(Color.white);\r
+    panel1.setBackground(Color.white);\r
+    panel2.setBackground(Color.white);\r
+    panel3.setBackground(Color.white);\r
+    panel1.add(label1, BorderLayout.WEST);\r
+    panel1.add(fontName, BorderLayout.CENTER);\r
+    panel5.add(panel1, null);\r
+    panel5.add(panel3, null);\r
+    panel5.add(panel2, null);\r
+    panel2.add(label3,  BorderLayout.WEST);\r
+    panel2.add(fontStyle,  BorderLayout.CENTER);\r
+    panel3.add(label2, BorderLayout.WEST);\r
+    panel3.add(fontSize, BorderLayout.CENTER);\r
+    this.add(panel4,  BorderLayout.SOUTH);\r
+    panel4.add(ok, null);\r
+    panel4.add(cancel, null);\r
+    this.add(panel5, BorderLayout.CENTER);\r
+\r
+   }\r
+\r
+  protected void ok_actionPerformed()\r
+  {\r
+\r
+  }\r
+\r
+  protected void cancel_actionPerformed()\r
+  {\r
+\r
+  }\r
+\r
+  protected void fontName_actionPerformed()\r
+  {\r
+\r
+  }\r
+\r
+  protected void fontSize_actionPerformed()\r
+  {\r
+\r
+  }\r
+\r
+  protected void fontStyle_actionPerformed()\r
+  {\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/jbappletgui/GPCAPanel.java b/src/jalview/jbappletgui/GPCAPanel.java
new file mode 100755 (executable)
index 0000000..ad8a02e
--- /dev/null
@@ -0,0 +1,95 @@
+package jalview.jbappletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+public class GPCAPanel extends Panel\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
+\r
+  public GPCAPanel()\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
+  private void jbInit() 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(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        zCombobox_actionPerformed(null);\r
+      }\r
+    });\r
+    yCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
+    yCombobox.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        yCombobox_actionPerformed(null);\r
+      }\r
+    });\r
+    xCombobox.setFont(new java.awt.Font("Verdana", 0, 12));\r
+    xCombobox.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        xCombobox_actionPerformed(null);\r
+      }\r
+    });\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
+  }\r
+\r
+  protected void xCombobox_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void yCombobox_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void zCombobox_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/jbappletgui/GPairwiseAlignPanel.java b/src/jalview/jbappletgui/GPairwiseAlignPanel.java
new file mode 100755 (executable)
index 0000000..ecf3c8d
--- /dev/null
@@ -0,0 +1,51 @@
+package jalview.jbappletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+\r
+public class GPairwiseAlignPanel extends Panel\r
+{\r
+  protected ScrollPane scrollPane = new ScrollPane();\r
+  protected TextArea textarea = new TextArea();\r
+  protected Button viewInEditorButton = new Button();\r
+  Panel jPanel1 = new Panel();\r
+  BorderLayout borderLayout1 = new BorderLayout();\r
+\r
+  public GPairwiseAlignPanel()\r
+  {\r
+    try\r
+    {\r
+      jbInit();\r
+    }\r
+    catch(Exception e)\r
+    {\r
+      e.printStackTrace();\r
+    }\r
+  }\r
+  private void jbInit() throws Exception\r
+  {\r
+    this.setLayout(borderLayout1);\r
+    textarea.setFont(new java.awt.Font("Monospaced", 0, 12));\r
+    textarea.setText("");\r
+    viewInEditorButton.setFont(new java.awt.Font("Verdana", 0, 12));\r
+    viewInEditorButton.setLabel("View in alignment editor");\r
+    viewInEditorButton.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        viewInEditorButton_actionPerformed(e);\r
+      }\r
+    });\r
+    this.add(scrollPane, BorderLayout.CENTER);\r
+    scrollPane.add(textarea);\r
+    this.add(jPanel1, BorderLayout.SOUTH);\r
+    jPanel1.add(viewInEditorButton, null);\r
+  }\r
+\r
+  protected void viewInEditorButton_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/jbappletgui/GSliderPanel.java b/src/jalview/jbappletgui/GSliderPanel.java
new file mode 100755 (executable)
index 0000000..8f7613a
--- /dev/null
@@ -0,0 +1,117 @@
+package jalview.jbappletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+public class GSliderPanel extends Panel\r
+{\r
+  // this is used for conservation colours, PID colours and redundancy threshold\r
+  protected Scrollbar slider = new Scrollbar();\r
+  protected TextField valueField = new TextField();\r
+  protected Label label = new Label();\r
+  Panel jPanel1 = new Panel();\r
+  Panel jPanel2 = new Panel();\r
+  protected Button applyButton = new Button();\r
+  protected Button undoButton = new Button();\r
+  FlowLayout flowLayout1 = new FlowLayout();\r
+  protected Checkbox allGroupsCheck = new Checkbox();\r
+  BorderLayout borderLayout1 = new BorderLayout();\r
+  BorderLayout borderLayout2 = new BorderLayout();\r
+  FlowLayout flowLayout2 = new FlowLayout();\r
+\r
+  public GSliderPanel()\r
+  {\r
+    try\r
+    {\r
+      jbInit();\r
+    }\r
+    catch(Exception e)\r
+    {\r
+      e.printStackTrace();\r
+    }\r
+  }\r
+  private void jbInit() throws Exception\r
+  {\r
+    this.setLayout(borderLayout2);\r
+   // slider.setMajorTickSpacing(10);\r
+  //  slider.setMinorTickSpacing(1);\r
+  //  slider.setPaintTicks(true);\r
+    slider.setBackground(Color.white);\r
+    slider.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    slider.setOrientation(0);\r
+    valueField.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    valueField.setText("      ");\r
+    valueField.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        valueField_actionPerformed(e);\r
+      }\r
+    });\r
+    label.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    label.setText("set this label text");\r
+    jPanel1.setLayout(borderLayout1);\r
+    jPanel2.setLayout(flowLayout1);\r
+    applyButton.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    applyButton.setLabel("Apply");\r
+    applyButton.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        applyButton_actionPerformed(e);\r
+      }\r
+    });\r
+    undoButton.setEnabled(false);\r
+    undoButton.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    undoButton.setLabel("Undo");\r
+    undoButton.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        undoButton_actionPerformed(e);\r
+      }\r
+    });\r
+    allGroupsCheck.setEnabled(false);\r
+    allGroupsCheck.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    allGroupsCheck.setLabel("Apply threshold to all groups");\r
+    allGroupsCheck.setName("Apply to all Groups");\r
+    allGroupsCheck.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        allGroupsCheck_actionPerformed();\r
+      }\r
+    });\r
+    this.setBackground(Color.white);\r
+    this.setForeground(Color.black);\r
+    jPanel2.add(label, null);\r
+    jPanel2.add(applyButton, null);\r
+    jPanel2.add(undoButton, null);\r
+    jPanel2.add(allGroupsCheck);\r
+    jPanel1.add(valueField, java.awt.BorderLayout.EAST);\r
+    jPanel1.add(slider, java.awt.BorderLayout.CENTER);\r
+    this.add(jPanel1, java.awt.BorderLayout.SOUTH);\r
+    this.add(jPanel2, java.awt.BorderLayout.CENTER);\r
+  }\r
+\r
+  protected void valueField_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void applyButton_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void undoButton_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void allGroupsCheck_actionPerformed()\r
+  {\r
+\r
+  }\r
+\r
+}\r
diff --git a/src/jalview/jbappletgui/GTreePanel.java b/src/jalview/jbappletgui/GTreePanel.java
new file mode 100755 (executable)
index 0000000..e0b56b2
--- /dev/null
@@ -0,0 +1,108 @@
+package jalview.jbappletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+public class GTreePanel extends Frame\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 fitToWindow = new CheckboxMenuItem();\r
+\r
+  public GTreePanel()\r
+  {\r
+    try\r
+    {\r
+      jbInit();\r
+      this.setMenuBar(jMenuBar1);\r
+    }\r
+    catch(Exception e)\r
+    {\r
+      e.printStackTrace();\r
+    }\r
+\r
+  }\r
+  private void jbInit() 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 Size - 12");\r
+    fontSize.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        fontSize_actionPerformed(e);\r
+      }\r
+    });\r
+    bootstrapMenu.setLabel("Show Bootstrap values");\r
+    bootstrapMenu.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        bootstrapMenu_actionPerformed(null);\r
+      }\r
+    });\r
+    distanceMenu.setLabel("Show Distances");\r
+    distanceMenu.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        distanceMenu_actionPerformed(null);\r
+      }\r
+    });\r
+    fitToWindow.setState(true);\r
+    fitToWindow.setLabel("Fit to window");\r
+    fitToWindow.addItemListener(new java.awt.event.ItemListener()\r
+    {\r
+      public void itemStateChanged(ItemEvent e)\r
+      {\r
+        fitToWindow_actionPerformed(null);\r
+      }\r
+    });\r
+    add(scrollPane, BorderLayout.CENTER);\r
+    jMenuBar1.add(jMenu2);\r
+    jMenu2.add(fitToWindow);\r
+    jMenu2.add(fontSize);\r
+    jMenu2.add(distanceMenu);\r
+    jMenu2.add(bootstrapMenu);\r
+  }\r
+\r
+  protected void saveMenu_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void printMenu_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void fontSize_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void distanceMenu_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void bootstrapMenu_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void fitToWindow_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+}\r
diff --git a/src/jalview/jbappletgui/GUserDefinedColours.java b/src/jalview/jbappletgui/GUserDefinedColours.java
new file mode 100755 (executable)
index 0000000..47170b2
--- /dev/null
@@ -0,0 +1,201 @@
+package jalview.jbappletgui;\r
+\r
+import java.awt.*;\r
+import java.awt.event.*;\r
+\r
+\r
+public class GUserDefinedColours extends Panel\r
+{\r
+  protected Panel buttonPanel = new Panel();\r
+  protected GridLayout gridLayout = new GridLayout();\r
+  Panel jPanel2 = new Panel();\r
+  protected Button okButton = new Button();\r
+  protected Button applyButton = new Button();\r
+  protected Button cancelButton = new Button();\r
+  protected Scrollbar rScroller = new Scrollbar();\r
+  Label label1 = new Label();\r
+  Panel panel2 = new Panel();\r
+  BorderLayout borderLayout1 = new BorderLayout();\r
+  protected TextField rText = new TextField();\r
+  Panel panel3 = new Panel();\r
+  Label label4 = new Label();\r
+  protected Scrollbar gScroller = new Scrollbar();\r
+  protected TextField gText = new TextField();\r
+  BorderLayout borderLayout2 = new BorderLayout();\r
+  Panel panel4 = new Panel();\r
+  Label label5 = new Label();\r
+  protected Scrollbar bScroller = new Scrollbar();\r
+  protected TextField bText = new TextField();\r
+  BorderLayout borderLayout3 = new BorderLayout();\r
+  protected Panel target = new Panel();\r
+\r
+  public GUserDefinedColours()\r
+  {\r
+    try\r
+    {\r
+      jbInit();\r
+    }\r
+    catch(Exception e)\r
+    {\r
+      e.printStackTrace();\r
+    }\r
+  }\r
+  private void jbInit() throws Exception\r
+  {\r
+    this.setLayout(null);\r
+    buttonPanel.setLayout(gridLayout);\r
+    gridLayout.setColumns(6);\r
+    gridLayout.setRows(4);\r
+    okButton.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    okButton.setLabel("OK");\r
+    okButton.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        okButton_actionPerformed(e);\r
+      }\r
+    });\r
+    applyButton.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    applyButton.setLabel("Apply");\r
+    applyButton.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        applyButton_actionPerformed(e);\r
+      }\r
+    });\r
+    cancelButton.setFont(new java.awt.Font("Verdana", 0, 11));\r
+    cancelButton.setLabel("Cancel");\r
+    cancelButton.addActionListener(new java.awt.event.ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        cancelButton_actionPerformed(e);\r
+      }\r
+    });\r
+    this.setBackground(new Color(212, 208, 223));\r
+    jPanel2.setBounds(new Rectangle(0, 265, 400, 35));\r
+    buttonPanel.setBounds(new Rectangle(0, 123, 400, 142));\r
+    rScroller.setMaximum(255);\r
+    rScroller.setMinimum(0);\r
+    rScroller.setOrientation(0);\r
+    rScroller.setUnitIncrement(1);\r
+    rScroller.addAdjustmentListener(new java.awt.event.AdjustmentListener() {\r
+      public void adjustmentValueChanged(AdjustmentEvent e) {\r
+        rScroller_adjustmentValueChanged(e);\r
+      }\r
+    });\r
+    label1.setText("R");\r
+    panel2.setBounds(new Rectangle(20, 29, 180, 19));\r
+    panel2.setLayout(borderLayout1);\r
+    rText.setText("    0");\r
+    rText.addActionListener(new java.awt.event.ActionListener() {\r
+      public void actionPerformed(ActionEvent e) {\r
+        rText_actionPerformed(e);\r
+      }\r
+    });\r
+    panel3.setLayout(borderLayout2);\r
+    label4.setText("G");\r
+    gScroller.setMaximum(255);\r
+    gScroller.setMinimum(0);\r
+    gScroller.setOrientation(0);\r
+    gScroller.setUnitIncrement(1);\r
+    gScroller.addAdjustmentListener(new java.awt.event.AdjustmentListener() {\r
+      public void adjustmentValueChanged(AdjustmentEvent e) {\r
+        gScroller_adjustmentValueChanged(e);\r
+      }\r
+    });\r
+    gText.setText("    0");\r
+    gText.addActionListener(new java.awt.event.ActionListener() {\r
+      public void actionPerformed(ActionEvent e) {\r
+        gText_actionPerformed(e);\r
+      }\r
+    });\r
+    panel3.setBounds(new Rectangle(19, 54, 181, 20));\r
+    panel4.setLayout(borderLayout3);\r
+    label5.setText("B");\r
+    bScroller.setMaximum(255);\r
+    bScroller.setMinimum(0);\r
+    bScroller.setOrientation(0);\r
+    bScroller.setUnitIncrement(1);\r
+    bScroller.addAdjustmentListener(new java.awt.event.AdjustmentListener() {\r
+      public void adjustmentValueChanged(AdjustmentEvent e) {\r
+        bScroller_adjustmentValueChanged(e);\r
+      }\r
+    });\r
+    bText.setSelectionStart(6);\r
+    bText.setText("    0");\r
+    bText.addActionListener(new java.awt.event.ActionListener() {\r
+      public void actionPerformed(ActionEvent e) {\r
+        bText_actionPerformed(e);\r
+      }\r
+    });\r
+    panel4.setBounds(new Rectangle(19, 87, 180, 20));\r
+    target.setBackground(Color.black);\r
+    target.setBounds(new Rectangle(229, 26, 134, 79));\r
+    this.add(jPanel2, null);\r
+    jPanel2.add(okButton, null);\r
+    jPanel2.add(applyButton, null);\r
+    jPanel2.add(cancelButton, null);\r
+    this.add(buttonPanel, null);\r
+    panel2.add(label1, BorderLayout.WEST);\r
+    panel2.add(rScroller, BorderLayout.CENTER);\r
+    panel2.add(rText, BorderLayout.EAST);\r
+    this.add(target, null);\r
+    this.add(panel4, null);\r
+    panel3.add(label4, BorderLayout.WEST);\r
+    panel3.add(gScroller, BorderLayout.CENTER);\r
+    panel3.add(gText, BorderLayout.EAST);\r
+    this.add(panel2, null);\r
+    panel4.add(label5, BorderLayout.WEST);\r
+    panel4.add(bScroller, BorderLayout.CENTER);\r
+    panel4.add(bText, BorderLayout.EAST);\r
+    this.add(panel3, null);\r
+  }\r
+\r
+\r
+  protected void okButton_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void applyButton_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+\r
+\r
+  protected void cancelButton_actionPerformed(ActionEvent e)\r
+  {\r
+\r
+  }\r
+\r
+  protected void rScroller_adjustmentValueChanged(AdjustmentEvent e) {\r
+\r
+  }\r
+\r
+  protected void gScroller_adjustmentValueChanged(AdjustmentEvent e) {\r
+\r
+  }\r
+\r
+  protected void bScroller_adjustmentValueChanged(AdjustmentEvent e) {\r
+\r
+  }\r
+\r
+  protected void rText_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+  protected void gText_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+  protected void bText_actionPerformed(ActionEvent e) {\r
+\r
+  }\r
+\r
+\r
+\r
+\r
+}\r