/*
* Copyright 2004 - 2008 Christian Sprajc. All rights reserved.
*
* This file is part of PowerFolder.
*
* PowerFolder is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation.
*
* PowerFolder is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PowerFolder. If not, see <http://www.gnu.org/licenses/>.
*
* $Id$
*/
package de.dal33t.powerfolder.ui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JWindow;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.ui.util.Icons;
import de.dal33t.powerfolder.util.Waiter;
/**
* Splash screen
*
* @author <a href="mailto:totmacher@powerfolder.com">Christian Sprajc </a>
* @version $Revision: 1.16 $
*/
@SuppressWarnings("serial")
public class SplashScreen extends JWindow {
private static final Logger log = Logger.getLogger(SplashScreen.class
.getName());
private Controller controller;
private JProgressBar bar;
private Thread splashThread;
private JLabel image;
private Timer timer;
private int nPercentageGuessed;
private int nextPercentage;
private Date startTime;
/**
* New splashscreen
*
* @param controller
* the controller.
* @param waitTime
*/
public SplashScreen(final Controller controller, int waitTime) {
if (controller == null) {
throw new NullPointerException("Controller is null");
}
this.controller = controller;
// Get last start time
long lastStartTookMS = controller.getPreferences().getLong(
"lastStartTookMS", 1000);
image = new JLabel(Icons.getIconById(Icons.SPLASH));
image.setBorder(BorderFactory.createEmptyBorder());
bar = new JProgressBar(SwingConstants.HORIZONTAL, 0, 100);
bar.setBorder(BorderFactory.createEmptyBorder());
getContentPane().add(image, BorderLayout.NORTH);
getContentPane().add(bar, BorderLayout.SOUTH);
pack();
timer = new Timer("Splash barupdater", true);
timer.schedule(new BarUpdater(), 0,
Math.max((int) lastStartTookMS / 200, 10));
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension labelSize = getPreferredSize();
setLocation(screenSize.width / 2 - labelSize.width / 2,
(int) (screenSize.height / 2.5) - labelSize.height / 2);
final int pause = waitTime;
final Runnable closerRunner = new Runnable() {
public void run() {
timer.purge();
timer.cancel();
setVisible(false);
dispose();
}
};
Runnable waitRunner = new Runnable() {
public void run() {
try {
Waiter waiter = new Waiter(pause);
while (!waiter.isTimeout()) {
waiter.waitABit();
if (controller.isShuttingDown()) {
break;
}
}
} catch (RuntimeException e) {
// Ignore
} finally {
SwingUtilities.invokeLater(closerRunner);
}
}
};
setVisible(true);
splashThread = new Thread(waitRunner, "SplashScreenThread");
splashThread.start();
}
/**
* Updates the bar and intercalculate completion percentage
*
* @author <a href="mailto:totmacher@powerfolder.com">Christian Sprajc</a>
*/
private class BarUpdater extends TimerTask {
@Override
public void run() {
EventQueue.invokeLater(new Runnable() {
public void run() {
int v = bar.getValue();
if (v < nextPercentage && nPercentageGuessed < 30) {
bar.setValue(v + 1);
nPercentageGuessed++;
}
}
});
}
}
/**
* Sets the completion percentage of loading process
*
* @param absPerc
*/
public void setCompletionPercentage(final int absPerc, int nextPerc) {
if (startTime == null) {
// Started
startTime = new Date();
}
if (absPerc >= 100) {
long startTook = System.currentTimeMillis() - startTime.getTime();
// completed
controller.getPreferences().putLong("lastStartTookMS", startTook);
}
// Not longer guessed
nPercentageGuessed = 0;
nextPercentage = nextPerc;
try {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
bar.setValue(absPerc);
// draw version number only once (cannot do in init, no yet
// Graphics there)
Graphics g = image.getGraphics();
if (g == null) {
return;
}
String version = Controller.PROGRAM_VERSION;
g.drawString(version, 20, getHeight() - 25);
}
});
} catch (InterruptedException e) {
log.log(Level.SEVERE, "InterruptedException", e);
} catch (InvocationTargetException e) {
log.log(Level.SEVERE, "InvocationTargetException", e);
}
}
/**
* Shutsdown/hides the splashscreen
*/
public void shutdown() {
setVisible(false);
dispose();
if (splashThread != null) {
splashThread.interrupt();
}
timer.purge();
timer.cancel();
}
}