JAL-3116 parse EMBL XML with JAXB (todo: update unit tests)
[jalview.git] / src / jalview / gui / FeatureRenderer.java
index c0e3e73..46f574e 100644 (file)
@@ -41,9 +41,9 @@ import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.List;
 
 import javax.swing.JColorChooser;
@@ -64,8 +64,8 @@ import javax.swing.event.DocumentListener;
  * @author $author$
  * @version $Revision$
  */
-public class FeatureRenderer extends
-        jalview.renderer.seqfeatures.FeatureRenderer
+public class FeatureRenderer
+        extends jalview.renderer.seqfeatures.FeatureRenderer
 {
   /*
    * defaults for creating a new feature are the last created
@@ -180,15 +180,15 @@ public class FeatureRenderer extends
     final JSpinner end = new JSpinner();
     start.setPreferredSize(new Dimension(80, 20));
     end.setPreferredSize(new Dimension(80, 20));
-    final FeatureRenderer me = this;
     final JLabel colour = new JLabel();
     colour.setOpaque(true);
     // colour.setBorder(BorderFactory.createEtchedBorder());
     colour.setMaximumSize(new Dimension(30, 16));
     colour.addMouseListener(new MouseAdapter()
     {
-      FeatureColourChooser fcc = null;
-
+      /*
+       * open colour chooser on click in colour panel
+       */
       @Override
       public void mousePressed(MouseEvent evt)
       {
@@ -205,28 +205,26 @@ public class FeatureRenderer extends
         }
         else
         {
-          if (fcc == null)
+          /*
+           * variable colour dialog - on OK, refetch the updated
+           * feature colour and update this display
+           */
+          final String ft = features.get(featureIndex).getType();
+          final String type = ft == null ? lastFeatureAdded : ft;
+          FeatureTypeSettings fcc = new FeatureTypeSettings(
+                  FeatureRenderer.this, type);
+          fcc.setRequestFocusEnabled(true);
+          fcc.requestFocus();
+          fcc.addActionListener(new ActionListener()
           {
-            final String ft = features.get(featureIndex).getType();
-            final String type = ft == null ? lastFeatureAdded : ft;
-            fcc = new FeatureColourChooser(me, type);
-            fcc.setRequestFocusEnabled(true);
-            fcc.requestFocus();
-
-            fcc.addActionListener(new ActionListener()
+            @Override
+            public void actionPerformed(ActionEvent e)
             {
-
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                fcol = fcc.getLastColour();
-                fcc = null;
-                setColour(type, fcol);
-                updateColourButton(mainPanel, colour, fcol);
-              }
-            });
-
-          }
+              fcol = FeatureRenderer.this.getFeatureStyle(ft);
+              setColour(type, fcol);
+              updateColourButton(mainPanel, colour, fcol);
+            }
+          });
         }
       }
     });
@@ -235,20 +233,26 @@ public class FeatureRenderer extends
     if (!create && features.size() > 1)
     {
       /*
-       * more than one feature at selected position - add a drop-down
-       * to choose the feature to amend
+       * more than one feature at selected position - 
+       * add a drop-down to choose the feature to amend
+       * space pad text if necessary to make entries distinct
        */
       gridPanel = new JPanel(new GridLayout(4, 1));
       JPanel choosePanel = new JPanel();
-      choosePanel.add(new JLabel(MessageManager
-              .getString("label.select_feature")
-              + ":"));
-      final JComboBox<String> overlaps = new JComboBox<String>();
+      choosePanel.add(new JLabel(
+              MessageManager.getString("label.select_feature") + ":"));
+      final JComboBox<String> overlaps = new JComboBox<>();
+      List<String> added = new ArrayList<>();
       for (SequenceFeature sf : features)
       {
-        String text = sf.getType() + "/" + sf.getBegin() + "-"
-                + sf.getEnd() + " (" + sf.getFeatureGroup() + ")";
+        String text = String.format("%s/%d-%d (%s)", sf.getType(),
+                sf.getBegin(), sf.getEnd(), sf.getFeatureGroup());
+        while (added.contains(text))
+        {
+          text += " ";
+        }
         overlaps.addItem(text);
+        added.add(text);
       }
       choosePanel.add(overlaps);
 
@@ -272,14 +276,14 @@ public class FeatureRenderer extends
             highlight.addResult(sequences.get(0), sf.getBegin(),
                     sf.getEnd());
 
-            alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(highlight);
-
+            alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(
+                    highlight, false);
           }
           FeatureColourI col = getFeatureStyle(name.getText());
           if (col == null)
           {
-            col = new FeatureColour(ColorUtils
-                    .createColourFromName(name.getText()));
+            col = new FeatureColour(
+                    ColorUtils.createColourFromName(name.getText()));
           }
           oldcol = fcol = col;
           updateColourButton(mainPanel, colour, col);
