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

Last change on this file since 8282 was 7768, checked in by Don-vip, 9 years ago

see #6896 - update logo images - use new logo at fixed resolution in spash screen

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