X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FJvOptionPane.java;h=bf15b865f405dfdec0f834b423df69fa12fa34d9;hb=2e57729baa0bc97fc03ab1fb8eb4dbc1a12f3d9a;hp=3a5e0f7a0a55ced94037e2ad294bb7a64772ee66;hpb=99427a60fd0b57bc3e6af84637bb2983b2edc871;p=jalview.git diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index 3a5e0f7..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, @@ -704,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 @@ -763,7 +763,7 @@ public class JvOptionPane extends JOptionPane if (!isInteractiveMode()) { - runner.firstRun((int) getMockResponse()); + handleResponse(getMockResponse()); } // two uses: // @@ -779,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, @@ -806,67 +806,78 @@ public class JvOptionPane extends JOptionPane { if (!isInteractiveMode()) { - runner.firstRun((int) getMockResponse()); - } - 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(); + } + } }