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

Last change on this file since 7005 was 7005, checked in by Don-vip, 10 years ago

see #8465 - use diamond operator where applicable

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