org.biojava.nbio.structure.align.gui.SystemInfo Maven / Gradle / Ivy
/*
* BioJava development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. If you do not have a copy,
* see:
*
* http://www.gnu.org/copyleft/lesser.html
*
* Copyright for this code is held jointly by the individual
* authors. These should be listed in @author doc comments.
*
* For more information on the BioJava project and its aims,
* or to join the biojava-l mailing list, visit the home page
* at:
*
* http://www.biojava.org/
*
* Created on Mar 18, 2010
* Author: Andreas Prlic
*
*/
package org.biojava.nbio.structure.align.gui;
import org.biojava.nbio.structure.align.webstart.BrowserOpener;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
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.util.Enumeration;
import java.util.Properties;
import java.util.StringTokenizer;
public class SystemInfo
{
Box vBox;
String msg;
/*
* This is a default list of system properties that we will use
* if the Security Manager doesn't let us extract the "real" list.
*/
public static final String defaultProperties =
""
+ "browser "
+ "file.separator "
+ "java.class.version "
+ "java.vendor "
+ "java.vendor.url "
+ "java.version "
+ "line.separator "
+ "os.arch "
+ "os.name "
+ "os.version "
+ "path.separator ";
public static final String hexPropertyNames =
" file.separator "
+ "line.separator "
+ "path.separator ";
public static final String urlPropertyNames =
" browser.vendor.url "
+ " java.class.path "
+ "java.home "
+ "user.dir "
+ "user.home "
+ "user.name ";
EtchedBorder border;
public SystemInfo()
{
border = new EtchedBorder();
msg = "";
try {
Properties props = System.getProperties();
/*
* Unfortunately, enumerating System.getProperties() returns
* them in an unsatisfactory order. To make the display
* esthetically pleasing, we'll extract the property names
* (i.e. the keys) into a vector, then sort the vector, then
* use the vector as an enumeration. props.size() is not
* trustworthy (bug in MRJ?)
*/
//border.setLabelText ("System Properties");
/*
* Count the actual size of the System property list.
*/
int size = 0;
Enumeration> enumo = props.propertyNames();
while (enumo.hasMoreElements()) {
++size;
enumo.nextElement();
}
String[] names = new String[size];
enumo = props.propertyNames();
for (int i = 0; enumo.hasMoreElements(); i++) {
names[i] = (String) enumo.nextElement();
}
if (size < 1) {
msg = "No System Properties";
}
else {
quickSort(names, 0, names.length - 1);
for (int i = 0; i < size; i++) {
addOneSystemProperty(names[i]);
}
}
}
catch (SecurityException e) {
// border.setLabelText ("Default Applet Properties");
StringTokenizer t = new StringTokenizer(defaultProperties, " ");
while (t.hasMoreElements()) {
addOneSystemProperty(t.nextToken());
}
}
catch (Exception e) {
append("Strange Exception getting system properties: " + e);
}
}
private void append(String txt){
msg += txt;
}
/**
* Stripped-down QuickSort.
* @param vector The vector of strings to sort
* @param startIndex The first element to sort
* @param endIndex The last element to sort
*
* example use:
*
* JavaInfo.quickSort(vector, 0, vector.length - 1);
*
*/
public static void quickSort(
String[] vector,
int startIndex,
int endIndex
)
{
int i = startIndex;
int j = endIndex;
String pivot = vector[(i + j) / 2];
do {
while (i < endIndex && pivot.compareTo(vector[i]) > 0) {
++i;
}
while (j > startIndex && pivot.compareTo(vector[j]) < 0) {
--j;
}
if (i < j) {
String temp = vector[i];
vector[i] = vector[j];
vector[j] = temp;
}
if (i <= j) {
++i;
--j;
}
} while (i <= j);
if (startIndex < j) {
quickSort(vector, startIndex, j);
}
if (i < endIndex) {
quickSort(vector, i, endIndex);
}
}
public void addOneSystemProperty(
String name
)
{
try {
String propValue = System.getProperty(name);
/*
* On the Macintosh (under MRJ), a bunch of font names
* are loaded into the property list. We toss them
* to avoid confusion.
*/
if (propValue != null && !name.equals(propValue)) {
append(""+name + ":");
boolean isReadable = true;
for (int i = 0; i < propValue.length(); i++) {
char c = propValue.charAt(i);
if (isControlCharacter(c)) {
isReadable = false;
break;
}
}
if (!isReadable) {
for (int i = 0; i < propValue.length(); i++) {
char c = propValue.charAt(i);
if (Character.isLetterOrDigit(c)) {
append(" '" + c + "'");
}
else {
append(" 0x");
if (c < 0x10) {
append("0");
}
append(Integer.toHexString(c));
}
}
}
else if (isURLProperty(name)) {
StringBuffer fixed = new StringBuffer();
int start = 0;
int hit = 0;
while ((hit = propValue.indexOf('%', start)) >= 0) {
fixed.append(propValue.substring(start, hit));
int value =
Integer.parseInt(propValue.substring(hit + 1, hit + 3), 16);
fixed.append(((char) value));
start = hit + 3;
}
append(" \"" + fixed + "\"");
}
else {
append(" " + propValue);
}
append("
");
} /* If the property name was found */
} /* Try to fetch the property name */
catch (SecurityException e) {
append(name + ": Security Exception\n" );
}
catch (Exception e) {
append(name + ": " + e + "\n");
}
}
protected boolean isHexProperty(
String thisName
)
{
int index = hexPropertyNames.indexOf(" " + thisName + " ");
return (index >= 0);
}
protected boolean isURLProperty(
String thisName
)
{
int index = urlPropertyNames.indexOf(" " + thisName + " ");
return (index >= 0);
}
/**
* Replicate the Java 1.1 isISOControl method (for Java 1.0.2 compatibility)
*/
private boolean isControlCharacter(
char c
)
{
return ((c >= '\u0000' && c <= '\u001f')
|| (c >= '\u007f' && c <= '\u009f'));
}
public String getMessage(){
return msg;
}
public void showDialog(){
JDialog dialog = new JDialog();
dialog.setSize(new Dimension(500,650));
String msg = getMessage();
JEditorPane txt = new JEditorPane("text/html", msg);
txt.setEditable(false);
JScrollPane scroll = new JScrollPane(txt);
scroll.setSize(new Dimension(300,500));
vBox= Box.createVerticalBox();
vBox.add(scroll);
txt.addHyperlinkListener(new HyperlinkListener(){
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
String href = e.getDescription();
BrowserOpener.showDocument(href);
}
if ( e.getEventType() == HyperlinkEvent.EventType.ENTERED) {
// change the mouse curor
vBox.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
if (e.getEventType() == HyperlinkEvent.EventType.EXITED) {
vBox.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
});
JButton close = new JButton("Close");
close.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
JButton but = (JButton)source;
Container parent = but.getParent().getParent().getParent().getParent().getParent().getParent() ;
JDialog dia = (JDialog) parent;
dia.dispose();
}
});
Box hBoxb = Box.createHorizontalBox();
hBoxb.add(Box.createGlue());
hBoxb.add(close,BorderLayout.EAST);
vBox.add(hBoxb);
dialog.getContentPane().add(vBox);
dialog.setVisible(true);
}
}