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