X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FFeatureRenderer.java;h=17f5a7186000150e0a72803bdbbccdc23fd4a2ba;hb=90ae01c1c1504e0ae42817f78116f1d35b317c47;hp=0921a48e97522dc3609e90bd5f87f07c73ec2fa5;hpb=d3792892a182540d35193a6aa93072197955e2a5;p=jalview.git
diff --git a/src/jalview/gui/FeatureRenderer.java b/src/jalview/gui/FeatureRenderer.java
index 0921a48..17f5a71 100644
--- a/src/jalview/gui/FeatureRenderer.java
+++ b/src/jalview/gui/FeatureRenderer.java
@@ -41,6 +41,7 @@ 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.List;
@@ -63,9 +64,17 @@ 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
+ * feature type and group
+ */
+ static String lastFeatureAdded = "feature_1";
+
+ static String lastFeatureGroupAdded = "Jalview";
+
Color resBoxColour;
AlignmentPanel ap;
@@ -87,16 +96,6 @@ public class FeatureRenderer extends
}
}
- // // /////////////
- // // Feature Editing Dialog
- // // Will be refactored in next release.
-
- static String lastFeatureAdded;
-
- static String lastFeatureGroupAdded;
-
- static String lastDescriptionAdded;
-
FeatureColourI oldcol, fcol;
int featureIndex = 0;
@@ -109,27 +108,25 @@ public class FeatureRenderer extends
*
Create sequence feature from pop-up menu on selected region
* Create features for pattern matches from Find
*
+ * If the supplied feature type is null, show (and update on confirm) the type
+ * and group of the last new feature created (with initial defaults of
+ * "feature_1" and "Jalview").
*
* @param sequences
* the sequences features are to be created on (if creating
* features), or a single sequence (if amending features)
* @param features
* the current features at the position (if amending), or template
- * new features with start/end position set (if creating)
+ * new feature(s) with start/end position set (if creating)
* @param create
* true to create features, false to amend or delete
- * @param featureType
- * the feature type to set on new features; if null, defaults to the
- * type of the last new feature created if any, failing that to
- * "feature_1"
* @param alignPanel
* @return
*/
protected boolean amendFeatures(final List sequences,
final List features, boolean create,
- final AlignmentPanel alignPanel, String featureType)
+ final AlignmentPanel alignPanel)
{
-
featureIndex = 0;
final JPanel mainPanel = new JPanel(new BorderLayout());
@@ -203,7 +200,7 @@ public class FeatureRenderer extends
if (col != null)
{
fcol = new FeatureColour(col);
- updateColourButton(mainPanel, colour, new FeatureColour(col));
+ updateColourButton(mainPanel, colour, fcol);
}
}
else
@@ -238,20 +235,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")
- + ":"));
+ choosePanel.add(new JLabel(
+ MessageManager.getString("label.select_feature") + ":"));
final JComboBox overlaps = new JComboBox();
+ List 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);
@@ -275,14 +278,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);
@@ -319,9 +322,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));
@@ -344,54 +346,24 @@ public class FeatureRenderer extends
mainPanel.add(descriptionPanel, BorderLayout.CENTER);
}
+ /*
+ * default feature type and group to that of the first feature supplied,
+ * or to the last feature created if not supplied (null value)
+ */
SequenceFeature firstFeature = features.get(0);
- if (featureType != null)
- {
- lastFeatureAdded = featureType;
- }
- else
- {
- if (lastFeatureAdded == null)
- {
- if (firstFeature.type != null)
- {
- lastFeatureAdded = firstFeature.type;
- }
- else
- {
- lastFeatureAdded = "feature_1";
- }
- }
- }
-
- if (lastFeatureGroupAdded == null)
- {
- if (firstFeature.featureGroup != null)
- {
- lastFeatureGroupAdded = firstFeature.featureGroup;
- }
- else
- {
- lastFeatureGroupAdded = "Jalview";
- }
- }
-
- if (create)
- {
- name.setText(lastFeatureAdded);
- group.setText(lastFeatureGroupAdded);
- }
- else
- {
- name.setText(firstFeature.getType());
- group.setText(firstFeature.getFeatureGroup());
- }
+ boolean useLastDefaults = firstFeature.getType() == null;
+ final String featureType = useLastDefaults ? lastFeatureAdded
+ : firstFeature.getType();
+ final String featureGroup = useLastDefaults ? lastFeatureGroupAdded
+ : firstFeature.getFeatureGroup();
+ name.setText(featureType);
+ group.setText(featureGroup);
start.setValue(new Integer(firstFeature.getBegin()));
end.setValue(new Integer(firstFeature.getEnd()));
description.setText(firstFeature.getDescription());
updateColourButton(mainPanel, colour,
- (oldcol = fcol = getFeatureStyle(name.getText())));
+ (oldcol = fcol = getFeatureStyle(featureType)));
Object[] options;
if (!create)
{
@@ -405,10 +377,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
@@ -420,15 +393,24 @@ public class FeatureRenderer extends
FeaturesFile ffile = new FeaturesFile();
- if (reply == JvOptionPane.OK_OPTION && name.getText().length() > 0)
+ final String enteredType = name.getText().trim();
+ final String enteredGroup = group.getText().trim();
+ final String enteredDescription = description.getText().replaceAll("\n", " ");
+
+ if (reply == JvOptionPane.OK_OPTION && enteredType.length() > 0)
{
- lastFeatureAdded = name.getText().trim();
- lastFeatureGroupAdded = group.getText().trim();
- lastDescriptionAdded = description.getText().replaceAll("\n", " ");
- // TODO: determine if the null feature group is valid
- if (lastFeatureGroupAdded.length() < 1)
+ /*
+ * update default values only if creating using default values
+ */
+ if (useLastDefaults)
{
- lastFeatureGroupAdded = null;
+ lastFeatureAdded = enteredType;
+ lastFeatureGroupAdded = enteredGroup;
+ // TODO: determine if the null feature group is valid
+ if (lastFeatureGroupAdded.length() < 1)
+ {
+ lastFeatureGroupAdded = null;
+ }
}
}
@@ -449,25 +431,37 @@ public class FeatureRenderer extends
{
/*
* YES_OPTION corresponds to the Amend button
+ * need to refresh Feature Settings if type, group or colour changed;
+ * note we don't force the feature to be visible - the user has been
+ * warned if a hidden feature type or group was entered
*/
- boolean refreshSettings = (!lastFeatureAdded.equals(sf.type) || !lastFeatureGroupAdded
- .equals(sf.featureGroup));
+ boolean refreshSettings = (!featureType.equals(enteredType) || !featureGroup
+ .equals(enteredGroup));
refreshSettings |= (fcol != oldcol);
- sf.type = lastFeatureAdded;
- sf.featureGroup = lastFeatureGroupAdded;
- sf.description = lastDescriptionAdded;
-
- setColour(sf.type, fcol);
-
+ setColour(enteredType, fcol);
+ int newBegin = sf.begin;
+ int newEnd = sf.end;
try
{
- sf.begin = ((Integer) start.getValue()).intValue();
- sf.end = ((Integer) end.getValue()).intValue();
+ newBegin = ((Integer) start.getValue()).intValue();
+ newEnd = ((Integer) end.getValue()).intValue();
} catch (NumberFormatException ex)
{
+ // JSpinner doesn't accept invalid format data :-)
}
- ffile.parseDescriptionHTML(sf, false);
+ /*
+ * replace the feature by deleting it and adding a new one
+ * (to ensure integrity of SequenceFeatures data store)
+ */
+ sequences.get(0).deleteFeature(sf);
+ SequenceFeature newSf = new SequenceFeature(sf, enteredType,
+ newBegin, newEnd, enteredGroup, sf.getScore());
+ newSf.setDescription(enteredDescription);
+ ffile.parseDescriptionHTML(newSf, false);
+ // amend features dialog only updates one sequence at a time
+ sequences.get(0).addSequenceFeature(newSf);
+
if (refreshSettings)
{
featuresAdded();
@@ -477,20 +471,19 @@ public class FeatureRenderer extends
else
// NEW FEATURES ADDED
{
- if (reply == JvOptionPane.OK_OPTION && lastFeatureAdded.length() > 0)
+ if (reply == JvOptionPane.OK_OPTION && enteredType.length() > 0)
{
for (int i = 0; i < sequences.size(); i++)
{
SequenceFeature sf = features.get(i);
- sf.type = lastFeatureAdded;
- // fix for JAL-1538 - always set feature group here
- sf.featureGroup = lastFeatureGroupAdded;
- sf.description = lastDescriptionAdded;
- sequences.get(i).addSequenceFeature(sf);
- ffile.parseDescriptionHTML(sf, false);
+ SequenceFeature sf2 = new SequenceFeature(enteredType,
+ enteredDescription, sf.getBegin(), sf.getEnd(),
+ enteredGroup);
+ ffile.parseDescriptionHTML(sf2, false);
+ sequences.get(i).addSequenceFeature(sf2);
}
- setColour(lastFeatureAdded, fcol);
+ setColour(enteredType, fcol);
featuresAdded();
@@ -541,7 +534,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);
}
}