Amend features/annotations in applet
authoramwaterhouse <Andrew Waterhouse>
Wed, 11 Apr 2007 13:00:48 +0000 (13:00 +0000)
committeramwaterhouse <Andrew Waterhouse>
Wed, 11 Apr 2007 13:00:48 +0000 (13:00 +0000)
src/jalview/appletgui/APopupMenu.java
src/jalview/appletgui/AnnotationLabels.java
src/jalview/appletgui/AnnotationPanel.java
src/jalview/appletgui/AppletJmol.java
src/jalview/appletgui/EditNameDialog.java
src/jalview/appletgui/FeatureRenderer.java
src/jalview/appletgui/Finder.java
src/jalview/appletgui/ScalePanel.java
src/jalview/appletgui/SeqPanel.java
src/jalview/appletgui/UserDefinedColours.java

index a103073..ede493e 100755 (executable)
@@ -68,6 +68,7 @@ public class APopupMenu
   MenuItem hideSeqs = new MenuItem();\r
   MenuItem repGroup = new MenuItem();\r
   MenuItem sequenceName = new MenuItem("Edit Name/Description");\r
+  MenuItem sequenceFeature = new MenuItem("Create Sequence Feature");\r
 \r
   Sequence seq;\r
   MenuItem revealAll = new MenuItem();\r
@@ -302,8 +303,9 @@ public class APopupMenu
           getGroup().getDescription(),\r
           "       Group Name",\r
           "Group Description",\r
-          ap,\r
-          "Edit Group Name / Description");\r
+          ap.alignFrame,\r
+          "Edit Group Name / Description",\r
+          500,100);\r
 \r
       if (dialog.accept)\r
       {\r
@@ -398,6 +400,35 @@ public class APopupMenu
 \r
       }\r
     }\r
+    else if(source == sequenceFeature)\r
+    {\r
+      SequenceGroup sg = ap.av.getSelectionGroup();\r
+      if (sg == null)\r
+      {\r
+        return;\r
+      }\r
+\r
+      int gSize = sg.getSize();\r
+      SequenceI[] seqs = new SequenceI[gSize];\r
+      SequenceFeature[] features = new SequenceFeature[gSize];\r
+\r
+      for (int i = 0; i < gSize; i++)\r
+      {\r
+        seqs[i] = sg.getSequenceAt(i);\r
+        int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());\r
+        int end = sg.findEndRes(sg.getSequenceAt(i));\r
+        features[i] = new SequenceFeature(null, null, null, start, end,\r
+                                          "Jalview");\r
+      }\r
+\r
+      if (ap.seqPanel.seqCanvas.getFeatureRenderer()\r
+          .createNewFeatures(seqs, features, ap))\r
+      {\r
+        ap.alignFrame.sequenceFeatures.setState(true);\r
+        ap.av.showSequenceFeatures(true);\r
+        ap.highlightSearchResults(null);\r
+      }\r
+    }\r
     else\r
     {\r
       outputText(evt);\r
@@ -429,8 +460,9 @@ public class APopupMenu
         seq.getDescription(),\r
         "       Sequence Name",\r
         "Sequence Description",\r
-        ap,\r
-        "Edit Sequence Name / Description");\r
+        ap.alignFrame,\r
+        "Edit Sequence Name / Description",\r
+        500,100);\r
 \r
     if (dialog.accept)\r
     {\r
@@ -455,6 +487,7 @@ public class APopupMenu
   {\r
     groupMenu.setLabel("Group");\r
     groupMenu.setLabel("Selection");\r
+    sequenceFeature.addActionListener(this);\r
 \r
     editGroupName.addActionListener(this);\r
     unGroupMenuItem.setLabel("Remove Group");\r
@@ -488,7 +521,9 @@ public class APopupMenu
     groupMenu.add(editGroupName);\r
     groupMenu.add(editMenu);\r
     groupMenu.add(outputmenu);\r
+    groupMenu.add(sequenceFeature);\r
     groupMenu.add(menu1);\r
+\r
     colourMenu.add(noColourmenuItem);\r
     colourMenu.add(clustalColour);\r
     colourMenu.add(BLOSUM62Colour);\r
index cb17e64..a952f9d 100755 (executable)
@@ -35,15 +35,16 @@ public class AnnotationLabels
   AlignViewport av;\r
   boolean resizing = false;\r
   int oldY, mouseX;\r
-  static String EDITNAME = "Edit label/description";\r
-  static String HIDE = "Hide this row";\r
-  static String DELETE = "Delete this row";\r
-  static String SHOWALL = "Show all hidden rows";\r
+\r
+  static String ADDNEW = "Add New Row";\r
+  static String EDITNAME = "Edit Label/Description";\r
+  static String HIDE = "Hide This Row";\r
+  static String SHOWALL = "Show All Hidden Rows";\r
   static String OUTPUT_TEXT = "Show Values In Textbox";\r
   static String COPYCONS_SEQ = "Copy Consensus Sequence";\r
 \r
-  int selectedRow = 0;\r
   int scrollOffset = 0;\r
+  int selectedRow = -1;\r
 \r
   Tooltip tooltip;\r
 \r
@@ -67,14 +68,14 @@ public class AnnotationLabels
     repaint();\r
   }\r
 \r
-  void getSelectedRow(int y)\r
+  int getSelectedRow(int y)\r
   {\r
-    selectedRow = -1;\r
+    int row = -1;\r
     AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
 \r
     if (aa == null)\r
     {\r
-      return;\r
+      return row;\r
     }\r
 \r
     int height = 0;\r
@@ -88,34 +89,37 @@ public class AnnotationLabels
       height += aa[i].height;\r
       if (y < height)\r
       {\r
-        selectedRow = i;\r
+        row = i;\r
         break;\r
       }\r
     }\r
+\r
+    return row;\r
   }\r
 \r
   public void actionPerformed(ActionEvent evt)\r
   {\r
     AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
 \r
-    if (evt.getActionCommand().equals(EDITNAME))\r
+    if (evt.getActionCommand().equals(ADDNEW))\r
     {\r
-      EditNameDialog dialog = new EditNameDialog(\r
-          aa[selectedRow].label,\r
-          aa[selectedRow].description,\r
-          "       Annotation Label",\r
-          "Annotation Description",\r
-          ap,\r
-          "Edit Annotation Name / Description");\r
-\r
-      if (dialog.accept)\r
+      AlignmentAnnotation newAnnotation = new AlignmentAnnotation("",\r
+          null,\r
+          new Annotation[ap.av.alignment.getWidth()]);\r
+\r
+      if (!editLabelDescription(newAnnotation))\r
       {\r
-        aa[selectedRow].label = dialog.getName();\r
-        aa[selectedRow].description = dialog.getDescription();\r
-        repaint();\r
+        return;\r
       }\r
+\r
+      ap.av.alignment.addAnnotation(newAnnotation);\r
+      ap.av.alignment.setAnnotationIndex(newAnnotation, 0);\r
+    }\r
+    else if (evt.getActionCommand().equals(EDITNAME))\r
+    {\r
+      editLabelDescription(aa[selectedRow]);\r
     }\r
-    if (evt.getActionCommand().equals(HIDE))\r
+    else if (evt.getActionCommand().equals(HIDE))\r
     {\r
       aa[selectedRow].visible = false;\r
     }\r
@@ -151,23 +155,46 @@ public class AnnotationLabels
     ap.paintAlignment(true);\r
   }\r
 \r
+  boolean editLabelDescription(AlignmentAnnotation annotation)\r
+  {\r
+    EditNameDialog dialog = new EditNameDialog(\r
+        annotation.label,\r
+        annotation.description,\r
+        "       Annotation Label",\r
+        "Annotation Description",\r
+        ap.alignFrame,\r
+        "Edit Annotation Name / Description",\r
+        500, 100);\r
+\r
+    if (dialog.accept)\r
+    {\r
+      annotation.label = dialog.getName();\r
+      annotation.description = dialog.getDescription();\r
+      repaint();\r
+      return true;\r
+    }\r
+    else\r
+      return false;\r
+\r
+  }\r
+\r
   public void mouseMoved(MouseEvent evt)\r
   {\r
-    getSelectedRow(evt.getY() - scrollOffset);\r
+    int row = getSelectedRow(evt.getY() - scrollOffset);\r
 \r
-    if (selectedRow > -1)\r
+    if (row > -1)\r
     {\r
       if (tooltip == null)\r
       {\r
         tooltip = new Tooltip(ap.av.alignment.\r
-                              getAlignmentAnnotation()[selectedRow].\r
+                              getAlignmentAnnotation()[row].\r
                               description,\r
                               this);\r
       }\r
       else\r
       {\r
         tooltip.setTip(ap.av.alignment.\r
-                       getAlignmentAnnotation()[selectedRow].description);\r
+                       getAlignmentAnnotation()[row].description);\r
       }\r
     }\r
     else if (tooltip != null)\r
