X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FJvOptionPane.java;h=bf15b865f405dfdec0f834b423df69fa12fa34d9;hb=6e56c166e45d1af37c5531b4cbe909a3e110927e;hp=e1d76f1054d2a45937deef244fd78ad2f0b583c4;hpb=984e67333b47f980e03c7fbc7cf161f604a6aee6;p=jalview.git diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index e1d76f1..bf15b86 100644 --- a/src/jalview/gui/JvOptionPane.java +++ b/src/jalview/gui/JvOptionPane.java @@ -21,22 +21,46 @@ package jalview.gui; +import jalview.util.Platform; +import jalview.util.dialogrunner.DialogRunnerI; + 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 +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; private static boolean interactiveMode = true; + private 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 = Platform.isJS() ? this : parent; + } + public static int showConfirmDialog(Component parentComponent, Object message) throws HeadlessException { @@ -61,7 +85,9 @@ public class JvOptionPane extends JOptionPane throws HeadlessException { if (!isInteractiveMode()) + { return (int) getMockResponse(); + } switch (optionType) { case JvOptionPane.YES_NO_CANCEL_OPTION: @@ -155,7 +181,9 @@ public class JvOptionPane extends JOptionPane String message, String title, int optionType) { if (!isInteractiveMode()) + { return (int) getMockResponse(); + } switch (optionType) { case JvOptionPane.YES_NO_CANCEL_OPTION: @@ -188,7 +216,9 @@ public class JvOptionPane extends JOptionPane Object message, String title, int optionType, int messageType) { if (!isInteractiveMode()) + { return (int) getMockResponse(); + } switch (optionType) { case JvOptionPane.YES_NO_CANCEL_OPTION: @@ -220,7 +250,9 @@ public class JvOptionPane extends JOptionPane Icon icon) { if (!isInteractiveMode()) + { return (int) getMockResponse(); + } switch (optionType) { case JvOptionPane.YES_NO_CANCEL_OPTION: @@ -255,7 +287,9 @@ public class JvOptionPane extends JOptionPane throws HeadlessException { if (!isInteractiveMode()) + { return (int) getMockResponse(); + } // two uses: // // TODO @@ -454,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 @@ -490,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(); + } /** * @@ -636,34 +710,174 @@ 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; } + /** + * create a new option dialog that can be used to register responses - along + * lines of showOptionDialog + * + * @param desktop + * @param question + * @param string + * @param defaultOption + * @param plainMessage + * @param object + * @param options + * @param string2 + * @return + */ + public static JvOptionPane newOptionDialog(Component parentComponent) + { + return new JvOptionPane(parentComponent); + } + + public void showDialog( + String message, String title, int optionType, int messageType, + Icon icon, Object[] options, Object initialValue) + { + + if (!isInteractiveMode()) + { + handleResponse(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 + // + + 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()) + /** + * Java only + * + * @j2sIgnore + */ + { + 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; + 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()) + /** + * Java only + * + * @j2sIgnore + */ + { + handleResponse(response); + } + } + + @Override + public JvOptionPane setResponseHandler(Object response, Runnable action) + { + 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) + { + Object newValue = evt.getNewValue(); + int ourOption = ourOptions.indexOf(newValue); + if (ourOption >= 0) + { + handleResponse(ourOption); + } + else + { + // 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(); + } + } }