package org.hihan.girinoscope.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Desktop;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
@SuppressWarnings("serial")
public class AboutDialog extends JDialog {
private static final Logger logger = Logger.getLogger(AboutDialog.class.getName());
public AboutDialog(JFrame owner) {
super(owner, true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setLayout(new BorderLayout());
setBackground(Color.WHITE);
add(createEditorPane(), BorderLayout.CENTER);
pack();
setLocationRelativeTo(owner);
setResizable(false);
}
private JEditorPane createEditorPane() {
try {
InputStream input = getClass().getResource("about.html").openStream();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
StringBuilder html = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
html.append(line);
}
return createEditorPane(html.toString());
} finally {
input.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private JEditorPane createEditorPane(String text) {
HTMLEditorKit kit = new HTMLEditorKit();
StyleSheet styleSheet = kit.getStyleSheet();
styleSheet.addRule("body {bgcolor: white;}");
JEditorPane editorPane = new JEditorPane();
editorPane.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
editorPane.setOpaque(true);
editorPane.setEditorKit(kit);
editorPane.setContentType("text/html");
editorPane.setText(text);
editorPane.setEditable(false);
editorPane.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(final HyperlinkEvent event) {
if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
final String href = getHref(event);
try {
Desktop.getDesktop().browse(new URI(href));
} catch (IOException e) {
logger.log(Level.WARNING, "Can’t open link " + href, e);
} catch (URISyntaxException e) {
logger.log(Level.WARNING, "Can’t open link " + href, e);
}
}
}
});
return editorPane;
}
private String getHref(HyperlinkEvent event) {
AttributeSet attributes = event.getSourceElement().getAttributes();
return getAttribute((AttributeSet) getAttribute(attributes, "a"), "href").toString();
}
private Object getAttribute(AttributeSet attributes, String name) {
for (Enumeration<?> enumeration = attributes.getAttributeNames(); enumeration.hasMoreElements();) {
Object nameKey = enumeration.nextElement();
if (name.equals(nameKey.toString())) {
return attributes.getAttribute(nameKey);
}
}
return null;
}
}