// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JSeparator; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.border.EtchedBorder; import org.openstreetmap.josm.data.Version; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.gui.progress.ProgressRenderer; import org.openstreetmap.josm.gui.progress.SwingRenderingProgressMonitor; import org.openstreetmap.josm.tools.ImageProvider; /** * Show a splash screen so the user knows what is happening during startup. * */ public class SplashScreen extends JFrame { private SplashScreenProgressRenderer progressRenderer; private SwingRenderingProgressMonitor progressMonitor; public SplashScreen() { super(); setUndecorated(true); // Add a nice border to the main splash screen JPanel contentPane = (JPanel)this.getContentPane(); Border margin = new EtchedBorder(1, Color.white, Color.gray); contentPane.setBorder(margin); // Add a margin from the border to the content JPanel innerContentPane = new JPanel(); innerContentPane.setBorder(new EmptyBorder(10, 10, 2, 10)); contentPane.add(innerContentPane); innerContentPane.setLayout(new GridBagLayout()); // Add the logo JLabel logo = new JLabel(ImageProvider.get("logo.png")); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridheight = 2; innerContentPane.add(logo, gbc); // Add the name of this application JLabel caption = new JLabel("JOSM - " + tr("Java OpenStreetMap Editor")); caption.setFont(new Font("Helvetica", Font.BOLD, 20)); gbc.gridheight = 1; gbc.gridx = 1; gbc.insets = new Insets(30, 0, 0, 0); innerContentPane.add(caption, gbc); // Add the version number JLabel version = new JLabel(tr("Version {0}", Version.getInstance().getVersionString())); gbc.gridy = 1; gbc.insets = new Insets(0, 0, 0, 0); innerContentPane.add(version, gbc); // Add a separator to the status text JSeparator separator = new JSeparator(JSeparator.HORIZONTAL); gbc.gridx = 0; gbc.gridy = 2; gbc.gridwidth = 2; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets(15, 0, 5, 0); innerContentPane.add(separator, gbc); // Add a status message progressRenderer = new SplashScreenProgressRenderer(); gbc.gridy = 3; gbc.insets = new Insets(5, 5, 10, 5); innerContentPane.add(progressRenderer, gbc); progressMonitor = new SwingRenderingProgressMonitor(progressRenderer); pack(); // Center the splash screen setLocationRelativeTo(null); // Add ability to hide splash screen by clicking it addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent event) { setVisible(false); } }); } public ProgressMonitor getProgressMonitor() { return progressMonitor; } static private class SplashScreenProgressRenderer extends JPanel implements ProgressRenderer { private JLabel lblTaskTitle; private JLabel lblCustomText; private JProgressBar progressBar; protected void build() { setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.gridx = 0; gc.gridy = 0; gc.fill = GridBagConstraints.HORIZONTAL; gc.weightx = 1.0; gc.weighty = 0.0; gc.insets = new Insets(5,0,0,5); add(lblTaskTitle = new JLabel(""), gc); gc.gridx = 0; gc.gridy = 1; gc.fill = GridBagConstraints.HORIZONTAL; gc.weightx = 1.0; gc.weighty = 0.0; gc.insets = new Insets(5,0,0,5); add(lblCustomText = new JLabel(""), gc); gc.gridx = 0; gc.gridy = 2; gc.fill = GridBagConstraints.HORIZONTAL; gc.weightx = 1.0; gc.weighty = 0.0; gc.insets = new Insets(5,0,0,5); add(progressBar = new JProgressBar(JProgressBar.HORIZONTAL), gc); } public SplashScreenProgressRenderer() { build(); } public void setCustomText(String message) { lblCustomText.setText(message); repaint(); } public void setIndeterminate(boolean indeterminate) { progressBar.setIndeterminate(indeterminate); repaint(); } public void setMaximum(int maximum) { progressBar.setMaximum(maximum); repaint(); } public void setTaskTitle(String taskTitle) { lblTaskTitle.setText(taskTitle); repaint(); } public void setValue(int value) { progressBar.setValue(value); repaint(); } } }