X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FJvOptionPane.java;h=020890b392b35aa3271c64d007cf35ba78c0f8a5;hb=a67002917b669aaff650904ec4353f8c70866cc8;hp=364d4c1971f4dd1eb4f5e43a4f451ebc86d8b6cf;hpb=12098b3de3f7a7858cdf50bbcc51a2afc7568e76;p=jalview.git diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index 364d4c1..020890b 100644 --- a/src/jalview/gui/JvOptionPane.java +++ b/src/jalview/gui/JvOptionPane.java @@ -42,6 +42,7 @@ 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; @@ -57,6 +58,8 @@ 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.Platform; import jalview.util.dialogrunner.DialogRunnerI; @@ -71,6 +74,10 @@ public class JvOptionPane extends JOptionPane private Component parentComponent; + private ExecutorService executor = Executors.newCachedThreadPool(); + + private JDialog dialog = null; + private Map> callbacks = new HashMap<>(); /* @@ -82,6 +89,7 @@ public class JvOptionPane extends JOptionPane public JvOptionPane(final Component parent) { this.parentComponent = Platform.isJS() ? this : parent; + this.setIcon(null); } public static int showConfirmDialog(Component parentComponent, @@ -803,6 +811,7 @@ public class JvOptionPane extends JOptionPane if (!isInteractiveMode()) { handleResponse(getMockResponse()); + return; } // two uses: // @@ -875,7 +884,7 @@ public class JvOptionPane extends JOptionPane JOptionPane joptionpane = (JOptionPane) joptionpaneObject; joptionpane.setValue(buttonAction); if (action != null) - Executors.newSingleThreadExecutor().submit(action); + getExecutor().submit(action); joptionpane.transferFocusBackward(); joptionpane.setVisible(false); // put focus and raise parent window if possible, unless cancel or @@ -976,12 +985,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.newSingleThreadExecutor().submit(action); + getExecutor().submit(action); // joptionpane.transferFocusBackward(); joptionpane.transferFocusBackward(); joptionpane.setVisible(false); @@ -1028,11 +1038,12 @@ 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); } } @@ -1055,10 +1066,13 @@ public class JvOptionPane extends JOptionPane 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 +1118,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; @@ -1142,6 +1156,28 @@ public class JvOptionPane extends JOptionPane return this; } + public ExecutorService getExecutor() + { + if (executor == null) + executor = Executors.newSingleThreadExecutor(); + return executor; + } + + public void setExecutor(ExecutorService es) + { + executor = es; + } + + public void setDialog(JDialog d) + { + dialog = d; + } + + public JDialog getDialog() + { + return dialog; + } + /** * showDialogOnTop will create a dialog that (attempts to) come to top of OS * desktop windows @@ -1149,6 +1185,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) @@ -1159,14 +1207,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.setIconImage(WindowIcons.logoIcon.getImage()); - 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; } @@ -1176,7 +1233,7 @@ public class JvOptionPane extends JOptionPane Object[] options, Object initialValue, boolean modal) { JFrame frame = new JFrame(); - frame.setIconImage(WindowIcons.logoIcon.getImage()); + frame.setIconImages(ChannelProperties.getIconList()); showDialogOnTopAsync(frame, label, actionString, JOPTIONPANE_OPTION, JOPTIONPANE_MESSAGETYPE, icon, options, initialValue, modal); } @@ -1196,6 +1253,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) @@ -1254,7 +1316,8 @@ public class JvOptionPane extends JOptionPane { try { - action.call(); + getExecutor().submit(action).get(); + // action.call(); } catch (Exception e) { e.printStackTrace(); @@ -1280,6 +1343,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(); @@ -1345,7 +1413,7 @@ public class JvOptionPane extends JOptionPane { joptionpane.setValue(buttonAction); if (action != null) - Executors.newSingleThreadExecutor().submit(action); + getExecutor().submit(action); // joptionpane.transferFocusBackward(); joptionpane.transferFocusBackward(); joptionpane.setVisible(false); @@ -1391,10 +1459,11 @@ public class JvOptionPane extends JOptionPane Platform.isJS() ? initialValue : initialValueButton); 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); + setDialog(dialog); return dialog; } @@ -1482,4 +1551,53 @@ public class JvOptionPane extends JOptionPane parent.remove(f); } } + + public static JvOptionPane frameDialog(String message, String title, + int messageType, String[] buttonsText, String defaultButton, + Callable[] handlers, boolean modal) + { + JFrame parent = new JFrame(); + JvOptionPane jvop = JvOptionPane.newOptionDialog(); + 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[0]); + if (dialogType == JOptionPane.YES_NO_OPTION + || dialogType == JOptionPane.YES_NO_CANCEL_OPTION) + { + jvop.setResponseHandler(JOptionPane.NO_OPTION, handlers[1]); + } + if (dialogType == JOptionPane.YES_NO_CANCEL_OPTION) + { + jvop.setResponseHandler(JOptionPane.CANCEL_OPTION, handlers[2]); + } + + final int dt = dialogType; + jvop.getExecutor().execute(() -> { + jvop.showDialog(message, title, dt, messageType, null, buttonsText, + defaultButton, modal, buttons); + }); + + return jvop; + } }