package home;
|
import javax.swing.*;
|
import javax.swing.border.TitledBorder;
|
import java.awt.*;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.io.*;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
|
public class ExtensionPanel extends JDialog {
|
private static final long serialVersionUID = 1L;
|
private MainFrame mainFrame;
|
private JPanel commandPanel;
|
private JScrollPane scrollPane;
|
private JButton saveButton;
|
private File commandFile;
|
|
public ExtensionPanel(MainFrame parent) {
|
super(parent, getString(parent, "extension"), false); // ÉèÖÃΪ·Çģ̬¶Ô»°¿ò
|
this.mainFrame = parent;
|
initializeUI();
|
loadCommands();
|
}
|
|
private void initializeUI() {
|
setSize(800, 500); // ÐÞ¸ÄĬÈÏ´ò¿ª´°¿ÚΪ800*500
|
setLocationRelativeTo(mainFrame);
|
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
setLayout(new BorderLayout());
|
|
// ´´½¨ÃüÁîÃæ°å
|
commandPanel = new JPanel();
|
commandPanel.setLayout(new BoxLayout(commandPanel, BoxLayout.Y_AXIS));
|
|
scrollPane = new JScrollPane(commandPanel);
|
scrollPane.setBorder(BorderFactory.createTitledBorder(
|
BorderFactory.createEtchedBorder(),
|
getString(mainFrame, "common.commands"),
|
TitledBorder.LEFT,
|
TitledBorder.TOP
|
));
|
|
// ´´½¨°´Å¥Ãæ°å
|
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
|
|
// ʹÓÃButtonUtils´´½¨Ñùʽ°´Å¥
|
saveButton = ButtonUtils.createBlueButton(getString(mainFrame, "save.common.commands"), 25);
|
saveButton.setPreferredSize(new Dimension(120, 25));
|
|
saveButton.addActionListener(new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
saveCommands();
|
}
|
});
|
|
buttonPanel.add(saveButton);
|
|
add(scrollPane, BorderLayout.CENTER);
|
add(buttonPanel, BorderLayout.SOUTH);
|
|
// ³õʼ»¯Ö¸ÁîÎļþ
|
String rootPath = System.getProperty("user.dir");
|
File systemFileDir = new File(rootPath + File.separator + "systemfile");
|
if (!systemFileDir.exists()) {
|
systemFileDir.mkdirs();
|
}
|
commandFile = new File(systemFileDir, "zhiling.txt");
|
}
|
|
private void loadCommands() {
|
commandPanel.removeAll(); // Çå¿ÕÃæ°å
|
|
if (commandFile.exists()) {
|
try (BufferedReader reader = new BufferedReader(new FileReader(commandFile))) {
|
String line;
|
while ((line = reader.readLine()) != null) {
|
if (!line.trim().isEmpty()) {
|
// ÿÐиñʽ£ºÊÇ·ñHEX:Ö¸ÁîÄÚÈÝ
|
String[] parts = line.split(":", 2);
|
boolean isHex = false;
|
String command = "";
|
|
if (parts.length == 2) {
|
isHex = Boolean.parseBoolean(parts[0]);
|
command = parts[1];
|
} else {
|
command = line;
|
}
|
|
addCommandRow(isHex, command);
|
}
|
}
|
} catch (IOException e) {
|
JOptionPane.showMessageDialog(this,
|
getString(mainFrame, "load.commands.failed") + e.getMessage(),
|
getString(mainFrame, "error"),
|
JOptionPane.ERROR_MESSAGE);
|
}
|
}
|
|
// Ìí¼ÓÒ»¸ö¿ÕÐÐÓÃÓÚÐÂÔöÃüÁî
|
addCommandRow(false, "");
|
|
commandPanel.revalidate();
|
commandPanel.repaint();
|
}
|
|
private void addCommandRow(boolean isHex, String command) {
|
JPanel rowPanel = new JPanel();
|
rowPanel.setLayout(new BoxLayout(rowPanel, BoxLayout.X_AXIS));
|
rowPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // ÉèÖÃÐмä¾à
|
|
// HEX¸´Ñ¡¿ò
|
JCheckBox hexCheckBox = new JCheckBox(getString(mainFrame, "hex.send"));
|
hexCheckBox.setSelected(isHex);
|
hexCheckBox.setAlignmentY(Component.CENTER_ALIGNMENT);
|
|
// ÃüÁîÎı¾¿ò
|
JTextField commandField = new JTextField(command);
|
commandField.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30)); // ÏÞÖÆ¸ß¶È£¬¿í¶È×ÔÊÊÓ¦
|
|
// ·¢ËͰ´Å¥
|
JButton sendButton = createSendButton();
|
sendButton.addActionListener(new ActionListener() {
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
sendCommand(hexCheckBox.isSelected(), commandField.getText());
|
}
|
});
|
|
// Ìí¼Ó×é¼þµ½ÐÐÃæ°å
|
rowPanel.add(hexCheckBox);
|
rowPanel.add(Box.createHorizontalStrut(5)); // HEX¸´Ñ¡¿òÓëÎı¾¿ò¼ä¸ô5ÏñËØ
|
rowPanel.add(commandField);
|
rowPanel.add(Box.createHorizontalStrut(10)); // Îı¾¿òÓë°´Å¥¼ä¸ô10ÏñËØ
|
rowPanel.add(sendButton);
|
|
commandPanel.add(rowPanel);
|
}
|
|
private JButton createSendButton() {
|
JButton button = new JButton(getString(mainFrame, "send"));
|
|
// ÉèÖð´Å¥´óСΪ60¡Á20£¨¿í¡Á¸ß£©
|
button.setPreferredSize(new Dimension(80, 20));
|
button.setMinimumSize(new Dimension(80, 20));
|
button.setMaximumSize(new Dimension(80, 20));
|
|
// ÉèÖð´Å¥Ñùʽ
|
button.setBackground(new Color(0, 120, 215));
|
button.setForeground(Color.WHITE);
|
button.setFocusPainted(false);
|
button.setBorderPainted(false);
|
button.setFont(button.getFont().deriveFont(Font.BOLD, 12f));
|
|
// Ìí¼ÓÊó±ê½»»¥Ð§¹û
|
button.addMouseListener(new java.awt.event.MouseAdapter() {
|
public void mouseEntered(java.awt.event.MouseEvent evt) {
|
button.setBackground(new Color(0, 150, 255)); // Ðüͣʱ±äÁÁ
|
button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
}
|
|
public void mouseExited(java.awt.event.MouseEvent evt) {
|
button.setBackground(new Color(0, 120, 215)); // »Ö¸´Õý³£ÑÕÉ«
|
button.setCursor(Cursor.getDefaultCursor());
|
}
|
|
public void mousePressed(java.awt.event.MouseEvent evt) {
|
// µã»÷Ч¹û - ÑÕÉ«±äÉî²¢ÓÐÇá΢ËõСЧ¹û
|
button.setBackground(new Color(0, 80, 160));
|
button.setBounds(button.getX() + 1, button.getY() + 1, 58, 18);
|
}
|
|
public void mouseReleased(java.awt.event.MouseEvent evt) {
|
// »Ö¸´Ô×´
|
button.setBackground(new Color(0, 150, 255));
|
button.setBounds(button.getX() - 1, button.getY() - 1, 60, 20);
|
}
|
});
|
|
return button;
|
}
|
|
private void saveCommands() {
|
try (BufferedWriter writer = new BufferedWriter(new FileWriter(commandFile))) {
|
Component[] components = commandPanel.getComponents();
|
for (Component comp : components) {
|
if (comp instanceof JPanel) {
|
JPanel rowPanel = (JPanel) comp;
|
Component[] rowComponents = rowPanel.getComponents();
|
|
boolean isHex = false;
|
String command = "";
|
|
for (Component rowComp : rowComponents) {
|
if (rowComp instanceof JCheckBox) {
|
isHex = ((JCheckBox) rowComp).isSelected();
|
} else if (rowComp instanceof JTextField) {
|
command = ((JTextField) rowComp).getText().trim();
|
}
|
}
|
|
if (!command.isEmpty()) {
|
writer.write(isHex + ":" + command);
|
writer.newLine();
|
}
|
}
|
}
|
JOptionPane.showMessageDialog(this,
|
getString(mainFrame, "save.commands.success"),
|
getString(mainFrame, "prompt"),
|
JOptionPane.INFORMATION_MESSAGE);
|
} catch (IOException e) {
|
JOptionPane.showMessageDialog(this,
|
getString(mainFrame, "save.commands.failed") + e.getMessage(),
|
getString(mainFrame, "error"),
|
JOptionPane.ERROR_MESSAGE);
|
}
|
}
|
|
private void sendCommand(boolean isHex, String command) {
|
if (command == null || command.trim().isEmpty()) {
|
JOptionPane.showMessageDialog(this,
|
getString(mainFrame, "command.cannot.empty"),
|
getString(mainFrame, "error"),
|
JOptionPane.ERROR_MESSAGE);
|
return;
|
}
|
|
// »ñÈ¡µ±Ç°Ê±¼ä
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
String currentTime = dateFormat.format(new Date());
|
|
// ¹¹½¨ÈÕÖ¾ÐÅÏ¢
|
StringBuilder logMessage = new StringBuilder();
|
logMessage.append("[").append(currentTime).append("] ");
|
logMessage.append(getString(mainFrame, "send")).append(": ");
|
|
// ¸ù¾ÝHEX·¢ËÍÑ¡Ïî¸ñʽ»¯ÄÚÈÝ
|
if (isHex) {
|
logMessage.append("HEX ");
|
logMessage.append(command);
|
} else {
|
logMessage.append("ASCII ");
|
logMessage.append(command);
|
}
|
|
logMessage.append(" [").append(getString(mainFrame, "extension.command")).append("]");
|
logMessage.append("\n");
|
|
// ½«·¢ËÍÐÅÏ¢Ìí¼Óµ½Êý¾ÝÈÕÖ¾Ãæ°å
|
addLogToDataLogPanel(logMessage.toString());
|
|
// µ÷ÓÃÖ÷¿ò¼ÜµÄ·¢ËÍ·½·¨
|
if (mainFrame != null) {
|
mainFrame.sendDataFromExtension(command, isHex);
|
}
|
}
|
|
/**
|
* ½«ÈÕÖ¾ÐÅÏ¢Ìí¼Óµ½Êý¾ÝÈÕÖ¾Ãæ°å
|
* @param logMessage ÈÕÖ¾ÐÅÏ¢
|
*/
|
private void addLogToDataLogPanel(String logMessage) {
|
try {
|
// ͨ¹ýÖ÷¿ò¼Ü»ñÈ¡DataLogPanelʵÀý
|
if (mainFrame != null) {
|
// Ö±½Óµ÷ÓÃMainFrameµÄÈÕÖ¾Ìí¼Ó·½·¨£¬±ÜÃâʹÓ÷´Éä
|
mainFrame.addToDataLog(logMessage);
|
}
|
} catch (Exception ex) {
|
// ±¸Ó÷½°¸£º³¢ÊÔʹÓ÷´Éä
|
try {
|
DataLogPanel dataLogPanel = mainFrame.getDataLogPanel();
|
if (dataLogPanel != null) {
|
java.lang.reflect.Field logAreaField = DataLogPanel.class.getDeclaredField("logArea");
|
logAreaField.setAccessible(true);
|
JTextArea logArea = (JTextArea) logAreaField.get(dataLogPanel);
|
|
if (logArea != null) {
|
logArea.append(logMessage);
|
// ×Ô¶¯¹ö¶¯µ½×îºó
|
logArea.setCaretPosition(logArea.getDocument().getLength());
|
}
|
}
|
} catch (Exception e) {
|
System.err.println("ÎÞ·¨·ÃÎÊÊý¾ÝÈÕÖ¾ÇøÓò: " + e.getMessage());
|
// ÏÔʾ´íÎóÐÅÏ¢
|
JOptionPane.showMessageDialog(this,
|
"ÎÞ·¨ÔÚÊý¾ÝÈÕÖ¾ÖÐÏÔʾÄÚÈÝ: " + e.getMessage(),
|
"´íÎó",
|
JOptionPane.ERROR_MESSAGE);
|
}
|
}
|
}
|
|
private static String getString(MainFrame mainFrame, String key) {
|
return mainFrame != null ? mainFrame.getString(key) : key;
|
}
|
}
|