X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FFeatureRenderer.java;h=ac56590446bbb586fd553c8bc3a512c32cffe75d;hb=ffa5c07d90b4a933762a5d9faa0578c11693d63a;hp=b33ada2c6320ea03b34dc1d32940f1ec79b65c32;hpb=a42904684c75b2729d763af933e5a991a3424f67;p=jalview.git
diff --git a/src/jalview/gui/FeatureRenderer.java b/src/jalview/gui/FeatureRenderer.java
index b33ada2..ac56590 100644
--- a/src/jalview/gui/FeatureRenderer.java
+++ b/src/jalview/gui/FeatureRenderer.java
@@ -43,7 +43,6 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Comparator;
-import java.util.HashMap;
import java.util.List;
import javax.swing.JColorChooser;
@@ -55,6 +54,8 @@ import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
/**
* DOCUMENT ME!
@@ -65,6 +66,14 @@ import javax.swing.SwingConstants;
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;
@@ -86,16 +95,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;
@@ -108,32 +107,73 @@ 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());
+
final JTextField name = new JTextField(25);
- final JTextField source = new JTextField(25);
+ name.getDocument().addDocumentListener(new DocumentListener()
+ {
+ @Override
+ public void insertUpdate(DocumentEvent e)
+ {
+ warnIfTypeHidden(mainPanel, name.getText());
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e)
+ {
+ warnIfTypeHidden(mainPanel, name.getText());
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e)
+ {
+ warnIfTypeHidden(mainPanel, name.getText());
+ }
+ });
+
+ final JTextField group = new JTextField(25);
+ group.getDocument().addDocumentListener(new DocumentListener()
+ {
+ @Override
+ public void insertUpdate(DocumentEvent e)
+ {
+ warnIfGroupHidden(mainPanel, group.getText());
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e)
+ {
+ warnIfGroupHidden(mainPanel, group.getText());
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e)
+ {
+ warnIfGroupHidden(mainPanel, group.getText());
+ }
+ });
+
final JTextArea description = new JTextArea(3, 25);
final JSpinner start = new JSpinner();
final JSpinner end = new JSpinner();
@@ -159,7 +199,7 @@ public class FeatureRenderer extends
if (col != null)
{
fcol = new FeatureColour(col);
- updateColourButton(mainPanel, colour, new FeatureColour(col));
+ updateColourButton(mainPanel, colour, fcol);
}
}
else
@@ -223,7 +263,7 @@ public class FeatureRenderer extends
SequenceFeature sf = features.get(index);
name.setText(sf.getType());
description.setText(sf.getDescription());
- source.setText(sf.getFeatureGroup());
+ group.setText(sf.getFeatureGroup());
start.setValue(new Integer(sf.getBegin()));
end.setValue(new Integer(sf.getEnd()));
@@ -247,8 +287,6 @@ public class FeatureRenderer extends
gridPanel.add(choosePanel);
}
- // ////////
- // ////////////////////////////////////
JPanel namePanel = new JPanel();
gridPanel.add(namePanel);
@@ -260,7 +298,7 @@ public class FeatureRenderer extends
gridPanel.add(groupPanel);
groupPanel.add(new JLabel(MessageManager.getString("label.group:"),
JLabel.RIGHT));
- groupPanel.add(source);
+ groupPanel.add(group);
JPanel colourPanel = new JPanel();
gridPanel.add(colourPanel);
@@ -302,54 +340,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);
- source.setText(lastFeatureGroupAdded);
- }
- else
- {
- name.setText(firstFeature.getType());
- source.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)
{
@@ -378,15 +386,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 = source.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;
+ }
}
}
@@ -400,19 +417,21 @@ public class FeatureRenderer extends
* NO_OPTION corresponds to the Delete button
*/
sequences.get(0).getDatasetSequence().deleteFeature(sf);
+ // update Feature Settings for removal of feature / group
+ featuresAdded();
}
else if (reply == JvOptionPane.YES_OPTION)
{
/*
* 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 typeChanged = !lastFeatureAdded.equals(sf.type);
- String newType = lastFeatureAdded;
- String newFeatureGroup = lastFeatureGroupAdded;
- String newDescription = lastDescriptionAdded;
-
- setColour(newType, fcol);
- getFeaturesDisplayed().setVisible(newType);
+ boolean refreshSettings = (!featureType.equals(enteredType) || !featureGroup
+ .equals(enteredGroup));
+ refreshSettings |= (fcol != oldcol);
+ setColour(enteredType, fcol);
int newBegin = sf.begin;
int newEnd = sf.end;
try
@@ -429,56 +448,37 @@ public class FeatureRenderer extends
* (to ensure integrity of SequenceFeatures data store)
*/
sequences.get(0).deleteFeature(sf);
- SequenceFeature newSf = new SequenceFeature(newType,
- newDescription, newBegin, newEnd, sf.getScore(),
- newFeatureGroup);
- // ensure any additional properties are copied
- if (sf.otherDetails != null)
- {
- newSf.otherDetails = new HashMap(sf.otherDetails);
- }
+ SequenceFeature newSf = new SequenceFeature(sf, newBegin, newEnd,
+ enteredGroup, sf.getScore());
+ sf.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 (typeChanged)
+ if (refreshSettings)
{
- findAllFeatures();
+ featuresAdded();
}
}
}
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);
}
- if (lastFeatureGroupAdded != null)
- {
- setGroupVisibility(lastFeatureGroupAdded, true);
- }
- setColour(lastFeatureAdded, fcol);
- setVisible(lastFeatureAdded);
+ setColour(enteredType, fcol);
- findAllFeatures(false);
+ featuresAdded();
alignPanel.paintAlignment(true);
@@ -496,6 +496,42 @@ public class FeatureRenderer extends
}
/**
+ * Show a warning message if the entered type is one that is currently hidden
+ *
+ * @param panel
+ * @param type
+ */
+ protected void warnIfTypeHidden(JPanel panel, String type)
+ {
+ if (getRenderOrder().contains(type))
+ {
+ if (!showFeatureOfType(type))
+ {
+ String msg = MessageManager.formatMessage("label.warning_hidden",
+ MessageManager.getString("label.feature_type"), type);
+ JvOptionPane.showMessageDialog(panel, msg, "",
+ JvOptionPane.OK_OPTION);
+ }
+ }
+ }
+
+ /**
+ * Show a warning message if the entered group is one that is currently hidden
+ *
+ * @param panel
+ * @param group
+ */
+ protected void warnIfGroupHidden(JPanel panel, String group)
+ {
+ if (featureGroups.containsKey(group) && !featureGroups.get(group))
+ {
+ String msg = MessageManager.formatMessage("label.warning_hidden",
+ MessageManager.getString("label.group"), group);
+ JvOptionPane.showMessageDialog(panel, msg, "", JvOptionPane.OK_OPTION);
+ }
+ }
+
+ /**
* update the amend feature button dependent on the given style
*
* @param bigPanel