X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=e7854313b261cd4792d388c609e1704a2977eba2;hb=refs%2Fheads%2Ffeature%2FJAL-4274_configurable_bitmap_export_preferences;hp=66055a4c52c93cf03a6ba1972b25e0949a9d2f27;hpb=0393ac2e7941f0afaae4d4947f400291b7abd82c;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index 66055a4..e785431 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -22,6 +22,7 @@ package jalview.gui; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Component; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; @@ -51,6 +52,7 @@ import java.awt.event.WindowEvent; import java.awt.geom.AffineTransform; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.beans.PropertyVetoException; import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -63,6 +65,7 @@ import java.util.Hashtable; import java.util.List; import java.util.ListIterator; import java.util.Locale; +import java.util.Map; import java.util.Vector; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -85,10 +88,14 @@ import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JMenuItem; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JProgressBar; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; import javax.swing.JTextField; +import javax.swing.JTextPane; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; @@ -96,6 +103,7 @@ import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkEvent.EventType; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; +import javax.swing.text.JTextComponent; import org.stackoverflowusers.file.WindowsShortcut; @@ -104,6 +112,7 @@ import jalview.api.AlignmentViewPanel; import jalview.api.structures.JalviewStructureDisplayI; import jalview.bin.Cache; import jalview.bin.Jalview; +import jalview.bin.Jalview.ExitCode; import jalview.datamodel.Alignment; import jalview.datamodel.HiddenColumns; import jalview.datamodel.Sequence; @@ -633,6 +642,7 @@ public class Desktop extends jalview.jbgui.GDesktop // used for jalviewjsTest jalview.bin.Console.info("JALVIEWJS: CREATED DESKTOP"); } + } /** @@ -1079,23 +1089,23 @@ public class Desktop extends jalview.jbgui.GDesktop setKeyBindings(frame); - // Since the latest FlatLaf patch, we occasionally have problems showing structureViewer frames... - int tries=3; - boolean shown=false; - Exception last=null; + // Since the latest FlatLaf patch, we occasionally have problems showing + // structureViewer frames... + int tries = 3; + boolean shown = false; + Exception last = null; do { try { desktop.add(frame); - shown=true; + shown = true; } catch (IllegalArgumentException iaex) { - last=iaex; + last = iaex; tries--; - jalview.bin.Console.info( - "Squashed IllegalArgument Exception (" + tries + " left) for "+frame.getTitle(), - iaex); + jalview.bin.Console.info("Squashed IllegalArgument Exception (" + + tries + " left) for " + frame.getTitle(), iaex); try { Thread.sleep(5); @@ -1107,7 +1117,9 @@ public class Desktop extends jalview.jbgui.GDesktop } while (!shown && tries > 0); if (!shown) { - jalview.bin.Console.error("Serious Problem whilst showing window "+frame.getTitle(),last); + jalview.bin.Console.error( + "Serious Problem whilst showing window " + frame.getTitle(), + last); } windowMenu.add(menuItem); @@ -1520,7 +1532,7 @@ public class Desktop extends jalview.jbgui.GDesktop // this will run the shutdownHook but QuitHandler.getQuitResponse() should // not run a second time if gotQuitResponse flag has been set (i.e. user // confirmed quit of some kind). - Jalview.exit("Desktop exiting.", 0); + Jalview.exit("Desktop exiting.", ExitCode.OK); } private void storeLastKnownDimensions(String string, Rectangle jc) @@ -1633,7 +1645,8 @@ public class Desktop extends jalview.jbgui.GDesktop } } catch (Exception ex) { - jalview.bin.Console.errPrintln("Error opening help: " + ex.getMessage()); + jalview.bin.Console + .errPrintln("Error opening help: " + ex.getMessage()); } } @@ -1864,7 +1877,8 @@ public class Desktop extends jalview.jbgui.GDesktop boolean autoSave = projectFile != null && !saveAs && BackupFiles.getEnabled(); - // jalview.bin.Console.outPrintln("autoSave="+autoSave+", projectFile='"+projectFile+"', + // jalview.bin.Console.outPrintln("autoSave="+autoSave+", + // projectFile='"+projectFile+"', // saveAs="+saveAs+", Backups // "+(BackupFiles.getEnabled()?"enabled":"disabled")); @@ -3658,14 +3672,16 @@ public class Desktop extends jalview.jbgui.GDesktop Desktop us = Desktop.instance; Desktop.instance = null; // call dispose in a separate thread - try to avoid indirect deadlocks - new Thread(new Runnable() { + new Thread(new Runnable() + { @Override public void run() { ExecutorService dex = us.dialogExecutor; - if (dex!=null) { + if (dex != null) + { dex.shutdownNow(); - us.dialogExecutor=null; + us.dialogExecutor = null; us.block.drainPermits(); } us.dispose(); @@ -3675,17 +3691,19 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * checks if any progress bars are being displayed in any of the windows managed by the desktop + * checks if any progress bars are being displayed in any of the windows + * managed by the desktop + * * @return */ public boolean operationsAreInProgress() { JInternalFrame[] frames = getAllFrames(); - for (JInternalFrame frame:frames) + for (JInternalFrame frame : frames) { if (frame instanceof IProgressIndicator) { - if (((IProgressIndicator)frame).operationInProgress()) + if (((IProgressIndicator) frame).operationInProgress()) { return true; } @@ -3693,4 +3711,113 @@ public class Desktop extends jalview.jbgui.GDesktop } return operationInProgress(); } + + /** + * keep track of modal JvOptionPanes open as modal dialogs for AlignFrames. + * The way the modal JInternalFrame is made means it cannot be a child of an + * AlignFrame, so closing the AlignFrame might leave the modal open :( + */ + private static Map alignFrameModalMap = new HashMap<>(); + + protected static void addModal(AlignFrame af, JInternalFrame jif) + { + alignFrameModalMap.put(af, jif); + } + + protected static void closeModal(AlignFrame af) + { + if (!alignFrameModalMap.containsKey(af)) + { + return; + } + JInternalFrame jif = alignFrameModalMap.get(af); + if (jif != null) + { + try + { + jif.setClosed(true); + } catch (PropertyVetoException e) + { + e.printStackTrace(); + } + } + alignFrameModalMap.remove(af); + } + + public void nonBlockingDialog(String title, String message, String button, + int type, boolean scrollable, boolean modal) + { + nonBlockingDialog(32, 2, title, message, null, button, type, scrollable, + false, modal); + } + + public void nonBlockingDialog(int width, int height, String title, + String message, String boxtext, String button, int type, + boolean scrollable, boolean html, boolean modal) + { + if (type < 0) + { + type = JvOptionPane.WARNING_MESSAGE; + } + JLabel jl = new JLabel(message); + + JTextComponent jtc = null; + if (html) + { + JTextPane jtp = new JTextPane(); + jtp.setContentType("text/html"); + jtp.setEditable(false); + jtp.setAutoscrolls(true); + jtp.setText(boxtext); + + jtc = jtp; + } + else + { + JTextArea jta = new JTextArea(height, width); + // jta.setLineWrap(true); + jta.setEditable(false); + jta.setWrapStyleWord(true); + jta.setAutoscrolls(true); + jta.setText(boxtext); + + jtc = jta; + } + + JScrollPane jsp = scrollable + ? new JScrollPane(jtc, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED) + : null; + + JvOptionPane jvp = JvOptionPane.newOptionDialog(this); + + JPanel jp = new JPanel(); + jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); + + if (message != null) + { + jl.setAlignmentX(Component.LEFT_ALIGNMENT); + jp.add(jl); + } + if (boxtext != null) + { + if (scrollable) + { + jsp.setAlignmentX(Component.LEFT_ALIGNMENT); + jp.add(jsp); + } + else + { + jtc.setAlignmentX(Component.LEFT_ALIGNMENT); + jp.add(jtc); + } + } + + jvp.setResponseHandler(JOptionPane.YES_OPTION, () -> { + }); + jvp.showDialogOnTopAsync(this, jp, title, JOptionPane.YES_OPTION, type, + null, new Object[] + { button }, button, modal, null, false); + } + }