/*
* SK's Minecraft Launcher
* Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors
* Please see LICENSE.txt for license information.
*/
package com.skcraft.launcher.bootstrap;
import com.skcraft.launcher.Bootstrap;
import lombok.extern.java.Log;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Timer;
import java.util.TimerTask;
import static com.skcraft.launcher.bootstrap.SharedLocale._;
@Log
public class DownloadFrame extends JFrame {
private Downloader downloader;
private Timer timer;
private final JLabel label = new JLabel();
private final JPanel progressPanel = new JPanel(new BorderLayout(0, 5));
private final JPanel textAreaPanel = new JPanel(new BorderLayout());
private final JProgressBar progressBar = new JProgressBar();
private final LinedBoxPanel buttonsPanel = new LinedBoxPanel(true);
private final JButton cancelButton = new JButton(_("button.cancal"));
public DownloadFrame(ProgressObservable observable) {
super(_("downloader.title"));
setResizable(false);
initComponents();
label.setText(_("downloader.pleaseWait"));
setMinimumSize(new Dimension(400, 100));
pack();
setLocationRelativeTo(null);
SwingHelper.setIconImage(this, Bootstrap.class, "bootstrapper_icon.png");
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event) {
if (confirmCancel()) {
cancel();
dispose();
}
}
});
}
private void initComponents() {
buttonsPanel.addGlue();
buttonsPanel.addElement(cancelButton);
buttonsPanel.setBorder(BorderFactory.createEmptyBorder(30, 13, 13, 13));;
progressBar.setIndeterminate(true);
progressBar.setMinimum(0);
progressBar.setMaximum(1000);
progressBar.setPreferredSize(new Dimension(0, 16));
progressPanel.add(label, BorderLayout.NORTH);
progressPanel.setBorder(BorderFactory.createEmptyBorder(13, 13, 0, 13));
progressPanel.add(progressBar, BorderLayout.CENTER);
textAreaPanel.setBorder(BorderFactory.createEmptyBorder(10, 13, 0, 13));
add(progressPanel, BorderLayout.NORTH);
add(textAreaPanel, BorderLayout.CENTER);
add(buttonsPanel, BorderLayout.SOUTH);
textAreaPanel.setVisible(false);
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (confirmCancel()) {
cancel();
dispose();
}
}
});
}
private boolean confirmCancel() {
return SwingHelper.confirmDialog(this, _("progress.confirmCancel"), _("progress.confirmCancelTitle"));
}
private void cancel() {
Downloader downloader = this.downloader;
if (downloader != null) {
downloader.cancel();
} else {
System.exit(0);
}
}
public synchronized void setDownloader(Downloader downloader) {
this.downloader = downloader;
if (downloader == null) {
if (timer != null) {
timer.cancel();
timer = null;
}
} else {
if (timer == null) {
timer = new Timer();
timer.scheduleAtFixedRate(new UpdateProgress( downloader), 500, 500);
}
}
}
private class UpdateProgress extends TimerTask {
private final Downloader downloader;
public UpdateProgress(Downloader downloader) {
this.downloader = downloader;
}
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Downloader downloader = DownloadFrame.this.downloader;
if (downloader != null) {
label.setText(downloader.getStatus());
double progress = downloader.getProgress();
if (progress < 0) {
progressBar.setIndeterminate(true);
} else {
progressBar.setIndeterminate(false);
progressBar.setValue((int) (1000 * progress));
}
} else {
label.setText(_("downloader.pleaseWait"));
progressBar.setIndeterminate(true);
}
}
});
}
}
}