Files
HaE/src/main/java/hae/component/board/Datatable.java

229 lines
7.9 KiB
Java
Raw Normal View History

2024-05-06 12:56:56 +08:00
package hae.component.board;
import burp.api.montoya.MontoyaApi;
import hae.component.board.message.MessageTableModel;
2024-05-09 13:32:22 +08:00
import hae.instances.editor.RequestEditor;
2023-12-12 14:19:28 +08:00
import jregex.Pattern;
import jregex.REFlags;
2024-05-06 12:56:56 +08:00
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
2023-11-07 11:15:20 +08:00
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
2024-05-06 12:56:56 +08:00
import java.util.*;
2023-11-07 11:15:20 +08:00
import java.util.List;
2024-05-06 12:56:56 +08:00
import javax.swing.*;
import java.awt.datatransfer.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class Datatable extends JPanel {
private final MontoyaApi api;
private final JTable dataTable;
private final DefaultTableModel dataTableModel;
2023-11-07 11:15:20 +08:00
private final JTextField searchField;
2024-05-06 12:56:56 +08:00
private final TableRowSorter<DefaultTableModel> sorter;
private final JCheckBox searchMode = new JCheckBox("Reverse search");
private final String tabName;
public Datatable(MontoyaApi api, String tabName, List<String> dataList) {
this.api = api;
this.tabName = tabName;
2023-11-07 11:15:20 +08:00
2023-11-07 11:32:44 +08:00
String[] columnNames = {"#", "Information"};
2024-05-06 12:56:56 +08:00
dataTableModel = new DefaultTableModel(columnNames, 0);
dataTable = new JTable(dataTableModel);
sorter = new TableRowSorter<>(dataTableModel);
searchField = new JTextField();
initComponents(dataList);
}
private void initComponents(List<String> dataList) {
2023-11-13 08:28:44 +08:00
// 设置ID排序
sorter.setComparator(0, new Comparator<Integer>() {
@Override
public int compare(Integer s1, Integer s2) {
return s1.compareTo(s2);
}
});
2023-11-07 11:15:20 +08:00
2024-05-06 12:56:56 +08:00
dataTable.setRowSorter(sorter);
TableColumn idColumn = dataTable.getColumnModel().getColumn(0);
2023-11-07 11:32:44 +08:00
idColumn.setMaxWidth(50);
2023-11-07 11:15:20 +08:00
2024-05-06 12:56:56 +08:00
for (String item : dataList) {
2024-02-02 19:07:03 +08:00
if (!item.isEmpty()) {
2024-05-06 12:56:56 +08:00
addRowToTable(new Object[]{item});
2024-02-02 19:07:03 +08:00
}
2023-12-12 14:19:28 +08:00
}
2024-05-06 12:56:56 +08:00
// 设置灰色默认文本
String searchText = "Search";
addPlaceholder(searchField, searchText);
2023-11-07 11:15:20 +08:00
// 监听输入框内容输入、更新、删除
searchField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
performSearch();
}
@Override
public void removeUpdate(DocumentEvent e) {
performSearch();
}
@Override
public void changedUpdate(DocumentEvent e) {
performSearch();
}
});
// 设置布局
2024-05-06 12:56:56 +08:00
JScrollPane scrollPane = new JScrollPane(dataTable);
2023-11-07 11:15:20 +08:00
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
2023-11-13 08:28:44 +08:00
2024-05-06 12:56:56 +08:00
searchMode.addItemListener(e -> performSearch());
2023-11-13 08:28:44 +08:00
2023-11-07 11:15:20 +08:00
setLayout(new BorderLayout(0, 5));
2023-11-13 08:28:44 +08:00
JPanel optionsPanel = new JPanel();
optionsPanel.setBorder(BorderFactory.createEmptyBorder(2, 3, 5, 5));
optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.X_AXIS));
// 新增复选框要在这修改rows
2023-12-12 14:19:28 +08:00
JPanel menuPanel = new JPanel(new GridLayout(1, 1));
2023-11-13 08:28:44 +08:00
menuPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
JPopupMenu menu = new JPopupMenu();
menuPanel.add(searchMode);
menu.add(menuPanel);
JButton settingsButton = new JButton("Settings");
2024-05-06 12:56:56 +08:00
settingsButton.addActionListener(e -> {
int x = settingsButton.getX();
int y = settingsButton.getY() - menu.getPreferredSize().height;
menu.show(settingsButton, x, y);
2023-11-13 08:28:44 +08:00
});
optionsPanel.add(settingsButton);
optionsPanel.add(Box.createHorizontalStrut(5));
optionsPanel.add(searchField);
2023-11-07 11:15:20 +08:00
add(scrollPane, BorderLayout.CENTER);
2023-11-13 08:28:44 +08:00
add(optionsPanel, BorderLayout.SOUTH);
2023-12-12 14:19:28 +08:00
}
2023-11-13 08:28:44 +08:00
2024-05-06 12:56:56 +08:00
public static void addPlaceholder(JTextField textField, String placeholderText) {
textField.setForeground(Color.GRAY);
textField.setText(placeholderText);
textField.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
if (textField.getText().equals(placeholderText)) {
textField.setText("");
textField.setForeground(Color.BLACK);
}
}
@Override
public void focusLost(FocusEvent e) {
if (textField.getText().isEmpty()) {
textField.setForeground(Color.GRAY);
textField.setText(placeholderText);
}
}
});
}
private void addRowToTable(Object[] data) {
int rowCount = dataTableModel.getRowCount();
int id = rowCount > 0 ? (Integer) dataTableModel.getValueAt(rowCount - 1, 0) + 1 : 1;
2023-12-12 14:19:28 +08:00
Object[] rowData = new Object[data.length + 1];
2024-05-06 12:56:56 +08:00
rowData[0] = id;
System.arraycopy(data, 0, rowData, 1, data.length);
dataTableModel.addRow(rowData);
2023-11-07 11:15:20 +08:00
}
2023-11-13 08:28:44 +08:00
private void performSearch() {
if (searchField.getForeground().equals(Color.BLACK)) {
2024-01-18 12:07:20 +08:00
RowFilter<Object, Object> rowFilter = new RowFilter<Object, Object>() {
public boolean include(Entry<?, ?> entry) {
String searchFieldTextText = searchField.getText();
Pattern pattern = null;
try {
pattern = new Pattern(searchFieldTextText, REFlags.IGNORE_CASE);
} catch (Exception ignored) {
2023-11-13 08:28:44 +08:00
}
2024-01-18 12:07:20 +08:00
String entryValue = ((String) entry.getValue(1)).toLowerCase();
searchFieldTextText = searchFieldTextText.toLowerCase();
if (pattern != null) {
return searchFieldTextText.isEmpty() || pattern.matcher(entryValue).find() != searchMode.isSelected();
} else {
return searchFieldTextText.isEmpty() || entryValue.contains(searchFieldTextText) != searchMode.isSelected();
}
}
};
2023-11-13 08:28:44 +08:00
sorter.setRowFilter(rowFilter);
}
}
2024-05-06 12:56:56 +08:00
public void setTableListener(MessageTableModel messagePanel) {
2024-05-09 13:32:22 +08:00
// 表格复制功能
dataTable.setTransferHandler(new TransferHandler() {
@Override
public void exportToClipboard(JComponent comp, Clipboard clip, int action) throws IllegalStateException {
if (comp instanceof JTable) {
StringSelection stringSelection = new StringSelection(getSelectedDataAtTable((JTable) comp));
clip.setContents(stringSelection, null);
} else {
super.exportToClipboard(comp, clip, action);
}
}
});
2024-05-06 12:56:56 +08:00
dataTable.setDefaultEditor(Object.class, null);
// 表格内容双击事件
dataTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int selectedRow = dataTable.getSelectedRow();
if (selectedRow != -1) {
String rowData = dataTable.getValueAt(selectedRow, 1).toString();
messagePanel.applyMessageFilter(tabName, rowData);
}
}
}
});
2023-11-07 11:15:20 +08:00
}
2024-05-09 13:32:22 +08:00
public String getSelectedDataAtTable(JTable table) {
int[] selectRows = table.getSelectedRows();
StringBuilder selectData = new StringBuilder();
for (int row : selectRows) {
selectData.append(table.getValueAt(row, 1).toString()).append("\n");
}
// 便于单行复制,去除最后一个换行符
if (!selectData.isEmpty()){
selectData.deleteCharAt(selectData.length() - 1);
return selectData.toString();
} else {
return "";
}
}
public JTable getDataTable() {
return this.dataTable;
}
2024-05-06 12:56:56 +08:00
}