2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import java.awt.BorderLayout;
24 import java.awt.Color;
25 import java.awt.Component;
26 import java.awt.Dimension;
28 import java.awt.Graphics;
29 import java.awt.Image;
30 import java.awt.MediaTracker;
31 import java.awt.event.MouseAdapter;
32 import java.awt.event.MouseEvent;
34 import javax.swing.JInternalFrame;
35 import javax.swing.JLabel;
36 import javax.swing.JLayeredPane;
37 import javax.swing.JPanel;
38 import javax.swing.JTextPane;
39 import javax.swing.event.HyperlinkEvent;
40 import javax.swing.event.HyperlinkListener;
42 import jalview.util.ChannelProperties;
43 import jalview.util.Platform;
51 public class SplashScreen extends JPanel
52 implements Runnable, HyperlinkListener
54 private static final int SHOW_FOR_SECS = 5;
56 private static final int FONT_SIZE = 11;
58 private boolean visible = true;
60 private JPanel iconimg = new JPanel(new BorderLayout());
62 // could change fg, bg, font later to use ChannelProperties (these are not
63 // actually being used!)
64 private static Color bg = Color.WHITE;
66 private static Color fg = Color.BLACK;
68 private static Font font = new Font("SansSerif", Font.PLAIN, FONT_SIZE);
71 * as JTextPane in Java, JLabel in javascript
73 private Component splashText;
75 private JInternalFrame iframe;
79 private boolean transientDialog = false;
81 private long oldTextLength = -1;
83 public static int logoSize = 32;
86 * allow click in the initial splash screen to dismiss it
87 * immediately (not if opened from About menu)
89 private MouseAdapter closer = new MouseAdapter()
92 public void mousePressed(MouseEvent evt)
100 } catch (Exception ex)
108 * Constructor that displays the splash screen
111 * if true the panel removes itself on click or after a few seconds;
112 * if false it stays up until closed by the user
114 public SplashScreen(boolean isTransient)
116 this.transientDialog = isTransient;
117 if (this.transientDialog)
119 Desktop.instance.acquireDialogQueue();
122 if (Platform.isJS()) // BH 2019
124 splashText = new JLabel("");
135 splashText = new JTextPane();
136 splashText.setBackground(bg);
137 splashText.setForeground(fg);
138 splashText.setFont(font);
139 Thread t = new Thread(this);
146 * ping the jalview version page then create and display the jalview
147 * splashscreen window.
149 void initSplashScreenWindow()
151 addMouseListener(closer);
155 if (!Platform.isJS())
157 image = ChannelProperties.getImage("banner");
158 Image logo = ChannelProperties.getImage("logo.48");
159 MediaTracker mt = new MediaTracker(this);
162 mt.addImage(image, 0);
166 mt.addImage(logo, 1);
173 } catch (InterruptedException x)
178 jalview.bin.Console.errPrintln("Error when loading images!");
180 } while (!mt.checkAll());
181 Desktop.instance.setIconImages(ChannelProperties.getIconList());
183 } catch (Exception ex)
187 this.setBackground(bg);
188 this.setForeground(fg);
191 iframe = new JInternalFrame();
192 iframe.setFrameIcon(null);
193 iframe.setClosable(true);
194 this.setLayout(new BorderLayout());
195 iframe.setContentPane(this);
196 iframe.setLayer(JLayeredPane.PALETTE_LAYER);
197 iframe.setBackground(bg);
198 iframe.setForeground(fg);
199 iframe.setFont(font);
203 // ignore in JavaScript
212 ((JTextPane) splashText).setEditable(false);
213 splashText.setBackground(bg);
214 splashText.setForeground(fg);
215 splashText.setFont(font);
217 SplashImage splashimg = new SplashImage(image);
218 iconimg.add(splashimg, BorderLayout.LINE_START);
219 iconimg.setBackground(bg);
220 add(iconimg, BorderLayout.NORTH);
222 add(splashText, BorderLayout.CENTER);
223 splashText.addMouseListener(closer);
224 Desktop.desktop.add(iframe);
229 * update text in author text panel reflecting current version information
231 protected boolean refreshText()
233 String newtext = Desktop.instance.getAboutMessage();
234 // jalview.bin.Console.errPrintln("Text found: \n"+newtext+"\nEnd of
236 if (oldTextLength != newtext.length())
238 iframe.setVisible(false);
239 oldTextLength = newtext.length();
240 if (Platform.isJS()) // BH 2019
243 * SwingJS doesn't have HTMLEditorKit, required for a JTextPane
244 * to display formatted html, so we use a simple alternative
246 String text = "<html><br><img src=\""
247 + ChannelProperties.getImageURL("banner") + "\"/>" + newtext
249 JLabel ta = new JLabel(text);
251 ta.setBackground(Color.white);
261 JTextPane jtp = new JTextPane();
262 jtp.setEditable(false);
263 jtp.setBackground(bg);
264 jtp.setForeground(fg);
266 jtp.setContentType("text/html");
267 jtp.setText("<html>" + newtext + "</html>");
268 jtp.addHyperlinkListener(this);
271 splashText.addMouseListener(closer);
273 splashText.setVisible(true);
274 splashText.setSize(new Dimension(750,
275 425 + logoSize + (Platform.isJS() ? 40 : 0)));
276 splashText.setBackground(bg);
277 splashText.setForeground(fg);
278 splashText.setFont(font);
279 add(splashText, BorderLayout.CENTER);
281 int width = Math.max(splashText.getWidth(), iconimg.getWidth());
282 int height = splashText.getHeight() + iconimg.getHeight();
284 Math.max(0, (Desktop.instance.getWidth() - width) / 2),
285 Math.max(0, (Desktop.instance.getHeight() - height) / 2),
288 iframe.setVisible(true);
295 * Create splash screen, display it and clear it off again.
300 initSplashScreenWindow();
302 long startTime = System.currentTimeMillis() / 1000;
310 } catch (Exception ex)
314 if (transientDialog && ((System.currentTimeMillis() / 1000)
315 - startTime) > SHOW_FOR_SECS)
320 if (visible && refreshText())
324 if (!transientDialog)
336 public void closeSplash()
338 if (this.transientDialog)
340 Desktop.instance.releaseDialogQueue();
345 iframe.setClosed(true); // ##### implicated BLOCKED
346 } catch (Exception ex)
351 public class SplashImage extends JPanel
355 public SplashImage(Image todisplay)
360 setPreferredSize(new Dimension(image.getWidth(this) + 8,
361 image.getHeight(this)));
366 public Dimension getPreferredSize()
368 return new Dimension(image.getWidth(this) + 8, image.getHeight(this));
372 public void paintComponent(Graphics g)
375 g.fillRect(0, 0, getWidth(), getHeight());
377 g.setFont(new Font(font.getFontName(), Font.BOLD, FONT_SIZE + 6));
381 g.drawImage(image, (getWidth() - image.getWidth(this)) / 2,
382 (getHeight() - image.getHeight(this)) / 2, this);
388 public void hyperlinkUpdate(HyperlinkEvent e)
390 Desktop.hyperlinkUpdate(e);