Newer
Older
sklauncher / launcher-bootstrap / src / main / java / com / skcraft / launcher / bootstrap / DownloadFrame.java
@sk89q sk89q on 25 Jul 2015 4 KB [Bootstrap] Rename _() to tr().
/*
 * 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.tr;

@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(tr("button.cancal"));

    public DownloadFrame(ProgressObservable observable) {
        super(tr("downloader.title"));
        setResizable(false);
        initComponents();
        label.setText(tr("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, tr("progress.confirmCancel"), tr("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(tr("downloader.pleaseWait"));
                        progressBar.setIndeterminate(true);
                    }
                }
            });
        }
    }

}