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 ); } } }