/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander 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; either version 3 of the License, or * (at your option) any later version. * * muCommander 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 this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.ui.main; import com.mucommander.commons.file.util.ResourceLoader; import com.mucommander.ui.dialog.DialogToolkit; import com.mucommander.ui.icon.IconManager; import javax.swing.*; import java.awt.*; /** * Splash screen that gets displayed on muCommander startup. * * <p>The splash screen is made of a logo image on top of which is displayed muCommander version number (in the top right corner) * and a loading message (in the lower left corner) which is updated by {@link com.mucommander.muCommander} to show startup progress. * It is then closed by {@link com.mucommander.muCommander} when muCommander is fully started and ready for use.</p> * * @author Maxence Bernard */ public class SplashScreen extends JWindow { /** muCommander version displayed on this splash screen */ private String version; /** Current loading message displayed on this splash screen */ private String loadingMessage; /** Font used to display version and loading message on this splash screen */ private Font customFont; /** Path to the splash screen logo image within the JAR file */ private final static String SPLASH_IMAGE_PATH = IconManager.getIconSetFolder(IconManager.MUCOMMANDER_ICON_SET)+"splash.png"; /** Name of the font used to display text on this splash screen */ private final static String FONT_NAME = "Courier"; /** Style of the font used to display text on this splash screen */ // private final static int FONT_STYLE = Font.PLAIN; private final static int FONT_STYLE = Font.BOLD; /** Size of the font used to display text on this splash screen */ private final static int FONT_SIZE = 11; /** Color of the text displayed on this splash screen */ private final static Color TEXT_COLOR = new Color(192, 238, 241); private final static Color SHADOW_TEXT_COLOR = new Color(0, 86, 117); /** Number of pixels between the loading message and the left side of the splash image */ private final static int LOADING_MSG_MARGIN_X = 4; /** Number of pixels between the loading message and the bottom of the splash image */ private final static int LOADING_MSG_MARGIN_Y = 6; /** Number of pixels between the version information and the right side of the splash image */ private final static int VERSION_MARGIN_X = 5; /** Number of pixels between the version information and the top of the splash image */ private final static int VERSION_MARGIN_Y = 3; /** * Creates and displays a new SplashScreen, with the given version string and initial loading message. * * @param version muCommander version string which will be displayed in the top right corner * @param loadingMessage initial loading message, displayed in the lower left corner */ public SplashScreen(String version, String loadingMessage) { this.version = version; this.loadingMessage = loadingMessage; // Create a custom font this.customFont = new Font(FONT_NAME, FONT_STYLE, FONT_SIZE); // Resolve the URL of the splash logo image within the JAR file and create an ImageIcon // Note: DO NOT use IconManager to load the icon as it would trigger ConfigurationManager's initialization // and we don't want that, we want SpashScreen to be displayed as soon as possible ImageIcon imageIcon = new ImageIcon(ResourceLoader.getResourceAsURL(SPLASH_IMAGE_PATH)); // Wait for the image to be fully loaded MediaTracker mediaTracker = new MediaTracker(this); mediaTracker.addImage(imageIcon.getImage(), 0); try { mediaTracker.waitForID(0); } catch(InterruptedException e) {} setContentPane(new JLabel(imageIcon)); // Set size manually instead of using pack(), because of a bug under 1.3.1/Win32 which // eats a 1-pixel row of the image // pack(); int width = imageIcon.getIconWidth(); int height = imageIcon.getIconHeight(); setSize(width, height); DialogToolkit.centerOnScreen(this); // Display the splash screen setVisible(true); } /** * Repaints this SplashScreen to display the new given loading message, replacing the previous one. * * @param msg the new loading message to be displayed */ public void setLoadingMessage(String msg) { this.loadingMessage = msg; repaint(); } /** * Overridden paint method. */ @Override public void paint(Graphics g) { super.paint(g); g.setFont(customFont); // Display loading message in the lower left corner int textX = LOADING_MSG_MARGIN_X; int textY = getHeight()-LOADING_MSG_MARGIN_Y; g.setColor(SHADOW_TEXT_COLOR); g.drawString(loadingMessage, textX-1, textY-1); g.setColor(TEXT_COLOR); g.drawString(loadingMessage, textX, textY); // Display version in the top right corner // Get FontRenderContext instance to calculate text width and height java.awt.font.FontRenderContext fontRenderContext = ((Graphics2D)g).getFontRenderContext(); java.awt.geom.Rectangle2D textBounds = new java.awt.font.TextLayout(version, customFont, fontRenderContext).getBounds(); textX = getWidth()-(int)textBounds.getWidth()-VERSION_MARGIN_X; textY = (int)textBounds.getHeight()+VERSION_MARGIN_Y; g.setColor(SHADOW_TEXT_COLOR); g.drawString(version, textX-1, textY-1); g.setColor(TEXT_COLOR); g.drawString(version, textX, textY); } }