@@ -316,9 +320,8 @@ public class FeatureRenderer extends
     mainPanel.add(gridPanel, BorderLayout.NORTH);
 
     JPanel descriptionPanel = new JPanel();
-    descriptionPanel.add(new JLabel(MessageManager
-            .getString("label.description:"),
-            JLabel.RIGHT));
+    descriptionPanel.add(new JLabel(
+            MessageManager.getString("label.description:"), JLabel.RIGHT));
     description.setFont(JvSwingUtils.getTextAreaFont());
     description.setLineWrap(true);
     descriptionPanel.add(new JScrollPane(description));
@@ -372,10 +375,11 @@ public class FeatureRenderer extends
           MessageManager.getString("action.cancel") };
     }
 
-    String title = create ? MessageManager
-            .getString("label.create_new_sequence_features")
+    String title = create
+            ? MessageManager.getString("label.create_new_sequence_features")
             : MessageManager.formatMessage("label.amend_delete_features",
-                    new String[] { sequences.get(0).getName() });
+                    new String[]
+                    { sequences.get(0).getName() });
 
     /*
      * show the dialog
@@ -449,24 +453,11 @@ public class FeatureRenderer extends
          * (to ensure integrity of SequenceFeatures data store)
          */
         sequences.get(0).deleteFeature(sf);
-        SequenceFeature newSf = new SequenceFeature(enteredType,
-                enteredDescription, newBegin, newEnd, sf.getScore(),
-                enteredGroup);
-        // ensure any additional properties are copied
-        if (sf.otherDetails != null)
-        {
-          newSf.otherDetails = new HashMap<String, Object>(sf.otherDetails);
-        }
+        SequenceFeature newSf = new SequenceFeature(sf, enteredType,
+                newBegin, newEnd, enteredGroup, sf.getScore());
+        newSf.setDescription(enteredDescription);
         ffile.parseDescriptionHTML(newSf, false);
-        // add any additional links not parsed from description
-        if (sf.links != null)
-        {
-          for (String link : sf.links)
-          {
-            newSf.addLink(link);
-          }
-        }
-        // amend features only gets one sequence to act on
+        // amend features dialog only updates one sequence at a time
         sequences.get(0).addSequenceFeature(newSf);
 
         if (refreshSettings)
@@ -485,16 +476,16 @@ public class FeatureRenderer extends
           SequenceFeature sf = features.get(i);
           SequenceFeature sf2 = new SequenceFeature(enteredType,
                   enteredDescription, sf.getBegin(), sf.getEnd(),
-                  Float.NaN, enteredGroup);
-          sequences.get(i).addSequenceFeature(sf2);
+                  enteredGroup);
           ffile.parseDescriptionHTML(sf2, false);
+          sequences.get(i).addSequenceFeature(sf2);
         }
 
         setColour(enteredType, fcol);
 
         featuresAdded();
 
-        alignPanel.paintAlignment(true);
+        alignPanel.paintAlignment(true, true);
 
         return true;
       }
@@ -504,7 +495,7 @@ public class FeatureRenderer extends
       }
     }
 
-    alignPanel.paintAlignment(true);
+    alignPanel.paintAlignment(true, true);
 
     return true;
   }
@@ -541,7 +532,8 @@ public class FeatureRenderer extends
     {
       String msg = MessageManager.formatMessage("label.warning_hidden",
               MessageManager.getString("label.group"), group);
-      JvOptionPane.showMessageDialog(panel, msg, "", JvOptionPane.OK_OPTION);
+      JvOptionPane.showMessageDialog(panel, msg, "",
+              JvOptionPane.OK_OPTION);
     }
   }