X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FJvOptionPane.java;h=bf15b865f405dfdec0f834b423df69fa12fa34d9;hb=aa96618cbd41b40e2377f3f1f105aea90a5a86e0;hp=f0bd8005eb3da1f3a00c315fc8e266171f028a50;hpb=406e7b1a013740e38221de3a0621232aa229093e;p=jalview.git diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index f0bd800..bf15b86 100644 --- a/src/jalview/gui/JvOptionPane.java +++ b/src/jalview/gui/JvOptionPane.java @@ -21,26 +21,25 @@ package jalview.gui; -import jalview.util.dialogrunner.DialogRunner; +import jalview.util.Platform; import jalview.util.dialogrunner.DialogRunnerI; -import jalview.util.dialogrunner.RunResponse; import java.awt.Component; import java.awt.HeadlessException; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.swing.Icon; import javax.swing.JOptionPane; import javax.swing.JPanel; -public class JvOptionPane extends JOptionPane - implements DialogRunnerI, PropertyChangeListener +public class JvOptionPane extends JOptionPane implements DialogRunnerI, + PropertyChangeListener { - // BH 2018 no changes needed here. - private static final long serialVersionUID = -3019167117756785229L; private static Object mockResponse = JvOptionPane.CANCEL_OPTION; @@ -49,10 +48,17 @@ public class JvOptionPane extends JOptionPane private Component parentComponent; - public JvOptionPane(final Component parentComponent) + private Map callbacks = new HashMap<>(); + + /* + * JalviewJS reports user choice in the dialog as the selected + * option (text); this list allows conversion to index (int) + */ + List ourOptions; + + public JvOptionPane(final Component parent) { - - this.parentComponent = parentComponent; + this.parentComponent = Platform.isJS() ? this : parent; } public static int showConfirmDialog(Component parentComponent, @@ -482,6 +488,25 @@ public class JvOptionPane extends JOptionPane } /** + * adds inital selection value + * + * @param message + * @param initialSelectionValue + * @return + */ + public static String showInputDialog(Object message, + Object initialSelectionValue) + { + if (!isInteractiveMode()) + { + return getMockResponse().toString(); + } + + // AnnotationPanel character option + + return JOptionPane.showInputDialog(message, initialSelectionValue); + } + /** * centered on parent * * @param parentComponent @@ -518,6 +543,27 @@ public class JvOptionPane extends JOptionPane initialSelectionValue) : getMockResponse().toString(); } + + + /** + * input with initial selection + * + * @param parentComponent + * @param message + * @param initialSelectionValue + * @return + */ + public static String showInputDialog(Component parentComponent, + Object message, Object initialSelectionValue) + { + + // AnnotationPanel + + return isInteractiveMode() + ? JOptionPane.showInputDialog(parentComponent, message, + initialSelectionValue) + : getMockResponse().toString(); + } /** * @@ -664,39 +710,33 @@ public class JvOptionPane extends JOptionPane return interactiveMode; } - public static void setInteractiveMode(boolean interactiveMode) + public static void setInteractiveMode(boolean interactive) { - JvOptionPane.interactiveMode = interactiveMode; + JvOptionPane.interactiveMode = interactive; } - @SuppressWarnings("unused") private static String getPrefix(int messageType) { - String prefix = ""; // JavaScript only - - if (/** @j2sNative true || */ - false) + String prefix = ""; + + // JavaScript only + if (Platform.isJS()) { switch (messageType) { - default: - case JvOptionPane.INFORMATION_MESSAGE: - prefix = "Note: "; - break; case JvOptionPane.WARNING_MESSAGE: prefix = "WARNING! "; break; case JvOptionPane.ERROR_MESSAGE: - prefix = "ERRROR! "; + prefix = "ERROR! "; break; + default: + prefix = "Note: "; } } return prefix; } - DialogRunner runner = new DialogRunner(this); - - private List ourOptions; /** * create a new option dialog that can be used to register responses - along * lines of showOptionDialog @@ -723,7 +763,7 @@ public class JvOptionPane extends JOptionPane if (!isInteractiveMode()) { - runner.firstRun((int) getMockResponse()); + handleResponse(getMockResponse()); } // two uses: // @@ -739,25 +779,25 @@ public class JvOptionPane extends JOptionPane // // 2) UserDefinedColors warning about saving over a name already defined // - Component parent; - /** - * @j2sNative - * parent = this; - */ - { - parent = parentComponent; - } - ; + ourOptions = Arrays.asList(options); - int response = JOptionPane.showOptionDialog(parent, message, title, + + int response = JOptionPane.showOptionDialog(parentComponent, message, title, optionType, messageType, icon, options, initialValue); + + /* + * In Java, the response is returned to this thread and handled here; + * (for Javascript, see propertyChange) + */ + if (!Platform.isJS()) /** - * @j2sNative + * Java only + * + * @j2sIgnore */ { - runner.firstRun(response); + handleResponse(response); } - } public void showInternalDialog(JPanel mainPanel, String title, @@ -766,81 +806,78 @@ public class JvOptionPane extends JOptionPane { if (!isInteractiveMode()) { - runner.firstRun((int) getMockResponse()); - } - // two uses: - // - // TODO - // - // 1) AlignViewport for openLinkedAlignment - // - // Show a dialog with the option to open and link (cDNA <-> protein) as a - // new - // alignment, either as a standalone alignment or in a split frame. Returns - // true if the new alignment was opened, false if not, because the user - // declined the offer. - // - // 2) UserDefinedColors warning about saving over a name already defined - // - Component parent; - /** - * @j2sNative parent = this; - */ - { - parent = parentComponent; + handleResponse(getMockResponse()); } - ; - ourOptions = Arrays.asList(options); + ourOptions = Arrays.asList(options); int response; - if (parent!=this) { - - response = JOptionPane.showInternalOptionDialog(parent, mainPanel, + if (parentComponent != this) + { + response = JOptionPane.showInternalOptionDialog(parentComponent, mainPanel, title, yesNoCancelOption, questionMessage, icon, options, initresponse); } else { - response = JOptionPane.showOptionDialog(parent, mainPanel, title, + response = JOptionPane.showOptionDialog(parentComponent, mainPanel, title, yesNoCancelOption, questionMessage, icon, options, initresponse); } + if (!Platform.isJS()) /** - * @j2sNative + * Java only + * + * @j2sIgnore */ { - runner.firstRun(response); + handleResponse(response); } - } + @Override - public JvOptionPane response(RunResponse action) + public JvOptionPane setResponseHandler(Object response, Runnable action) { - - runner.response(action); - return this; - } - - public JvOptionPane defaultResponse(Runnable runnable) - { - runner.setDefaultResponse(runnable); + callbacks.put(response, action); return this; } + /** + * JalviewJS signals option selection by a property change event + * for the option e.g. "OK". This methods responds to that by + * running the response action that corresponds to that option. + * + * @param evt + */ @Override public void propertyChange(PropertyChangeEvent evt) { - int ourOption = ourOptions.indexOf(evt.getNewValue()); - if (ourOption == -1) + Object newValue = evt.getNewValue(); + int ourOption = ourOptions.indexOf(newValue); + if (ourOption >= 0) { - // try our luck.. - runner.run(evt.getNewValue()); + handleResponse(ourOption); } else { - runner.run(ourOption); + // try our luck.. + handleResponse(newValue); } } - + @Override + public void handleResponse(Object response) + { + /* + * this test is for NaN in Chrome + */ + if (response != null && !response.equals(response)) + { + return; + } + Runnable action = callbacks.get(response); + if (action != null) + { + action.run(); + } + } }