import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
+import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
+import javax.swing.JPanel;
import com.samskivert.swing.util.SwingUtil;
import com.threerings.getdown.data.*;
Config config = _app.init(true);
if (preloads) doPredownloads(_app.getResources());
_ifc = new Application.UpdateInterface(config);
+ if (_status != null) {
+ _status.setAppbase(_app.getAppbase());
+ }
}
/**
throw new IOException("m.java_download_failed");
}
+ // on Windows, if the local JVM is in use, we will not be able to replace it with an
+ // updated JVM; we detect this by attempting to rename the java.dll to its same name, which
+ // will fail on Windows for in use files; hackery!
+ File javaLocalDir = new File(_app.getAppDir(), LaunchUtil.LOCAL_JAVA_DIR+File.separator);
+ File javaDll = new File(javaLocalDir, "bin" + File.separator + "java.dll");
+ if (javaDll.exists()) {
+ if (!javaDll.renameTo(javaDll)) {
+ log.info("Cannot update local Java VM as it is in use.");
+ return;
+ }
+ log.info("Can update local Java VM as it is not in use.");
+ }
+
reportTrackingEvent("jvm_start", -1);
updateStatus("m.downloading_java");
// show the patch notes button, if applicable
if (!StringUtil.isBlank(_ifc.patchNotesUrl)) {
createInterfaceAsync(false);
- EventQueue.invokeLater(new Runnable() {
+ EQinvoke(new Runnable() {
public void run () {
_patchNotes.setVisible(true);
}
} else {
proc = _app.createProcess(false);
}
-
+
// close standard in to avoid choking standard out of the launched process
proc.getInputStream().close();
// close standard out, since we're not going to write to anything to it anyway
}
}
+ //_container.setVisible(true);
+ //_container.validate();
+
// if we have a UI open and we haven't been around for at least 5 seconds (the default
// for min_show_seconds), don't stick a fork in ourselves straight away but give our
// lovely user a chance to see what we're doing
if (_silent || (_container != null && !reinit)) {
return;
}
-
- EventQueue.invokeLater(new Runnable() {
+
+ EQinvoke (new Runnable() {
public void run () {
+
if (_container == null || reinit) {
if (_container == null) {
_container = createContainer();
}
configureContainer();
_layers = new JLayeredPane();
+
+
+
+ // added in the instant display of a splashscreen
+ try {
+ readConfig(false);
+ Graphics g = _container.getGraphics();
+ BufferedImage iBgImage = loadImage(_ifc.instantBackgroundImage);
+ boolean ibg = true;
+ if (iBgImage == null) {
+ iBgImage = loadImage(_ifc.backgroundImage);
+ ibg = false;
+ }
+ if (iBgImage != null) {
+ final BufferedImage bgImage = iBgImage;
+ int bwidth = bgImage.getWidth();
+ int bheight = bgImage.getHeight();
+
+ log.info("Displaying instant background image", ibg?"instant_background_image":"background_image");
+
+ instantSplashPane = new JPanel() {
+ @Override
+ protected void paintComponent(Graphics g)
+ {
+ super.paintComponent(g);
+ // attempt to draw a background image...
+ if (bgImage != null) {
+ g.drawImage(bgImage, 0, 0, this);
+ }
+ }
+ };
+
+ instantSplashPane.setSize(bwidth,bheight);
+ instantSplashPane.setPreferredSize(new Dimension(bwidth,bheight));
+
+ _layers.add(instantSplashPane, Integer.valueOf(1));
+
+ _container.setPreferredSize(new Dimension(bwidth,bheight));
+ }
+ } catch (Exception e) {
+ log.warning("Failed to set instant background image", "ibg", _ifc.instantBackgroundImage);
+ }
+
_container.add(_layers, BorderLayout.CENTER);
_patchNotes = new JButton(new AbstractAction(_msgs.getString("m.patch_notes")) {
@Override public void actionPerformed (ActionEvent event) {
_patchNotes.setFont(StatusPanel.FONT);
_layers.add(_patchNotes);
_status = new StatusPanel(_msgs);
- _layers.add(_status);
+ setStatusAsync("m.initialising", 0, -1L, true);
+ //_layers.add(_status, Integer.valueOf(2));
initInterface();
}
showContainer();
}
});
+
}
/**
_status.init(_ifc, _background, getProgressImage());
Dimension size = _status.getPreferredSize();
_status.setSize(size);
+ //_status.updateStatusLabel();
_layers.setPreferredSize(size);
_patchNotes.setBounds(_ifc.patchNotes.x, _ifc.patchNotes.y,
protected RotatingBackgrounds getBackground ()
{
- if (_ifc.rotatingBackgrounds != null) {
+ if (_ifc.rotatingBackgrounds != null && _ifc.rotatingBackgrounds.size() > 0) {
if (_ifc.backgroundImage != null) {
log.warning("ui.background_image and ui.rotating_background were both specified. " +
- "The rotating images are being used.");
+ "The background image is being used.");
}
- return new RotatingBackgrounds(_ifc.rotatingBackgrounds, _ifc.errorBackground,
- Getdown.this);
+ return new RotatingBackgrounds(_ifc.rotatingBackgrounds, _ifc.errorBackground, Getdown.this);
} else if (_ifc.backgroundImage != null) {
return new RotatingBackgrounds(loadImage(_ifc.backgroundImage));
} else {
createInterfaceAsync(false);
}
- EventQueue.invokeLater(new Runnable() {
+ EQinvoke(new Runnable() {
public void run () {
- if (_status == null) {
+
+ if (_status == null) {
if (message != null) {
log.info("Dropping status '" + message + "'.");
}
_status.setProgress(0, -1L);
} else if (percent >= 0) {
_status.setProgress(percent, remaining);
+ } else {
+ //_status.setStatus("m.initialising", false);
}
+
}
});
+
+ if (! _addedStatusLayer) {
+ _layers.add(_status, Integer.valueOf(2));
+ _addedStatusLayer = true;
+ initInterface();
+ }
+
}
protected void reportTrackingEvent (String event, int progress)
setStatusAsync(null, stepToGlobalPercent(percent), -1L, false);
}
};
-
- public void setStartupFilesFromParameterString(String p) {
- String q = "\"";
- if (p != null && p.length() > 0) {
- String[] filenames;
- if (p.startsWith(q) && p.endsWith(q)) {
- filenames = p.substring(q.length(),p.length()-q.length()).split(q+" "+q);
- } else {
- filenames = new String[]{p};
- }
- for (int i = 0; i < filenames.length; i++) {
- String filename = filenames[i];
- String ext = null;
- int j = filename.lastIndexOf('.');
- if (j > -1) {
- ext = filename.substring(j+1);
- }
- // jvl files
- if (_app.locatorFileExtension.equals(ext.toLowerCase())) {
- File f = new File(filename);
- if (f.exists()) {
- String appbase = null;
- try {
- java.util.Properties jvlprops = new java.util.Properties();
- FileInputStream in = new FileInputStream(f);
- jvlprops.load(in);
- in.close();
- appbase = jvlprops.getProperty("appbase");
- } catch(Exception e) {
- log.warning("Something went wrong reading Jalview Version Locator file '"+filename+"'", e);
- }
- if (appbase != null) {
- try {
- URL newAppbase = new URL(appbase);
- _app.newAppbase(newAppbase);
- log.warning("Java Version Locator url '"+appbase+"' found in file '"+filename+"' being used");
- } catch(MalformedURLException e) {
- log.warning("Java Version Locator url '"+appbase+"' found in file '"+filename+"' is malformed", e);
- }
- }
- }
- } else {
- // jvp files etc
- boolean addedStartupFile = false; // only add one startup file
- if (! addedStartupFile) {
- File f = new File(filename);
- if (f.exists()) {
- _app.addStartupFile(f);
- addedStartupFile = true;
- }
- }
- }
+
+ // Asynchronous or synchronous progress updates
+ protected void EQinvoke(Runnable r) {
+
+ try {
+ readConfig(false);
+ } catch (Exception e) {
+ log.warning("Could't read config when invoking GUI action", "Exception", e.getMessage());
+ }
+ if (_ifc != null && (_shownContainer?_ifc.progressSyncAfterShown:_ifc.progressSync)) {
+ try {
+ EventQueue.invokeAndWait(r);
+ //r.run();
+ log.warning("INVOKEANDWAIT", "shownContainer", _shownContainer);
+ } catch (Exception e) {
+ log.warning("Tried to invokeAndWait but couldn't. Going to invokeLater instead", "Exception", e.getMessage());
+ EventQueue.invokeLater(r);
}
+ } else {
+ EventQueue.invokeLater(r);
+ log.warning("INVOKELATER", "ifc", _ifc, "shownContainer", _shownContainer);
+ //r.run();
}
+
+ //try { Thread.sleep(500); } catch (Exception e) {}
+
}
-
+
protected Application _app;
protected Application.UpdateInterface _ifc = new Application.UpdateInterface(Config.EMPTY);
protected ResourceBundle _msgs;
protected Container _container;
protected JLayeredPane _layers;
+ protected JPanel instantSplashPane;
protected StatusPanel _status;
protected JButton _patchNotes;
protected AbortPanel _abort;
protected RotatingBackgrounds _background;
+ protected boolean _addedStatusLayer;
protected boolean _dead;
protected boolean _silent;
protected boolean _launchInSilent;
protected boolean _noUpdate;
protected long _startup;
-
+
protected Set<Resource> _toInstallResources;
protected boolean _readyToInstall;
protected boolean _enableTracking = true;
protected int _reportedProgress = 0;
+ protected boolean _shownContainer;
+
/** Number of minutes to wait after startup before beginning any real heavy lifting. */
protected int _delay;