X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FJvOptionPane.java;h=c0efd4a5e61826ba057dbbfea4373994ae46e0fb;hb=0c90355de2854b4ba6f30c1c162f9cb0c712351a;hp=752f25c7b3961e0c5590891a247185e782b7aeb5;hpb=952d6b6fecfb976c0c113f013ed2b8980af3d190;p=jalview.git diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index 752f25c..c0efd4a 100644 --- a/src/jalview/gui/JvOptionPane.java +++ b/src/jalview/gui/JvOptionPane.java @@ -18,7 +18,6 @@ * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ - package jalview.gui; import java.awt.AWTEvent; @@ -42,7 +41,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.Icon; @@ -58,6 +57,9 @@ import javax.swing.UIManager; import javax.swing.event.InternalFrameEvent; import javax.swing.event.InternalFrameListener; +import jalview.bin.Console; +import jalview.util.ChannelProperties; +import jalview.util.MessageManager; import jalview.util.Platform; import jalview.util.dialogrunner.DialogRunnerI; @@ -70,19 +72,27 @@ public class JvOptionPane extends JOptionPane private static boolean interactiveMode = true; + public static final Runnable NULLCALLABLE = () -> { + }; + private Component parentComponent; - private Map> callbacks = new HashMap<>(); + private ExecutorService executor = Executors.newCachedThreadPool(); + + private JDialog dialog = null; + + private Map callbacks = new HashMap<>(); /* - * JalviewJS reports user choice in the dialog as the selected - * option (text); this list allows conversion to index (int) + * 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; + this.setIcon(null); } public static int showConfirmDialog(Component parentComponent, @@ -804,6 +814,7 @@ public class JvOptionPane extends JOptionPane if (!isInteractiveMode()) { handleResponse(getMockResponse()); + return; } // two uses: // @@ -847,7 +858,7 @@ public class JvOptionPane extends JOptionPane initialValueButton = jb; int buttonAction = buttonActions[i]; - Callable action = callbacks.get(buttonAction); + Runnable action = callbacks.get(buttonAction); jb.setText((String) o); jb.addActionListener(new ActionListener() { @@ -876,7 +887,7 @@ public class JvOptionPane extends JOptionPane JOptionPane joptionpane = (JOptionPane) joptionpaneObject; joptionpane.setValue(buttonAction); if (action != null) - Executors.newSingleThreadExecutor().submit(action); + new Thread(action).start(); joptionpane.transferFocusBackward(); joptionpane.setVisible(false); // put focus and raise parent window if possible, unless cancel or @@ -918,8 +929,8 @@ public class JvOptionPane extends JOptionPane useButtons ? initialValueButton : initialValue); /* - * In Java, the response is returned to this thread and handled here; - * (for Javascript, see propertyChange) + * In Java, the response is returned to this thread and handled here; (for + * Javascript, see propertyChange) */ if (!Platform.isJS()) /** @@ -934,9 +945,9 @@ public class JvOptionPane extends JOptionPane else { /* - * This is java similar to the swingjs handling, with the callbacks - * attached to the button press of the dialog. This means we can use - * a non-modal JDialog for the confirmation without blocking the GUI. + * This is java similar to the swingjs handling, with the callbacks attached to + * the button press of the dialog. This means we can use a non-modal JDialog for + * the confirmation without blocking the GUI. */ JOptionPane joptionpane = new JOptionPane(); // Make button options @@ -965,7 +976,8 @@ public class JvOptionPane extends JOptionPane ArrayList options_btns = new ArrayList<>(); Object initialValue_btn = null; - if (!Platform.isJS()) // JalviewJS already uses callback, don't need to add them here + if (!Platform.isJS()) // JalviewJS already uses callback, don't need to + // add them here { for (int i = 0; i < options.length && i < 3; i++) { @@ -976,12 +988,13 @@ public class JvOptionPane extends JOptionPane jb.setText((String) o); jb.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { joptionpane.setValue(buttonAction); if (action != null) - Executors.defaultThreadFactory().newThread(action).start(); + new Thread(action).start(); // joptionpane.transferFocusBackward(); joptionpane.transferFocusBackward(); joptionpane.setVisible(false); @@ -1028,15 +1041,16 @@ public class JvOptionPane extends JOptionPane Platform.isJS() ? initialValue : initialValue_btn); JDialog dialog = joptionpane.createDialog(parentComponent, title); - dialog.setIconImage(WindowIcons.logoIcon.getImage()); + dialog.setIconImages(ChannelProperties.getIconList()); dialog.setModalityType(modal ? ModalityType.APPLICATION_MODAL : ModalityType.MODELESS); dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.setVisible(true); + setDialog(dialog); } } - public void showInternalDialog(JPanel mainPanel, String title, + public void showInternalDialog(Object mainPanel, String title, int yesNoCancelOption, int questionMessage, Icon icon, Object[] options, String initresponse) { @@ -1054,11 +1068,13 @@ public class JvOptionPane extends JOptionPane this.setMessage(mainPanel); ourOptions = Arrays.asList(options); - int response; - if (parentComponent != this) + if (parentComponent != this + && !(parentComponent == null && Desktop.instance == null)) { - JInternalFrame jif = this.createInternalFrame(parentComponent, title); - jif.setFrameIcon(WindowIcons.logoIcon); + JInternalFrame jif = this.createInternalFrame( + parentComponent != null ? parentComponent : Desktop.instance, + title); + jif.setFrameIcon(null); jif.addInternalFrameListener(new InternalFrameListener() { @Override @@ -1104,7 +1120,7 @@ public class JvOptionPane extends JOptionPane else { JDialog dialog = this.createDialog(parentComponent, title); - dialog.setIconImage(WindowIcons.logoIcon.getImage()); + dialog.setIconImages(ChannelProperties.getIconList()); dialog.setVisible(true); // blocking this.internalDialogHandleResponse(); return; @@ -1128,27 +1144,31 @@ public class JvOptionPane extends JOptionPane } /* + * @Override public JvOptionPane setResponseHandler(Object response, Runnable + * action) { callbacks.put(response, new Callable() { + * + * @Override public Void call() { action.run(); return null; } }); return this; + * } + */ @Override public JvOptionPane setResponseHandler(Object response, Runnable action) { - callbacks.put(response, new Callable() + if (action == null) { - @Override - public Void call() - { - action.run(); - return null; - } - }); + action = NULLCALLABLE; + } + callbacks.put(response, action); return this; } - */ - @Override - public JvOptionPane setResponseHandler(Object response, - Callable action) + + public void setDialog(JDialog d) { - callbacks.put(response, action); - return this; + dialog = d; + } + + public JDialog getDialog() + { + return dialog; } /** @@ -1158,6 +1178,18 @@ public class JvOptionPane extends JOptionPane public static int showDialogOnTop(String label, String actionString, int JOPTIONPANE_OPTION, int JOPTIONPANE_MESSAGETYPE) { + return showDialogOnTop(null, label, actionString, JOPTIONPANE_OPTION, + JOPTIONPANE_MESSAGETYPE); + } + + public static int showDialogOnTop(Component dialogParentComponent, + String label, String actionString, int JOPTIONPANE_OPTION, + int JOPTIONPANE_MESSAGETYPE) + { + if (!isInteractiveMode()) + { + return (int) getMockResponse(); + } // Ensure Jalview window is brought to front (primarily for Quit // confirmation window to be visible) @@ -1168,13 +1200,23 @@ public class JvOptionPane extends JOptionPane // A better hack which works is to create a new JFrame parent with // setAlwaysOnTop(true) JFrame dialogParent = new JFrame(); - dialogParent.setAlwaysOnTop(true); + if (dialogParentComponent == null) + { + dialogParent.setIconImages(ChannelProperties.getIconList()); + dialogParent.setAlwaysOnTop(true); + } - int answer = JOptionPane.showConfirmDialog(dialogParent, label, - actionString, JOPTIONPANE_OPTION, JOPTIONPANE_MESSAGETYPE); + int answer = JOptionPane.showConfirmDialog( + dialogParentComponent == null ? dialogParent + : dialogParentComponent, + label, actionString, JOPTIONPANE_OPTION, + JOPTIONPANE_MESSAGETYPE); - dialogParent.setAlwaysOnTop(false); - dialogParent.dispose(); + if (dialogParentComponent == null) + { + dialogParent.setAlwaysOnTop(false); + dialogParent.dispose(); + } return answer; } @@ -1183,9 +1225,10 @@ public class JvOptionPane extends JOptionPane int JOPTIONPANE_OPTION, int JOPTIONPANE_MESSAGETYPE, Icon icon, Object[] options, Object initialValue, boolean modal) { - showDialogOnTopAsync(new JFrame(), label, actionString, - JOPTIONPANE_OPTION, JOPTIONPANE_MESSAGETYPE, icon, options, - initialValue, modal); + JFrame frame = new JFrame(); + frame.setIconImages(ChannelProperties.getIconList()); + showDialogOnTopAsync(frame, label, actionString, JOPTIONPANE_OPTION, + JOPTIONPANE_MESSAGETYPE, icon, options, initialValue, modal); } public void showDialogOnTopAsync(JFrame dialogParent, Object label, @@ -1203,6 +1246,11 @@ public class JvOptionPane extends JOptionPane int JOPTIONPANE_MESSAGETYPE, Icon icon, Object[] options, Object initialValue, boolean modal, JButton[] buttons) { + if (!isInteractiveMode()) + { + handleResponse(getMockResponse()); + return; + } // Ensure Jalview window is brought to front (primarily for Quit // confirmation window to be visible) @@ -1250,18 +1298,19 @@ public class JvOptionPane extends JOptionPane public void handleResponse(Object response) { /* - * this test is for NaN in Chrome - */ + * this test is for NaN in Chrome + */ if (response != null && !response.equals(response)) { return; } - Callable action = callbacks.get(response); + Runnable action = callbacks.get(response); if (action != null) { try { - action.call(); + new Thread(action).start(); + // action.call(); } catch (Exception e) { e.printStackTrace(); @@ -1287,6 +1336,11 @@ public class JvOptionPane extends JOptionPane Object[] options, Object initialValue, boolean modal, JButton[] buttons) { + if (!isInteractiveMode()) + { + handleResponse(getMockResponse()); + return null; + } JButton[] optionsButtons = null; Object initialValueButton = null; JOptionPane joptionpane = new JOptionPane(); @@ -1334,7 +1388,7 @@ public class JvOptionPane extends JOptionPane { Object o = options[i]; int buttonAction = buttonActions[i]; - Callable action = callbacks.get(buttonAction); + Runnable action = callbacks.get(buttonAction); JButton jb; if (buttons != null && buttons.length > i && buttons[i] != null) { @@ -1352,7 +1406,7 @@ public class JvOptionPane extends JOptionPane { joptionpane.setValue(buttonAction); if (action != null) - Executors.newSingleThreadExecutor().submit(action); + new Thread(action).start(); // joptionpane.transferFocusBackward(); joptionpane.transferFocusBackward(); joptionpane.setVisible(false); @@ -1398,9 +1452,11 @@ public class JvOptionPane extends JOptionPane Platform.isJS() ? initialValue : initialValueButton); JDialog dialog = joptionpane.createDialog(parentComponent, title); + dialog.setIconImages(ChannelProperties.getIconList()); dialog.setModalityType( modal ? ModalityType.APPLICATION_MODAL : ModalityType.MODELESS); dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + setDialog(dialog); return dialog; } @@ -1488,4 +1544,72 @@ public class JvOptionPane extends JOptionPane parent.remove(f); } } + + public static JvOptionPane frameDialog(Object message, String title, + int messageType, String[] buttonsTextS, String defaultButtonS, + List handlers, boolean modal) + { + JFrame parent = new JFrame(); + JvOptionPane jvop = JvOptionPane.newOptionDialog(); + final String[] buttonsText; + final String defaultButton; + if (buttonsTextS == null) + { + String ok = MessageManager.getString("action.ok"); + buttonsText = new String[] { ok }; + defaultButton = ok; + } + else + { + buttonsText = buttonsTextS; + defaultButton = defaultButtonS; + } + JButton[] buttons = new JButton[buttonsText.length]; + for (int i = 0; i < buttonsText.length; i++) + { + buttons[i] = new JButton(); + buttons[i].setText(buttonsText[i]); + Console.debug("DISABLING BUTTON " + buttons[i].getText()); + buttons[i].setEnabled(false); + buttons[i].setVisible(false); + } + + int dialogType = -1; + if (buttonsText.length == 1) + { + dialogType = JOptionPane.OK_OPTION; + } + else if (buttonsText.length == 2) + { + dialogType = JOptionPane.YES_NO_OPTION; + } + else + { + dialogType = JOptionPane.YES_NO_CANCEL_OPTION; + } + jvop.setResponseHandler(JOptionPane.YES_OPTION, + (handlers != null && handlers.size() > 0) ? handlers.get(0) + : NULLCALLABLE); + if (dialogType == JOptionPane.YES_NO_OPTION + || dialogType == JOptionPane.YES_NO_CANCEL_OPTION) + { + jvop.setResponseHandler(JOptionPane.NO_OPTION, + (handlers != null && handlers.size() > 1) ? handlers.get(1) + : NULLCALLABLE); + } + if (dialogType == JOptionPane.YES_NO_CANCEL_OPTION) + { + jvop.setResponseHandler(JOptionPane.CANCEL_OPTION, + (handlers != null && handlers.size() > 2) ? handlers.get(2) + : NULLCALLABLE); + } + + final int dt = dialogType; + new Thread(() -> { + jvop.showDialog(message, title, dt, messageType, null, buttonsText, + defaultButton, modal, buttons); + }).start(); + + return jvop; + } }