X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=b901ae416c8311664b4e692863820d7f4862d7dc;hb=refs%2Fheads%2Fpatch%2FJAL-4196_structure_viewer_synchronising;hp=1521d0ac65aafd2c7f533f6bd2ac6fdf1bb47c24;hpb=270f61aee660a2b8206e51f6392405b8ac30fef7;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index 1521d0a..b901ae4 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -64,7 +64,6 @@ import java.util.List; import java.util.ListIterator; import java.util.Locale; import java.util.Vector; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; @@ -122,6 +121,7 @@ import jalview.io.FormatAdapter; import jalview.io.IdentifyFile; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; +import jalview.io.exceptions.ImageOutputException; import jalview.jbgui.GSplitFrame; import jalview.jbgui.GStructureViewer; import jalview.project.Jalview2XML; @@ -435,9 +435,14 @@ public class Desktop extends jalview.jbgui.GDesktop { if (LaunchUtils.getJavaVersion() >= 11) { - jalview.bin.Console.info( + /* + * Send this message to stderr as the warning that follows (due to + * reflection) also goes to stderr. + */ + System.err.println( "Linux platform only! You may have the following warning next: \"WARNING: An illegal reflective access operation has occurred\"\nThis is expected and cannot be avoided, sorry about that."); } + final String awtAppClassName = "awtAppClassName"; try { Toolkit xToolkit = Toolkit.getDefaultToolkit(); @@ -445,10 +450,10 @@ public class Desktop extends jalview.jbgui.GDesktop Field awtAppClassNameField = null; if (Arrays.stream(declaredFields) - .anyMatch(f -> f.getName().equals("awtAppClassName"))) + .anyMatch(f -> f.getName().equals(awtAppClassName))) { awtAppClassNameField = xToolkit.getClass() - .getDeclaredField("awtAppClassName"); + .getDeclaredField(awtAppClassName); } String title = ChannelProperties.getProperty("app_name"); @@ -459,11 +464,12 @@ public class Desktop extends jalview.jbgui.GDesktop } else { - jalview.bin.Console.debug("XToolkit: awtAppClassName not found"); + jalview.bin.Console + .debug("XToolkit: " + awtAppClassName + " not found"); } } catch (Exception e) { - jalview.bin.Console.debug("Error setting awtAppClassName"); + jalview.bin.Console.debug("Error setting " + awtAppClassName); jalview.bin.Console.trace(Cache.getStackTraceString(e)); } } @@ -530,6 +536,9 @@ public class Desktop extends jalview.jbgui.GDesktop setBounds(xPos, yPos, 900, 650); } + // start dialogue queue for single dialogues + startDialogQueue(); + if (!Platform.isJS()) /** * Java only @@ -617,6 +626,12 @@ public class Desktop extends jalview.jbgui.GDesktop } }); desktop.addMouseListener(ma); + + if (Platform.isJS()) + { + // used for jalviewjsTest + jalview.bin.Console.info("JALVIEWJS: CREATED DESKTOP"); + } } /** @@ -808,7 +823,7 @@ public class Desktop extends jalview.jbgui.GDesktop // TODO - write tests and fix AlignFrame.paste() which doesn't track if // clipboard has come from a different alignment window than the one where // paste has been called! JAL-4151 - + if (Desktop.jalviewClipboard != null) { // The clipboard was filled from within Jalview, we must use the @@ -835,30 +850,32 @@ public class Desktop extends jalview.jbgui.GDesktop } Desktop.addInternalFrame(af, newtitle, AlignFrame.DEFAULT_WIDTH, - AlignFrame.DEFAULT_HEIGHT); + AlignFrame.DEFAULT_HEIGHT); - } else { - try + } + else { - Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); - Transferable contents = c.getContents(this); - - if (contents != null) + try { - String file = (String) contents - .getTransferData(DataFlavor.stringFlavor); + Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); + Transferable contents = c.getContents(this); - FileFormatI format = new IdentifyFile().identify(file, - DataSourceType.PASTE); + if (contents != null) + { + String file = (String) contents + .getTransferData(DataFlavor.stringFlavor); + + FileFormatI format = new IdentifyFile().identify(file, + DataSourceType.PASTE); - new FileLoader().LoadFile(file, DataSourceType.PASTE, format); + new FileLoader().LoadFile(file, DataSourceType.PASTE, format); + } + } catch (Exception ex) + { + System.out.println( + "Unable to paste alignment from system clipboard:\n" + ex); } - } catch (Exception ex) - { - System.out.println( - "Unable to paste alignment from system clipboard:\n" + ex); - } } } @@ -1256,7 +1273,6 @@ public class Desktop extends jalview.jbgui.GDesktop new FileLoader().LoadFile(viewport, selectedFile, DataSourceType.FILE, format); - return null; }); chooser.showOpenDialog(this); } @@ -1312,7 +1328,7 @@ public class Desktop extends jalview.jbgui.GDesktop Object[] options = new Object[] { MessageManager.getString("action.ok"), MessageManager.getString("action.cancel") }; - Callable action = () -> { + Runnable action = () -> { @SuppressWarnings("unchecked") String url = (history instanceof JTextField ? ((JTextField) history).getText() @@ -1351,8 +1367,7 @@ public class Desktop extends jalview.jbgui.GDesktop JvOptionPane.showInternalMessageDialog(Desktop.desktop, msg, MessageManager.getString("label.url_not_found"), JvOptionPane.WARNING_MESSAGE); - - return null; // Void + return; } if (viewport != null) @@ -1365,7 +1380,6 @@ public class Desktop extends jalview.jbgui.GDesktop new FileLoader().LoadFile(url, DataSourceType.URL, format); } } - return null; // Void }; String dialogOption = MessageManager .getString("label.input_alignment_from_url"); @@ -1404,7 +1418,7 @@ public class Desktop extends jalview.jbgui.GDesktop public QuitHandler.QResponse desktopQuit(boolean ui, boolean disposeFlag) { - final Callable doDesktopQuit = () -> { + final Runnable doDesktopQuit = () -> { Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); Cache.setProperty("SCREENGEOMETRY_WIDTH", screen.width + ""); Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height + ""); @@ -1430,7 +1444,7 @@ public class Desktop extends jalview.jbgui.GDesktop if (QuitHandler.quitCancelled()) { jalview.bin.Console.debug("Desktop aborting quit"); - return null; + return; } if (dialogExecutor != null) @@ -1459,8 +1473,6 @@ public class Desktop extends jalview.jbgui.GDesktop // instance.dispose(); } instance.quit(); - - return null; // Void }; return QuitHandler.getQuitResponse(ui, doDesktopQuit, doDesktopQuit, @@ -1476,7 +1488,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). - System.exit(0); + Jalview.exit("Desktop exiting.", 0); } private void storeLastKnownDimensions(String string, Rectangle jc) @@ -1608,7 +1620,7 @@ public class Desktop extends jalview.jbgui.GDesktop } } Jalview.setCurrentAlignFrame(null); - System.out.println("ALL CLOSED"); + jalview.bin.Console.info("ALL CLOSED"); /* * reset state of singleton objects as appropriate (clear down session state @@ -1959,7 +1971,6 @@ public class Desktop extends jalview.jbgui.GDesktop } } }, "Project Loader").start(); - return null; }); chooser.showOpenDialog(this); @@ -3049,7 +3060,7 @@ public class Desktop extends jalview.jbgui.GDesktop /** * pause the queue */ - private java.util.concurrent.Semaphore block = new Semaphore(0); + private Semaphore block = new Semaphore(0); private static groovy.ui.Console groovyConsole; @@ -3067,12 +3078,7 @@ public class Desktop extends jalview.jbgui.GDesktop { if (dialogPause) { - try - { - block.acquire(); - } catch (InterruptedException x) - { - } + acquireDialogQueue(); } if (instance == null) { @@ -3090,12 +3096,41 @@ public class Desktop extends jalview.jbgui.GDesktop }); } + private boolean dialogQueueStarted = false; + public void startDialogQueue() { + if (dialogQueueStarted) + { + return; + } // set the flag so we don't pause waiting for another permit and semaphore // the current task to begin - dialogPause = false; + releaseDialogQueue(); + dialogQueueStarted = true; + } + + public void acquireDialogQueue() + { + try + { + block.acquire(); + dialogPause = true; + } catch (InterruptedException e) + { + jalview.bin.Console.debug("Interruption when acquiring DialogueQueue", + e); + } + } + + public void releaseDialogQueue() + { + if (!dialogPause) + { + return; + } block.release(); + dialogPause = false; } /** @@ -3130,7 +3165,15 @@ public class Desktop extends jalview.jbgui.GDesktop String title = "View of desktop"; ImageExporter exporter = new ImageExporter(writer, null, TYPE.EPS, title); - exporter.doExport(of, this, width, height, title); + try + { + exporter.doExport(of, this, width, height, title); + } catch (ImageOutputException ioex) + { + jalview.bin.Console.error( + "Unexpected error whilst writing Jalview desktop snapshot as EPS", + ioex); + } } /** @@ -3570,4 +3613,38 @@ public class Desktop extends jalview.jbgui.GDesktop jalview.bin.Console.debug(Cache.getStackTraceString(e)); } } + + /** + * closes the current instance window, disposes and forgets about it. + */ + public static void closeDesktop() + { + if (Desktop.instance != null) + { + Desktop.instance.closeAll_actionPerformed(null); + Desktop.instance.setVisible(false); + Desktop.instance.dispose(); + Desktop.instance = null; + } + } + + /** + * 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) + { + if (frame instanceof IProgressIndicator) + { + if (((IProgressIndicator)frame).operationInProgress()) + { + return true; + } + } + } + return operationInProgress(); + } }