X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=getdown%2Fsrc%2Fgetdown%2Flauncher%2Fsrc%2Fmain%2Fjava%2Fcom%2Fthreerings%2Fgetdown%2Flauncher%2FGetdown.java;h=01bf370e71e5c1448bc0adc7e73a7128c0c95f52;hb=7d8ba6c44b69e49f071c082d19470c399ff84255;hp=99def4f100538ecc6eed3a5cc29f1b7bc66c8028;hpb=f517e5ea31f1749617ac191137891cf87111550b;p=jalview.git diff --git a/getdown/src/getdown/launcher/src/main/java/com/threerings/getdown/launcher/Getdown.java b/getdown/src/getdown/launcher/src/main/java/com/threerings/getdown/launcher/Getdown.java index 99def4f..01bf370 100644 --- a/getdown/src/getdown/launcher/src/main/java/com/threerings/getdown/launcher/Getdown.java +++ b/getdown/src/getdown/launcher/src/main/java/com/threerings/getdown/launcher/Getdown.java @@ -9,18 +9,22 @@ import java.awt.BorderLayout; 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 java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.HttpURLConnection; +import java.net.MalformedURLException; import java.net.URL; import java.util.*; @@ -29,6 +33,7 @@ import javax.swing.AbstractAction; 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.*; @@ -226,6 +231,9 @@ public abstract class Getdown extends Thread Config config = _app.init(true); if (preloads) doPredownloads(_app.getResources()); _ifc = new Application.UpdateInterface(config); + if (_status != null) { + _status.setAppbase(_app.getAppbase()); + } } /** @@ -494,6 +502,19 @@ public abstract class Getdown extends Thread 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"); @@ -552,7 +573,7 @@ public abstract class Getdown extends Thread // 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); } @@ -684,7 +705,7 @@ public abstract class Getdown extends Thread } 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 @@ -713,6 +734,9 @@ public abstract class Getdown extends Thread } } + //_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 @@ -745,9 +769,10 @@ public abstract class Getdown extends Thread 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(); @@ -756,6 +781,49 @@ public abstract class Getdown extends Thread } 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) { @@ -765,12 +833,14 @@ public abstract class Getdown extends Thread _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(); } }); + } /** @@ -787,6 +857,7 @@ public abstract class Getdown extends Thread _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, @@ -801,13 +872,12 @@ public abstract class Getdown extends Thread 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 { @@ -888,9 +958,10 @@ public abstract class Getdown extends Thread 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 + "'."); } @@ -903,9 +974,19 @@ public abstract class Getdown extends Thread _status.setProgress(0, -1L); } else if (percent >= 0) { _status.setProgress(percent, remaining); + } else { + //_status.setStatus("m.initialising", false); } + } }); + + if (_status != null && ! _addedStatusLayer) { + _layers.add(_status, Integer.valueOf(2)); + _addedStatusLayer = true; + initInterface(); + } + } protected void reportTrackingEvent (String event, int progress) @@ -1034,30 +1115,59 @@ public abstract class Getdown extends Thread setStatusAsync(null, stepToGlobalPercent(percent), -1L, false); } }; - + + // 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(); + } 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); + //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 _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; @@ -1068,4 +1178,5 @@ public abstract class Getdown extends Thread protected static final int MAX_LOOPS = 5; protected static final long FALLBACK_CHECK_TIME = 1000L; + }