@@ -194,27 +221,32 @@ public class AnnotationLabels
 \r
   public void mousePressed(MouseEvent evt)\r
   {\r
+    selectedRow = getSelectedRow(evt.getY() - scrollOffset);\r
+\r
     AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
 \r
-    PopupMenu pop = new PopupMenu("Annotations");\r
+    PopupMenu popup = new PopupMenu("Annotations");\r
 \r
-    MenuItem item = new MenuItem(EDITNAME);\r
+    MenuItem item = new MenuItem(ADDNEW);\r
+    item.addActionListener(this);\r
+    popup.add(item);\r
+    item = new MenuItem(EDITNAME);\r
     item.addActionListener(this);\r
-    pop.add(item);\r
+    popup.add(item);\r
     item = new MenuItem(HIDE);\r
     item.addActionListener(this);\r
-    pop.add(item);\r
+    popup.add(item);\r
     item = new MenuItem(SHOWALL);\r
     item.addActionListener(this);\r
-    pop.add(item);\r
-    this.add(pop);\r
+    popup.add(item);\r
+    this.add(popup);\r
     item = new MenuItem(OUTPUT_TEXT);\r
     item.addActionListener(this);\r
-    pop.add(item);\r
+    popup.add(item);\r
 \r
     if (aa[selectedRow] == ap.av.consensus)\r
     {\r
-      pop.addSeparator();\r
+      popup.addSeparator();\r
       final CheckboxMenuItem cbmi = new CheckboxMenuItem(\r
           "Ignore Gaps In Consensus",\r
           ap.av.getIgnoreGapsConsensus());\r
@@ -227,13 +259,13 @@ public class AnnotationLabels
           ap.paintAlignment(true);\r
         }\r
       });\r
-      pop.add(cbmi);\r
-      final MenuItem cpcons = new MenuItem(COPYCONS_SEQ);\r
-      cpcons.addActionListener(this);\r
-      pop.add(cpcons);\r
+      popup.add(cbmi);\r
+      item = new MenuItem(COPYCONS_SEQ);\r
+      item.addActionListener(this);\r
+      popup.add(item);\r
     }\r
 \r
-    pop.show(this, evt.getX(), evt.getY());\r
+    popup.show(this, evt.getX(), evt.getY());\r
 \r
   }\r
 \r
index 9c45d5e..5242752 100755 (executable)
@@ -27,7 +27,8 @@ import java.awt.event.*;
 import jalview.datamodel.*;\r
 \r
 public class AnnotationPanel\r
-    extends Panel implements AdjustmentListener\r
+    extends Panel\r
+    implements AdjustmentListener, ActionListener, MouseListener, MouseMotionListener\r
 {\r
   AlignViewport av;\r
   AlignmentPanel ap;\r
@@ -65,13 +66,10 @@ public class AnnotationPanel
     setLayout(null);\r
     adjustPanelHeight();\r
 \r
-    addMouseMotionListener(new MouseMotionAdapter()\r
-    {\r
-      public void mouseMoved(MouseEvent evt)\r
-      {\r
-        doMouseMoved(evt);\r
-      }\r
-    });\r
+    addMouseMotionListener(this);\r
+\r
+    addMouseListener(this);\r
+\r
 \r
     // ap.annotationScroller.getVAdjustable().addAdjustmentListener( this );\r
   }\r
@@ -86,6 +84,288 @@ public class AnnotationPanel
     ap.alabels.setScrollOffset( -evt.getValue());\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
+  public void actionPerformed(ActionEvent evt)\r
+  {\r
+    AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
+    Annotation[] anot = aa[activeRow].annotations;\r
+\r
+    if (anot.length < av.getColumnSelection().getMax())\r
+    {\r
+      Annotation[] temp = new Annotation[av.getColumnSelection().getMax() + 2];\r
+      System.arraycopy(anot, 0, temp, 0, anot.length);\r
+      anot = temp;\r
+      aa[activeRow].annotations = anot;\r
+    }\r
+\r
+    String label = "";\r
+    if (av.colSel != null && av.colSel.size() > 0\r
+        && anot[av.colSel.getMin()] != null)\r
+      label = anot[av.getColumnSelection().getMin()].displayCharacter;\r
+\r
+\r
+    if (evt.getActionCommand().equals(REMOVE))\r
+    {\r
+      for (int i = 0; i < av.getColumnSelection().size(); i++)\r
+      {\r
+        anot[av.getColumnSelection().columnAt(i)] = null;\r
+      }\r
+    }\r
+    else if (evt.getActionCommand().equals(LABEL))\r
+    {\r
+      label = enterLabel(label, "Enter Label");\r
+\r
+      if (label == null)\r
+      {\r
+        return;\r
+      }\r
+\r
+      if ( (label.length() > 0) && !aa[activeRow].hasText)\r
+      {\r
+        aa[activeRow].hasText = true;\r
+      }\r
+\r
+      for (int i = 0; i < av.getColumnSelection().size(); i++)\r
+      {\r
+        int index = av.getColumnSelection().columnAt(i);\r
+\r
+        if(!av.colSel.isVisible(index))\r
+          continue;\r
+\r
+        if (anot[index] == null)\r
+        {\r
+          anot[index] = new Annotation(label, "", ' ', 0);\r
+        }\r
+\r
+        anot[index].displayCharacter = label;\r
+      }\r
+    }\r
+    else if (evt.getActionCommand().equals(COLOUR))\r
+    {\r
+      UserDefinedColours udc = new UserDefinedColours(\r
+          this,\r
+         Color.black, ap.alignFrame);\r
+\r
+      Color col = udc.getColor();\r
+\r
+      for (int i = 0; i < av.getColumnSelection().size(); i++)\r
+      {\r
+        int index = av.getColumnSelection().columnAt(i);\r
+\r
+        if(!av.colSel.isVisible(index))\r
+          continue;\r
+\r
+        if (anot[index] == null)\r
+        {\r
+          anot[index] = new Annotation("", "", ' ', 0);\r
+        }\r
+\r
+        anot[index].colour = col;\r
+      }\r
+    }\r
+    else // HELIX OR SHEET\r
+    {\r
+      char type = 0;\r
+      String symbol = "\u03B1";\r
+\r
+      if (evt.getActionCommand().equals(HELIX))\r
+      {\r
+        type = 'H';\r
+      }\r
+      else if (evt.getActionCommand().equals(SHEET))\r
+      {\r
+        type = 'E';\r
+        symbol = "\u03B2";\r
+      }\r
+\r
+      if (!aa[activeRow].hasIcons)\r
+      {\r
+        aa[activeRow].hasIcons = true;\r
+      }\r
+\r
+      label = enterLabel(symbol, "Enter Label");\r
+\r
+      if (label == null)\r
+      {\r
+        return;\r
+      }\r
+\r
+      if ( (label.length() > 0) && !aa[activeRow].hasText)\r
+      {\r
+        aa[activeRow].hasText = true;\r
+      }\r
+\r
+      for (int i = 0; i < av.getColumnSelection().size(); i++)\r
+      {\r
+        int index = av.getColumnSelection().columnAt(i);\r
+\r
+        if(!av.colSel.isVisible(index))\r
+          continue;\r
+\r
+        if (anot[index] == null)\r
+        {\r
+          anot[index] = new Annotation(label, "", type, 0);\r
+        }\r
+\r
+        anot[index].secondaryStructure = type;\r
+        anot[index].displayCharacter = label;\r
+      }\r
+    }\r
+\r
+    adjustPanelHeight();\r
+    repaint();\r
+\r
+    return;\r
+  }\r
+\r
+  String enterLabel(String text, String label)\r
+  {\r
+    EditNameDialog dialog = new EditNameDialog(text,null,label,null,\r
+        ap.alignFrame,"Enter Label", 400,200);\r
+\r
+    if(dialog.accept)\r
+      return dialog.getName();\r
+    else\r
+      return null;\r
+  }\r
+\r
+  public void mousePressed(MouseEvent evt)\r
+  {\r
+      AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
+      if (aa == null)\r
+      {\r
+        return;\r
+      }\r
+\r
+      int height = 0;\r
+      activeRow = -1;\r
+\r
+\r
+      for (int i = 0; i < aa.length; i++)\r
+      {\r
+        if (aa[i].visible)\r
+        {\r
+          height += aa[i].height;\r
+        }\r
+\r
+        if (evt.getY() < height)\r
+        {\r
+          if (aa[i].editable)\r
+          {\r
+            activeRow = i;\r
+          }\r
+\r
+          break;\r
+        }\r
+      }\r
+\r
+      if ( (evt.getModifiers() & InputEvent.BUTTON3_MASK) ==\r
+        InputEvent.BUTTON3_MASK  && activeRow != -1)\r
+      {\r
+        if (av.getColumnSelection() == null)\r
+        {\r
+          return;\r
+        }\r
+\r
+        PopupMenu pop = new PopupMenu("Structure type");\r
+        MenuItem item = new MenuItem(HELIX);\r
+        item.addActionListener(this);\r
+        pop.add(item);\r
+        item = new MenuItem(SHEET);\r
+        item.addActionListener(this);\r
+        pop.add(item);\r
+        item = new MenuItem(LABEL);\r
+        item.addActionListener(this);\r
+        pop.add(item);\r
+        item = new MenuItem(COLOUR);\r
+        item.addActionListener(this);\r
+        pop.add(item);\r
+        item = new MenuItem(REMOVE);\r
+        item.addActionListener(this);\r
+        pop.add(item);\r
+        ap.alignFrame.add(pop);\r
+        pop.show(this, evt.getX(), evt.getY());\r
+\r
+        return;\r
+      }\r
+\r
+      if (aa == null)\r
+      {\r
+        return;\r
+      }\r
+\r
+      ap.scalePanel.mousePressed(evt);\r
+  }\r
+\r
+  public void mouseReleased(MouseEvent evt)\r
+  {\r
+    ap.scalePanel.mouseReleased(evt);\r
+  }\r
+\r
+  public void mouseClicked(MouseEvent evt)\r
+  {}\r
+\r
+  public void mouseDragged(MouseEvent evt)\r
+  {\r
+    ap.scalePanel.mouseDragged(evt);\r
+  }\r
+\r
+  public void mouseMoved(MouseEvent evt)\r
+  {\r
+    AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
+    if (aa == null)\r
+    {\r
+      return;\r
+    }\r
+\r
+    int row = -1;\r
+    int height = 0;\r
+    for (int i = 0; i < aa.length; i++)\r
+    {\r
+\r
+      if (aa[i].visible)\r
+      {\r
+        height += aa[i].height;\r
+      }\r
+\r
+      if (evt.getY() < height)\r
+      {\r
+        row = i;\r
+        break;\r
+      }\r
+    }\r
+\r
+    int res = evt.getX() / av.getCharWidth() + av.getStartRes();\r
+\r
+    if (av.hasHiddenColumns)\r
+    {\r
+      res = av.getColumnSelection().adjustForHiddenColumns(res);\r
+    }\r
+\r
+    if (row > -1 && res < aa[row].annotations.length && aa[row].annotations[res] != null)\r
+    {\r
+      StringBuffer text = new StringBuffer("Sequence position " + (res + 1));\r
+      if (aa[row].annotations[res].description != null)\r
+      {\r
+        text.append("  " + aa[row].annotations[res].description);\r
+      }\r
+      ap.alignFrame.statusBar.setText(text.toString());\r
+    }\r
+  }\r
+  public void mouseEntered(MouseEvent evt)\r
+  {\r
+    ap.scalePanel.mouseEntered(evt);\r
+  }\r
+  public void mouseExited(MouseEvent evt)\r
+  {\r
+    ap.scalePanel.mouseExited(evt);\r
+  }\r
+\r
+\r
   public int adjustPanelHeight()\r
   {\r
     // setHeight of panels\r
@@ -167,48 +447,6 @@ public class AnnotationPanel
     activeRes.addElement(String.valueOf(i));\r
   }\r
 \r
