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

Last change on this file since 6084 was 6084, checked in by bastiK, 11 years ago

see #8902 - add missing @Override annotations (patch by shinigami)

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