package de.muntjak.tinylookandfeel.controlpanel;
import java.awt.BorderLayout;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.border.EmptyBorder;
import de.muntjak.tinylookandfeel.TinyLookAndFeel;
@SuppressWarnings (
{ "all" } )
public class CheckForUpdatesDialog extends JDialog
{
// local - resolves to D:\\htdocs\tinylaf\...
// private static final String CHECK_UPDATES_URL =
// "http://localhost:8080/tinylaf/checkforupdate.html";
// web
private static final String CHECK_UPDATES_URL = "http://www.muntjak.de/hans/java/tinylaf/checkforupdate.html";
private CheckForUpdatesDialog ( Frame parent )
{
super ( parent, "Check for Updates", true );
setupUI ( parent );
}
static void showDialog ( Frame parent )
{
new CheckForUpdatesDialog ( parent );
}
private void setupUI ( Frame frame )
{
getContentPane ().setLayout ( new BorderLayout ( 0, 0 ) );
JPanel p = new JPanel ( new BorderLayout ( 0, 12 ) );
JLabel l = new JLabel (
"<html>"
+ "When checking for updates, TinyLaF will connect to <b>muntjak.de</b>"
+ "<br>via HTTP. No personal data will be transmitted." );
l.setBorder ( new EmptyBorder ( 8, 8, 0, 8 ) );
p.add ( l, BorderLayout.NORTH );
JButton b = new JButton ( "Check for updates now" );
b.addActionListener ( new ActionListener ()
{
public void actionPerformed ( ActionEvent e )
{
String msg = checkForUpdates ();
int index = msg.indexOf ( "Exception was: " );
if ( index != -1 )
{
String title = msg.substring ( index + 15 );
JOptionPane.showMessageDialog ( CheckForUpdatesDialog.this, msg,
title, JOptionPane.PLAIN_MESSAGE );
}
else
{
if ( msg.startsWith ( "No " ) )
{
JOptionPane.showMessageDialog ( CheckForUpdatesDialog.this, msg,
"Update Information", JOptionPane.PLAIN_MESSAGE );
}
else
{
new UpdateDialog ( CheckForUpdatesDialog.this, msg );
}
}
}
} );
JPanel flow = new JPanel ( new FlowLayout ( FlowLayout.CENTER, 0, 8 ) );
flow.add ( b );
p.add ( flow, BorderLayout.CENTER );
p.add ( new JSeparator (), BorderLayout.SOUTH );
getContentPane ().add ( p, BorderLayout.CENTER );
b = new JButton ( "Close" );
getRootPane ().setDefaultButton ( b );
b.addActionListener ( new ActionListener ()
{
public void actionPerformed ( ActionEvent e )
{
dispose ();
}
} );
flow = new JPanel ( new FlowLayout ( FlowLayout.CENTER, 0, 8 ) );
flow.add ( b );
getContentPane ().add ( flow, BorderLayout.SOUTH );
pack ();
Dimension size = getSize ();
setLocation ( frame.getLocationOnScreen ().x
+ ( frame.getWidth () - getSize ().width ) / 2, frame
.getLocationOnScreen ().y
+ ( frame.getHeight () - getSize ().height ) / 2 );
setVisible ( true );
}
private String checkForUpdates ()
{
String answer = checkForUpdate ();
// String answer = "TinyLaF 1.3.6 (2005/10/30)";
// String answer = "TinyLaF " +
// TinyLookAndFeel.VERSION_STRING + " (2005/10/30)";
if ( answer.indexOf ( "Exception" ) != -1 )
return answer;
if ( ! ( answer.startsWith ( "TinyLaF " ) && answer.endsWith ( ")" )
&& answer.indexOf ( "(" ) != -1 && answer.indexOf ( "/" ) != -1 ) )
{
return "An exception occured while checking for updates."
+ "\n\nException was: Invalid response.";
}
String version = answer.substring ( 8, answer.indexOf ( "(" ) - 1 );
if ( !TinyLookAndFeel.VERSION_STRING.equals ( version ) )
{
return answer;
}
else
{
return "No updated version of TinyLaF available.";
}
}
private String checkForUpdate ()
{
InputStream is = null;
try
{
URL url = new URL ( CHECK_UPDATES_URL );
try
{
HttpURLConnection conn = ( HttpURLConnection ) url.openConnection ();
conn.setRequestProperty ( "User-Agent", "TinyLaF" );
Object content = conn.getContent ();
if ( ! ( content instanceof InputStream ) )
{
return "An exception occured while checking for updates."
+ "\n\nException was: Content is no InputStream";
}
is = ( InputStream ) content;
}
catch ( ConnectException ex )
{
// ex.printStackTrace();
return "An exception occured while checking for updates."
+ "\n\nException was: " + ex.getClass ().getName ();
}
catch ( UnknownHostException ex )
{
// ex.printStackTrace();
return "An exception occured while checking for updates."
+ "\n\nException was: " + ex.getClass ().getName ();
}
catch ( IOException ex )
{
// ex.printStackTrace();
return "An exception occured while checking for updates."
+ "\n\nException was: " + ex.getClass ().getName ();
}
}
catch ( MalformedURLException ex )
{
// ex.printStackTrace();
return "An exception occured while checking for updates."
+ "\n\nException was: " + ex.getClass ().getName ();
}
// read message returned from muntjak server
try
{
BufferedReader in = new BufferedReader ( new InputStreamReader ( is ) );
StringBuffer buff = new StringBuffer ();
String line;
while ( ( line = in.readLine () ) != null )
{
buff.append ( line );
}
in.close ();
return buff.toString ();
}
catch ( IOException ex )
{
// ex.printStackTrace();
return "An exception occured while checking for updates."
+ "\n\nException was: " + ex.getClass ().getName ();
}
}
private class UpdateDialog extends JDialog
{
UpdateDialog ( Dialog owner, String version )
{
super ( CheckForUpdatesDialog.this, "Update Information", true );
setDefaultCloseOperation ( DISPOSE_ON_CLOSE );
getContentPane ().setLayout ( new BorderLayout () );
String msg = "<html>" + "An updated version of TinyLaF is available:<br>"
+ version + "<br>"
+ "It can be downloaded at www.muntjak.de/hans/java/tinylaf/.";
JPanel p = new JPanel ( new FlowLayout ( FlowLayout.CENTER, 12, 8 ) );
p.add ( new JLabel ( msg ) );
getContentPane ().add ( p, BorderLayout.CENTER );
p = new JPanel ( new FlowLayout ( FlowLayout.CENTER, 8, 10 ) );
JButton b = new JButton ( "Copy Link" );
b.addActionListener ( new ActionListener ()
{
public void actionPerformed ( ActionEvent e )
{
Clipboard cb = Toolkit.getDefaultToolkit ().getSystemClipboard ();
if ( cb == null )
{
JOptionPane.showMessageDialog ( UpdateDialog.this,
"System Clipboard not available.", "Error",
JOptionPane.ERROR_MESSAGE );
}
else
{
StringSelection ss = new StringSelection (
"http://www.muntjak.de/hans/java/tinylaf/" );
cb.setContents ( ss, ss );
}
}
} );
p.add ( b );
b = new JButton ( "Close" );
getRootPane ().setDefaultButton ( b );
b.addActionListener ( new ActionListener ()
{
public void actionPerformed ( ActionEvent e )
{
UpdateDialog.this.dispose ();
}
} );
p.add ( b );
getContentPane ().add ( p, BorderLayout.SOUTH );
pack ();
Point loc = owner.getLocationOnScreen ();
loc.x += ( owner.getWidth () - getWidth () ) / 2;
loc.y += ( owner.getHeight () - getHeight () ) / 2;
setLocation ( loc );
setVisible ( true );
}
}
}