-  public void doMouseMoved(MouseEvent evt)\r
-  {\r
-    AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
-    if (aa == null)\r
-    {\r
-      return;\r
-    }\r
-\r
-    int row = -1;\r
-    int height = 0;\r
-    for (int i = 0; i < aa.length; i++)\r
-    {\r
-\r
-      if (aa[i].visible)\r
-      {\r
-        height += aa[i].height;\r
-      }\r
-\r
-      if (evt.getY() < height)\r
-      {\r
-        row = i;\r
-        break;\r
-      }\r
-    }\r
-\r
-    int res = evt.getX() / av.getCharWidth() + av.getStartRes();\r
-\r
-    if (av.hasHiddenColumns)\r
-    {\r
-      res = av.getColumnSelection().adjustForHiddenColumns(res);\r
-    }\r
-\r
-    if (row > -1 && res < aa[row].annotations.length && aa[row].annotations[res] != null)\r
-    {\r
-      StringBuffer text = new StringBuffer("Sequence position " + (res + 1));\r
-      if (aa[row].annotations[res].description != null)\r
-      {\r
-        text.append("  " + aa[row].annotations[res].description);\r
-      }\r
-      ap.alignFrame.statusBar.setText(text.toString());\r
-    }\r
-  }\r
 \r
   public void update(Graphics g)\r
   {\r
@@ -387,6 +625,27 @@ public class AnnotationPanel
           validRes = true;\r
         }\r
 \r
