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;
118 if (Platform.isJS()) // BH 2019
120 splashText = new JLabel("");
131 splashText = new JTextPane();
132 splashText.setBackground(bg);
133 splashText.setForeground(fg);
134 splashText.setFont(font);
135 Thread t = new Thread(this);
142 * ping the jalview version page then create and display the jalview
143 * splashscreen window.
145 void initSplashScreenWindow()
147 addMouseListener(closer);
151 if (!Platform.isJS())
153 image = ChannelProperties.getImage("banner");
154 Image logo = ChannelProperties.getImage("logo.48");
155 MediaTracker mt = new MediaTracker(this);
158 mt.addImage(image, 0);
162 mt.addImage(logo, 1);
169 } catch (InterruptedException x)
174 System.err.println("Error when loading images!");
176 } while (!mt.checkAll());
177 Desktop.instance.setIconImages(ChannelProperties.getIconList());
179 } catch (Exception ex)
183 this.setBackground(bg);
184 this.setForeground(fg);
187 iframe = new JInternalFrame();
188 iframe.setFrameIcon(null);
189 iframe.setClosable(true);
190 this.setLayout(new BorderLayout());
191 iframe.setContentPane(this);
192 iframe.setLayer(JLayeredPane.PALETTE_LAYER);
193 iframe.setBackground(bg);
194 iframe.setForeground(fg);
195 iframe.setFont(font);
199 // ignore in JavaScript
208 ((JTextPane) splashText).setEditable(false);
209 splashText.setBackground(bg);
210 splashText.setForeground(fg);
211 splashText.setFont(font);
213 SplashImage splashimg = new SplashImage(image);
214 iconimg.add(splashimg, BorderLayout.LINE_START);
215 iconimg.setBackground(bg);
216 add(iconimg, BorderLayout.NORTH);
218 add(splashText, BorderLayout.CENTER);
219 splashText.addMouseListener(closer);
220 Desktop.desktop.add(iframe);
225 * update text in author text panel reflecting current version information
227 protected boolean refreshText()
229 String newtext = Desktop.instance.getAboutMessage();
230 // System.err.println("Text found: \n"+newtext+"\nEnd of newtext.");
231 if (oldTextLength != newtext.length())
233 iframe.setVisible(false);
234 oldTextLength = newtext.length();
235 if (Platform.isJS()) // BH 2019
238 * SwingJS doesn't have HTMLEditorKit, required for a JTextPane
239 * to display formatted html, so we use a simple alternative
241 String text = "<html><br><img src=\""
242 + ChannelProperties.getImageURL("banner") + "\"/>" + newtext
244 JLabel ta = new JLabel(text);
246 ta.setBackground(Color.white);
256 JTextPane jtp = new JTextPane();
257 jtp.setEditable(false);
258 jtp.setBackground(bg);
259 jtp.setForeground(fg);
261 jtp.setContentType("text/html");
262 jtp.setText("<html>" + newtext + "</html>");
263 jtp.addHyperlinkListener(this);
266 splashText.addMouseListener(closer);
268 splashText.setVisible(true);
269 splashText.setSize(new Dimension(750,
270 375 + logoSize + (Platform.isJS() ? 40 : 0)));
271 splashText.setBackground(bg);
272 splashText.setForeground(fg);
273 splashText.setFont(font);
274 add(splashText, BorderLayout.CENTER);
276 int width = Math.max(splashText.getWidth(), iconimg.getWidth());
277 int height = splashText.getHeight() + iconimg.getHeight();
279 Math.max(0, (Desktop.instance.getWidth() - width) / 2),
280 Math.max(0, (Desktop.instance.getHeight() - height) / 2),
283 iframe.setVisible(true);
290 * Create splash screen, display it and clear it off again.
295 initSplashScreenWindow();
297 long startTime = System.currentTimeMillis() / 1000;
305 } catch (Exception ex)
309 if (transientDialog && ((System.currentTimeMillis() / 1000)
310 - startTime) > SHOW_FOR_SECS)
315 if (visible && refreshText())
319 if (!transientDialog)
326 Desktop.instance.startDialogQueue();
332 public void closeSplash()
337 iframe.setClosed(true);
338 } catch (Exception ex)
343 public class SplashImage extends JPanel
347 public SplashImage(Image todisplay)
352 setPreferredSize(new Dimension(image.getWidth(this) + 8,
353 image.getHeight(this)));
358 public Dimension getPreferredSize()
360 return new Dimension(image.getWidth(this) + 8, image.getHeight(this));
364 public void paintComponent(Graphics g)
367 g.fillRect(0, 0, getWidth(), getHeight());
369 g.setFont(new Font(font.getFontName(), Font.BOLD, FONT_SIZE + 6));
373 g.drawImage(image, (getWidth() - image.getWidth(this)) / 2,
374 (getHeight() - image.getHeight(this)) / 2, this);
380 public void hyperlinkUpdate(HyperlinkEvent e)
382 Desktop.hyperlinkUpdate(e);