import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
+import jalview.api.StructureSelectionManagerProvider;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.bin.Cache;
-import jalview.bin.Instance;
import jalview.bin.Jalview;
import jalview.gui.ImageExporter.ImageWriterI;
import jalview.io.BackupFiles;
import jalview.io.IdentifyFile;
import jalview.io.JalviewFileChooser;
import jalview.io.JalviewFileView;
+import jalview.jbgui.GDesktop;
import jalview.jbgui.GSplitFrame;
import jalview.jbgui.GStructureViewer;
import jalview.project.Jalview2XML;
* @version $Revision: 1.155 $
*/
@SuppressWarnings("serial")
-public class Desktop extends jalview.jbgui.GDesktop
+public class Desktop extends GDesktop
implements DropTargetListener, ClipboardOwner, IProgressIndicator,
- jalview.api.StructureSelectionManagerProvider
+ StructureSelectionManagerProvider, ApplicationSingletonI
{
+
private final static int DEFAULT_MIN_WIDTH = 300;
private final static int DEFAULT_MIN_HEIGHT = 250;
public static MyDesktopPane getDesktopPane()
{
- return Instance.getDesktop().desktopPane;
+ return Desktop.getInstance().desktopPane;
+ }
+
+ public StructureSelectionManager getStructureSelectionManager()
+ {
+ return StructureSelectionManager
+ .getStructureSelectionManager(this);
}
static int openFrameCount = 0;
public MyDesktopPane desktopPane;
+ /**
+ * Answers an 'application scope' singleton instance of this class. Separate
+ * SwingJS 'applets' running in the same browser page will each have a
+ * distinct instance of Desktop.
+ *
+ * @return
+ */
+ public static Desktop getInstance()
+ {
+ return (Desktop) ApplicationSingletonProvider
+ .getInstance(Desktop.class);
+ }
+
+ /**
+ * For testing.
+ *
+ * @param forInstance
+ */
public Desktop(boolean forInstance)
{
instanceOnly = true;
}
+
/**
- * Creates a new Desktop object.
+ * Private constructor enforces singleton pattern. It is called by reflection
+ * from ApplicationSingletonProvider.getInstance().
*/
- public Desktop()
+ @SuppressWarnings("unused")
+ private Desktop()
{
/**
* A note to implementors. It is ESSENTIAL that any activities that might
* block are spawned off as threads rather than waited for during this
* constructor.
*/
- Instance.setDesktop(this);
if (!Platform.isJS())
{
doVamsasClientCheck();
}
-
+
doConfigureStructurePrefs();
setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
boolean showjconsole = jalview.bin.Cache.getDefault("SHOW_JAVA_CONSOLE",
false);
desktopPane = new MyDesktopPane(selmemusage);
-
+
showMemusage.setSelected(selmemusage);
desktopPane.setBackground(Color.white);
getContentPane().setLayout(new BorderLayout());
// JScrollPane sp = new JScrollPane();
// sp.getViewport().setView(desktop);
// getContentPane().add(sp, BorderLayout.CENTER);
-
+
// BH 2018 - just an experiment to try unclipped JInternalFrames.
if (Platform.isJS())
{
getRootPane().putClientProperty("swingjs.overflow.hidden", "false");
}
-
+
getContentPane().add(desktopPane, BorderLayout.CENTER);
desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
-
+
// This line prevents Windows Look&Feel resizing all new windows to maximum
// if previous window was maximised
desktopPane.setDesktopManager(new MyDesktopManager(
? new AquaInternalFrameManager(
desktopPane.getDesktopManager())
: desktopPane.getDesktopManager())));
-
+
Rectangle dims = getLastKnownDimensions("");
if (dims != null)
{
int yPos = Math.max(5, (screenSize.height - 650) / 2);
setBounds(xPos, yPos, 900, 650);
}
-
+
if (!Platform.isJS())
/**
* Java only
* @j2sIgnore
*/
{
-
+
jconsole = new Console(this, showjconsole);
// add essential build information
jconsole.setHeader("Jalview Version: "
+ System.getProperty("os.arch") + " "
+ System.getProperty("os.name") + " "
+ System.getProperty("os.version"));
-
+
showConsole(showjconsole);
-
+
showNews.setVisible(false);
-
+
experimentalFeatures.setSelected(showExperimental());
-
+
getIdentifiersOrgData();
-
+
checkURLLinks();
-
+
// Spawn a thread that shows the splashscreen
-
+
SwingUtilities.invokeLater(new Runnable()
{
@Override
new SplashScreen();
}
});
-
+
// Thread off a new instance of the file chooser - this reduces the time
// it
// takes to open it later on.
changeSupport.addJalviewPropertyChangeListener("services",
new PropertyChangeListener()
{
-
+
@Override
public void propertyChange(PropertyChangeEvent evt)
{
+ evt.getNewValue());
JalviewServicesChanged(evt);
}
-
+
});
-
+
}
-
+
this.setDropTarget(new java.awt.dnd.DropTarget(desktopPane, this));
-
+
this.addWindowListener(new WindowAdapter()
{
@Override
quit();
}
});
-
+
MouseAdapter ma;
this.addMouseListener(ma = new MouseAdapter()
{
showPasteMenu(evt.getX(), evt.getY());
}
}
-
+
@Override
public void mouseReleased(MouseEvent evt)
{
}
});
desktopPane.addMouseListener(ma);
-
}
/**
public void doConfigureStructurePrefs()
{
// configure services
- StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(this);
+ StructureSelectionManager ssm = getStructureSelectionManager();
if (jalview.bin.Cache.getDefault(Preferences.ADD_SS_ANN, true))
{
ssm.setAddTempFacAnnot(jalview.bin.Cache
}
}
}).start();
- ;
+
}
@Override
// A HEADLESS STATE WHEN NO DESKTOP EXISTS. MUST RETURN
// IF JALVIEW IS RUNNING HEADLESS
// ///////////////////////////////////////////////
- if (Instance.getDesktop().instanceOnly || Jalview.isHeadlessMode())
+ if (Desktop.getInstance().instanceOnly || Jalview.isHeadlessMode())
{
return;
}
{
menuItem.removeActionListener(menuItem.getActionListeners()[0]);
}
- Instance.getDesktop().windowMenu.remove(menuItem);
- };
+ Desktop.getInstance().windowMenu.remove(menuItem);
+ }
});
menuItem.addActionListener(new ActionListener()
getDesktopPane().add(frame);
- Instance.getDesktop().windowMenu.add(menuItem);
+ Desktop.getInstance().windowMenu.add(menuItem);
frame.toFront();
try
{
if (!internalCopy)
{
- Instance.getDesktop().jalviewClipboard = null;
+ Desktop.getInstance().jalviewClipboard = null;
}
internalCopy = false;
* reset state of singleton objects as appropriate (clear down session state
* when all windows are closed)
*/
- StructureSelectionManager ssm = StructureSelectionManager
- .getStructureSelectionManager(this);
- if (ssm != null)
- {
- ssm.resetAll();
- }
+ getStructureSelectionManager().resetAll();
}
@Override
});
rthr.start();
}
- };
+ }
});
VamsasStMenu.add(sessit);
}
if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
{
- t2 = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+ t2 = jalview.ws.jws2.Jws2Discoverer.getInstance()
.startDiscoverer(changeSupport);
}
Thread t3 = null;
{
if (evt.getNewValue() == null || evt.getNewValue() instanceof Vector)
{
- final String ermsg = jalview.ws.jws2.Jws2Discoverer.getDiscoverer()
+ final String ermsg = jalview.ws.jws2.Jws2Discoverer.getInstance()
.getErrorMessages();
if (ermsg != null)
{
*/
public static void showUrl(final String url)
{
- showUrl(url, Instance.getDesktop());
+ showUrl(url, Desktop.getInstance());
}
/**
public static ParamManager getUserParameterStore()
{
- Desktop d = Instance.getDesktop();
+ Desktop d = Desktop.getInstance();
if (d.wsparamManager == null)
{
d.wsparamManager = new WsParamSetManager();
} catch (InterruptedException x)
{
}
- ;
}
if (instanceOnly)
{
public static groovy.ui.Console getGroovyConsole()
{
- return Instance.getDesktop().groovyConsole;
+ return Desktop.getInstance().groovyConsole;
}
/**
System.err.println(
"Please ignore plist error - occurs due to problem with java 8 on OSX");
}
- ;
}
} catch (Throwable ex)
{