/*
* 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.event.MouseAdapter;
import java.awt.event.MouseEvent;
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
{
boolean visible = true;
JPanel iconimg = new JPanel(new BorderLayout());
/**
* either text area in javascript or in java text pane
*/
Component authlist;
JInternalFrame iframe;
Image image;
int fontSize = 11;
int yoffset = 30;
/**
* Creates a new SplashScreen object.
*/
public SplashScreen()
{
this(false);
}
private boolean interactiveDialog = false;
/**
*
* @param interactive
* if true - an internal dialog is opened rather than a free-floating
* splash screen
*/
public SplashScreen(boolean interactive)
{
this.interactiveDialog = interactive;
// show a splashscreen that will disapper
if (Platform.isJS()) // BH 2019
{
authlist = new JLabel("");
run();
}
else
{
/**
* Java only
*
* @j2sIgnore
*/
{
authlist = new JTextPane();
Thread t = new Thread(this, "SplashScreen");
t.start();
}
}
}
MouseAdapter closer = new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent evt)
{
try
{
if (!interactiveDialog)
{
visible = false;
closeSplash();
}
} catch (Exception ex)
{
}
}
};
/**
* ping the jalview version page then create and display the jalview
* splashscreen window.
*/
void initSplashScreenWindow()
{
addMouseListener(closer);
try
{
java.net.URL url = getClass().getResource("/images/Jalview_Logo.png");
java.net.URL urllogo = getClass()
.getResource("/images/Jalview_Logo_small.png");
if (!Platform.isJS() && url != null)
{
image = java.awt.Toolkit.getDefaultToolkit().createImage(url);
Image logo = java.awt.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.getInstance().setIconImage(logo);
}
} catch (Exception ex)
{
}
iframe = new JInternalFrame();
iframe.setFrameIcon(null);
iframe.setClosable(interactiveDialog);
this.setLayout(new BorderLayout());
iframe.setContentPane(this);
iframe.setLayer(JLayeredPane.PALETTE_LAYER);
if (Platform.isJS())
{
// ignore in JavaScript
}
else
/**
* Java only
*
* @j2sIgnore
*/
{
((JTextPane) authlist).setEditable(false);
SplashImage splashimg = new SplashImage(image);
iconimg.add(splashimg, BorderLayout.CENTER);
add(iconimg, BorderLayout.NORTH);
}
add(authlist, BorderLayout.CENTER);
authlist.addMouseListener(closer);
Desktop.getDesktopPane().add(iframe);
refreshText();
}
long oldtext = -1;
/**
* update text in author text panel reflecting current version information
*/
@SuppressWarnings("unused")
protected boolean refreshText()
{
Desktop desktop = Desktop.getInstance();
String newtext = desktop.getAboutMessage(true).toString();
// System.err.println("Text found: \n"+newtext+"\nEnd of newtext.");
if (oldtext != newtext.length())
{
iframe.setVisible(false);
oldtext = newtext.length();
if (Platform.isJS()) // BH 2019
{
authlist = new JLabel(
"
"
+ newtext);
((JLabel) authlist).setOpaque(true);
((JLabel) authlist).setBackground(Color.white);
}
else
/**
* Java only
*
* @j2sIgnore
*/
{
authlist = new JTextPane();
((JTextPane) authlist).setEditable(false);
((JTextPane) authlist).setContentType("text/html");
((JTextPane) authlist).setText(newtext);
((JTextPane) authlist).addHyperlinkListener(this);
}
authlist.addMouseListener(closer);
authlist.setVisible(true);
authlist.setSize(new Dimension(750, 375));
add(authlist, BorderLayout.CENTER);
revalidate();
iframe.setBounds((desktop.getWidth() - 750) / 2,
(desktop.getHeight() - 375) / 2, 750,
authlist.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 (!interactiveDialog
&& ((System.currentTimeMillis() / 1000) - startTime) > 5)
{
visible = false;
}
if (visible && refreshText())
{
// if (interactiveDialog) {
iframe.repaint();
// } else {
// iframe.repaint();
// };
}
if (interactiveDialog)
{
return;
}
}
closeSplash();
Desktop.getInstance().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, fontSize + 6));
if (image != null)
{
g.drawImage(image, (getWidth() - image.getWidth(this)) / 2,
(getHeight() - image.getHeight(this)) / 2, this);
}
}
/*
* int y = yoffset;
*
* g.drawString("Jalview " + jalview.bin.Cache.getProperty("VERSION"), 50,
* y);
*
* FontMetrics fm = g.getFontMetrics(); int vwidth =
* fm.stringWidth("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
* g.setFont(new Font("Verdana", Font.BOLD, fontSize + 2)); g.drawString(
* "Last updated: " + jalview.bin.Cache.getDefault("BUILD_DATE", "unknown"),
* 50 + vwidth + 5, y); if (jalview.bin.Cache.getDefault("LATEST_VERSION",
* "Checking").equals( "Checking")) { // Displayed when code version and
* jnlp version do not match g.drawString("...Checking latest version...",
* 50, y += fontSize + 10); y += 5; g.setColor(Color.black); } else if
* (!jalview.bin.Cache.getDefault("LATEST_VERSION", "Checking")
* .equals(jalview.bin.Cache.getProperty("VERSION"))) { if
* (jalview.bin.Cache.getProperty("VERSION").toLowerCase()
* .indexOf("automated build") == -1) { // Displayed when code version and
* jnlp version do not match and code // version is not a development build
* g.setColor(Color.red); } g.drawString( "!! Jalview version " +
* jalview.bin.Cache.getDefault("LATEST_VERSION", "..Checking..") +
* " is available for download from "
* +jalview.bin.Cache.getDefault("www.jalview.org"
* ,"http://www.jalview.org")+" !!", 50, y += fontSize + 10); y += 5;
* g.setColor(Color.black); }
*
* g.setFont(new Font("Verdana", Font.BOLD, fontSize)); g.drawString(
* "Authors: Jim Procter, Andrew Waterhouse, Michele Clamp, James Cuff, Steve Searle,"
* , 50, y += fontSize + 4); g.drawString("David Martin & Geoff Barton.",
* 60, y += fontSize + 4); g.drawString(
* "Development managed by The Barton Group, University of Dundee.", 50, y
* += fontSize + 4); g.drawString("If you use Jalview, please cite: ", 50,
* y += fontSize + 4); g.drawString(
* "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)"
* , 50, y += fontSize + 4); g.drawString(
* "Jalview Version 2 - a multiple sequence alignment editor and analysis workbench"
* , 50, y += fontSize + 4);
* g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033", 50, y
* += fontSize + 4); }
*/
}
@Override
public void hyperlinkUpdate(HyperlinkEvent e)
{
Desktop.hyperlinkUpdate(e);
}
}