JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / FeatureRenderer.java
index 32adfeb..5eee4bc 100644 (file)
-/*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
- * 
- * This file is part of Jalview.
- * 
- * Jalview is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License 
- * as published by the Free Software Foundation, either version 3
- * of the License, or (at your option) any later version.
- *  
- * Jalview is distributed in the hope that it will be useful, but 
- * WITHOUT ANY WARRANTY; without even the implied warranty 
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
- * PURPOSE.  See the GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.appletgui;
-
-import jalview.datamodel.SearchResults;
-import jalview.datamodel.SequenceFeature;
-import jalview.datamodel.SequenceI;
-import jalview.io.FeaturesFile;
-import jalview.schemes.AnnotationColourGradient;
-import jalview.schemes.GraduatedColor;
-import jalview.schemes.UserColourScheme;
-import jalview.util.MessageManager;
-import jalview.viewmodel.AlignmentViewport;
-
-import java.awt.BorderLayout;
-import javax.swing.JButton;
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Graphics;
-import java.awt.GridLayout;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Hashtable;
-
-/**
- * DOCUMENT ME!
- * 
- * @author $author$
- * @version $Revision$
- */
-public class FeatureRenderer extends
-        jalview.renderer.seqfeatures.FeatureRenderer
-{
-
-  // Holds web links for feature groups and feature types
-  // in the form label|link
-  Hashtable featureLinks = null;
-
-  /**
-   * Creates a new FeatureRenderer object.
-   * 
-   * @param av
-   *          DOCUMENT ME!
-   */
-  public FeatureRenderer(AlignmentViewport av)
-  {
-    super();
-    this.av = av;
-
-    setTransparencyAvailable(!System.getProperty("java.version")
-            .startsWith("1.1"));
-  }
-
-  static String lastFeatureAdded;
-
-  static String lastFeatureGroupAdded;
-
-  static String lastDescriptionAdded;
-
-  int featureIndex = 0;
-
-  boolean deleteFeature = false;
-
-  FeatureColourPanel colourPanel;
-
-  class FeatureColourPanel extends JPanel
-  {
-    String label = "";
-
-    private Color maxCol;
-
-    private boolean isColourByLabel, isGcol;
-
-    /**
-     * render a feature style in the amend feature dialog box
-     */
-    public void updateColor(Object newcol)
-    {
-
-      Color bg, col = null;
-      GraduatedColor gcol = null;
-      String vlabel = "";
-      if (newcol instanceof Color)
-      {
-        isGcol = false;
-        col = (Color) newcol;
-        gcol = null;
-      }
-      else if (newcol instanceof GraduatedColor)
-      {
-        isGcol = true;
-        gcol = (GraduatedColor) newcol;
-        col = null;
-      }
-      else
-      {
-        throw new Error(
-                MessageManager
-                        .getString("error.invalid_colour_for_mycheckbox"));
-      }
-      if (col != null)
-      {
-        setBackground(bg = col);
-      }
-      else
-      {
-        if (gcol.getThreshType() != AnnotationColourGradient.NO_THRESHOLD)
-        {
-          vlabel += " "
-                  + ((gcol.getThreshType() == AnnotationColourGradient.ABOVE_THRESHOLD) ? "(>)"
-                          : "(<)");
-        }
-        if (isColourByLabel = gcol.isColourByLabel())
-        {
-          setBackground(bg = Color.white);
-          vlabel += " (by Label)";
-        }
-        else
-        {
-          setBackground(bg = gcol.getMinColor());
-          maxCol = gcol.getMaxColor();
-        }
-      }
-      label = vlabel;
-      setBackground(bg);
-      repaint();
-    }
-
-    FeatureColourPanel()
-    {
-      super(null);
-    }
-
-    public void paint(Graphics g)
-    {
-      Dimension d = getSize();
-      if (isGcol)
-      {
-        if (isColourByLabel)
-        {
-          g.setColor(Color.white);
-          g.fillRect(d.width / 2, 0, d.width / 2, d.height);
-          g.setColor(Color.black);
-          Font f = new Font("Verdana", Font.PLAIN, 10);
-          g.setFont(f);
-          g.drawString(MessageManager.getString("label.label"), 0, 0);
-        }
-        else
-        {
-          g.setColor(maxCol);
-          g.fillRect(d.width / 2, 0, d.width / 2, d.height);
-
-        }
-      }
-    }
-
-  }
-
-  boolean amendFeatures(final SequenceI[] sequences,
-          final SequenceFeature[] features, boolean newFeatures,
-          final AlignmentPanel ap)
-  {
-    JPanel bigPanel = new JPanel(new BorderLayout());
-    final JTextField name = new JTextField(16);
-    final JTextField source = new JTextField(16);
-    final JTextArea description = new JTextArea(3, 35);
-    final JTextField start = new JTextField(8);
-    final JTextField end = new JTextField(8);
-    final Choice overlaps;
-    JButton deleteButton = new JButton("Delete");
-    deleteFeature = false;
-
-    colourPanel = new FeatureColourPanel();
-    colourPanel.setSize(110, 15);
-    final FeatureRenderer fr = this;
-
-    JPanel panel = new JPanel(new GridLayout(3, 1));
-
-    featureIndex = 0; // feature to be amended.
-    JPanel tmp;
-
-    // /////////////////////////////////////
-    // /MULTIPLE FEATURES AT SELECTED RESIDUE
-    if (!newFeatures && features.length > 1)
-    {
-      panel = new JPanel(new GridLayout(4, 1));
-      tmp = new JPanel();
-      tmp.add(new JLabel("Select Feature: "));
-      overlaps = new Choice();
-      for (int i = 0; i < features.length; i++)
-      {
-        String item = features[i].getType() + "/" + features[i].getBegin()
-                + "-" + features[i].getEnd();
-
-        if (features[i].getFeatureGroup() != null)
-        {
-          item += " (" + features[i].getFeatureGroup() + ")";
-        }
-
-        overlaps.addItem(item);
-      }
-
-      tmp.add(overlaps);
-
-      overlaps.addItemListener(new java.awt.event.ItemListener()
-      {
-        public void itemStateChanged(java.awt.event.ItemEvent e)
-        {
-          int index = overlaps.getSelectedIndex();
-          if (index != -1)
-          {
-            featureIndex = index;
-            name.setText(features[index].getType());
-            description.setText(features[index].getDescription());
-            source.setText(features[index].getFeatureGroup());
-            start.setText(features[index].getBegin() + "");
-            end.setText(features[index].getEnd() + "");
-
-            SearchResults highlight = new SearchResults();
-            highlight.addResult(sequences[0], features[index].getBegin(),
-                    features[index].getEnd());
-
-            ap.seqPanel.seqCanvas.highlightSearchResults(highlight);
-
-          }
-          Object col = getFeatureStyle(name.getText());
-          if (col == null)
-          {
-            col = new UserColourScheme().createColourFromName(name
-                    .getText());
-          }
-
-          colourPanel.updateColor(col);
-        }
-      });
-
-      panel.add(tmp);
-    }
-    // ////////
-    // ////////////////////////////////////
-
-    tmp = new JPanel();
-    panel.add(tmp);
-    tmp.add(new JLabel("Name: ", JLabel.RIGHT));
-    tmp.add(name);
-
-    tmp = new JPanel();
-    panel.add(tmp);
-    tmp.add(new JLabel("Group: ", JLabel.RIGHT));
-    tmp.add(source);
-
-    tmp = new JPanel();
-    panel.add(tmp);
-    tmp.add(new JLabel("Colour: ", JLabel.RIGHT));
-    tmp.add(colourPanel);
-
-    bigPanel.add(panel, BorderLayout.NORTH);
-
-    panel = new JPanel();
-    panel.add(new JLabel("Description: ", JLabel.RIGHT));
-    panel.add(new JScrollPane().add(description));
-
-    if (!newFeatures)
-    {
-      bigPanel.add(panel, BorderLayout.SOUTH);
-
-      panel = new JPanel();
-      panel.add(new JLabel(" Start:", JLabel.RIGHT));
-      panel.add(start);
-      panel.add(new JLabel("  End:", JLabel.RIGHT));
-      panel.add(end);
-      bigPanel.add(panel, BorderLayout.CENTER);
-    }
-    else
-    {
-      bigPanel.add(panel, BorderLayout.CENTER);
-    }
-
-    if (lastFeatureAdded == null)
-    {
-      if (features[0].type != null)
-      {
-        lastFeatureAdded = features[0].type;
-      }
-      else
-      {
-        lastFeatureAdded = "feature_1";
-      }
-    }
-
-    if (lastFeatureGroupAdded == null)
-    {
-      if (features[0].featureGroup != null)
-      {
-        lastFeatureGroupAdded = features[0].featureGroup;
-      }
-      else
-      {
-        lastFeatureAdded = "Jalview";
-      }
-    }
-
-    String title = newFeatures ? MessageManager
-            .getString("label.create_new_sequence_features")
-            : MessageManager.formatMessage("label.amend_delete_features",
-                    new String[]
-                    { sequences[0].getName() });
-
-    final JVDialog dialog = new JVDialog(ap.alignFrame, title, true, 385,
-            240);
-
-    dialog.setMainPanel(bigPanel);
-
-    if (newFeatures)
-    {
-      name.setText(lastFeatureAdded);
-      source.setText(lastFeatureGroupAdded);
-    }
-    else
-    {
-      dialog.ok.setLabel(MessageManager.getString("label.amend"));
-      dialog.buttonPanel.add(deleteButton, 1);
-      deleteButton.addActionListener(new ActionListener()
-      {
-        public void actionPerformed(ActionEvent evt)
-        {
-          deleteFeature = true;
-          dialog.setVisible(false);
-        }
-      });
-      name.setText(features[0].getType());
-      source.setText(features[0].getFeatureGroup());
-    }
-
-    start.setText(features[0].getBegin() + "");
-    end.setText(features[0].getEnd() + "");
-    description.setText(features[0].getDescription());
-    Color col = getColour(name.getText());
-    if (col == null)
-    {
-      col = new UserColourScheme()
-              .createColourFromName(name.getText());
-    }
-    Object fcol = getFeatureStyle(name.getText());
-    // simply display the feature color in a box
-    colourPanel.updateColor(fcol);
-    dialog.setResizable(true);
-    // TODO: render the graduated color in the box.
-    colourPanel.addMouseListener(new java.awt.event.MouseAdapter()
-    {
-      public void mousePressed(java.awt.event.MouseEvent evt)
-      {
-        if (!colourPanel.isGcol)
-        {
-          new UserDefinedColours(fr, ap.alignFrame);
-        }
-        else
-        {
-          FeatureColourChooser fcc = new FeatureColourChooser(
-                  ap.alignFrame, name.getText());
-          dialog.transferFocus();
-        }
-      }
-    });
-    dialog.setVisible(true);
-
-    FeaturesFile ffile = new FeaturesFile();
-
-    if (dialog.accept)
-    {
-      // This ensures that the last sequence
-      // is refreshed and new features are rendered
-      lastSeq = null;
-      lastFeatureAdded = name.getText().trim();
-      lastFeatureGroupAdded = source.getText().trim();
-      lastDescriptionAdded = description.getText().replace('\n', ' ');
-    }
-
-    if (lastFeatureGroupAdded != null && lastFeatureGroupAdded.length() < 1)
-    {
-      lastFeatureGroupAdded = null;
-    }
-
-    if (!newFeatures)
-    {
-
-      SequenceFeature sf = features[featureIndex];
-      if (dialog.accept)
-      {
-        sf.type = lastFeatureAdded;
-        sf.featureGroup = lastFeatureGroupAdded;
-        sf.description = lastDescriptionAdded;
-        if (!colourPanel.isGcol)
-        {
-          // update colour - otherwise its already done.
-          setColour(sf.type, colourPanel.getBackground());
-        }
-        try
-        {
-          sf.begin = Integer.parseInt(start.getText());
-          sf.end = Integer.parseInt(end.getText());
-        } catch (NumberFormatException ex)
-        {
-        }
-
-        ffile.parseDescriptionHTML(sf, false);
-        setVisible(lastFeatureAdded); // if user edited name then make sure new
-                                      // type is visible
-      }
-      if (deleteFeature)
-      {
-        sequences[0].deleteFeature(sf);
-      }
-
-    }
-    else
-    {
-      if (dialog.accept && name.getText().length() > 0)
-      {
-        for (int i = 0; i < sequences.length; i++)
-        {
-          features[i].type = lastFeatureAdded;
-          features[i].featureGroup = lastFeatureGroupAdded;
-          features[i].description = lastDescriptionAdded;
-          sequences[i].addSequenceFeature(features[i]);
-          ffile.parseDescriptionHTML(features[i], false);
-        }
-
-        Color newColour = colourPanel.getBackground();
-        // setColour(lastFeatureAdded, fcol);
-
-        if (lastFeatureGroupAdded != null)
-        {
-          setGroupVisibility(lastFeatureGroupAdded, true);
-        }
-        setColour(lastFeatureAdded, newColour); // was fcol
-        setVisible(lastFeatureAdded);
-        findAllFeatures(false); // different to original applet behaviour ?
-        // findAllFeatures();
-      }
-      else
-      {
-        // no update to the alignment
-        return false;
-      }
-    }
-    // refresh the alignment and the feature settings dialog
-    if (((AlignViewport) av).featureSettings != null)
-    {
-      ((AlignViewport) av).featureSettings.refreshTable();
-    }
-    // findAllFeatures();
-
-    ap.paintAlignment(true);
-
-    return true;
-  }
-}
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
+ * \r
+ * This file is part of Jalview.\r
+ * \r
+ * Jalview is free software: you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License \r
+ * as published by the Free Software Foundation, either version 3\r
+ * of the License, or (at your option) any later version.\r
+ *  \r
+ * Jalview is distributed in the hope that it will be useful, but \r
+ * WITHOUT ANY WARRANTY; without even the implied warranty \r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
+ * PURPOSE.  See the GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
+ * The Jalview Authors are detailed in the 'AUTHORS' file.\r
+ */\r
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.SearchResults;\r
+import jalview.datamodel.SequenceFeature;\r
+import jalview.datamodel.SequenceI;\r
+import jalview.io.FeaturesFile;\r
+import jalview.schemes.AnnotationColourGradient;\r
+import jalview.schemes.GraduatedColor;\r
+import jalview.schemes.UserColourScheme;\r
+import jalview.util.MessageManager;\r
+import jalview.viewmodel.AlignmentViewport;\r
+\r
+import java.awt.BorderLayout;\r
+import javax.swing.JButton;\r
+import java.awt.Color;\r
+import java.awt.Dimension;\r
+import java.awt.Font;\r
+import java.awt.Graphics;\r
+import java.awt.GridLayout;\r
+import javax.swing.JLabel;\r
+import javax.swing.JPanel;\r
+import javax.swing.JScrollPane;\r
+import javax.swing.JTextArea;\r
+import javax.swing.JTextField;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.util.Hashtable;\r
+\r
+/**\r
+ * DOCUMENT ME!\r
+ * \r
+ * @author $author$\r
+ * @version $Revision$\r
+ */\r
+public class FeatureRenderer extends\r
+        jalview.renderer.seqfeatures.FeatureRenderer\r
+{\r
+\r
+  // Holds web links for feature groups and feature types\r
+  // in the form label|link\r
+  Hashtable featureLinks = null;\r
+\r
+  /**\r
+   * Creates a new FeatureRenderer object.\r
+   * \r
+   * @param av\r
+   *          DOCUMENT ME!\r
+   */\r
+  public FeatureRenderer(AlignmentViewport av)\r
+  {\r
+    super();\r
+    this.av = av;\r
+\r
+    setTransparencyAvailable(!System.getProperty("java.version")\r
+            .startsWith("1.1"));\r
+  }\r
+\r
+  static String lastFeatureAdded;\r
+\r
+  static String lastFeatureGroupAdded;\r
+\r
+  static String lastDescriptionAdded;\r
+\r
+  int featureIndex = 0;\r
+\r
+  boolean deleteFeature = false;\r
+\r
+  FeatureColourPanel colourPanel;\r
+\r
+  class FeatureColourPanel extends JPanel\r
+  {\r
+    String label = "";\r
+\r
+    private Color maxCol;\r
+\r
+    private boolean isColourByLabel, isGcol;\r
+\r
+    /**\r
+     * render a feature style in the amend feature dialog box\r
+     */\r
+    public void updateColor(Object newcol)\r
+    {\r
+\r
+      Color bg, col = null;\r
+      GraduatedColor gcol = null;\r
+      String vlabel = "";\r
+      if (newcol instanceof Color)\r
+      {\r
+        isGcol = false;\r
+        col = (Color) newcol;\r
+        gcol = null;\r
+      }\r
+      else if (newcol instanceof GraduatedColor)\r
+      {\r
+        isGcol = true;\r
+        gcol = (GraduatedColor) newcol;\r
+        col = null;\r
+      }\r
+      else\r
+      {\r
+        throw new Error(\r
+                MessageManager\r
+                        .getString("error.invalid_colour_for_mycheckbox"));\r
+      }\r
+      if (col != null)\r
+      {\r
+        setBackground(bg = col);\r
+      }\r
+      else\r
+      {\r
+        if (gcol.getThreshType() != AnnotationColourGradient.NO_THRESHOLD)\r
+        {\r
+          vlabel += " "\r
+                  + ((gcol.getThreshType() == AnnotationColourGradient.ABOVE_THRESHOLD) ? "(>)"\r
+                          : "(<)");\r
+        }\r
+        if (isColourByLabel = gcol.isColourByLabel())\r
+        {\r
+          setBackground(bg = Color.white);\r
+          vlabel += " (by Label)";\r
+        }\r
+        else\r
+        {\r
+          setBackground(bg = gcol.getMinColor());\r
+          maxCol = gcol.getMaxColor();\r
+        }\r
+      }\r
+      label = vlabel;\r
+      setBackground(bg);\r
+      repaint();\r
+    }\r
+\r
+    FeatureColourPanel()\r
+    {\r
+      super(null);\r
+    }\r
+\r
+    public void paint(Graphics g)\r
+    {\r
+      Dimension d = getSize();\r
+      if (isGcol)\r
+      {\r
+        if (isColourByLabel)\r
+        {\r
+          g.setColor(Color.white);\r
+          g.fillRect(d.width / 2, 0, d.width / 2, d.height);\r
+          g.setColor(Color.black);\r
+          Font f = new Font("Verdana", Font.PLAIN, 10);\r
+          g.setFont(f);\r
+          g.drawString(MessageManager.getString("label.label"), 0, 0);\r
+        }\r
+        else\r
+        {\r
+          g.setColor(maxCol);\r
+          g.fillRect(d.width / 2, 0, d.width / 2, d.height);\r
+\r
+        }\r
+      }\r
+    }\r
+\r
+  }\r
+\r
+  boolean amendFeatures(final SequenceI[] sequences,\r
+          final SequenceFeature[] features, boolean newFeatures,\r
+          final AlignmentPanel ap)\r
+  {\r
+    JPanel bigPanel = new JPanel(new BorderLayout());\r
+    final JTextField name = new JTextField(16);\r
+    final JTextField source = new JTextField(16);\r
+    final JTextArea description = new JTextArea(3, 35);\r
+    final JTextField start = new JTextField(8);\r
+    final JTextField end = new JTextField(8);\r
+    final Choice overlaps;\r
+    JButton deleteButton = new JButton("Delete");\r
+    deleteFeature = false;\r
+\r
+    colourPanel = new FeatureColourPanel();\r
+    colourPanel.setSize(110, 15);\r
+    final FeatureRenderer fr = this;\r
+\r
+    JPanel panel = new JPanel(new GridLayout(3, 1));\r
+\r
+    featureIndex = 0; // feature to be amended.\r
+    JPanel tmp;\r
+\r
+    // /////////////////////////////////////\r
+    // /MULTIPLE FEATURES AT SELECTED RESIDUE\r
+    if (!newFeatures && features.length > 1)\r
+    {\r
+      panel = new JPanel(new GridLayout(4, 1));\r
+      tmp = new JPanel();\r
+      tmp.add(new JLabel("Select Feature: "));\r
+      overlaps = new Choice();\r
+      for (int i = 0; i < features.length; i++)\r
+      {\r
+        String item = features[i].getType() + "/" + features[i].getBegin()\r
+                + "-" + features[i].getEnd();\r
+\r
+        if (features[i].getFeatureGroup() != null)\r
+        {\r
+          item += " (" + features[i].getFeatureGroup() + ")";\r
+        }\r
+\r
+        overlaps.addItem(item);\r
+      }\r
+\r
+      tmp.add(overlaps);\r
+\r
+      overlaps.addItemListener(new java.awt.event.ItemListener()\r
+      {\r
+        public void itemStateChanged(java.awt.event.ItemEvent e)\r
+        {\r
+          int index = overlaps.getSelectedIndex();\r
+          if (index != -1)\r
+          {\r
+            featureIndex = index;\r
+            name.setText(features[index].getType());\r
+            description.setText(features[index].getDescription());\r
+            source.setText(features[index].getFeatureGroup());\r
+            start.setText(features[index].getBegin() + "");\r
+            end.setText(features[index].getEnd() + "");\r
+\r
+            SearchResults highlight = new SearchResults();\r
+            highlight.addResult(sequences[0], features[index].getBegin(),\r
+                    features[index].getEnd());\r
+\r
+            ap.seqPanel.seqCanvas.highlightSearchResults(highlight);\r
+\r
+          }\r
+          Object col = getFeatureStyle(name.getText());\r
+          if (col == null)\r
+          {\r
+            col = new UserColourScheme().createColourFromName(name\r
+                    .getText());\r
+          }\r
+\r
+          colourPanel.updateColor(col);\r
+        }\r
+      });\r
+\r
+      panel.add(tmp);\r
+    }\r
+    // ////////\r
+    // ////////////////////////////////////\r
+\r
+    tmp = new JPanel();\r
+    panel.add(tmp);\r
+    tmp.add(new JLabel("Name: ", JLabel.RIGHT));\r
+    tmp.add(name);\r
+\r
+    tmp = new JPanel();\r
+    panel.add(tmp);\r
+    tmp.add(new JLabel("Group: ", JLabel.RIGHT));\r
+    tmp.add(source);\r
+\r
+    tmp = new JPanel();\r
+    panel.add(tmp);\r
+    tmp.add(new JLabel("Colour: ", JLabel.RIGHT));\r
+    tmp.add(colourPanel);\r
+\r
+    bigPanel.add(panel, BorderLayout.NORTH);\r
+\r
+    panel = new JPanel();\r
+    panel.add(new JLabel("Description: ", JLabel.RIGHT));\r
+    panel.add(new JScrollPane().add(description));\r
+\r
+    if (!newFeatures)\r
+    {\r
+      bigPanel.add(panel, BorderLayout.SOUTH);\r
+\r
+      panel = new JPanel();\r
+      panel.add(new JLabel(" Start:", JLabel.RIGHT));\r
+      panel.add(start);\r
+      panel.add(new JLabel("  End:", JLabel.RIGHT));\r
+      panel.add(end);\r
+      bigPanel.add(panel, BorderLayout.CENTER);\r
+    }\r
+    else\r
+    {\r
+      bigPanel.add(panel, BorderLayout.CENTER);\r
+    }\r
+\r
+    if (lastFeatureAdded == null)\r
+    {\r
+      if (features[0].type != null)\r
+      {\r
+        lastFeatureAdded = features[0].type;\r
+      }\r
+      else\r
+      {\r
+        lastFeatureAdded = "feature_1";\r
+      }\r
+    }\r
+\r
+    if (lastFeatureGroupAdded == null)\r
+    {\r
+      if (features[0].featureGroup != null)\r
+      {\r
+        lastFeatureGroupAdded = features[0].featureGroup;\r
+      }\r
+      else\r
+      {\r
+        lastFeatureAdded = "Jalview";\r
+      }\r
+    }\r
+\r
+    String title = newFeatures ? MessageManager\r
+            .getString("label.create_new_sequence_features")\r
+            : MessageManager.formatMessage("label.amend_delete_features",\r
+                    new String[]\r
+                    { sequences[0].getName() });\r
+\r
+    final JVDialog dialog = new JVDialog(ap.alignFrame, title, true, 385,\r
+            240);\r
+\r
+    dialog.setMainPanel(bigPanel);\r
+\r
+    if (newFeatures)\r
+    {\r
+      name.setText(lastFeatureAdded);\r
+      source.setText(lastFeatureGroupAdded);\r
+    }\r
+    else\r
+    {\r
+      dialog.ok.setLabel(MessageManager.getString("label.amend"));\r
+      dialog.buttonPanel.add(deleteButton, 1);\r
+      deleteButton.addActionListener(new ActionListener()\r
+      {\r
+        public void actionPerformed(ActionEvent evt)\r
+        {\r
+          deleteFeature = true;\r
+          dialog.setVisible(false);\r
+        }\r
+      });\r
+      name.setText(features[0].getType());\r
+      source.setText(features[0].getFeatureGroup());\r
+    }\r
+\r
+    start.setText(features[0].getBegin() + "");\r
+    end.setText(features[0].getEnd() + "");\r
+    description.setText(features[0].getDescription());\r
+    Color col = getColour(name.getText());\r
+    if (col == null)\r
+    {\r
+      col = new UserColourScheme()\r
+              .createColourFromName(name.getText());\r
+    }\r
+    Object fcol = getFeatureStyle(name.getText());\r
+    // simply display the feature color in a box\r
+    colourPanel.updateColor(fcol);\r
+    dialog.setResizable(true);\r
+    // TODO: render the graduated color in the box.\r
+    colourPanel.addMouseListener(new java.awt.event.MouseAdapter()\r
+    {\r
+      public void mousePressed(java.awt.event.MouseEvent evt)\r
+      {\r
+        if (!colourPanel.isGcol)\r
+        {\r
+          new UserDefinedColours(fr, ap.alignFrame);\r
+        }\r
+        else\r
+        {\r
+          FeatureColourChooser fcc = new FeatureColourChooser(\r
+                  ap.alignFrame, name.getText());\r
+          dialog.transferFocus();\r
+        }\r
+      }\r
+    });\r
+    dialog.setVisible(true);\r
+\r
+    FeaturesFile ffile = new FeaturesFile();\r
+\r
+    if (dialog.accept)\r
+    {\r
+      // This ensures that the last sequence\r
+      // is refreshed and new features are rendered\r
+      lastSeq = null;\r
+      lastFeatureAdded = name.getText().trim();\r
+      lastFeatureGroupAdded = source.getText().trim();\r
+      lastDescriptionAdded = description.getText().replace('\n', ' ');\r
+    }\r
+\r
+    if (lastFeatureGroupAdded != null && lastFeatureGroupAdded.length() < 1)\r
+    {\r
+      lastFeatureGroupAdded = null;\r
+    }\r
+\r
+    if (!newFeatures)\r
+    {\r
+\r
+      SequenceFeature sf = features[featureIndex];\r
+      if (dialog.accept)\r
+      {\r
+        sf.type = lastFeatureAdded;\r
+        sf.featureGroup = lastFeatureGroupAdded;\r
+        sf.description = lastDescriptionAdded;\r
+        if (!colourPanel.isGcol)\r
+        {\r
+          // update colour - otherwise its already done.\r
+          setColour(sf.type, colourPanel.getBackground());\r
+        }\r
+        try\r
+        {\r
+          sf.begin = Integer.parseInt(start.getText());\r
+          sf.end = Integer.parseInt(end.getText());\r
+        } catch (NumberFormatException ex)\r
+        {\r
+        }\r
+\r
+        ffile.parseDescriptionHTML(sf, false);\r
+        setVisible(lastFeatureAdded); // if user edited name then make sure new\r
+                                      // type is visible\r
+      }\r
+      if (deleteFeature)\r
+      {\r
+        sequences[0].deleteFeature(sf);\r
+      }\r
+\r
+    }\r
+    else\r
+    {\r
+      if (dialog.accept && name.getText().length() > 0)\r
+      {\r
+        for (int i = 0; i < sequences.length; i++)\r
+        {\r
+          features[i].type = lastFeatureAdded;\r
+          features[i].featureGroup = lastFeatureGroupAdded;\r
+          features[i].description = lastDescriptionAdded;\r
+          sequences[i].addSequenceFeature(features[i]);\r
+          ffile.parseDescriptionHTML(features[i], false);\r
+        }\r
+\r
+        Color newColour = colourPanel.getBackground();\r
+        // setColour(lastFeatureAdded, fcol);\r
+\r
+        if (lastFeatureGroupAdded != null)\r
+        {\r
+          setGroupVisibility(lastFeatureGroupAdded, true);\r
+        }\r
+        setColour(lastFeatureAdded, newColour); // was fcol\r
+        setVisible(lastFeatureAdded);\r
+        findAllFeatures(false); // different to original applet behaviour ?\r
+        // findAllFeatures();\r
+      }\r
+      else\r
+      {\r
+        // no update to the alignment\r
+        return false;\r
+      }\r
+    }\r
+    // refresh the alignment and the feature settings dialog\r
+    if (((AlignViewport) av).featureSettings != null)\r
+    {\r
+      ((AlignViewport) av).featureSettings.refreshTable();\r
+    }\r
+    // findAllFeatures();\r
+\r
+    ap.paintAlignment(true);\r
+\r
+    return true;\r
+  }\r
+}\r