package net.sf.jabref;
//import javax.swing.*;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.Window;
import java.net.URL;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class SplashScreen extends Window {
private Image splashImage;
private boolean paintCalled = false;
public SplashScreen(Frame owner) {
super(owner);
URL imageURL = SplashScreen.class.getResource("/images/splash.png");
splashImage = Toolkit.getDefaultToolkit().createImage(imageURL);
// Load the image
MediaTracker mt = new MediaTracker(this);
mt.addImage(splashImage,0);
try {
mt.waitForID(0);
} catch(InterruptedException ie) {}
// Center the window on the screen.
int imgWidth = splashImage.getWidth(this);
int imgHeight = splashImage.getHeight(this);
setSize(imgWidth, imgHeight);
setLocationRelativeTo(null);
/* Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
setLocation(
(screenDim.width - imgWidth) / 2,
(screenDim.height - imgHeight) / 2
);
*/
}
/**
* Updates the display area of the window.
*/
public void update(Graphics g) {
// Note: Since the paint method is going to draw an
// image that covers the complete area of the component we
// do not fill the component with its background color
// here. This avoids flickering.
g.setColor(getForeground());
paint(g);
}
/**
* Paints the image on the window.
*/
public void paint(Graphics g) {
g.drawImage(splashImage, 0, 0, this);
// Notify method splash that the window
// has been painted.
if (! paintCalled) {
paintCalled = true;
synchronized (this) { notifyAll(); }
}
}
/**
* Constructs and displays a SplashWindow.<p>
* This method is useful for startup splashs.
* Dispose the returned frame to get rid of the splash window.<p>
*
* @param splashImage The image to be displayed.
* @return Returns the frame that owns the SplashWindow.
*/
public static Frame splash() {
Frame f = new Frame();
SplashScreen w = new SplashScreen(f);
// Show the window.
w.setVisible(true);
w.toFront();
// Note: To make sure the user gets a chance to see the
// splash window we wait until its paint method has been
// called at least once by the AWT event dispatcher thread.
// sebwills adds: However, just in case the paint method never gets called
// (e.g. if the splashscreen is completely obscured by an 'always on top'
// window of some other application), we time-out after 5 seconds.
if (! EventQueue.isDispatchThread()) {
synchronized (w) {
if (! w.paintCalled) {
try {
w.wait(5000);
} catch (InterruptedException e) {}
}
}
}
return f;
}
}