/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.gui;
import jalview.util.Platform;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
/**
* DOCUMENT ME!
*
* @author $author$
* @version $Revision$
*/
public class SplashScreen extends JPanel
implements Runnable, HyperlinkListener
{
private static final int SHOW_FOR_SECS = 5;
private static final int FONT_SIZE = 11;
private boolean visible = true;
private JPanel iconimg = new JPanel(new BorderLayout());
/*
* as JTextPane in Java, JLabel in javascript
*/
private Component splashText;
private JInternalFrame iframe;
private Image image;
private boolean transientDialog = false;
private long oldTextLength = -1;
/*
* allow click in the initial splash screen to dismiss it
* immediately (not if opened from About menu)
*/
private MouseAdapter closer = new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent evt)
{
if (transientDialog)
{
try
{
visible = false;
closeSplash();
} catch (Exception ex)
{
}
}
}
};
/**
* Constructor that displays the splash screen
*
* @param isTransient
* if true the panel removes itself on click or after a few seconds;
* if false it stays up until closed by the user
*/
public SplashScreen(boolean isTransient)
{
this.transientDialog = isTransient;
if (Platform.isJS()) // BH 2019
{
splashText = new JLabel("");
run();
}
else
{
/**
* Java only
*
* @j2sIgnore
*/
{
splashText = new JTextPane();
Thread t = new Thread(this);
t.start();
}
}
}
/**
* ping the jalview version page then create and display the jalview
* splashscreen window.
*/
void initSplashScreenWindow()
{
addMouseListener(closer);
try
{
URL url = getClass().getResource("/images/Jalview_Logo.png");
URL urllogo = getClass()
.getResource("/images/Jalview_Logo_small.png");
if (!Platform.isJS() && url != null)
{
image = Toolkit.getDefaultToolkit().createImage(url);
Image logo = Toolkit.getDefaultToolkit().createImage(urllogo);
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 0);
mt.addImage(logo, 1);
do
{
try
{
mt.waitForAll();
} catch (InterruptedException x)
{
}
if (mt.isErrorAny())
{
System.err.println("Error when loading images!");
}
} while (!mt.checkAll());
Desktop.instance.setIconImage(logo);
}
} catch (Exception ex)
{
}
iframe = new JInternalFrame();
iframe.setFrameIcon(null);
iframe.setClosable(true);
this.setLayout(new BorderLayout());
iframe.setContentPane(this);
iframe.setLayer(JLayeredPane.PALETTE_LAYER);
if (Platform.isJS())
{
// ignore in JavaScript
}
else
/**
* Java only
*
* @j2sIgnore
*/
{
((JTextPane) splashText).setEditable(false);
SplashImage splashimg = new SplashImage(image);
iconimg.add(splashimg, BorderLayout.CENTER);
add(iconimg, BorderLayout.NORTH);
}
add(splashText, BorderLayout.CENTER);
splashText.addMouseListener(closer);
Desktop.desktop.add(iframe);
refreshText();
}
/**
* update text in author text panel reflecting current version information
*/
protected boolean refreshText()
{
String newtext = Desktop.instance.getAboutMessage();
// System.err.println("Text found: \n"+newtext+"\nEnd of newtext.");
if (oldTextLength != newtext.length())
{
iframe.setVisible(false);
oldTextLength = newtext.length();
if (Platform.isJS()) // BH 2019
{
/*
* SwingJS doesn't have HTMLEditorKit, required for a JTextPane
* to display formatted html, so we use a simple alternative
*/
String text = "
"
+ newtext + "";
JLabel ta = new JLabel(text);
ta.setOpaque(true);
ta.setBackground(Color.white);
splashText = ta;
}
else
/**
* Java only
*
* @j2sIgnore
*/
{
JTextPane jtp = new JTextPane();
jtp.setEditable(false);
jtp.setContentType("text/html");
jtp.setText("" + newtext + "");
jtp.addHyperlinkListener(this);
splashText = jtp;
}
splashText.addMouseListener(closer);
splashText.setVisible(true);
splashText.setSize(new Dimension(750, 375));
add(splashText, BorderLayout.CENTER);
revalidate();
iframe.setBounds((Desktop.instance.getWidth() - 750) / 2,
(Desktop.instance.getHeight() - 375) / 2, 750,
splashText.getHeight() + iconimg.getHeight());
iframe.validate();
iframe.setVisible(true);
return true;
}
return false;
}
/**
* Create splash screen, display it and clear it off again.
*/
@Override
public void run()
{
initSplashScreenWindow();
long startTime = System.currentTimeMillis() / 1000;
while (visible)
{
iframe.repaint();
try
{
Thread.sleep(500);
} catch (Exception ex)
{
}
if (transientDialog
&& ((System.currentTimeMillis() / 1000) - startTime) > SHOW_FOR_SECS)
{
visible = false;
}
if (visible && refreshText())
{
iframe.repaint();
}
if (!transientDialog)
{
return;
}
}
closeSplash();
Desktop.instance.startDialogQueue();
}
/**
* DOCUMENT ME!
*/
public void closeSplash()
{
try
{
iframe.setClosed(true);
} catch (Exception ex)
{
}
}
public class SplashImage extends JPanel
{
Image image;
public SplashImage(Image todisplay)
{
image = todisplay;
if (image != null)
{
setPreferredSize(new Dimension(image.getWidth(this) + 8,
image.getHeight(this)));
}
}
@Override
public Dimension getPreferredSize()
{
return new Dimension(image.getWidth(this) + 8, image.getHeight(this));
}
@Override
public void paintComponent(Graphics g)
{
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.black);
g.setFont(new Font("Verdana", Font.BOLD, FONT_SIZE + 6));
if (image != null)
{
g.drawImage(image, (getWidth() - image.getWidth(this)) / 2,
(getHeight() - image.getHeight(this)) / 2, this);
}
}
}
@Override
public void hyperlinkUpdate(HyperlinkEvent e)
{
Desktop.hyperlinkUpdate(e);
}
}