isJS cleanup
[jalview.git] / src / jalview / gui / SplashScreen.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
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.
11  *  
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.
16  * 
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.
20  */
21 package jalview.gui;
22
23 import jalview.util.Platform;
24
25 import java.awt.BorderLayout;
26 import java.awt.Color;
27 import java.awt.Component;
28 import java.awt.Dimension;
29 import java.awt.Font;
30 import java.awt.Graphics;
31 import java.awt.Image;
32 import java.awt.MediaTracker;
33 import java.awt.event.MouseAdapter;
34 import java.awt.event.MouseEvent;
35
36 import javax.swing.JInternalFrame;
37 import javax.swing.JLabel;
38 import javax.swing.JLayeredPane;
39 import javax.swing.JPanel;
40 import javax.swing.JTextPane;
41 import javax.swing.event.HyperlinkEvent;
42 import javax.swing.event.HyperlinkListener;
43
44 /**
45  * DOCUMENT ME!
46  * 
47  * @author $author$
48  * @version $Revision$
49  */
50 public class SplashScreen extends JPanel
51         implements Runnable, HyperlinkListener
52 {
53   boolean visible = true;
54
55   JPanel iconimg = new JPanel(new BorderLayout());
56
57   /**
58    * either text area in javascript or in java text pane
59    */
60   Component authlist;
61
62   JInternalFrame iframe;
63
64   Image image;
65
66   int fontSize = 11;
67
68   int yoffset = 30;
69
70   /**
71    * Creates a new SplashScreen object.
72    */
73   public SplashScreen()
74   {
75     this(false);
76   }
77
78   private boolean interactiveDialog = false;
79
80   /**
81    * 
82    * @param interactive
83    *          if true - an internal dialog is opened rather than a free-floating
84    *          splash screen
85    */
86   public SplashScreen(boolean interactive)
87   {
88     this.interactiveDialog = interactive;
89     // show a splashscreen that will disapper
90     if (Platform.isJS()) // BH 2019
91     // if (/** @j2sNative true || */ false)
92     {
93       authlist = new JLabel("");
94       run();
95     }
96     else
97     {
98       /**
99        * Java only
100        * 
101        * @j2sNative
102        */
103       {
104         authlist = new JTextPane();
105         Thread t = new Thread(this);
106         t.start();
107       }
108     }
109
110   }
111
112   MouseAdapter closer = new MouseAdapter()
113   {
114     @Override
115     public void mousePressed(MouseEvent evt)
116     {
117       try
118       {
119         if (!interactiveDialog)
120         {
121           visible = false;
122           closeSplash();
123         }
124       } catch (Exception ex)
125       {
126       }
127     }
128   };
129
130   /**
131    * ping the jalview version page then create and display the jalview
132    * splashscreen window.
133    */
134   void initSplashScreenWindow()
135   {
136     addMouseListener(closer);
137     try
138     {
139       java.net.URL url = getClass().getResource("/images/Jalview_Logo.png");
140       java.net.URL urllogo = getClass()
141               .getResource("/images/Jalview_Logo_small.png");
142
143       if (/** @j2sNative false || */
144       url != null)
145       {
146         image = java.awt.Toolkit.getDefaultToolkit().createImage(url);
147         Image logo = java.awt.Toolkit.getDefaultToolkit()
148                 .createImage(urllogo);
149         MediaTracker mt = new MediaTracker(this);
150         mt.addImage(image, 0);
151         mt.addImage(logo, 1);
152         do
153         {
154           try
155           {
156             mt.waitForAll();
157           } catch (InterruptedException x)
158           {
159           }
160           ;
161           if (mt.isErrorAny())
162           {
163             System.err.println("Error when loading images!");
164           }
165         } while (!mt.checkAll());
166         Desktop.instance.setIconImage(logo);
167       }
168     } catch (Exception ex)
169     {
170     }
171
172     iframe = new JInternalFrame();
173     iframe.setFrameIcon(null);
174     iframe.setClosable(interactiveDialog);
175     this.setLayout(new BorderLayout());
176     iframe.setContentPane(this);
177     iframe.setLayer(JLayeredPane.PALETTE_LAYER);
178     /**
179      * we add image directly in html for javascript ?
180      * 
181      * @j2sNative
182      */
183     {
184       ((JTextPane) authlist).setEditable(false);
185
186       SplashImage splashimg = new SplashImage(image);
187       iconimg.add(splashimg, BorderLayout.CENTER);
188       add(iconimg, BorderLayout.NORTH);
189     }
190     add(authlist, BorderLayout.CENTER);
191     authlist.addMouseListener(closer);
192     Desktop.desktop.add(iframe);
193     refreshText();
194   }
195
196   long oldtext = -1;
197
198   /**
199    * update text in author text panel reflecting current version information
200    */
201   @SuppressWarnings("unused")
202   protected boolean refreshText()
203   {
204     String newtext = Desktop.instance.getAboutMessage(true).toString();
205     // System.err.println("Text found: \n"+newtext+"\nEnd of newtext.");
206     if (oldtext != newtext.length())
207     {
208       iframe.setVisible(false);
209       oldtext = newtext.length();
210       if (Platform.isJS()) // BH 2019
211       // if (/** @j2sNative true || */ false)
212       {
213         authlist = new JLabel(
214                 "<html><br/><br/><img src=\"swingjs/j2s/images/Jalview_Logo.png\"/><br/>"
215                         + newtext);
216         ((JLabel) authlist).setOpaque(true);
217         ((JLabel) authlist).setBackground(Color.white);
218       }
219       else
220       {
221         /**
222          * Java only
223          * 
224          * @j2sNative
225          */
226         {
227           authlist = new JTextPane();
228           ((JTextPane) authlist).setEditable(false);
229           ((JTextPane) authlist).setContentType("text/html");
230           ((JTextPane) authlist).setText(newtext);
231           ((JTextPane) authlist).addHyperlinkListener(this);
232         }
233       }
234       authlist.addMouseListener(closer);
235
236       authlist.setVisible(true);
237       authlist.setSize(new Dimension(750, 375));
238       add(authlist, BorderLayout.CENTER);
239       revalidate();
240       iframe.setBounds((Desktop.instance.getWidth() - 750) / 2,
241               (Desktop.instance.getHeight() - 375) / 2, 750,
242               authlist.getHeight() + iconimg.getHeight());
243       iframe.validate();
244       iframe.setVisible(true);
245       return true;
246     }
247     return false;
248   }
249
250   /**
251    * Create splash screen, display it and clear it off again.
252    */
253   @Override
254   public void run()
255   {
256     initSplashScreenWindow();
257
258     long startTime = System.currentTimeMillis() / 1000;
259
260     while (visible)
261     {
262       iframe.repaint();
263       try
264       {
265         Thread.sleep(500);
266       } catch (Exception ex)
267       {
268       }
269
270       if (!interactiveDialog
271               && ((System.currentTimeMillis() / 1000) - startTime) > 5)
272       {
273         visible = false;
274       }
275
276       if (visible && refreshText())
277       {
278         // if (interactiveDialog) {
279         iframe.repaint();
280         // } else {
281         // iframe.repaint();
282         // };
283       }
284       if (interactiveDialog)
285       {
286         return;
287       }
288     }
289
290     closeSplash();
291     Desktop.instance.startDialogQueue();
292   }
293
294   /**
295    * DOCUMENT ME!
296    */
297   public void closeSplash()
298   {
299     try
300     {
301
302       iframe.setClosed(true);
303     } catch (Exception ex)
304     {
305     }
306   }
307
308   public class SplashImage extends JPanel
309   {
310     Image image;
311
312     public SplashImage(Image todisplay)
313     {
314       image = todisplay;
315       if (image != null)
316       {
317         setPreferredSize(new Dimension(image.getWidth(this) + 8,
318                 image.getHeight(this)));
319       }
320     }
321
322     @Override
323     public Dimension getPreferredSize()
324     {
325       return new Dimension(image.getWidth(this) + 8, image.getHeight(this));
326     }
327
328     @Override
329     public void paintComponent(Graphics g)
330     {
331       g.setColor(Color.white);
332       g.fillRect(0, 0, getWidth(), getHeight());
333       g.setColor(Color.black);
334       g.setFont(new Font("Verdana", Font.BOLD, fontSize + 6));
335
336       if (image != null)
337       {
338         g.drawImage(image, (getWidth() - image.getWidth(this)) / 2,
339                 (getHeight() - image.getHeight(this)) / 2, this);
340       }
341     }
342     /*
343      * int y = yoffset;
344      * 
345      * g.drawString("Jalview " + jalview.bin.Cache.getProperty("VERSION"), 50,
346      * y);
347      * 
348      * FontMetrics fm = g.getFontMetrics(); int vwidth =
349      * fm.stringWidth("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
350      * g.setFont(new Font("Verdana", Font.BOLD, fontSize + 2)); g.drawString(
351      * "Last updated: " + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown"),
352      * 50 + vwidth + 5, y); if (jalview.bin.Cache.getDefault("LATEST_VERSION",
353      * "Checking").equals( "Checking")) { // Displayed when code version and
354      * jnlp version do not match g.drawString("...Checking latest version...",
355      * 50, y += fontSize + 10); y += 5; g.setColor(Color.black); } else if
356      * (!jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking")
357      * .equals(jalview.bin.Cache.getProperty("VERSION"))) { if
358      * (jalview.bin.Cache.getProperty("VERSION").toLowerCase()
359      * .indexOf("automated build") == -1) { // Displayed when code version and
360      * jnlp version do not match and code // version is not a development build
361      * g.setColor(Color.red); } g.drawString( "!! Jalview version " +
362      * jalview.bin.Cache.getDefault("LATEST_VERSION", "..Checking..") +
363      * " is available for download from "
364      * +jalview.bin.Cache.getDefault("www.jalview.org"
365      * ,"http://www.jalview.org")+" !!", 50, y += fontSize + 10); y += 5;
366      * g.setColor(Color.black); }
367      * 
368      * g.setFont(new Font("Verdana", Font.BOLD, fontSize)); g.drawString(
369      * "Authors: Jim Procter, Andrew Waterhouse, Michele Clamp, James Cuff, Steve Searle,"
370      * , 50, y += fontSize + 4); g.drawString("David Martin & Geoff Barton.",
371      * 60, y += fontSize + 4); g.drawString(
372      * "Development managed by The Barton Group, University of Dundee.", 50, y
373      * += fontSize + 4); g.drawString("If  you use Jalview, please cite: ", 50,
374      * y += fontSize + 4); g.drawString(
375      * "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
376      * , 50, y += fontSize + 4); g.drawString(
377      * "Jalview Version 2 - a multiple sequence alignment editor and analysis workbench"
378      * , 50, y += fontSize + 4);
379      * g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033", 50, y
380      * += fontSize + 4); }
381      */
382   }
383
384   @Override
385   public void hyperlinkUpdate(HyperlinkEvent e)
386   {
387     Desktop.hyperlinkUpdate(e);
388
389   }
390 }