package bs.util.tool.commongui.plugins;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.UnsupportedEncodingException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTextField;
import bs.util.common.ExCodec;
import bs.util.tool.commongui.GuiJPanel;
import bs.util.tool.commongui.GuiUtils;
import bs.util.tool.commongui.utils.RadixUtils;
/**
* 编码转换.
*/
public class CharacterConverter extends GuiJPanel {
private static final long serialVersionUID = 1L;
/**
* Encode TextField.
*/
private JTextField encodeTextField = new JTextField("");
/**
* Encode JButton.
*/
private JButton encodeButton = createJButton("Encode", Integer.toString(0), GuiUtils.font16);
/**
* 2进制.
*/
private String codeType_2Radix = "二进制";
/**
* 8进制.
*/
private String codeType_8Radix = "八进制";
/**
* 10进制.
*/
private String codeType_10Radix = "十进制";
/**
* 16进制.
*/
private String codeType_16Radix = "十六进制";
/**
* 乱码解码.
*/
private String codeType_Decode = "乱码解码";
/**
* 编解码类别.
*/
private String[] codeTypes = new String[] { codeType_2Radix, codeType_8Radix, codeType_10Radix, codeType_16Radix,
codeType_Decode };
/**
* 当前编码类别.
*/
private String curCodeType = codeType_16Radix;
/**
* 进制前缀符.
*/
private String[] prefixs = new String[] { "空格", "空", "-", "%", "\\u" };
/**
* 进制前缀符下拉框.
*/
private JComboBox prefixsBox = createJComboBox(prefixs, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
curPrefix = getCorrectSeparator(((JComboBox) event.getSource()).getSelectedItem().toString());
}
});
/**
* 当前进制前缀符.
*/
private String curPrefix = getCorrectSeparator(prefixs[0]);
/**
* 获取正确的前缀符.
*/
private String getCorrectSeparator(String separ) {
if (prefixs[0].equals(separ)) {
return " ";
} else if (prefixs[1].equals(separ)) {
return "";
} else {
return separ;
}
}
/**
* 进制编码大小写.
*/
private String[] lowUpCase = new String[] { "小写", "大写" };
/**
* 进制编码大小写下拉框.
*/
private JComboBox lowUpCaseBox = createJComboBox(lowUpCase, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
curLowUpCase = ((JComboBox) event.getSource()).getSelectedItem().toString();
}
});
/**
* 当前进制编码大小写.
*/
private String curLowUpCase = lowUpCase[0];
/**
* 字符集.
*/
private String[] charsets = new String[] { GuiUtils.CHARSET_UTF_16BE, GuiUtils.CHARSET_UTF_16LE,
GuiUtils.CHARSET_UTF_8, GuiUtils.CHARSET_UTF_16, GuiUtils.CHARSET_GB2312, GuiUtils.CHARSET_GBK,
GuiUtils.CHARSET_GB18030, GuiUtils.CHARSET_Big5, GuiUtils.CHARSET_ISO_8859_1, "" };
/**
* 手动输入的字符编码框.
*/
private JTextField customCharsetField = new JTextField("UTF-8");
/**
* TextField数组,与字符集对应.
*/
private JTextField[] fields = new JTextField[charsets.length];
{
for (int i = 0; i < fields.length; i++) {
fields[i] = new JTextField();
}
}
/**
* Converter Encode、Decode行数.
*/
private int rows = fields.length + 2;
public CharacterConverter() {
// 主面板:边界布局,分North、Center两部分,North用于放置控件,Center是一个空面板
setLayout(new BorderLayout());
// Center空面板
add(new JPanel(), BorderLayout.CENTER);
// North面板
JPanel topPanel = new JPanel(new BorderLayout());
add(topPanel, BorderLayout.NORTH);
// 左侧:放置Label
JPanel labelsPanel = new JPanel(new GridLayout(rows, 1));
topPanel.add(labelsPanel, BorderLayout.WEST);
// 中间:放置输入输出框
JPanel fieldsPanel = new JPanel(new GridLayout(rows, 1));
topPanel.add(fieldsPanel, BorderLayout.CENTER);
// 右侧:放置按钮
JPanel buttonsPanel = new JPanel(new GridLayout(rows, 1));
topPanel.add(buttonsPanel, BorderLayout.EAST);
// 左侧:放置Label
addJLabel(labelsPanel, " Encode String: ", GuiUtils.font16);
addJLabel(labelsPanel, " ", GuiUtils.font16); // 仅作填充
for (int i = 0; i < fields.length - 1; i++) {
addJLabel(labelsPanel, " " + charsets[i] + ": ", GuiUtils.font16);
}
// 手动输入的字符编码框
addJTextField(labelsPanel, customCharsetField, GuiUtils.font14_un);
// 中间:放置输入输出框
addJTextField(fieldsPanel, encodeTextField, GuiUtils.font14_un);
JPanel comboxPanel = new JPanel(new BorderLayout());
fieldsPanel.add(comboxPanel);
for (int i = 0; i < fields.length; i++) {
addJTextField(fieldsPanel, fields[i], GuiUtils.font14_un);
}
// 下拉框面板
JPanel flowComboxPanel = new JPanel(new FlowLayout());
comboxPanel.add(flowComboxPanel, BorderLayout.WEST);
comboxPanel.add(new JPanel(), BorderLayout.CENTER);
addJLabel(flowComboxPanel, "编码类别:", GuiUtils.font14_cn);
// 编码类别下拉框,默认选择16进制
addJComboBox(flowComboxPanel, codeTypes, 3, GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent event) {
curCodeType = ((JComboBox) event.getSource()).getSelectedItem().toString();
if (codeType_Decode.equals(curCodeType)) {
encodeTextField.setEnabled(false);
encodeButton.setEnabled(false);
prefixsBox.setEnabled(false);
lowUpCaseBox.setEnabled(false);
} else {
encodeTextField.setEnabled(true);
encodeButton.setEnabled(true);
prefixsBox.setEnabled(true);
lowUpCaseBox.setEnabled(true);
}
}
});
addJLabel(flowComboxPanel, " 进制前缀符:", GuiUtils.font14_cn);
// 进制前缀符下拉框
prefixsBox.setEditable(true);
flowComboxPanel.add(prefixsBox);
addJLabel(flowComboxPanel, " 进制大小写:", GuiUtils.font14_cn);
// 进制编码大小写下拉框
flowComboxPanel.add(lowUpCaseBox);
addJLabel(flowComboxPanel, " ", GuiUtils.font14_cn);
addJButton(flowComboxPanel, "清除输入输出", "clear", GuiUtils.font14_cn, new ActionListener() {
public void actionPerformed(ActionEvent e) {
clearTextFields();
}
});
// 右侧:放置按钮
encodeButton.addActionListener(getButtonActionListener(0));
buttonsPanel.add(encodeButton);
addJLabel(buttonsPanel, " ", GuiUtils.font16); // 仅作填充
for (int i = 0; i < fields.length; i++) {
addJButton(buttonsPanel, "Decode", Integer.toString(i + 1), GuiUtils.font16, getButtonActionListener(i + 1));
}
}
/**
* 清除输入输出.
*/
private void clearTextFields() {
encodeTextField.setText("");
for (int i = 0; i < fields.length; i++) {
fields[i].setText("");
}
}
/**
* 按钮点击事件.
*/
private ActionListener getButtonActionListener(int current) {
return new ActionListener() {
public void actionPerformed(ActionEvent event) {
// 手动输入的字符编码
charsets[charsets.length - 1] = customCharsetField.getText().trim();
int sort = Integer.parseInt(((JButton) event.getSource()).getName());
if (sort == 0) {
String input = encodeTextField.getText();
clearTextFields();
encodeTextField.setText(input);
if (input.length() == 0) {
return;
}
for (int i = 0; i < fields.length; i++) {
try {
if (codeType_16Radix.equals(curCodeType)) {
fields[i].setText(encode16RadixAddPrefix(input, charsets[i], curPrefix));
} else if (codeType_10Radix.equals(curCodeType)) {
fields[i].setText(encode10RadixAddPrefix(input, charsets[i], curPrefix));
} else if (codeType_8Radix.equals(curCodeType)) {
fields[i].setText(encode8RadixAddPrefix(input, charsets[i], curPrefix));
} else if (codeType_2Radix.equals(curCodeType)) {
fields[i].setText(encode2RadixAddPrefix(input, charsets[i], curPrefix));
}
} catch (Exception e) {
showExceptionMessage(e);
return;
}
}
} else {
String input = fields[sort - 1].getText();
clearTextFields();
fields[sort - 1].setText(input);
input = input.replace(curPrefix, ""); // 去除前缀符
if (input.length() == 0) {
return;
}
try {
String decodeString = "";
if (codeType_16Radix.equals(curCodeType)) {
decodeString = ExCodec.decodeHex(input, charsets[sort - 1]);
} else if (codeType_10Radix.equals(curCodeType)) {
decodeString = ExCodec.decodeHex(RadixUtils.convertRadixString10To16(input),
charsets[sort - 1]);
} else if (codeType_8Radix.equals(curCodeType)) {
decodeString = ExCodec.decodeHex(RadixUtils.convertRadixString8To16(input),
charsets[sort - 1]);
} else if (codeType_2Radix.equals(curCodeType)) {
decodeString = ExCodec.decodeHex(RadixUtils.convertRadixString2To16(input),
charsets[sort - 1]);
}
encodeTextField.setText(decodeString);
if (codeType_Decode.equals(curCodeType)) {
encodeTextField.setText("\"" + codeType_Decode + "\"与Encode String无关!");
}
for (int i = 0; i < fields.length; i++) {
if (i != sort - 1) {
if (codeType_16Radix.equals(curCodeType)) {
fields[i].setText(encode16RadixAddPrefix(decodeString, charsets[i], curPrefix));
} else if (codeType_10Radix.equals(curCodeType)) {
fields[i].setText(encode10RadixAddPrefix(decodeString, charsets[i], curPrefix));
} else if (codeType_8Radix.equals(curCodeType)) {
fields[i].setText(encode8RadixAddPrefix(decodeString, charsets[i], curPrefix));
} else if (codeType_2Radix.equals(curCodeType)) {
fields[i].setText(encode2RadixAddPrefix(decodeString, charsets[i], curPrefix));
} else if (codeType_Decode.equals(curCodeType)) {
fields[i].setText(GuiUtils.encode(input, charsets[sort - 1], charsets[i]));
}
}
}
} catch (Exception e) {
showExceptionMessage(e);
return;
}
}
// 大小写
if (codeType_16Radix.equals(curCodeType) || codeType_2Radix.equals(curCodeType)) {
if (lowUpCase[0].equals(curLowUpCase)) {
for (int fi = 0; fi < fields.length; fi++) {
fields[fi].setText(fields[fi].getText().toLowerCase());
}
} else if (lowUpCase[1].equals(curLowUpCase)) {
for (int fi = 0; fi < fields.length; fi++) {
fields[fi].setText(fields[fi].getText().toUpperCase());
}
}
}
}
};
}
/**
* 字符编码进制前缀字符填充 - 16进制.
*/
private String encode16RadixAddPrefix(String input, String charset, String prefix)
throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
// ExCodec.encodeHex 转16进制
sb.append(prefix).append(ExCodec.encodeHex(input.substring(i, i + 1), charset));
}
return sb.toString();
}
/**
* 字符编码进制前缀字符填充 - 10进制.
*/
private String encode10RadixAddPrefix(String input, String charset, String prefix)
throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
sb.append(prefix).append(
RadixUtils.convertRadixString16To10(ExCodec.encodeHex(input.substring(i, i + 1), charset)));
}
return sb.toString();
}
/**
* 字符编码进制前缀字符填充 - 8进制.
*/
private String encode8RadixAddPrefix(String input, String charset, String prefix)
throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
sb.append(prefix).append(
RadixUtils.convertRadixString16To8(ExCodec.encodeHex(input.substring(i, i + 1), charset)));
}
return sb.toString();
}
/**
* 字符编码进制前缀字符填充 - 2进制.
*/
private String encode2RadixAddPrefix(String input, String charset, String prefix)
throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
sb.append(prefix).append(
RadixUtils.convertRadixString16To2(ExCodec.encodeHex(input.substring(i, i + 1), charset)));
}
return sb.toString();
}
}