source: josm/trunk/src/org/openstreetmap/josm/gui/SplashScreen.java@ 4820

Last change on this file since 4820 was 4681, checked in by simon04, 15 years ago

see #6329 - improve splash screen: show execution time of items, display more detailed information

  • Property svn:eol-style set to native
File size: 7.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Color;
7import java.awt.Dimension;
8import java.awt.Font;
9import java.awt.GridBagConstraints;
10import java.awt.GridBagLayout;
11import java.awt.Insets;
12import java.awt.event.MouseAdapter;
13import java.awt.event.MouseEvent;
14
15import java.util.Arrays;
16import java.util.LinkedList;
17import javax.swing.JFrame;
18import javax.swing.JLabel;
19import javax.swing.JPanel;
20import javax.swing.JProgressBar;
21import javax.swing.JSeparator;
22import javax.swing.border.Border;
23import javax.swing.border.EmptyBorder;
24import javax.swing.border.EtchedBorder;
25
26import org.openstreetmap.josm.data.Version;
27import org.openstreetmap.josm.gui.progress.ProgressMonitor;
28import org.openstreetmap.josm.gui.progress.ProgressRenderer;
29import org.openstreetmap.josm.gui.progress.SwingRenderingProgressMonitor;
30import org.openstreetmap.josm.tools.ImageProvider;
31
32/**
33 * Show a splash screen so the user knows what is happening during startup.
34 *
35 */
36public class SplashScreen extends JFrame {
37
38 private SplashScreenProgressRenderer progressRenderer;
39 private SwingRenderingProgressMonitor progressMonitor;
40
41 public SplashScreen() {
42 super();
43 setUndecorated(true);
44
45 // Add a nice border to the main splash screen
46 JPanel contentPane = (JPanel)this.getContentPane();
47 Border margin = new EtchedBorder(1, Color.white, Color.gray);
48 contentPane.setBorder(margin);
49
50 // Add a margin from the border to the content
51 JPanel innerContentPane = new JPanel();
52 innerContentPane.setBorder(new EmptyBorder(10, 10, 2, 10));
53 contentPane.add(innerContentPane);
54 innerContentPane.setLayout(new GridBagLayout());
55
56 // Add the logo
57 JLabel logo = new JLabel(ImageProvider.get("logo.png"));
58 GridBagConstraints gbc = new GridBagConstraints();
59 gbc.gridheight = 2;
60 innerContentPane.add(logo, gbc);
61
62 // Add the name of this application
63 JLabel caption = new JLabel("JOSM - " + tr("Java OpenStreetMap Editor"));
64 caption.setFont(new Font("Helvetica", Font.BOLD, 20));
65 gbc.gridheight = 1;
66 gbc.gridx = 1;
67 gbc.insets = new Insets(30, 0, 0, 0);
68 innerContentPane.add(caption, gbc);
69
70 // Add the version number
71 JLabel version = new JLabel(tr("Version {0}", Version.getInstance().getVersionString()));
72 gbc.gridy = 1;
73 gbc.insets = new Insets(0, 0, 0, 0);
74 innerContentPane.add(version, gbc);
75
76 // Add a separator to the status text
77 JSeparator separator = new JSeparator(JSeparator.HORIZONTAL);
78 gbc.gridx = 0;
79 gbc.gridy = 2;
80 gbc.gridwidth = 2;
81 gbc.fill = GridBagConstraints.HORIZONTAL;
82 gbc.insets = new Insets(15, 0, 5, 0);
83 innerContentPane.add(separator, gbc);
84
85 // Add a status message
86 progressRenderer = new SplashScreenProgressRenderer();
87 gbc.gridy = 3;
88 gbc.insets = new Insets(0, 0, 10, 0);
89 innerContentPane.add(progressRenderer, gbc);
90 progressMonitor = new SwingRenderingProgressMonitor(progressRenderer);
91
92 pack();
93
94 // Center the splash screen
95 setLocationRelativeTo(null);
96
97 // Add ability to hide splash screen by clicking it
98 addMouseListener(new MouseAdapter() {
99 @Override
100 public void mousePressed(MouseEvent event) {
101 setVisible(false);
102 }
103 });
104 }
105
106 public ProgressMonitor getProgressMonitor() {
107 return progressMonitor;
108 }
109
110 static private class SplashScreenProgressRenderer extends JPanel implements ProgressRenderer {
111 private JLabel lblTaskTitle;
112 private JLabel lblCustomText;
113 private JProgressBar progressBar;
114
115 protected void build() {
116 setLayout(new GridBagLayout());
117 GridBagConstraints gc = new GridBagConstraints();
118 gc.gridx = 0;
119 gc.gridy = 0;
120 gc.fill = GridBagConstraints.HORIZONTAL;
121 gc.weightx = 1.0;
122 gc.weighty = 0.0;
123 gc.insets = new Insets(5,0,0,0);
124 add(lblTaskTitle = new JLabel(" "), gc);
125
126 gc.gridx = 0;
127 gc.gridy = 1;
128 gc.fill = GridBagConstraints.HORIZONTAL;
129 gc.weightx = 1.0;
130 gc.weighty = 0.0;
131 gc.insets = new Insets(5,0,0,0);
132 add(lblCustomText = new JLabel(" ") {
133 @Override
134 public Dimension getPreferredSize() {
135 Dimension d = super.getPreferredSize();
136 if(d.width < 600) d.width = 600;
137 d.height *= MAX_NUMBER_OF_MESSAGES;
138 return d;
139 }
140 }, gc);
141
142 gc.gridx = 0;
143 gc.gridy = 2;
144 gc.fill = GridBagConstraints.HORIZONTAL;
145 gc.weightx = 1.0;
146 gc.weighty = 0.0;
147 gc.insets = new Insets(5,0,0,0);
148 add(progressBar = new JProgressBar(JProgressBar.HORIZONTAL), gc);
149 }
150
151 public SplashScreenProgressRenderer() {
152 build();
153 }
154
155 public void setCustomText(String message) {
156 if(message.isEmpty())
157 message = " "; /* prevent killing of additional line */
158 lblCustomText.setText(message);
159 repaint();
160 }
161
162 public void setIndeterminate(boolean indeterminate) {
163 progressBar.setIndeterminate(indeterminate);
164 repaint();
165 }
166
167 public void setMaximum(int maximum) {
168 progressBar.setMaximum(maximum);
169 repaint();
170 }
171
172 private static final int MAX_NUMBER_OF_MESSAGES = 3;
173 private LinkedList<String> messages = new LinkedList<String>(Arrays.asList("", "", "")); //update when changing MAX_NUMBER_OF_MESSAGES
174 private long time = System.currentTimeMillis();
175
176 /**
177 * Stores and displays the {@code MAX_NUMBER_OF_MESSAGES} most recent
178 * task titles together with their execution time.
179 */
180 public void setTaskTitle(String taskTitle) {
181
182 while (messages.size() >= MAX_NUMBER_OF_MESSAGES) {
183 messages.removeFirst();
184 }
185 long now = System.currentTimeMillis();
186 String prevMessageTitle = messages.getLast();
187 if (!prevMessageTitle.isEmpty()) {
188 messages.removeLast();
189 messages.add(tr("{0} ({1} ms)", prevMessageTitle, Long.toString(now - time)));
190 }
191 time = now;
192 if (!taskTitle.isEmpty()) {
193 messages.add(taskTitle);
194 }
195 String html = "";
196 int i = 0;
197 for (String m : messages) {
198 html += "<p class=\"entry" + (++i) + "\">" + m + "</p>";
199 }
200
201 lblTaskTitle.setText("<html><style>"
202 + ".entry1{color:#CCCCCC;}"
203 + ".entry2{color:#999999;}"
204 + ".entry3{color:#000000;}</style>" + html + "</html>"); //update when changing MAX_NUMBER_OF_MESSAGES
205 repaint();
206 }
207
208 public void setValue(int value) {
209 progressBar.setValue(value);
210 repaint();
211 }
212 }
213}
Note: See TracBrowser for help on using the repository browser.