import jalview.schemes.FeatureColour;
import jalview.util.ColorUtils;
import jalview.util.MessageManager;
+import jalview.util.dialogrunner.RunResponse;
import java.awt.BorderLayout;
import java.awt.Color;
* @param create
* true to create features, false to amend or delete
* @param alignPanel
- * @return
+ * @param responseHandler
+ * boolean true RunResponse is run if features are created
*/
protected boolean amendFeatures(final List<SequenceI> sequences,
final List<SequenceFeature> features, boolean create,
- final AlignmentPanel alignPanel)
+ final AlignmentPanel alignPanel, final Runnable responseHandler)
{
featureIndex = 0;
highlight.addResult(sequences.get(0), sf.getBegin(),
sf.getEnd());
- alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(
- highlight, false);
+ alignPanel.getSeqPanel().seqCanvas
+ .highlightSearchResults(highlight, false);
}
FeatureColourI col = getFeatureStyle(name.getText());
if (col == null)
{ sequences.get(0).getName() });
/*
- * show the dialog
+ * register responses and show the dialog
*/
- int reply = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
- mainPanel, title, JvOptionPane.YES_NO_CANCEL_OPTION,
- JvOptionPane.QUESTION_MESSAGE, null, options,
- MessageManager.getString("action.ok"));
-
- FeaturesFile ffile = new FeaturesFile();
-
- 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)
- {
- /*
- * update default values only if creating using default values
- */
- if (useLastDefaults)
- {
- lastFeatureAdded = enteredType;
- lastFeatureGroupAdded = enteredGroup;
- // TODO: determine if the null feature group is valid
- if (lastFeatureGroupAdded.length() < 1)
- {
- lastFeatureGroupAdded = null;
- }
- }
- }
-
- if (!create)
- {
- SequenceFeature sf = features.get(featureIndex);
-
- if (reply == JvOptionPane.NO_OPTION)
- {
- /*
- * 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 refreshSettings = (!featureType.equals(enteredType) || !featureGroup
- .equals(enteredGroup));
- refreshSettings |= (fcol != oldcol);
- setColour(enteredType, fcol);
- int newBegin = sf.begin;
- int newEnd = sf.end;
- try
- {
- newBegin = ((Integer) start.getValue()).intValue();
- newEnd = ((Integer) end.getValue()).intValue();
- } catch (NumberFormatException ex)
- {
- // JSpinner doesn't accept invalid format data :-)
- }
-
- /*
- * 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();
- }
- }
- }
- else
- // NEW FEATURES ADDED
- {
- if (reply == JvOptionPane.OK_OPTION && enteredType.length() > 0)
- {
- for (int i = 0; i < sequences.size(); i++)
- {
- SequenceFeature sf = features.get(i);
- SequenceFeature sf2 = new SequenceFeature(enteredType,
- enteredDescription, sf.getBegin(), sf.getEnd(),
- enteredGroup);
- ffile.parseDescriptionHTML(sf2, false);
- sequences.get(i).addSequenceFeature(sf2);
- }
-
- setColour(enteredType, fcol);
-
- featuresAdded();
-
- alignPanel.paintAlignment(true, true);
-
- return true;
- }
- else
- {
- return false;
- }
- }
-
- alignPanel.paintAlignment(true, true);
+ JvOptionPane.newOptionDialog(Desktop.desktop).response(
+ new RunResponse(JvOptionPane.OK_OPTION)
+ {
+ public void run()
+ {
+ final String enteredType = name.getText().trim();
+ final String enteredGroup = group.getText().trim();
+ final String enteredDescription = description.getText()
+ .replaceAll("\n", " ");
+ if (enteredType.length() > 0)
+
+ {
+ /*
+ * update default values only if creating using default values
+ */
+ if (useLastDefaults)
+ {
+ lastFeatureAdded = enteredType;
+ lastFeatureGroupAdded = enteredGroup;
+ // TODO: determine if the null feature group is valid
+ if (lastFeatureGroupAdded.length() < 1)
+ {
+ lastFeatureGroupAdded = null;
+ }
+ }
+ }
+
+ if (create)
+ {
+ // NEW FEATURES ADDED
+ if (enteredType.length() > 0)
+ {
+ for (int i = 0; i < sequences.size(); i++)
+ {
+ SequenceFeature sf = features.get(i);
+ SequenceFeature sf2 = new SequenceFeature(enteredType,
+ enteredDescription, sf.getBegin(),
+ sf.getEnd(), enteredGroup);
+ new FeaturesFile().parseDescriptionHTML(sf2, false);
+ sequences.get(i).addSequenceFeature(sf2);
+ }
+
+ setColour(enteredType, fcol);
+
+ featuresAdded();
+
+ responseHandler.run();
+ }
+ } else {
+ SequenceFeature sf = features.get(featureIndex);
+ /*
+ * Feature amended - 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 = (!featureType.equals(enteredType)
+ || !featureGroup.equals(enteredGroup));
+ refreshSettings |= (fcol != oldcol);
+ setColour(enteredType, fcol);
+ int newBegin = sf.begin;
+ int newEnd = sf.end;
+ try
+ {
+ newBegin = ((Integer) start.getValue()).intValue();
+ newEnd = ((Integer) end.getValue()).intValue();
+ } catch (NumberFormatException ex)
+ {
+ // JSpinner doesn't accept invalid format data :-)
+ }
+
+ /*
+ * 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);
+ new FeaturesFile().parseDescriptionHTML(newSf, false);
+ // amend features dialog only updates one sequence at a time
+ sequences.get(0).addSequenceFeature(newSf);
+
+ if (refreshSettings)
+ {
+ featuresAdded();
+ }
+ }
+ alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(null, false);
+ alignPanel.paintAlignment(true, true);
+ }
+ }).response(new RunResponse(JvOptionPane.NO_OPTION)
+ {
+ public void run()
+ {
+ SequenceFeature sf = features.get(featureIndex);
+ /*
+ * NO_OPTION corresponds to the Delete button
+ */
+ sequences.get(0).getDatasetSequence().deleteFeature(sf);
+ // update Feature Settings for removal of feature / group
+ featuresAdded();
+ alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(null, false);
+ alignPanel.paintAlignment(true, true);
+ }
+ }).defaultResponse(new Runnable()
+ {
+ public void run()
+ {
+ alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(null, false);
+ alignPanel.paintAlignment(true, true);
+ }
+ }).showInternalDialog(mainPanel, title,
+ JvOptionPane.YES_NO_CANCEL_OPTION,
+ JvOptionPane.QUESTION_MESSAGE, null, options,
+ MessageManager.getString("action.ok"));
return true;
}