/*
 * 作成日: 2007/10/13
 */
package net.sourceforge.swingx;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.EmptyBorder;

import java.util.*;
import java.text.DecimalFormat;

/**
 * バージョン情報を作成するための
 */
public class SxAboutDialog {

	public static JPanel createJavaVmPanel() {
		JPanel panel = new JPanel();
		panel.setLayout(new BorderLayout());
		// システムプロパティを取得
		JComponent sysprop = null;
		try {
			sysprop = new JScrollPane(createSystemPropertiesTable());
		}
		catch(java.security.AccessControlException e) {
			// Appletだと取得できない。２ページ目はなし。
			sysprop = new JLabel("セキュリティ上、システムプロパティは取得できませんでした");
		}
		panel.add(sysprop, BorderLayout.CENTER);
		// メモリを下に表示する。
		panel.add(createMemoryPanel(), BorderLayout.SOUTH);
		panel.setBorder(new EmptyBorder(10,10,10,10));
		return panel;
	}
	 
	 public static JTable createSystemPropertiesTable() {
		// システムプロパティをソートする。
		Properties prop = System.getProperties();
		TreeMap sortMap = new TreeMap();
		Enumeration e = prop.propertyNames();
		while (e.hasMoreElements()) {
			String key = (String) e.nextElement();
			sortMap.put(key, prop.getProperty(key));
		}
		//
		String[] columnNames = { "Key", "Value" };
		Object[][] data = new Object[sortMap.size()][2];
		// 文字列に置き換える
		Iterator ite = sortMap.keySet().iterator();
		for (int i = 0; ite.hasNext(); i++) {
			String key = (String) ite.next();
			data[i][0] = key;
			data[i][1] = sortMap.get(key);
		}
		JTable table = new JTable(data, columnNames) {
			public boolean isCellEditable(int row, int col) {
				return false;
			}
		};
//		table.setEnabled(false);
		table.setCellEditor(null);
		table.setPreferredScrollableViewportSize(new Dimension(480, 240));
		table.getTableHeader().setReorderingAllowed(false);	// 入れ替えしない
		return table;
	}
//	public static JTable createEnvTable() {
//		Map map = System.getenv();
//	}
    public static JPanel createMemoryPanel() {
		// メモリを表示する。
//		final Runtime runtime = Runtime.getRuntime();
		JPanel panel = new JPanel();
		final JLabel memorySizeLabel = new JLabel(getMemoryText());
		panel.add(memorySizeLabel);
		panel.add(new JButton(new AbstractAction("GC実行") {
			/** ガーベージコレクションを行い、メモリサイズを再表示する。*/
			public void actionPerformed(ActionEvent e) {
				System.gc();
				memorySizeLabel.setText(getMemoryText());
			}
		}));
		
//		final JCheckBox traceInstructions = new JCheckBox("traceInstructions");
//		traceInstructions.addActionListener(new ActionListener() {
//			public void actionPerformed(ActionEvent e) {
//				System.out.println(e);
//				runtime.traceInstructions(traceInstructions.isSelected());
//			}
//		});
//		panel.add(traceInstructions);
//		
//		final JCheckBox traceMethodCalls = new JCheckBox("traceMethodCalls");
//		traceMethodCalls.addActionListener(new ActionListener() {
//			public void actionPerformed(ActionEvent e) {
//				System.out.println(e);
//				runtime.traceMethodCalls(traceMethodCalls.isSelected());
//			}
//		});
//		panel.add(traceMethodCalls);
		return panel;
	}
	/** メモリサイズを表示する。*/
	static String getMemoryText() {
		Runtime runtime = Runtime.getRuntime();
		DecimalFormat f = new DecimalFormat();    // カンマ区切りで
		if (System.getProperty("java.version").compareTo("1.4") < 0) {
			return
				"<html>"+
				"<table><tr><td>free memory</td>"+
				"<td align=\"right\">"+f.format(runtime.freeMemory())+"</td></tr>"+
				"<tr><td>total memory</td>"+
				"<td align=\"right\">"+f.format(runtime.totalMemory())+"</td></tr>"+
				"</table></html>";
		} else {
			return
				"<html>"+
				"<table><tr><td>free memory</td>"+
				"<td align=\"right\">"+f.format(runtime.freeMemory())+"</td></tr>"+
				"<tr><td>total memory</td>"+
				"<td align=\"right\">"+f.format(runtime.totalMemory())+"</td></tr>"+
				"<tr><td>max memory</td>"+
				"<td align=\"right\">"+f.format(runtime.maxMemory())+"</td></tr>"+
				"<tr><td>available processors</td>"+
				"<td align=\"right\">"+runtime.availableProcessors()+"</td></tr>"+
				"</table></html>";
		}
	}
	
}