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;
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;
{
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.
+ */
+ jalview.bin.Console.errPrintln(
"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();
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");
}
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));
}
}
setBounds(xPos, yPos, 900, 650);
}
+ // start dialogue queue for single dialogues
+ startDialogQueue();
+
if (!Platform.isJS())
/**
* Java only
}
});
desktop.addMouseListener(ma);
+
+ if (Platform.isJS())
+ {
+ // used for jalviewjsTest
+ jalview.bin.Console.info("JALVIEWJS: CREATED DESKTOP");
+ }
}
/**
// 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
}
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);
+
+ if (contents != null)
+ {
+ String file = (String) contents
+ .getTransferData(DataFlavor.stringFlavor);
- FileFormatI format = new IdentifyFile().identify(file,
- DataSourceType.PASTE);
+ 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)
+ {
+ jalview.bin.Console.outPrintln(
+ "Unable to paste alignment from system clipboard:\n" + ex);
}
- } catch (Exception ex)
- {
- System.out.println(
- "Unable to paste alignment from system clipboard:\n" + ex);
- }
}
}
setKeyBindings(frame);
- desktop.add(frame);
+ // 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;
+ } catch (IllegalArgumentException iaex)
+ {
+ last=iaex;
+ tries--;
+ jalview.bin.Console.info(
+ "Squashed IllegalArgument Exception (" + tries + " left) for "+frame.getTitle(),
+ iaex);
+ try
+ {
+ Thread.sleep(5);
+ } catch (InterruptedException iex)
+ {
+ }
+ ;
+ }
+ } while (!shown && tries > 0);
+ if (!shown)
+ {
+ jalview.bin.Console.error("Serious Problem whilst showing window "+frame.getTitle(),last);
+ }
windowMenu.add(menuItem);
new FileLoader().LoadFile(viewport, selectedFile, DataSourceType.FILE,
format);
- return null;
});
chooser.showOpenDialog(this);
}
Object[] options = new Object[] { MessageManager.getString("action.ok"),
MessageManager.getString("action.cancel") };
- Callable<Void> action = () -> {
+ Runnable action = () -> {
@SuppressWarnings("unchecked")
String url = (history instanceof JTextField
? ((JTextField) history).getText()
JvOptionPane.showInternalMessageDialog(Desktop.desktop, msg,
MessageManager.getString("label.url_not_found"),
JvOptionPane.WARNING_MESSAGE);
-
- return null; // Void
+ return;
}
if (viewport != null)
new FileLoader().LoadFile(url, DataSourceType.URL, format);
}
}
- return null; // Void
};
String dialogOption = MessageManager
.getString("label.input_alignment_from_url");
public QuitHandler.QResponse desktopQuit(boolean ui, boolean disposeFlag)
{
- final Callable<Void> doDesktopQuit = () -> {
+ final Runnable doDesktopQuit = () -> {
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
Cache.setProperty("SCREENGEOMETRY_WIDTH", screen.width + "");
Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height + "");
if (QuitHandler.quitCancelled())
{
jalview.bin.Console.debug("Desktop aborting quit");
- return null;
+ return;
}
if (dialogExecutor != null)
// instance.dispose();
}
instance.quit();
-
- return null; // Void
};
return QuitHandler.getQuitResponse(ui, doDesktopQuit, doDesktopQuit,
// 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)
}
} catch (Exception ex)
{
- System.err.println("Error opening help: " + ex.getMessage());
+ jalview.bin.Console.errPrintln("Error opening help: " + ex.getMessage());
}
}
}
}
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
boolean autoSave = projectFile != null && !saveAs
&& BackupFiles.getEnabled();
- // System.out.println("autoSave="+autoSave+", projectFile='"+projectFile+"',
+ // jalview.bin.Console.outPrintln("autoSave="+autoSave+", projectFile='"+projectFile+"',
// saveAs="+saveAs+", Backups
// "+(BackupFiles.getEnabled()?"enabled":"disabled"));
}
}
}, "Project Loader").start();
- return null;
});
chooser.showOpenDialog(this);
/**
* pause the queue
*/
- private java.util.concurrent.Semaphore block = new Semaphore(0);
+ private Semaphore block = new Semaphore(0);
private static groovy.ui.Console groovyConsole;
{
if (dialogPause)
{
- try
- {
- block.acquire();
- } catch (InterruptedException x)
- {
- }
+ acquireDialogQueue();
}
if (instance == null)
{
});
}
+ 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;
}
/**
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);
+ }
}
/**
{
if (Platform.isAMacAndNotJS())
{
- System.err.println(
+ jalview.bin.Console.errPrintln(
"Please ignore plist error - occurs due to problem with java 8 on OSX");
}
}
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 us = Desktop.instance;
+ Desktop.instance = null;
+ // call dispose in a separate thread - try to avoid indirect deadlocks
+ new Thread(new Runnable() {
+ @Override
+ public void run()
+ {
+ ExecutorService dex = us.dialogExecutor;
+ if (dex!=null) {
+ dex.shutdownNow();
+ us.dialogExecutor=null;
+ us.block.drainPermits();
+ }
+ us.dispose();
+ }
+ }).start();
+ }
+ }
+
+ /**
+ * 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();
+ }
}