summaryrefslogtreecommitdiff
path: root/NET/worlds/network/ProgressDialog.java
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-12 22:33:32 -0800
committerFuwn <[email protected]>2026-02-12 22:33:32 -0800
commitc7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9 (patch)
treedf9f48bf128a6c0186a8e91857d6ff30fe0e9f18 /NET/worlds/network/ProgressDialog.java
downloadworldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.tar.xz
worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.zip
Initial commit
Diffstat (limited to 'NET/worlds/network/ProgressDialog.java')
-rw-r--r--NET/worlds/network/ProgressDialog.java223
1 files changed, 223 insertions, 0 deletions
diff --git a/NET/worlds/network/ProgressDialog.java b/NET/worlds/network/ProgressDialog.java
new file mode 100644
index 0000000..85b4c20
--- /dev/null
+++ b/NET/worlds/network/ProgressDialog.java
@@ -0,0 +1,223 @@
+package NET.worlds.network;
+
+import NET.worlds.console.Console;
+import NET.worlds.console.PolledDialog;
+import NET.worlds.core.Std;
+import java.awt.Event;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.Label;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.text.NumberFormat;
+import java.util.Locale;
+import java.util.Vector;
+
+public class ProgressDialog extends PolledDialog {
+ private static final long serialVersionUID = 7533646170494183110L;
+ private static final String bytesMsg = Console.message("Bytes-remaining");
+ private int bytesTotal;
+ private int bytesLoaded;
+ private ProgressBar progressBar;
+ private Label progressBytes;
+ private Label progressTime;
+ private int startTime = Std.getFastTime();
+ private CacheFile cf;
+ private boolean cancelled;
+ private int wholeFileBytes = 0;
+
+ public ProgressDialog(int totalSize) {
+ super(Console.getFrame(), null, Console.message("Download-Progress"), false);
+ this.bytesTotal = totalSize;
+ this.progressBar = new ProgressBar(240);
+ NumberFormat nF = NumberFormat.getNumberInstance(Locale.getDefault());
+ String strSize = nF.format((long)totalSize);
+ this.progressBytes = new Label(bytesMsg + strSize);
+ this.progressTime = new Label("");
+ this.setAlignment(1);
+ this.readySetGo();
+ }
+
+ public boolean loadFiles(Vector<String> names, Vector<URL> urls) throws IOException {
+ try {
+ int count = names.size();
+ int i = 0;
+
+ while (true) {
+ if (i >= count) {
+ return true;
+ }
+
+ synchronized (this) {
+ if (this.cancelled) {
+ NetUpdate.warnUser("Upgrade cancelled.");
+ break;
+ }
+
+ if (this.cf != null) {
+ this.wholeFileBytes = this.wholeFileBytes + this.cf.bytesLoaded();
+ }
+
+ this.cf = Cache.getFile(urls.elementAt(i));
+ }
+
+ this.cf.waitUntilLoaded();
+ if (!this.cf.isActive()) {
+ this.cf.markTemporary();
+ NetUpdate.warnUser("Upgrade cancelled.");
+ break;
+ }
+
+ if (this.cf.error()) {
+ this.cf.markTemporary();
+ NetUpdate.warnUser("Error getting upgrade info, try again later");
+ break;
+ }
+
+ copyFile(this.cf.getLocalName(), names.elementAt(i));
+ this.cf.markTemporary();
+ this.cf.close();
+ i++;
+ }
+ } finally {
+ this.done(true);
+ }
+
+ return false;
+ }
+
+ public static boolean copyFile(String from, String to) {
+ int lastSlash = to.lastIndexOf(47);
+ int lastBackslash = to.lastIndexOf(92);
+ if (lastBackslash > lastSlash) {
+ lastSlash = lastBackslash;
+ }
+
+ if (lastSlash >= 0) {
+ new File(to.substring(0, lastSlash)).mkdirs();
+ }
+
+ FileInputStream s = null;
+ FileOutputStream d = null;
+
+ try {
+ try {
+ s = new FileInputStream(from);
+ d = new FileOutputStream(to);
+ byte[] buffer = new byte[1024];
+
+ while (true) {
+ int got = s.read(buffer);
+ if (got == -1) {
+ return true;
+ }
+
+ d.write(buffer, 0, got);
+ }
+ } finally {
+ if (d != null) {
+ d.close();
+ }
+
+ if (s != null) {
+ s.close();
+ }
+ }
+ } catch (IOException var12) {
+ return false;
+ }
+ }
+
+ @Override
+ protected void build() {
+ GridBagLayout gbag = new GridBagLayout();
+ this.setLayout(gbag);
+ GridBagConstraints c = new GridBagConstraints();
+ c.anchor = 10;
+ c.gridwidth = 0;
+ c.weightx = 1.0;
+ c.weighty = 1.0;
+ this.add(gbag, new Label(Console.message("Downloading-update")), c);
+ c.insets = new Insets(2, 2, 2, 2);
+ this.add(gbag, this.progressBar, c);
+ c.insets = new Insets(0, 2, 0, 2);
+ c.anchor = 17;
+ this.add(gbag, this.progressBytes, c);
+ c.fill = 2;
+ this.add(gbag, this.progressTime, c);
+ }
+
+ @Override
+ protected synchronized void activeCallback() {
+ int n;
+ synchronized (this) {
+ n = this.wholeFileBytes;
+ if (this.cf != null) {
+ n += this.cf.bytesLoaded();
+ }
+ }
+
+ if (n != this.bytesLoaded) {
+ this.bytesLoaded = n;
+ this.progressBar.setProgress((double)this.bytesLoaded / this.bytesTotal);
+ int bytesRemaining = this.bytesTotal - this.bytesLoaded;
+ NumberFormat nF = NumberFormat.getNumberInstance(Locale.getDefault());
+ String strRemain = nF.format((long)bytesRemaining);
+ this.progressBytes.setText(bytesMsg + strRemain);
+ int elapsed = (Std.getFastTime() - this.startTime) / 1000;
+ if (elapsed > 0) {
+ double bytesPerSec = (double)this.bytesLoaded / elapsed;
+ if (bytesPerSec > 0.0) {
+ String bps = formatTime((long)(bytesRemaining / bytesPerSec));
+ Object[] arguments = new Object[]{new String(bps)};
+ this.progressTime.setText(MessageFormat.format(Console.message("Time-remaining"), arguments));
+ }
+ }
+ }
+
+ this.notify();
+ }
+
+ @Override
+ protected boolean done(boolean confirmed) {
+ synchronized (this) {
+ this.cancelled = true;
+ if (this.cf != null) {
+ this.cf.close();
+ }
+ }
+
+ return super.done(confirmed);
+ }
+
+ private static String fmtTwoDigit(long val) {
+ return val < 10L ? "0" + val : "" + val;
+ }
+
+ private static String formatTime(long secs) {
+ String result = "";
+ long hrs = secs / 3600L;
+ secs -= hrs * 3600L;
+ long mins = secs / 60L;
+ secs -= mins * 60L;
+ if (hrs > 0L) {
+ result = result + hrs + ":";
+ }
+
+ return result + fmtTwoDigit(mins) + ":" + fmtTwoDigit(secs);
+ }
+
+ @Override
+ public boolean handleEvent(Event event) {
+ if (event.id == 1004) {
+ Console.getFrame().requestFocus();
+ return true;
+ } else {
+ return super.handleEvent(event);
+ }
+ }
+}