+        if (activeRow == i)\r
+        {\r
+          g.setColor(Color.red);\r
+\r
+          if (av.getColumnSelection() != null)\r
+          {\r
+            for (int n = 0; n < av.getColumnSelection().size(); n++)\r
+            {\r
+              int v = av.getColumnSelection().columnAt(n);\r
+\r
+              if (v == column)\r
+              {\r
+                g.fillRect(x * av.charWidth, y,\r
+                           av.charWidth, av.charHeight);\r
+              }\r
+            }\r
+          }\r
+        }\r
+\r
+\r
+\r
         if (av.validCharWidth && validRes &&\r
             (row.annotations[column].displayCharacter.length() > 0))\r
         {\r
index a48e77e..375fe4d 100644 (file)
@@ -29,6 +29,8 @@ import jalview.io.*;
 
 import org.jmol.api.*;
 import org.jmol.adapter.smarter.SmarterJmolAdapter;
+
+
 import org.jmol.popup.*;
 import jalview.schemes.*;
 
@@ -621,8 +623,7 @@ public class AppletJmol extends Frame
       pdbentry.setId(pdb.id);
 
       ssm.addStructureViewerListener(this);
-      if (fr!=null)
-        fr.featuresAdded();
+
       Vector chains = new Vector();
       for (int i = 0; i < pdb.chains.size(); i++)
       {
index 3e197f0..1c365ba 100644 (file)
 package jalview.appletgui;\r
 \r
 import java.awt.*;\r
-import java.awt.event.*;\r
 \r
-public class EditNameDialog\r
-    extends Dialog implements ActionListener\r
+\r
+public class EditNameDialog extends JVDialog\r
 {\r
   TextField id, description;\r
-  Button ok = new Button("Accept");\r
-  Button cancel = new Button("Cancel");\r
-  boolean accept = false;\r
 \r
   public String getName()\r
   {\r
@@ -51,61 +47,35 @@ public class EditNameDialog
                         String desc,\r
                         String label1,\r
                         String label2,\r
-                        AlignmentPanel ap,\r
-                        String title)\r
+                        Frame owner,\r
+                        String title,\r
+                        int width, int height)\r
   {\r
-    super(ap.alignFrame, title, true);\r
+    super(owner, title, true, width, height);\r
 \r
-    id = new TextField(name, 40);\r
-    description = new TextField(desc, 40);\r
     Panel panel = new Panel(new BorderLayout());\r
     Panel panel2 = new Panel(new BorderLayout());\r
+\r
+    id = new TextField(name, 40);\r
     Label label = new Label(label1);\r
     label.setFont(new Font("Monospaced", Font.PLAIN, 12));\r
+\r
     panel2.add(label, BorderLayout.WEST);\r
     panel2.add(id, BorderLayout.CENTER);\r
     panel.add(panel2, BorderLayout.NORTH);\r
-    panel2 = new Panel(new BorderLayout());\r
-    label = new Label(label2);\r
-    label.setFont(new Font("Monospaced", Font.PLAIN, 12));\r
-    panel2.add(label, BorderLayout.WEST);\r
-    panel2.add(description, BorderLayout.CENTER);\r
-    panel.add(panel2, BorderLayout.CENTER);\r
-\r
-    panel2 = new Panel(new FlowLayout());\r
-\r
-    panel2.add(ok);\r
-    panel2.add(cancel);\r
-    ok.addActionListener(this);\r
-    cancel.addActionListener(this);\r
-\r
-    panel.add(panel2, BorderLayout.SOUTH);\r
-\r
-    add(panel, BorderLayout.NORTH);\r
 \r
-    int width = 500, height = 100;\r
 \r
-    pack();\r
-\r
-    height += getInsets().top + getInsets().bottom;\r
-\r
-    setBounds(ap.alignFrame.getBounds().x\r
-              + (ap.alignFrame.getSize().width - width) / 2,\r
-              ap.alignFrame.getBounds().y\r
-              + (ap.alignFrame.getSize().height - height) / 2,\r
-              width, height);\r
-\r
-    show();\r
-\r
-  }\r
-\r
-  public void actionPerformed(ActionEvent evt)\r
-  {\r
-    if (evt.getSource() == ok)\r
+    if(label2!=null)\r
     {\r
-      accept = true;\r
+      panel2 = new Panel(new BorderLayout());\r
+      description = new TextField(desc, 40);\r
+      label = new Label(label2);\r
+      label.setFont(new Font("Monospaced", Font.PLAIN, 12));\r
+      panel2.add(label, BorderLayout.WEST);\r
+      panel2.add(description, BorderLayout.CENTER);\r
+      panel.add(panel2, BorderLayout.CENTER);\r
     }\r
-\r
-    setVisible(false);\r
+    setMainPanel(panel);\r
+    show();\r
   }\r
 }\r
index adfa518..ff58125 100755 (executable)
-/*
- * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
- */
-package jalview.appletgui;
-
-import java.util.*;
-
-import java.awt.*;
-
-import jalview.datamodel.*;
-
-/**
- * DOCUMENT ME!
- *
- * @author $author$
- * @version $Revision$
- */
-public class FeatureRenderer
-{
-  AlignViewport av;
-
-  Hashtable featureColours = new Hashtable();
-
-  // A higher level for grouping features of a
-  // particular type
-  Hashtable featureGroups = null;
-
-  // Holds web links for feature groups and feature types
-  // in the form label|link
-  Hashtable featureLinks = null;
-
-  // This is actually an Integer held in the hashtable,
-  // Retrieved using the key feature type
-  Object currentColour;
-
-  String[] renderOrder;
-
-  FontMetrics fm;
-  int charOffset;
-
-  float transparency = 1f;
-
-  TransparencySetter transparencySetter = null;
-
-  /**
-   * Creates a new FeatureRenderer object.
-   *
-   * @param av DOCUMENT ME!
-   */
-  public FeatureRenderer(AlignViewport av)
-  {
-    this.av = av;
-
-    if (!System.getProperty("java.version").startsWith("1.1"))
-    {
-      transparencySetter = new TransparencySetter();
-    }
-  }
-
-  public void transferSettings(FeatureRenderer fr)
-  {
-    renderOrder = fr.renderOrder;
-    featureGroups = fr.featureGroups;
-    featureColours = fr.featureColours;
-    transparency = fr.transparency;
-  }
-
-  public Color findFeatureColour(Color initialCol, SequenceI seq, int i)
-  {
-    overview = true;
-    if (!av.showSequenceFeatures)
-    {
-      return initialCol;
-    }
-
-    lastSequence = seq;
-    sequenceFeatures = lastSequence.getSequenceFeatures();
-    if (sequenceFeatures == null)
-    {
-      return initialCol;
-    }
-
-    sfSize = sequenceFeatures.length;
-
-    if (jalview.util.Comparison.isGap(lastSequence.getCharAt(i)))
-    {
-      return Color.white;
-    }
-
-    currentColour = null;
-
-    drawSequence(null, lastSequence, lastSequence.findPosition(i), -1, -1);
-
-    if (currentColour == null)
-    {
-      return initialCol;
-    }
-
-    return new Color( ( (Integer) currentColour).intValue());
-  }
-
-  /**
-   * This is used by the Molecule Viewer to get the accurate colour
-   * of the rendered sequence
-   */
-  boolean overview = false;
-
-  int white = Color.white.getRGB();
-  public int findFeatureColour(int initialCol, int seqIndex, int column)
-  {
-    if (!av.showSequenceFeatures)
-    {
-      return initialCol;
-    }
-
-    if (seqIndex != lastSequenceIndex)
-    {
-      lastSequence = av.alignment.getSequenceAt(seqIndex);
-      lastSequenceIndex = seqIndex;
-      sequenceFeatures = lastSequence.getSequenceFeatures();
-      if (sequenceFeatures == null)
-      {
-        return initialCol;
-      }
-
-      sfSize = sequenceFeatures.length;
-    }
-
-    if (jalview.util.Comparison.isGap(lastSequence.getCharAt(column)))
-    {
-      return Color.white.getRGB();
-    }
-
-    currentColour = null;
-
-    drawSequence(null, lastSequence, lastSequence.findPosition(column), -1, -1);
-
-    if (currentColour == null)
-    {
-      return initialCol;
-    }
-
-    return ( (Integer) currentColour).intValue();
-  }
-
-  /**
-   * DOCUMENT ME!
-   *
-   * @param g DOCUMENT ME!
-   * @param seq DOCUMENT ME!
-   * @param sg DOCUMENT ME!
-   * @param start DOCUMENT ME!
-   * @param end DOCUMENT ME!
-   * @param x1 DOCUMENT ME!
-   * @param y1 DOCUMENT ME!
-   * @param width DOCUMENT ME!
-   * @param height DOCUMENT ME!
-   */
-  // String type;
-  // SequenceFeature sf;
-  int lastSequenceIndex = -1;
-  SequenceI lastSequence;
-  SequenceFeature[] sequenceFeatures;
-  int sfSize, sfindex, spos, epos;
-
-  public void drawSequence(Graphics g, SequenceI seq,
-                           int start, int end, int y1)
-  {
-    if (seq.getSequenceFeatures() == null
-        || seq.getSequenceFeatures().length == 0)
-    {
-      return;
-    }
-
-    if (transparencySetter != null && g != null)
-    {
-      transparencySetter.setTransparency(g, transparency);
-    }
-    
-    if (lastSequence == null || seq != lastSequence || sequenceFeatures!=seq.getSequenceFeatures())
-    {
-      lastSequence = seq;
-      sequenceFeatures = seq.getSequenceFeatures();
-      sfSize = sequenceFeatures.length;
-    }
-
-    if (av.featuresDisplayed == null || renderOrder == null)
-    {
-      findAllFeatures();
-      if (av.featuresDisplayed.size() < 1)
-      {
-        return;
-      }
-
-      sequenceFeatures = seq.getSequenceFeatures();
-      sfSize = sequenceFeatures.length;
-    }
-    if (!overview)
-    {
-      spos = lastSequence.findPosition(start);
-      epos = lastSequence.findPosition(end);
-      if (g != null)
-      {
-        fm = g.getFontMetrics();
-      }
-    }
-    String type;
-    for (int renderIndex = 0; renderIndex < renderOrder.length; renderIndex++)
-    {
-      type = renderOrder[renderIndex];
-      if (!av.featuresDisplayed.containsKey(type))
-      {
-        continue;
-      }
-
-      // loop through all features in sequence to find
-      // current feature to render
-      for (sfindex = 0; sfindex < sfSize; sfindex++)
-      {
-        if (!sequenceFeatures[sfindex].type.equals(type))
-        {
-          continue;
-        }
-
-        if (featureGroups != null
-            && sequenceFeatures[sfindex].featureGroup != null
-            &&
-            featureGroups.containsKey(sequenceFeatures[sfindex].featureGroup)
-            &&
-            ! ( (Boolean) featureGroups.get(sequenceFeatures[sfindex].
-                                            featureGroup)).
-            booleanValue())
-        {
-          continue;
-        }
-
-        if (!overview && (sequenceFeatures[sfindex].getBegin() > epos
-                          || sequenceFeatures[sfindex].getEnd() < spos))
-        {
-          continue;
-        }
-
-        if (overview)
-        {
-          if (sequenceFeatures[sfindex].begin <= start &&
-              sequenceFeatures[sfindex].end >= start)
-          {
-            currentColour = av.featuresDisplayed.get(sequenceFeatures[sfindex].
-                type);
-          }
-
-        }
-        else if (sequenceFeatures[sfindex].type.equals("disulfide bond"))
-        {
-
-          renderFeature(g, seq,
-                        seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
-                        seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
-                        new Color( ( (Integer) av.featuresDisplayed.get(
-                            sequenceFeatures[sfindex].type)).intValue()),
-                        start, end, y1);
-          renderFeature(g, seq,
-                        seq.findIndex(sequenceFeatures[sfindex].end) - 1,
-                        seq.findIndex(sequenceFeatures[sfindex].end) - 1,
-                        new Color( ( (Integer) av.featuresDisplayed.get(
-                            sequenceFeatures[sfindex].type)).intValue()),
-                        start, end, y1);
-
-        }
-        else
-        {
-          renderFeature(g, seq,
-                        seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
-                        seq.findIndex(sequenceFeatures[sfindex].end) - 1,
-                        getColour(sequenceFeatures[sfindex].type),
-                        start, end, y1);
-        }
-
-      }
-    }
-
-    if (transparencySetter != null && g != null)
-    {
-      transparencySetter.setTransparency(g, 1.0f);
-    }
-  }
-
-  char s;
-  int i;
-  void renderFeature(Graphics g, SequenceI seq,
-                     int fstart, int fend, Color featureColour, int start,
-                     int end, int y1)
-  {
-
-    if ( ( (fstart <= end) && (fend >= start)))
-    {
-      if (fstart < start)
-      { // fix for if the feature we have starts before the sequence start,
-        fstart = start; // but the feature end is still valid!!
-      }
-
-      if (fend >= end)
-      {
-        fend = end;
-      }
-
-      for (i = fstart; i <= fend; i++)
-      {
-        s = seq.getCharAt(i);
-
-        if (jalview.util.Comparison.isGap(s))
-        {
-          continue;
-        }
-
-        g.setColor(featureColour);
-
-        g.fillRect( (i - start) * av.charWidth, y1, av.charWidth, av.charHeight);
-
-        if (!av.validCharWidth)
-        {
-          continue;
-        }
-
-        g.setColor(Color.white);
-        charOffset = (av.charWidth - fm.charWidth(s)) / 2;
-        g.drawString(String.valueOf(s),
-                     charOffset + (av.charWidth * (i - start)),
-                     (y1 + av.charHeight) - av.charHeight / 5); //pady = height / 5;
-
-      }
-    }
-  }
-
-  void findAllFeatures()
-  {
-    jalview.schemes.UserColourScheme ucs = new
-        jalview.schemes.UserColourScheme();
-    
-    av.featuresDisplayed = new Hashtable();
-    Vector allfeatures = new Vector();
-    for (int i = 0; i < av.alignment.getHeight(); i++)
-    {
-      SequenceFeature[] features = av.alignment.getSequenceAt(i).
-          getSequenceFeatures();
-
-      if (features == null)
-      {
-        continue;
-      }
-
-      int index = 0;
-      while (index < features.length)
-      {
-        if (!av.featuresDisplayed.containsKey(features[index].getType()))
-        {
-          if (getColour(features[index].getType()) == null)
-          {
-            featureColours.put(features[index].getType(),
-                               ucs.createColourFromName(features[index].
-                getType()));
-          }
-
-          av.featuresDisplayed.put(features[index].getType(),
-                                   new Integer(getColour(features[index].
-              getType()).getRGB()));
-          allfeatures.addElement(features[index].getType());
-        }
-        index++;
-      }
-    }
-
-    renderOrder = new String[allfeatures.size()];
-    Enumeration en = allfeatures.elements();
-    int i = allfeatures.size() - 1;
-    while (en.hasMoreElements())
-    {
-      renderOrder[i] = en.nextElement().toString();
-      i--;
-    }
-  }
-
-  public Color getColour(String featureType)
-  {
-    return (Color) featureColours.get(featureType);
-  }
-
-  public void addNewFeature(String name, Color col)
-  {
-
-    setColour(name, col);
-    if (av.featuresDisplayed == null)
-    {
-      av.featuresDisplayed = new Hashtable();
-    }
-
-    av.featuresDisplayed.put(name, "NOGROUP");
-  }
-
-  public void setColour(String featureType, Color col)
-  {
-    featureColours.put(featureType, col);
-  }
-
-  public void setFeaturePriority(Object[][] data)
-  {
-    // The feature table will display high priority
-    // features at the top, but theses are the ones
-    // we need to render last, so invert the data
-    if (av.featuresDisplayed != null)
-    {
-      av.featuresDisplayed.clear();
-    }
-
-    renderOrder = new String[data.length];
-
-    if (data.length > 0)
-    {
-      for (int i = 0; i < data.length; i++)
-      {
-        String type = data[i][0].toString();
-        setColour(type, (Color) data[i][1]);
-        if ( ( (Boolean) data[i][2]).booleanValue())
-        {
-          av.featuresDisplayed.put(type, new Integer(getColour(type).getRGB()));
-        }
-
-        renderOrder[data.length - i - 1] = type;
-      }
-    }
-  }
-
-  public void featuresAdded()
-  {
-    findAllFeatures();
-  }
-}
-
-class TransparencySetter
-{
-  void setTransparency(Graphics g, float value)
-  {
-     Graphics2D g2 = (Graphics2D) g;
-     g2.setComposite(
-        AlphaComposite.getInstance(
-             AlphaComposite.SRC_OVER, value));
-  }
-}
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer\r
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
+ */\r
+package jalview.appletgui;\r
+\r
+import java.util.*;\r
+\r
+import java.awt.*;\r
+\r
+import java.awt.event.*;\r
+\r
+\r
+import jalview.datamodel.*;\r
+\r
+/**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @author $author$\r
+ * @version $Revision$\r
+ */\r
+public class FeatureRenderer\r
+{\r
+  AlignViewport av;\r
+\r
+  Hashtable featureColours = new Hashtable();\r
+\r
+  // A higher level for grouping features of a\r
+  // particular type\r
+  Hashtable featureGroups = null;\r
+\r
+  // Holds web links for feature groups and feature types\r
+  // in the form label|link\r
+  Hashtable featureLinks = null;\r
+\r
+  // This is actually an Integer held in the hashtable,\r
+  // Retrieved using the key feature type\r
+  Object currentColour;\r
+\r
+  String[] renderOrder;\r
+\r
+  FontMetrics fm;\r
+  int charOffset;\r
+\r
+  float transparency = 1f;\r
+\r
+  TransparencySetter transparencySetter = null;\r
+\r
+  /**\r
+   * Creates a new FeatureRenderer object.\r
+   *\r
+   * @param av DOCUMENT ME!\r
+   */\r
+  public FeatureRenderer(AlignViewport av)\r
+  {\r
+    this.av = av;\r
+\r
+    if (!System.getProperty("java.version").startsWith("1.1"))\r
+    {\r
+      transparencySetter = new TransparencySetter();\r
+    }\r
+  }\r
+\r
+  public void transferSettings(FeatureRenderer fr)\r
+  {\r
+    renderOrder = fr.renderOrder;\r
+    featureGroups = fr.featureGroups;\r
+    featureColours = fr.featureColours;\r
+    transparency = fr.transparency;\r
+  }\r
+\r
+\r
+  static String lastFeatureAdded;\r
+  static String lastFeatureGroupAdded;\r
+  static String lastDescriptionAdded;\r
+\r
+  public boolean createNewFeatures(SequenceI[] sequences,\r
+                                   SequenceFeature[] features,\r
+      AlignmentPanel ap)\r
+  {\r
+    return amendFeatures(sequences, features, true, ap);\r
+  }\r
+\r
+\r
+  int featureIndex = 0;\r
+  boolean deleteFeature = false;\r
+  Panel colourPanel;\r
+  boolean amendFeatures(final SequenceI[] sequences,\r
+                        final SequenceFeature[] features,\r
+                        boolean newFeatures,\r
+                        final AlignmentPanel ap)\r
+  {\r
+    Panel bigPanel = new Panel(new BorderLayout());\r
+    final TextField name = new TextField(16);\r
+    final TextField source = new TextField(16);\r
+    final TextArea description = new TextArea(3, 35);\r
+    final TextField start = new TextField(8);\r
+    final TextField end = new TextField(8);\r
+    final Choice overlaps;\r
+    Button deleteButton = new Button("Delete");\r
+    deleteFeature = false;\r
+\r
+    colourPanel = new Panel(null);\r
+    colourPanel.setSize(110,15);\r
+    final FeatureRenderer fr = this;\r
+\r
+    Panel panel = new Panel(new GridLayout(3, 1));\r
+\r
+    Panel tmp;\r
+\r
+    ///////////////////////////////////////\r
+    ///MULTIPLE FEATURES AT SELECTED RESIDUE\r
+    if(!newFeatures && features.length>1)\r
+    {\r
+     panel = new Panel(new GridLayout(4, 1));\r
+     tmp = new Panel();\r
+     tmp.add(new Label("Select Feature: "));\r
+     overlaps = new Choice();\r
+     for(int i=0; i<features.length; i++)\r
+     {\r
+       String item = features[i].getType()\r
+        +"/"+features[i].getBegin()+"-"+features[i].getEnd();\r
+\r
+       if(features[i].getFeatureGroup()!=null)\r
+         item += " ("+features[i].getFeatureGroup()+")";\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],\r
+                               features[index].getBegin(),\r
+                               features[index].getEnd());\r
+\r
+           ap.seqPanel.seqCanvas.highlightSearchResults(highlight);\r
+\r
+         }\r
+         Color col = getColour(name.getText());\r
+         if (col == null)\r
+         {\r
+           col = new\r
+               jalview.schemes.UserColourScheme()\r
+               .createColourFromName(name.getText());\r
+         }\r
+\r
+         colourPanel.setBackground(col);\r
+       }\r
+     });\r
+\r
+\r
+     panel.add(tmp);\r
+    }\r
+    //////////\r
+    //////////////////////////////////////\r
+\r
+\r
+    tmp = new Panel();\r
+    panel.add(tmp);\r
+    tmp.add(new Label("Name: ", Label.RIGHT));\r
+    tmp.add(name);\r
+\r
+    tmp = new Panel();\r
+    panel.add(tmp);\r
+    tmp.add(new Label("Group: ",Label.RIGHT));\r
+    tmp.add(source);\r
+\r
+    tmp = new Panel();\r
+    panel.add(tmp);\r
+    tmp.add(new Label("Colour: ", Label.RIGHT));\r
+    tmp.add(colourPanel);\r
+\r
+    bigPanel.add(panel, BorderLayout.NORTH);\r
+\r
+    panel = new Panel();\r
+    panel.add(new Label("Description: ", Label.RIGHT));\r
+    panel.add(new ScrollPane().add(description));\r
+\r
+    if (!newFeatures)\r
+    {\r
+      bigPanel.add(panel, BorderLayout.SOUTH);\r
+\r
+      panel = new Panel();\r
+      panel.add(new Label(" Start:", Label.RIGHT));\r
+      panel.add(start);\r
+      panel.add(new Label("  End:", Label.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
+\r
+    String title = newFeatures ? "Create New Sequence Feature(s)" :\r
+        "Amend/Delete Features for "\r
+        + sequences[0].getName();\r
+\r
+    final JVDialog dialog = new JVDialog(ap.alignFrame,\r
+                               title,\r
+                               true,\r
+                               385,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("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
+\r
+    Color col = getColour(name.getText());\r
+    if (col == null)\r
+    {\r
+      col = new\r
+          jalview.schemes.UserColourScheme()\r
+          .createColourFromName(name.getText());\r
+    }\r
+\r
+    colourPanel.setBackground(col);\r
+\r
+    dialog.setResizable(true);\r
+\r
+\r
+    colourPanel.addMouseListener(new java.awt.event.MouseAdapter()\r
+    {\r
+      public void mousePressed(java.awt.event.MouseEvent evt)\r
+      {\r
+        new UserDefinedColours(fr, ap.alignFrame);\r
+      }\r
+    });\r
+\r
+    dialog.show();\r
+\r
+    jalview.io.FeaturesFile ffile = new jalview.io.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
+      lastFeatureGroupAdded = null;\r
+\r
+\r
+    if (!newFeatures)\r
+    {\r
+      SequenceFeature sf = features[featureIndex];\r
+\r
+      if (dialog.accept)\r
+      {\r
+        sf.type = lastFeatureAdded;\r
+        sf.featureGroup = lastFeatureGroupAdded;\r
+        sf.description = lastDescriptionAdded;\r
+        setColour(sf.type, colourPanel.getBackground());\r
+        try\r
+        {\r
+          sf.begin = Integer.parseInt(start.getText());\r
+          sf.end =  Integer.parseInt(end.getText());\r
+        }\r
+        catch (NumberFormatException ex)\r
+        {}\r
+\r
+        ffile.parseDescriptionHTML(sf, false);\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
+        if (av.featuresDisplayed == null)\r
+        {\r
+          av.featuresDisplayed = new Hashtable();\r
+        }\r
+\r
+        if (featureGroups == null)\r
+        {\r
+          featureGroups = new Hashtable();\r
+        }\r
+\r
+\r
+\r
+        col = colourPanel.getBackground();\r
+        setColour(lastFeatureAdded, col);\r
+\r
+        if(lastFeatureGroupAdded!=null)\r
+        {\r
+          featureGroups.put(lastFeatureGroupAdded, new Boolean(true));\r
+          av.featuresDisplayed.put(lastFeatureGroupAdded,\r
+                                   new Integer(col.getRGB()));\r
+        }\r
+        findAllFeatures();\r
+\r
+        return true;\r
+      }\r
+      else\r
+      {\r
+        return false;\r
+      }\r
+    }\r
+\r
+    findAllFeatures();\r
+\r
+    return true;\r
+  }\r
+\r
+\r
+  public Color findFeatureColour(Color initialCol, SequenceI seq, int i)\r
+  {\r
+    overview = true;\r
+    if (!av.showSequenceFeatures)\r
+    {\r
+      return initialCol;\r
+    }\r
+\r
+    lastSeq = seq;\r
+    sequenceFeatures = lastSeq.getSequenceFeatures();\r
+    if (sequenceFeatures == null)\r
+    {\r
+      return initialCol;\r
+    }\r
+\r
+    sfSize = sequenceFeatures.length;\r
+\r
+    if (jalview.util.Comparison.isGap(lastSeq.getCharAt(i)))\r
+    {\r
+      return Color.white;\r
+    }\r
+\r
+    currentColour = null;\r
+\r
+    drawSequence(null, lastSeq, lastSeq.findPosition(i), -1, -1);\r
+\r
+    if (currentColour == null)\r
+    {\r
+      return initialCol;\r
+    }\r
+\r
+    return new Color( ( (Integer) currentColour).intValue());\r
+  }\r
+\r
+  /**\r
+   * This is used by the Molecule Viewer to get the accurate colour\r
+   * of the rendered sequence\r
+   */\r
+  boolean overview = false;\r
+\r
+\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param g DOCUMENT ME!\r
+   * @param seq DOCUMENT ME!\r
+   * @param sg DOCUMENT ME!\r
+   * @param start DOCUMENT ME!\r
+   * @param end DOCUMENT ME!\r
+   * @param x1 DOCUMENT ME!\r
+   * @param y1 DOCUMENT ME!\r
+   * @param width DOCUMENT ME!\r
+   * @param height DOCUMENT ME!\r
+   */\r
+  // String type;\r
+  // SequenceFeature sf;\r
+\r
+  SequenceI lastSeq;\r
+  SequenceFeature[] sequenceFeatures;\r
+  int sfSize, sfindex, spos, epos;\r
+\r
+  public void drawSequence(Graphics g, SequenceI seq,\r
+                           int start, int end, int y1)\r
+  {\r
+    if (seq.getSequenceFeatures() == null\r
+        || seq.getSequenceFeatures().length == 0)\r
+    {\r
+      return;\r
+    }\r
+\r
+    if (transparencySetter != null && g != null)\r
+    {\r
+      transparencySetter.setTransparency(g, transparency);\r
+    }\r
+\r
+    if (lastSeq == null || seq != lastSeq || sequenceFeatures!=seq.getSequenceFeatures())\r
+    {\r
+      lastSeq = seq;\r
+      sequenceFeatures = seq.getSequenceFeatures();\r
+      sfSize = sequenceFeatures.length;\r
+    }\r
+\r
+    if (av.featuresDisplayed == null || renderOrder == null)\r
+    {\r
+      findAllFeatures();\r
+      if (av.featuresDisplayed.size() < 1)\r
+      {\r
+        return;\r
+      }\r
+\r
+      sequenceFeatures = seq.getSequenceFeatures();\r
+      sfSize = sequenceFeatures.length;\r
+    }\r
+    if (!overview)\r
+    {\r
+      spos = lastSeq.findPosition(start);\r
+      epos = lastSeq.findPosition(end);\r
+      if (g != null)\r
+      {\r
+        fm = g.getFontMetrics();\r
+      }\r
+    }\r
+    String type;\r
+    for (int renderIndex = 0; renderIndex < renderOrder.length; renderIndex++)\r
+    {\r
+      type = renderOrder[renderIndex];\r
+      if (!av.featuresDisplayed.containsKey(type))\r
+      {\r
+        continue;\r
+      }\r
+\r
+      // loop through all features in sequence to find\r
+      // current feature to render\r
+      for (sfindex = 0; sfindex < sfSize; sfindex++)\r
+      {\r
+        if (!sequenceFeatures[sfindex].type.equals(type))\r
+        {\r
+          continue;\r
+        }\r
+\r
+        if (featureGroups != null\r
+            && sequenceFeatures[sfindex].featureGroup != null\r
+            &&\r
+            featureGroups.containsKey(sequenceFeatures[sfindex].featureGroup)\r
+            &&\r
+            ! ( (Boolean) featureGroups.get(sequenceFeatures[sfindex].\r
+                                            featureGroup)).\r
+            booleanValue())\r
+        {\r
+          continue;\r
+        }\r
+\r
+        if (!overview && (sequenceFeatures[sfindex].getBegin() > epos\r
+                          || sequenceFeatures[sfindex].getEnd() < spos))\r
+        {\r
+          continue;\r
+        }\r
+\r
+        if (overview)\r
+        {\r
+          if (sequenceFeatures[sfindex].begin <= start &&\r
+              sequenceFeatures[sfindex].end >= start)\r
+          {\r
+            currentColour = av.featuresDisplayed.get(sequenceFeatures[sfindex].\r
+                type);\r
+          }\r
+\r
+        }\r
+        else if (sequenceFeatures[sfindex].type.equals("disulfide bond"))\r
+        {\r
+\r
+          renderFeature(g, seq,\r
+                        seq.findIndex(sequenceFeatures[sfindex].begin) - 1,\r
+                        seq.findIndex(sequenceFeatures[sfindex].begin) - 1,\r
+                        new Color( ( (Integer) av.featuresDisplayed.get(\r
+                            sequenceFeatures[sfindex].type)).intValue()),\r
+                        start, end, y1);\r
+          renderFeature(g, seq,\r
+                        seq.findIndex(sequenceFeatures[sfindex].end) - 1,\r
+                        seq.findIndex(sequenceFeatures[sfindex].end) - 1,\r
+                        new Color( ( (Integer) av.featuresDisplayed.get(\r
+                            sequenceFeatures[sfindex].type)).intValue()),\r
+                        start, end, y1);\r
+\r
+        }\r
+        else\r
+        {\r
+          renderFeature(g, seq,\r
+                        seq.findIndex(sequenceFeatures[sfindex].begin) - 1,\r
+                        seq.findIndex(sequenceFeatures[sfindex].end) - 1,\r
+                        getColour(sequenceFeatures[sfindex].type),\r
+                        start, end, y1);\r
+        }\r
+\r
+      }\r
+    }\r
+\r
+    if (transparencySetter != null && g != null)\r
+    {\r
+      transparencySetter.setTransparency(g, 1.0f);\r
+    }\r
+  }\r
+\r
+  char s;\r
+  int i;\r
+  void renderFeature(Graphics g, SequenceI seq,\r
+                     int fstart, int fend, Color featureColour, int start,\r
+                     int end, int y1)\r
+  {\r
+\r
+    if ( ( (fstart <= end) && (fend >= start)))\r
+    {\r
+      if (fstart < start)\r
+      { // fix for if the feature we have starts before the sequence start,\r
+        fstart = start; // but the feature end is still valid!!\r
+      }\r
+\r
+      if (fend >= end)\r
+      {\r
+        fend = end;\r
+      }\r
+\r
+      for (i = fstart; i <= fend; i++)\r
+      {\r
+        s = seq.getCharAt(i);\r
+\r
+        if (jalview.util.Comparison.isGap(s))\r
+        {\r
+          continue;\r
+        }\r
+\r
+        g.setColor(featureColour);\r
+\r
+        g.fillRect( (i - start) * av.charWidth, y1, av.charWidth, av.charHeight);\r
+\r
+        if (!av.validCharWidth)\r
+        {\r
+          continue;\r
+        }\r
+\r
+        g.setColor(Color.white);\r
+        charOffset = (av.charWidth - fm.charWidth(s)) / 2;\r
+        g.drawString(String.valueOf(s),\r
+                     charOffset + (av.charWidth * (i - start)),\r
+                     (y1 + av.charHeight) - av.charHeight / 5); //pady = height / 5;\r
+\r
+      }\r
+    }\r
+  }\r
+\r
+  void findAllFeatures()\r
+  {\r
+    jalview.schemes.UserColourScheme ucs = new\r
+        jalview.schemes.UserColourScheme();\r
+\r
+    av.featuresDisplayed = new Hashtable();\r
+    Vector allfeatures = new Vector();\r
+    for (int i = 0; i < av.alignment.getHeight(); i++)\r
+    {\r
+      SequenceFeature[] features = av.alignment.getSequenceAt(i).\r
+          getSequenceFeatures();\r
+\r
+      if (features == null)\r
+      {\r
+        continue;\r
+      }\r
+\r
+      int index = 0;\r
+      while (index < features.length)\r
+      {\r
+        if (!av.featuresDisplayed.containsKey(features[index].getType()))\r
+        {\r
+          if (getColour(features[index].getType()) == null)\r
+          {\r
+            featureColours.put(features[index].getType(),\r
+                               ucs.createColourFromName(features[index].\r
+                getType()));\r
+          }\r
+\r
+          av.featuresDisplayed.put(features[index].getType(),\r
+                                   new Integer(getColour(features[index].\r
+              getType()).getRGB()));\r
+          allfeatures.addElement(features[index].getType());\r
+        }\r
+        index++;\r
+      }\r
+    }\r
+\r
+    renderOrder = new String[allfeatures.size()];\r
+    Enumeration en = allfeatures.elements();\r
+    int i = allfeatures.size() - 1;\r
+    while (en.hasMoreElements())\r
+    {\r
+      renderOrder[i] = en.nextElement().toString();\r
+      i--;\r
+    }\r
+  }\r
+\r
+  public Color getColour(String featureType)\r
+  {\r
+    return (Color) featureColours.get(featureType);\r
+  }\r
+\r
+  public void addNewFeature(String name, Color col)\r
+  {\r
+\r
+    setColour(name, col);\r
+    if (av.featuresDisplayed == null)\r
+    {\r
+      av.featuresDisplayed = new Hashtable();\r
+    }\r
+\r
+    av.featuresDisplayed.put(name, "NOGROUP");\r
+  }\r
+\r
+  public void setColour(String featureType, Color col)\r
+  {\r
+    featureColours.put(featureType, col);\r
+  }\r
+\r
+  public void setFeaturePriority(Object[][] data)\r
+  {\r
+    // The feature table will display high priority\r
+    // features at the top, but theses are the ones\r
+    // we need to render last, so invert the data\r
+    if (av.featuresDisplayed != null)\r
+    {\r
+      av.featuresDisplayed.clear();\r
+    }\r
+\r
+    renderOrder = new String[data.length];\r
+\r
+    if (data.length > 0)\r
+    {\r
+      for (int i = 0; i < data.length; i++)\r
+      {\r
+        String type = data[i][0].toString();\r
+        setColour(type, (Color) data[i][1]);\r
+        if ( ( (Boolean) data[i][2]).booleanValue())\r
+        {\r
+          av.featuresDisplayed.put(type, new Integer(getColour(type).getRGB()));\r
+        }\r
+\r
+        renderOrder[data.length - i - 1] = type;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+class TransparencySetter\r
+{\r
+  void setTransparency(Graphics g, float value)\r
+  {\r
+     Graphics2D g2 = (Graphics2D) g;\r
+     g2.setComposite(\r
+        AlphaComposite.getInstance(\r
+             AlphaComposite.SRC_OVER, value));\r
+  }\r
+}\r
index 4f698d2..2b742b2 100755 (executable)
@@ -42,6 +42,7 @@ public class Finder
     try
     {
       jbInit();
+
     }
     catch (Exception e)
     {
@@ -61,6 +62,7 @@ public class Finder
         ap.highlightSearchResults(null);
       }
     });
+    textfield.requestFocus();
   }
 
   public void actionPerformed(ActionEvent evt)
@@ -89,43 +91,27 @@ public class Finder
 
   public void createNewGroup_actionPerformed()
   {
-
-    CutAndPasteTransfer cap = new CutAndPasteTransfer(true, null);
-    cap.accept.setLabel("Accept");
-    Dialog dialog = new Dialog(ap.alignFrame, "Enter New Feature Name", true);
-    dialog.add(cap);
-
-    cap.setText(textfield.getText());
-
-    dialog.setBounds(frame.getLocation().x + frame.getSize().width + 5,
-                     frame.getLocation().y + 20, 300, 100);
-    dialog.show();
-
-    String featureName = cap.getText().trim();
-    if (featureName.length() < 1)
-    {
-      return;
-    }
+    SequenceI[] seqs = new SequenceI[searchResults.getSize()];
+    SequenceFeature[] features = new SequenceFeature[searchResults.getSize()];
 
     for (int i = 0; i < searchResults.getSize(); i++)
     {
-      SequenceI seq = searchResults.getResultSequence(i);
-
-      SequenceFeature sf = new SequenceFeature(featureName,
-                                               null, null,
-                                               searchResults.getResultStart(i),
-                                               searchResults.getResultEnd(i),
-                                               "Search Results");
+      seqs[i] = searchResults.getResultSequence(i);
 
-      ap.seqPanel.seqCanvas.getFeatureRenderer().addNewFeature(
-          featureName, new Color(60, 160, 115));
-      seq.addSequenceFeature(sf);
+      features[i] = new SequenceFeature(textfield.getText().trim(),
+                                        "Search Results", null,
+                                        searchResults.getResultStart(i),
+                                        searchResults.getResultEnd(i),
+                                        "Search Results");
     }
 
-    ap.seqPanel.seqCanvas.getFeatureRenderer().featuresAdded();
-    ap.alignFrame.sequenceFeatures.setState(true);
-    av.showSequenceFeatures(true);
-    ap.highlightSearchResults(null);
+    if (ap.seqPanel.seqCanvas.getFeatureRenderer()
+        .createNewFeatures(seqs, features, ap))
+    {
+      ap.alignFrame.sequenceFeatures.setState(true);
+      av.showSequenceFeatures(true);
+      ap.highlightSearchResults(null);
+    }
   }
 
   void doSearch(boolean findAll)
index b35fa6c..4db8054 100755 (executable)
@@ -259,15 +259,18 @@ public class ScalePanel
         sg.setStartRes(res);\r
       }\r
 \r
+      int col;\r
       for (int i = min; i <= max; i++)\r
       {\r
-        if ( (i < sg.getStartRes()) || (i > sg.getEndRes()))\r
+        col = av.getColumnSelection().adjustForHiddenColumns(i);\r
+\r
+        if ( (col < sg.getStartRes()) || (col > sg.getEndRes()))\r
         {\r
-          av.getColumnSelection().removeElement(i);\r
+          av.getColumnSelection().removeElement(col);\r
         }\r
         else\r
         {\r
-          av.getColumnSelection().addElement(i);\r
+          av.getColumnSelection().addElement(col);\r
         }\r
       }\r
 \r
index f4f2cfd..f9304cf 100755 (executable)
@@ -448,7 +448,40 @@ public class SeqPanel
   }\r
 \r
   public void mouseClicked(MouseEvent evt)\r
-  {}\r
+  {\r
+    SequenceI sequence = av.alignment.getSequenceAt(findSeq(evt));\r
+    if (evt.getClickCount() > 1)\r
+    {\r
+      if (av.getSelectionGroup().getSize() == 1\r
+          && av.getSelectionGroup().getEndRes()\r
+          - av.getSelectionGroup().getStartRes() < 2)\r
+      {\r
+        av.setSelectionGroup(null);\r
+      }\r
+\r
+      SequenceFeature[] features = findFeaturesAtRes(\r
+          sequence,\r
+          sequence.findPosition(findRes(evt))\r
+          );\r
+\r
+      if (features != null && features.length > 0)\r
+      {\r
+        SearchResults highlight = new SearchResults();\r
+        highlight.addResult(sequence,\r
+                            features[0].getBegin(),\r
+                            features[0].getEnd());\r
+        seqCanvas.highlightSearchResults(highlight);\r
+      }\r
+      if (features != null && features.length > 0)\r
+      {\r
+        seqCanvas.getFeatureRenderer().amendFeatures(\r
+            new SequenceI[]\r
+            {sequence}, features, false, ap);\r
+\r
+        seqCanvas.highlightSearchResults(null);\r
+      }\r
+    }\r
+  }\r
 \r
   public void mouseReleased(MouseEvent evt)\r
   {\r
@@ -554,6 +587,8 @@ public class SeqPanel
     return seq;\r
   }\r
 \r
+\r
+\r
   public void doMousePressed(MouseEvent evt)\r
   {\r
 \r
@@ -691,18 +726,13 @@ public class SeqPanel
     }\r
 \r
     // use aa to see if the mouse pointer is on a\r
-    if (av.showSequenceFeatures\r
-        && sequence.getSequenceFeatures() != null\r
-        && av.featuresDisplayed != null)\r
-    {\r
-\r
-      Vector allFeatures = getAllFeaturesAtRes(sequence,\r
+    SequenceFeature [] allFeatures = findFeaturesAtRes(sequence,\r
                                                sequence.findPosition(res));\r
 \r
       int index = 0;\r
-      while (index < allFeatures.size())\r
+      while (index < allFeatures.length)\r
       {\r
-        SequenceFeature sf = (SequenceFeature) allFeatures.elementAt(index);\r
+        SequenceFeature sf = allFeatures[index];\r
 \r
         tooltipText.append(sf.getType() + " " + sf.begin + ":" + sf.end);\r
 \r
@@ -723,7 +753,6 @@ public class SeqPanel
 \r
         index++;\r
       }\r
-    }\r
 \r
     if (tooltip == null)\r
     {\r
@@ -735,29 +764,35 @@ public class SeqPanel
     }\r
   }\r
 \r
-  Vector getAllFeaturesAtRes(SequenceI seq, int res)\r
+  SequenceFeature[] findFeaturesAtRes(SequenceI sequence, int res)\r
   {\r
-    Vector allFeatures = new Vector();\r
-    int index = 0;\r
-    if (seq.getSequenceFeatures() != null)\r
+    Vector tmp = new Vector();\r
+    SequenceFeature[] features = sequence.getSequenceFeatures();\r
+    if (features != null)\r
     {\r
-      while (index < seq.getSequenceFeatures().length)\r
+      for (int i = 0; i < features.length; i++)\r
       {\r
-        SequenceFeature sf = seq.getSequenceFeatures()[index];\r
-        if (sf.getBegin() <= res &&\r
-            sf.getEnd() >= res)\r
+        if (av.featuresDisplayed == null\r
+            || !av.featuresDisplayed.containsKey(features[i].getType()))\r
         {\r
-          if (av.featuresDisplayed.containsKey(sf.getType()))\r
-          {\r
-            allFeatures.addElement(sf);\r
-          }\r
+          continue;\r
+        }\r
+\r
+        if ( (features[i].getBegin() <= res) &&\r
+            (features[i].getEnd() >= res))\r
+        {\r
+          tmp.addElement(features[i]);\r
         }\r
-        index++;\r
       }\r
     }\r
-    return allFeatures;\r
+\r
+    features = new SequenceFeature[tmp.size()];\r
+    tmp.copyInto(features);\r
+\r
+    return features;\r
   }\r
 \r
+\r
   Tooltip tooltip;\r
 \r
   public void mouseDragged(MouseEvent evt)\r
@@ -1320,21 +1355,20 @@ public class SeqPanel
     if ( (evt.getModifiers() & InputEvent.BUTTON3_MASK) ==\r
         InputEvent.BUTTON3_MASK)\r
     {\r
-      Vector allFeatures = getAllFeaturesAtRes(sequence,\r
+      SequenceFeature [] allFeatures = findFeaturesAtRes(sequence,\r
                                                sequence.findPosition(res));\r
 \r
       Vector links = null;\r
       if (allFeatures != null)\r
       {\r
-        for (int i = 0; i < allFeatures.size(); i++)\r
+        for (int i = 0; i < allFeatures.length; i++)\r
         {\r
-          SequenceFeature sf = (SequenceFeature) allFeatures.elementAt(i);\r
-          if (sf.links != null)\r
+          if (allFeatures[i].links != null)\r
           {\r
             links = new Vector();\r
-            for (int j = 0; j < sf.links.size(); j++)\r
+            for (int j = 0; j < allFeatures[i].links.size(); j++)\r
             {\r
-              links.addElement(sf.links.elementAt(j));\r
+              links.addElement(allFeatures[i].links.elementAt(j));\r
             }\r
           }\r
         }\r
index ecb3265..aa260c5 100755 (executable)
@@ -40,6 +40,7 @@ public class UserDefinedColours
   MCview.AppletPDBCanvas pdbcanvas;\r
   AppletJmol jmol;\r
 \r
+  Dialog dialog;\r
   Object caller;\r
   String originalLabel;\r
   Color originalColour;\r
@@ -81,6 +82,29 @@ public class UserDefinedColours
     init();\r
   }\r
 \r
+  public UserDefinedColours(FeatureRenderer fr, Frame alignframe)\r
+  {\r
+    caller = fr;\r
+    originalColour = fr.colourPanel.getBackground();\r
+    originalLabel = "Feature Colour";\r
+    setTargetColour(fr.colourPanel.getBackground());\r
+\r
+    setForDialog("Select Feature Colour", alignframe);\r
+  }\r
+\r
+  public UserDefinedColours(Component caller,\r
+                            Color col1,\r
+                            Frame alignframe)\r
+  {\r
+    this.caller = caller;\r
+    originalColour = col1;\r
+    originalLabel = "Select Colour";\r
+    setTargetColour(col1);\r
+\r
+    setForDialog("Select Colour", alignframe);\r
+  }\r
+\r
+\r
   public UserDefinedColours(Object caller,\r
                             String label,\r
                             Color colour)\r
@@ -98,6 +122,28 @@ public class UserDefinedColours
     frame.setSize(420, 200);\r
   }\r
 \r
+  void setForDialog(String title, Frame alignframe)\r
+  {\r
+    init();\r
+    frame.setVisible(false);\r
+    remove(buttonPanel);\r
+    dialog = new Dialog(alignframe, title, true);\r
+\r
+    dialog.add(this);\r
+    this.setSize(400,123);\r
+    okcancelPanel.setBounds(new Rectangle(0, 123, 400, 35));\r
+    int height = 160 + alignframe.getInsets().top + getInsets().bottom;\r
+    int width = 400;\r
+\r
+    dialog.setBounds(alignframe.getBounds().x\r
+              + (alignframe.getSize().width - width) / 2,\r
+              alignframe.getBounds().y\r
+              + (alignframe.getSize().height - height) / 2,\r
+              width, height);\r
+\r
+    dialog.show();\r
+  }\r
+\r
   public void actionPerformed(ActionEvent evt)\r
   {\r
     if (evt.getSource() == okButton)\r
@@ -298,9 +344,17 @@ public class UserDefinedColours
   protected void okButton_actionPerformed()\r
   {\r
     applyButton_actionPerformed();\r
+    if (dialog != null)\r
+      dialog.setVisible(false);\r
+\r
     frame.setVisible(false);\r
   }\r
 \r
+  public Color getColor()\r
+  {\r
+    return new Color(R, G, B);\r
+  }\r
+\r
   protected void applyButton_actionPerformed()\r
   {\r
     if (caller != null)\r
@@ -308,21 +362,26 @@ public class UserDefinedColours
       if (caller instanceof FeatureSettings)\r
       {\r
         ( (FeatureSettings) caller).setUserColour\r
-            (originalLabel, new Color(R, G, B));\r
+            (originalLabel, getColor());\r
       }\r
       else if (caller instanceof AnnotationColourChooser)\r
       {\r
         if (originalLabel.equals("Min Colour"))\r
         {\r
           ( (AnnotationColourChooser) caller).minColour_actionPerformed\r
-              (new Color(R, G, B));\r
+              (getColor());\r
         }\r
         else\r
         {\r
           ( (AnnotationColourChooser) caller).maxColour_actionPerformed\r
-              (new Color(R, G, B));\r
+              (getColor());\r
         }\r
       }\r
+      else if(caller instanceof FeatureRenderer)\r
+      {\r
+        ((FeatureRenderer)caller).colourPanel.setBackground(getColor());\r
+      }\r
+\r
       return;\r
     }\r
 \r
@@ -384,6 +443,15 @@ public class UserDefinedColours
               (originalColour);\r
         }\r
       }\r
+      else if (caller instanceof FeatureRenderer)\r
+      {\r
+        ( (FeatureRenderer) caller).colourPanel.setBackground(originalColour);\r
+\r
+      }\r
+\r
+      if(dialog!=null)\r
+        dialog.setVisible(false);\r
+\r
       frame.setVisible(false);\r
       return;\r
     }\r