From 9dde9d119ab3d14477dda70f8c33ba5fccf1c299 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 23 Sep 2011 01:03:23 +0000 Subject: [PATCH] Added the ability to specify a patch notes URL. When Getdown needs to patch, it will provide a button to access the URL if it's non-empty. --- .../threerings/getdown/data/Application.java | 13 ++++++- .../threerings/getdown/launcher/Getdown.java | 39 ++++++++++++++++++- .../getdown/launcher/GetdownApp.java | 24 ++++++++++++ .../getdown/launcher/GetdownApplet.java | 8 ++++ .../threerings/getdown/messages.properties | 4 +- 5 files changed, 85 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/threerings/getdown/data/Application.java b/src/main/java/com/threerings/getdown/data/Application.java index 0dc78f3..f34804d 100644 --- a/src/main/java/com/threerings/getdown/data/Application.java +++ b/src/main/java/com/threerings/getdown/data/Application.java @@ -146,6 +146,12 @@ public class Application /** Where to point the user for help with install errors. */ public String installError; + /** The dimensions of the patch notes button. */ + public Rectangle patchNotes = new Rectangle(5, 50, 112, 26); + + /** The patch notes URL. */ + public String patchNotesUrl; + /** Generates a string representation of this instance. */ @Override public String toString () @@ -153,7 +159,8 @@ public class Application return "[name=" + name + ", bg=" + backgroundImage + ", pi=" + progressImage + ", prect=" + progress + ", pt=" + progressText + ", pb=" + progressBar + ", srect=" + status + ", st=" + statusText + ", shadow=" + textShadow + - ", err=" + installError + "]"; + ", err=" + installError + ", nrect=" + patchNotes + + ", notes=" + patchNotesUrl + "]"; } } @@ -623,6 +630,10 @@ public class Application ui.installError = MessageUtil.taint(ui.installError); } + // the patch notes bits + ui.patchNotes = parseRect(cdata, "ui.patch_notes", ui.patchNotes); + ui.patchNotesUrl = (String)cdata.get("ui.patch_notes_url"); + return ui; } diff --git a/src/main/java/com/threerings/getdown/launcher/Getdown.java b/src/main/java/com/threerings/getdown/launcher/Getdown.java index 586c99a..ec29dee 100644 --- a/src/main/java/com/threerings/getdown/launcher/Getdown.java +++ b/src/main/java/com/threerings/getdown/launcher/Getdown.java @@ -27,13 +27,18 @@ package com.threerings.getdown.launcher; import java.awt.BorderLayout; import java.awt.Container; +import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Image; +import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; +import javax.swing.AbstractAction; import javax.swing.JApplet; +import javax.swing.JButton; import javax.swing.JFrame; +import javax.swing.JLayeredPane; import java.io.BufferedReader; import java.io.File; @@ -630,6 +635,16 @@ public abstract class Getdown extends Thread } } + // show the patch notes button, if applicable + if (!StringUtil.isBlank(_ifc.patchNotesUrl)) { + createInterface(false); + EventQueue.invokeLater(new Runnable() { + public void run () { + _patchNotes.setVisible(true); + } + }); + } + // download the patch files... download(list); @@ -796,8 +811,17 @@ public abstract class Getdown extends Thread public void run () { if (_status == null) { _container = createContainer(); + _layers = new JLayeredPane(); + _container.add(_layers, BorderLayout.CENTER); + _patchNotes = new JButton(new AbstractAction( + _msgs.getString("m.patch_notes")) { + @Override public void actionPerformed (ActionEvent event) { + showDocument(_ifc.patchNotesUrl); + } + }); + _layers.add(_patchNotes); _status = new StatusPanel(_msgs); - _container.add(_status, BorderLayout.CENTER); + _layers.add(_status); initInterface(); } else if (reinit) { initInterface(); @@ -819,6 +843,12 @@ public abstract class Getdown extends Thread _background = newBackgrounds; } _status.init(_ifc, _background, getProgressImage()); + Dimension size = _status.getPreferredSize(); + _status.setSize(size); + _layers.setPreferredSize(size); + + _patchNotes.setBounds(_ifc.patchNotes); + _patchNotes.setVisible(false); } protected RotatingBackgrounds getBackground () @@ -950,6 +980,11 @@ public abstract class Getdown extends Thread return null; } + /** + * Requests to show the document at the specified URL in a new window. + */ + protected abstract void showDocument (String url); + /** * Requests that Getdown exit. In applet mode this does nothing. */ @@ -1026,7 +1061,9 @@ public abstract class Getdown extends Thread protected ResourceBundle _msgs; protected Container _container; + protected JLayeredPane _layers; protected StatusPanel _status; + protected JButton _patchNotes; protected AbortPanel _abort; protected RotatingBackgrounds _background; diff --git a/src/main/java/com/threerings/getdown/launcher/GetdownApp.java b/src/main/java/com/threerings/getdown/launcher/GetdownApp.java index 0dbac85..d4f265a 100644 --- a/src/main/java/com/threerings/getdown/launcher/GetdownApp.java +++ b/src/main/java/com/threerings/getdown/launcher/GetdownApp.java @@ -43,6 +43,7 @@ import javax.swing.WindowConstants; import com.samskivert.swing.util.SwingUtil; import com.samskivert.util.ArrayUtil; +import com.samskivert.util.RunAnywhere; import com.samskivert.util.StringUtil; import static com.threerings.getdown.Log.log; @@ -162,6 +163,29 @@ public class GetdownApp } } @Override + protected void showDocument (String url) { + String[] cmdarray; + if (RunAnywhere.isWindows()) { + String osName = System.getProperty("os.name"); + if (osName.indexOf("9") != -1 || osName.indexOf("Me") != -1) { + cmdarray = new String[] { + "command.com", "/c", "start", "\"" + url + "\"" }; + } else { + cmdarray = new String[] { + "cmd.exe", "/c", "start", "\"\"", "\"" + url + "\"" }; + } + } else if (RunAnywhere.isMacOS()) { + cmdarray = new String[] { "open", url }; + } else { // Linux, Solaris, etc. + cmdarray = new String[] { "firefox", url }; + } + try { + Runtime.getRuntime().exec(cmdarray); + } catch (Exception e) { + log.warning("Failed to open browser.", "cmdarray", cmdarray, e); + } + } + @Override protected void exit (int exitCode) { System.exit(exitCode); } diff --git a/src/main/java/com/threerings/getdown/launcher/GetdownApplet.java b/src/main/java/com/threerings/getdown/launcher/GetdownApplet.java index 423761f..f6a6267 100644 --- a/src/main/java/com/threerings/getdown/launcher/GetdownApplet.java +++ b/src/main/java/com/threerings/getdown/launcher/GetdownApplet.java @@ -147,6 +147,14 @@ public class GetdownApplet extends JApplet return GetdownApplet.this; } @Override + protected void showDocument (String url) { + try { + getAppletContext().showDocument(new URL(url), "_blank"); + } catch (MalformedURLException e) { + log.warning("Invalid document url.", "url", url, e); + } + } + @Override protected void launch () { // if so configured, create a server socket to listen // for a connection from the app diff --git a/src/main/resources/com/threerings/getdown/messages.properties b/src/main/resources/com/threerings/getdown/messages.properties index 783f22f..cde257f 100644 --- a/src/main/resources/com/threerings/getdown/messages.properties +++ b/src/main/resources/com/threerings/getdown/messages.properties @@ -44,6 +44,8 @@ m.validating = Validating... m.patching = Patching... m.launching = Launching... +m.patch_notes = Patch Notes... + m.complete = {0}% complete m.complete_remain = {0}% complete {1} remaining @@ -75,7 +77,7 @@ m.init_error = The application has failed to launch due to the following \ information on how to handle such problems. m.readonly_error = The directory in which this application is installed: \ - \n{0}\nis read-only. Please install the applicaton into a directory where \ + \n{0}\nis read-only. Please install the application into a directory where \ you have write access. m.missing_resource = The application has failed to launch due to a missing \