/**
* Copyright (c) 2001-2017 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*/
package net.sf.robocode.ui.dialog;
import net.sf.robocode.ui.BrowserManager;
import net.sf.robocode.version.IVersionManager;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
/**
* The About box.
*
* @author Mathew A. Nelson (original)
* @author Flemming N. Larsen (original)
*/
@SuppressWarnings("serial")
public final class AboutBox extends JDialog {
// Tag used for background color replacement
private final static Color BG_COLOR = new Color(0xF0, 0xF0, 0xF0);
// Tag used for Robocode version replacement
private final static String TAG_ROBOCODE_VERSION = "\\Q{$robocode-version}\\E";
// Tag used for Robocode icon source replacement
private final static String TAG_ROBOCODE_ICON_SRC = "\\Q{$robocode-icon-url}\\E";
// Tag used for background color replacement
private final static String TAG_BG_COLOR = "\\Q{$background-color}\\E";
// Tag used for Java version replacement
private final static String TAG_JAVA_VERSION = "\\Q{$java-version}\\E";
// Tag used for Java vendor replacement
private final static String TAG_JAVA_VENDOR = "\\Q{$java-vendor}\\E";
// Tag used for transparent.png 1x1 px url replacement
private final static String TAG_TRANSPARENT = "\\Q{$transparent}\\E";
// Robocode version
private final String robocodeVersion;
// Robocode icon URL
private final java.net.URL iconURL;
// Transparent URL
private final java.net.URL transparentURL;
// Content pane
private JPanel aboutBoxContentPane;
// Main panel
private JEditorPane mainPanel;
// Button panel
private JPanel buttonPanel;
// OK button
private JButton okButton;
// HTML text after tag replacements
private String html;
private static String getHtmlTemplate() {
URL url = AboutBox.class.getResource("/net/sf/robocode/ui/html/about.html");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
URLConnection connection = url.openConnection();
int contentLength = connection.getContentLength();
InputStream in = url.openStream();
byte[] buf = new byte[contentLength];
int len;
while (true) {
len = in.read(buf);
if (len == -1) {
break;
}
baos.write(buf, 0, len);
}
baos.close();
} catch (IOException ignore) {}
return baos.toString();
}
// General event handler
private final transient ActionListener eventHandler = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == AboutBox.this.getOkButton()) {
AboutBox.this.dispose();
}
}
};
// Hyperlink event handler
private final transient HyperlinkListener hyperlinkHandler = new HyperlinkListener() {
public void hyperlinkUpdate(HyperlinkEvent event) {
if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
try {
BrowserManager.openURL(event.getURL().toExternalForm());
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
public AboutBox(RobocodeFrame owner, IVersionManager versionManager) {
super(owner, true);
robocodeVersion = versionManager.getVersion();
iconURL = AboutBox.class.getResource("/net/sf/robocode/ui/icons/robocode-icon.png");
transparentURL = AboutBox.class.getResource("/net/sf/robocode/ui/html/transparent.png");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setTitle("About Robocode");
setContentPane(getAboutBoxContentPane());
setResizable(false);
}
private JPanel getAboutBoxContentPane() {
if (aboutBoxContentPane == null) {
aboutBoxContentPane = new JPanel();
aboutBoxContentPane.setLayout(new BorderLayout());
aboutBoxContentPane.add(getButtonPanel(), BorderLayout.SOUTH);
aboutBoxContentPane.add(getMainPanel(), BorderLayout.CENTER);
}
return aboutBoxContentPane;
}
private JEditorPane getMainPanel() {
if (mainPanel == null) {
String aaFontSettings = System.getProperty("awt.useSystemAAFontSettings");
if (aaFontSettings != null) {
mainPanel = new JEditorPane("text/html; charset=ISO-8859-1", getHtmlText());
System.out.println(aaFontSettings);
} else {
mainPanel = new JEditorPane("text/html; charset=ISO-8859-1", getHtmlText()) {
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
super.paintComponent(g);
}
};
}
mainPanel.setBackground(BG_COLOR);
mainPanel.setEditable(false);
mainPanel.addHyperlinkListener(hyperlinkHandler);
}
return mainPanel;
}
private JPanel getButtonPanel() {
if (buttonPanel == null) {
buttonPanel = new JPanel();
buttonPanel.setBackground(BG_COLOR);
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(getOkButton());
}
return buttonPanel;
}
private JButton getOkButton() {
if (okButton == null) {
okButton = new JButton();
okButton.setText("OK");
okButton.addActionListener(eventHandler);
}
return okButton;
}
private String getHtmlText() {
if (html == null) {
html = getHtmlTemplate();
html = html.replaceAll(TAG_ROBOCODE_VERSION, robocodeVersion);
html = html.replaceAll(TAG_ROBOCODE_ICON_SRC, iconURL.toString());
html = html.replaceAll(TAG_BG_COLOR, toHtmlColor(BG_COLOR));
html = html.replaceAll(TAG_JAVA_VERSION, getJavaVersion());
html = html.replaceAll(TAG_JAVA_VENDOR, System.getProperty("java.vendor"));
html = html.replaceAll(TAG_TRANSPARENT, transparentURL.toString());
}
return html;
}
private static String toHtmlColor(Color color) {
return "#" + toHexDigits(color.getRed()) + toHexDigits(color.getGreen()) + toHexDigits(color.getBlue());
}
private static String toHexDigits(int value) {
return "" + toHexDigit(value >> 4) + toHexDigit(value & 0x0f);
}
private static char toHexDigit(int value) {
int v = (value & 0xf);
if (v < 10) {
return (char) ('0' + v);
}
return (char) ('A' + (v - 10));
}
private static String getJavaVersion() {
String javaVersion = System.getProperty("java.version");
String javaArchModel = System.getProperty("sun.arch.data.model");
if (javaArchModel != null) {
try {
int numBits = Integer.parseInt(javaArchModel);
javaVersion += " (" + numBits + "-bit)";
} catch (NumberFormatException ignore) {}
}
return javaVersion;
}
}