X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FJvOptionPane.java;h=bf15b865f405dfdec0f834b423df69fa12fa34d9;hb=059d7006f69f0c1623627ee437f9479455260ee5;hp=4e443e7a4ff30e052e2aa304d320154b4f7426ff;hpb=a622f6142714e1dcddcaa89b970c99fbe676a121;p=jalview.git diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index 4e443e7..bf15b86 100644 --- a/src/jalview/gui/JvOptionPane.java +++ b/src/jalview/gui/JvOptionPane.java @@ -21,25 +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; @@ -48,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, @@ -481,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 @@ -517,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(); + } /** * @@ -663,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 @@ -722,7 +763,7 @@ public class JvOptionPane extends JOptionPane if (!isInteractiveMode()) { - runner.firstRun((int) getMockResponse()); + handleResponse(getMockResponse()); } // two uses: // @@ -738,54 +779,105 @@ public class JvOptionPane extends JOptionPane // // 2) UserDefinedColors warning about saving over a name already defined // - Component parent; + + ourOptions = Arrays.asList(options); + + 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 - * parent = this; + * Java only + * + * @j2sIgnore */ { - parent = parentComponent; + handleResponse(response); } - ; + } + + public void showInternalDialog(JPanel mainPanel, String title, + int yesNoCancelOption, int questionMessage, Icon icon, + Object[] options, String initresponse) + { + if (!isInteractiveMode()) + { + handleResponse(getMockResponse()); + } + ourOptions = Arrays.asList(options); - int response = JOptionPane.showOptionDialog(parent, message, title, - optionType, messageType, icon, options, initialValue); + int response; + if (parentComponent != this) + { + response = JOptionPane.showInternalOptionDialog(parentComponent, mainPanel, + title, yesNoCancelOption, questionMessage, icon, options, + initresponse); + } + else + { + 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(); + } + } }