package org.limewire.ui.swing.components; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Image; import java.text.NumberFormat; import java.util.Locale; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JWindow; import org.limewire.ui.swing.components.decorators.ProgressBarDecorator; import org.limewire.ui.swing.util.I18n; import org.limewire.ui.swing.util.SwingUtils; /** * Window that displays the splash screen. This loads the splash screen * image, places it on the center of the screen, and allows dynamic * updating of the status text for loading the application. */ public class SplashWindow { /** The number format this will use to show percentages. */ private final NumberFormat numberFormat; /** The panel that text & progressbar is drawn on. */ private final JPanel textAndProgressPanel; /** The label that status text is written on. */ private final JLabel textLabel; /** The progressbar. */ private final LimeProgressBar progressBar; /** Constant handle to the label that represents the splash image. */ private final JLabel splashLabel; /** The JWindow the splash uses. */ private final JWindow splashWindow; public SplashWindow(Image splashImage, boolean isPro, Locale locale, int steps) { this.splashWindow = new JWindow(); this.splashLabel = new JLabel(); this.textAndProgressPanel = new JPanel(); this.numberFormat = NumberFormat.getInstance(locale); numberFormat.setMaximumIntegerDigits(3); numberFormat.setMaximumFractionDigits(0); textLabel = new JLabel(); textLabel.setOpaque(false); textLabel.setFont(new Font("Dialog", Font.PLAIN, 12)); textLabel.setForeground(Color.WHITE); progressBar = new LimeProgressBar(); if (isPro) { ProgressBarDecorator.decorateStaticPro(progressBar); } else { ProgressBarDecorator.decorateStaticBasic(progressBar); } int width = progressBar.getPreferredSize().width; progressBar.setPreferredSize(new Dimension(width, 8)); progressBar.setMinimumSize(new Dimension(width, 8)); progressBar.setMaximumSize(new Dimension(Integer.MAX_VALUE, 8)); progressBar.setMaximum(steps+1); progressBar.setMinimum(0); progressBar.setValue(0); textAndProgressPanel.setLayout(new BoxLayout(textAndProgressPanel, BoxLayout.Y_AXIS)); textAndProgressPanel.setOpaque(false); JPanel panel = new JPanel(new BorderLayout()); panel.setOpaque(false); panel.add(textLabel, BorderLayout.SOUTH); textAndProgressPanel.add(Box.createVerticalGlue()); textAndProgressPanel.add(panel); textAndProgressPanel.add(Box.createVerticalStrut(2)); textAndProgressPanel.add(progressBar); textAndProgressPanel.setBorder(BorderFactory.createEmptyBorder(0, 8, 8, 8)); int imgWidth = splashImage.getWidth(null); if(imgWidth < 1) imgWidth = 1; int imgHeight = splashImage.getHeight(null); if(imgHeight < 1) imgHeight = 1; Dimension size = new Dimension(imgWidth + 2, imgHeight + 2); splashWindow.setSize(size); splashLabel.setIcon(new ImageIcon(splashImage)); splashWindow.getContentPane().add(splashLabel, BorderLayout.CENTER); splashWindow.setGlassPane(textAndProgressPanel); splashWindow.pack(); // for some reason if you place this call before the pack, then the splash screen isn't centered correctly splashWindow.setLocationRelativeTo(null); } /** * Sets the Splash Window to be visible. */ public void begin() { SwingUtils.invokeNowOrLater(new Runnable() { public void run() { splashWindow.toFront(); splashWindow.setVisible(true); textAndProgressPanel.setVisible(true); setStatusText(I18n.tr("Loading LimeWire...")); } }); } /** * Sets the loading status text to display in the splash * screen window. * * @param text the text to display */ public void setStatusText(final String text) { SwingUtils.invokeNowOrLater(new Runnable() { public void run() { textLabel.setText(text); progressBar.setValue(progressBar.getValue() + 1); // force a redraw so the status is shown immediately, // even if we're currently in the Swing thread. textAndProgressPanel.paintImmediately(0, 0, textAndProgressPanel.getWidth(), textAndProgressPanel.getHeight()); } }); } public void dispose() { SwingUtils.invokeNowOrLater(new Runnable() { public void run() { splashWindow.dispose(); } }); } }