package dell_targets;
|
import targets.LocationTag;
|
import dell_targets.Dell_tag;
|
import javax.swing.*;
|
import javax.swing.table.*;
|
import java.awt.*;
|
import java.awt.event.WindowAdapter;
|
import java.awt.event.WindowEvent;
|
import java.util.*;
|
import java.util.List;
|
import java.util.ResourceBundle;
|
import publicsWay.ButtonUtils; // µ¼ÈëButtonUtils
|
import publicsWay.TableUtils; // µ¼ÈëTableUtils
|
|
public class SatelliteDevicePanel extends JPanel {
|
private static final long serialVersionUID = 1L;
|
private JTable deviceTable;
|
private DefaultTableModel tableModel;
|
private List<LocationTag> allDevices;
|
private ResourceBundle messages;
|
private JTextField searchField;
|
private JComboBox<String> upgradeConditionCombo;
|
private JTextField upgradeValueField;
|
private JButton startUpgradeButton;
|
private JTextField firmwareUrlField; // ¹Ì¼þÉý¼¶Îı¾Óò
|
|
public static String FirmwareURL="";//¹Ì¼þÉý¼¶µØÖ·
|
public static boolean isOpenUpgrade=false;//ÊÇ·ñ¿ªÆôÁËÉý¼¶¹¦ÄÜ
|
public static List<LocationTag> needUpgradeList=null;//ÐèÒªÉý¼¶µÄÉ豸¼¯ºÏ
|
|
@SuppressWarnings("serial")
|
public SatelliteDevicePanel(ResourceBundle messages) {
|
this.messages = messages;
|
setLayout(new BorderLayout());
|
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
|
|
// Ìí¼Ó´°¿Ú¹Ø±Õ¼àÌýÆ÷
|
addWindowCloseListener();
|
|
// ¶¥²¿²Ù×÷Ãæ°å
|
JPanel topPanel = new JPanel(new BorderLayout(5, 5));
|
topPanel.setBorder(BorderFactory.createTitledBorder(messages.getString("QUICK_OPERATION")));
|
|
// ËÑË÷Ãæ°å
|
JPanel searchInputPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
|
JLabel searchLabel = new JLabel(messages.getString("DEVICE_NUMBER") + ":");
|
searchField = new JTextField(15);
|
|
// ʹÓÃButtonUtils´´½¨À¶É«°´Å¥
|
JButton searchButton = ButtonUtils.createBlueButton(messages.getString("SEARCH"));
|
JButton resetButton = ButtonUtils.createBlueButton(messages.getString("RESET"));
|
JButton refreshButton = ButtonUtils.createBlueButton(messages.getString("REFRESH"));
|
|
searchInputPanel.add(searchLabel);
|
searchInputPanel.add(searchField);
|
searchInputPanel.add(searchButton);
|
searchInputPanel.add(resetButton);
|
searchInputPanel.add(refreshButton);
|
|
// Éý¼¶Ìõ¼þÃæ°å
|
JPanel upgradePanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
|
upgradeConditionCombo = new JComboBox<>(new String[]{
|
messages.getString("SET_UPGRADE_CONDITIONS"),
|
messages.getString("BY_VERSION"),
|
messages.getString("BY_NUMBER"),
|
messages.getString("BY_SELECTED_DEVICE"),
|
messages.getString("BY_COMPANY_NAME")
|
});
|
upgradeValueField = new JTextField(15);
|
startUpgradeButton = ButtonUtils.createBlueButton(messages.getString("START_UPGRADE"));
|
|
// ÐÂÔö¹Ì¼þµØÖ·Îı¾¿ò
|
JLabel firmwareUrlLabel = new JLabel(messages.getString("FIRMWARE_URL") + ":");
|
firmwareUrlField = new JTextField(20);
|
firmwareUrlField.setToolTipText(messages.getString("ENTER_FIRMWARE_DOWNLOAD_URL"));
|
|
upgradePanel.add(upgradeConditionCombo);
|
upgradePanel.add(upgradeValueField);
|
upgradePanel.add(firmwareUrlLabel);
|
upgradePanel.add(firmwareUrlField);
|
upgradePanel.add(startUpgradeButton);
|
|
// ²Ù×÷°´Å¥Ãæ°å
|
JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0));
|
|
// ½«ËÑË÷Ãæ°å¡¢Éý¼¶Ãæ°åºÍ²Ù×÷Ãæ°å·ÅÔÚÒ»ÐÐ
|
JPanel rowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5));
|
rowPanel.add(searchInputPanel);
|
rowPanel.add(upgradePanel);
|
rowPanel.add(actionPanel);
|
|
topPanel.add(rowPanel, BorderLayout.CENTER);
|
|
// ´´½¨±í¸ñÁÐÃû - Ôö¼ÓËùÊô¹«Ë¾ºÍÖ¸Áî·¢ËÍÁÐ
|
String[] columnNames = {
|
messages.getString("SELECT"),
|
messages.getString("INDEX"),
|
messages.getString("COMPANY"), // ÐÂÔöËùÊô¹«Ë¾ÁÐ
|
messages.getString("DEVICE_NUMBER"),
|
messages.getString("LONGITUDE"),
|
messages.getString("LATITUDE"),
|
messages.getString("ALTITUDE"),
|
messages.getString("STATUS"),
|
messages.getString("SATELLITE_COUNT"),
|
messages.getString("DIFFERENTIAL_TIME"),
|
messages.getString("RtkSource"),
|
messages.getString("VERSION"),
|
messages.getString("CARD_NUMBER"),
|
messages.getString("ADDRESS"),
|
messages.getString("PORT"),
|
messages.getString("COMMAND_SEND"), // ÐÂÔöÖ¸Áî·¢ËÍÁÐ
|
messages.getString("UPDATE_TIME")
|
};
|
|
// ´´½¨±í¸ñÄ£ÐÍ
|
tableModel = new DefaultTableModel(columnNames, 0) {
|
@Override
|
public boolean isCellEditable(int row, int column) {
|
// Ö»ÓÐÑ¡ÔñÁкÍÖ¸Áî·¢ËÍÁпɱà¼
|
return column == 0 || column == 14;
|
}
|
|
@Override
|
public Class<?> getColumnClass(int columnIndex) {
|
// Ñ¡ÔñÁÐʹÓÃBooleanÀàÐÍ
|
if (columnIndex == 0) {
|
return Boolean.class;
|
}
|
return Object.class;
|
}
|
};
|
|
// ´´½¨±í¸ñ - ʹÓÃTableUtilsÖеķ½·¨
|
deviceTable = new JTable(tableModel);
|
TableUtils.setupTableStyle(deviceTable);
|
TableUtils.setupTableHeaderStyle(deviceTable);
|
deviceTable.setAutoCreateRowSorter(true);
|
deviceTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
|
// ¸üÐÂÁпíÉèÖã¬Ôö¼Ó²î·ÖÔ´ÁеĿí¶È
|
deviceTable.getColumnModel().getColumn(0).setPreferredWidth(50);
|
deviceTable.getColumnModel().getColumn(1).setPreferredWidth(50);
|
deviceTable.getColumnModel().getColumn(2).setPreferredWidth(100);
|
deviceTable.getColumnModel().getColumn(3).setPreferredWidth(100);
|
deviceTable.getColumnModel().getColumn(4).setPreferredWidth(80);
|
deviceTable.getColumnModel().getColumn(5).setPreferredWidth(80);
|
deviceTable.getColumnModel().getColumn(6).setPreferredWidth(80);
|
deviceTable.getColumnModel().getColumn(7).setPreferredWidth(60);
|
deviceTable.getColumnModel().getColumn(8).setPreferredWidth(80);
|
deviceTable.getColumnModel().getColumn(9).setPreferredWidth(100);
|
deviceTable.getColumnModel().getColumn(10).setPreferredWidth(100); // ²î·ÖÔ´Áпí¶È
|
deviceTable.getColumnModel().getColumn(11).setPreferredWidth(80);
|
deviceTable.getColumnModel().getColumn(12).setPreferredWidth(100);
|
deviceTable.getColumnModel().getColumn(13).setPreferredWidth(120);
|
deviceTable.getColumnModel().getColumn(14).setPreferredWidth(80);
|
deviceTable.getColumnModel().getColumn(15).setPreferredWidth(100);
|
deviceTable.getColumnModel().getColumn(16).setPreferredWidth(150);
|
|
// Ó¦Óõ¥Ôª¸ñäÖȾÆ÷µ½ËùÓÐÁÐ - ʹÓÃTableUtilsÖеķ½·¨
|
DefaultTableCellRenderer cellRenderer = TableUtils.createCenteredCellRenderer();
|
for (int i = 0; i < deviceTable.getColumnCount(); i++) {
|
deviceTable.getColumnModel().getColumn(i).setCellRenderer(cellRenderer);
|
}
|
|
// ÌØÊâ´¦ÀíÑ¡ÔñÁÐ(¸´Ñ¡¿ò)
|
TableColumn selectColumn = deviceTable.getColumnModel().getColumn(0);
|
selectColumn.setCellRenderer(new DefaultTableCellRenderer() {
|
private JCheckBox checkBox = new JCheckBox();
|
|
@Override
|
public Component getTableCellRendererComponent(JTable table, Object value,
|
boolean isSelected, boolean hasFocus,
|
int row, int column) {
|
if (value instanceof Boolean) {
|
checkBox.setSelected((Boolean) value);
|
}
|
checkBox.setHorizontalAlignment(SwingConstants.CENTER);
|
|
// ÉèÖý»ÌæÐÐÑÕÉ«
|
if (!isSelected) {
|
if (row % 2 == 0) {
|
checkBox.setBackground(new Color(240, 240, 200)); // µ»ÆÉ«
|
} else {
|
checkBox.setBackground(Color.WHITE); // °×É«
|
}
|
} else {
|
checkBox.setBackground(new Color(200, 220, 240)); // Ñ¡ÖÐÐеÄÀ¶É«
|
}
|
|
checkBox.setOpaque(true);
|
return checkBox;
|
}
|
});
|
|
JScrollPane scrollPane = new JScrollPane(deviceTable);
|
scrollPane.setPreferredSize(new Dimension(1200, 400));
|
scrollPane.setBorder(BorderFactory.createEmptyBorder()); // ÒÆ³ý¹ö¶¯Ãæ°å±ß¿ò
|
|
// Ìí¼Ó×é¼þ
|
add(topPanel, BorderLayout.NORTH);
|
add(scrollPane, BorderLayout.CENTER);
|
|
// ¼ÓÔØÊý¾Ý
|
loadDeviceData();
|
|
// Ìí¼Óʼþ¼àÌýÆ÷
|
searchButton.addActionListener(e -> searchDevices());
|
resetButton.addActionListener(e -> resetSearch());
|
refreshButton.addActionListener(e -> loadDeviceData());
|
startUpgradeButton.addActionListener(e -> startUpgrade());
|
|
// Ìí¼Ó±í¸ñÄ£ÐͼàÌýÆ÷£¬ÓÃÓÚ×Ô¶¯¸üÐÂÑ¡ÖÐÉ豸µ½Îı¾¿ò
|
tableModel.addTableModelListener(e -> {
|
if (e.getColumn() == 0 && messages.getString("BY_SELECTED_DEVICE").equals(upgradeConditionCombo.getSelectedItem())) {
|
updateSelectedDevicesToTextField();
|
}
|
});
|
|
// Ìí¼ÓÉý¼¶Ìõ¼þ×éºÏ¿ò¼àÌýÆ÷
|
upgradeConditionCombo.addActionListener(e -> {
|
if (messages.getString("BY_SELECTED_DEVICE").equals(upgradeConditionCombo.getSelectedItem())) {
|
updateSelectedDevicesToTextField();
|
}
|
});
|
}
|
|
// ¸üÐÂÑ¡ÖÐÉ豸µ½Îı¾¿ò
|
private void updateSelectedDevicesToTextField() {
|
List<String> selectedDevices = new ArrayList<>();
|
for (int i = 0; i < tableModel.getRowCount(); i++) {
|
Boolean isSelected = (Boolean) tableModel.getValueAt(i, 0);
|
if (isSelected != null && isSelected) {
|
String deviceNumber = (String) tableModel.getValueAt(i, 3); // É豸±àºÅÔÚµÚ3ÁÐ
|
selectedDevices.add(deviceNumber);
|
}
|
}
|
upgradeValueField.setText(String.join(",", selectedDevices));
|
}
|
|
// °´Å¥äÖȾÆ÷
|
class ButtonRenderer extends JButton implements TableCellRenderer {
|
private static final long serialVersionUID = 1L;
|
|
public ButtonRenderer() {
|
setOpaque(true);
|
}
|
|
@Override
|
public Component getTableCellRendererComponent(JTable table, Object value,
|
boolean isSelected, boolean hasFocus,
|
int row, int column) {
|
setText((value == null) ? "" : value.toString());
|
return this;
|
}
|
}
|
|
// °´Å¥±à¼Æ÷
|
class ButtonEditor extends DefaultCellEditor {
|
private static final long serialVersionUID = 1L;
|
private String label;
|
private JButton button;
|
|
public ButtonEditor(JCheckBox checkBox) {
|
super(checkBox);
|
button = new JButton();
|
button.setOpaque(true);
|
button.addActionListener(e -> fireEditingStopped());
|
}
|
|
@Override
|
public Component getTableCellEditorComponent(JTable table, Object value,
|
boolean isSelected, int row, int column) {
|
label = (value == null) ? "" : value.toString();
|
button.setText(label);
|
return button;
|
}
|
|
@Override
|
public Object getCellEditorValue() {
|
return label;
|
}
|
}
|
|
private void loadDeviceData() {
|
try {
|
allDevices = Dell_tag.getOnlineLocationTags();
|
updateTable(allDevices);
|
} catch (Exception ex) {
|
JOptionPane.showMessageDialog(this, messages.getString("DATA_LOAD_ERROR") + ": " + ex.getMessage(),
|
messages.getString("ERROR"), JOptionPane.ERROR_MESSAGE);
|
}
|
}
|
|
// ËÑË÷É豸
|
private void searchDevices() {
|
String keyword = searchField.getText().trim();
|
if (keyword.isEmpty()) {
|
updateTable(allDevices);
|
return;
|
}
|
|
List<LocationTag> filtered = new ArrayList<>();
|
for (LocationTag device : allDevices) {
|
if (device.getDeviceNumber() != null &&
|
device.getDeviceNumber().toLowerCase().contains(keyword.toLowerCase())) {
|
filtered.add(device);
|
}
|
}
|
|
if (filtered.isEmpty()) {
|
JOptionPane.showMessageDialog(this, messages.getString("SEARCH_NO_RESULTS"),
|
messages.getString("INFO"), JOptionPane.INFORMATION_MESSAGE);
|
}
|
|
updateTable(filtered);
|
}
|
|
// ÖØÖÃËÑË÷
|
private void resetSearch() {
|
searchField.setText("");
|
updateTable(allDevices);
|
}
|
|
private void updateTable(List<LocationTag> devices) {
|
tableModel.setRowCount(0);
|
|
int index = 1;
|
for (LocationTag device : devices) {
|
tableModel.addRow(new Object[]{
|
false, // Ñ¡ÔñÁÐ
|
index++,
|
device.getCompany(), // ÐÂÔö¹«Ë¾ÁÐ
|
device.getDeviceNumber(),
|
device.getLongitude(),
|
device.getLatitude(),
|
device.getAltitude(),
|
device.getSatelliteQuality(),
|
device.getSatelliteCount(),
|
device.getDifferentialTime(),
|
device.getRTKsource(), // ÐÂÔö²î·ÖÔ´Êý¾Ý
|
device.getDeviceVersion(),
|
device.getDeviceCardNumber(),
|
device.getIpAddress(),
|
device.getIpPort(),
|
device.getAutoUpgraded(),// Ö¸Áî·¢ËͰ´Å¥
|
device.getGnGgaDataTime()
|
});
|
}
|
}
|
|
// Æô¶¯Éý¼¶
|
private void startUpgrade() {
|
int dex = upgradeConditionCombo.getSelectedIndex();
|
|
String value = upgradeValueField.getText().trim();
|
String firmwareUrl = firmwareUrlField.getText().trim();
|
|
if (firmwareUrl.isEmpty()) {
|
JOptionPane.showMessageDialog(this, messages.getString("FIRMWARE_URL_REQUIRED"),
|
messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE);
|
return;
|
}
|
|
if (value.isEmpty()) {
|
JOptionPane.showMessageDialog(this, messages.getString("UPGRADE_VALUE_REQUIRED"),
|
messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE);
|
return;
|
}
|
|
List<LocationTag> devicesToUpgrade = new ArrayList<>();
|
|
// ¸ù¾ÝÌõ¼þÖ´ÐÐÉý¼¶Âß¼
|
if (dex == 3) {
|
// »ñȡѡÖеÄÉ豸
|
for (int i = 0; i < tableModel.getRowCount(); i++) {
|
Boolean isSelected = (Boolean) tableModel.getValueAt(i, 0);
|
if (isSelected != null && isSelected) {
|
String deviceNumber = (String) tableModel.getValueAt(i, 3);
|
LocationTag device = Dell_tag.getTagByDeviceId(deviceNumber);
|
if (device != null) {
|
devicesToUpgrade.add(device);
|
}
|
}
|
}
|
|
if (devicesToUpgrade.isEmpty()) {
|
JOptionPane.showMessageDialog(this, messages.getString("SELECT_DEVICE_TO_UPGRADE"),
|
messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE);
|
return;
|
}
|
} else if (dex == 1) {
|
// Ö´Ðа´°æ±¾Éý¼¶
|
devicesToUpgrade = Dell_tag.getLocationTagsByProperty("deviceVersion", value);
|
} else if (dex == 2) {
|
// Ö´Ðа´É豸±àºÅÉý¼¶ - ÐÞ¸´Âß¼´íÎó
|
String[] tagIds = value.split("[\\s,;]+"); // ʹÓÃÕýÔò±í´ïʽ·Ö¸î¶àÖÖ·Ö¸ô·û
|
for (String tagId : tagIds) {
|
List<LocationTag> devicesForId = Dell_tag.getLocationTagsByProperty("deviceNumber", tagId.trim());
|
if (devicesForId != null) {
|
devicesToUpgrade.addAll(devicesForId);
|
}
|
}
|
} else if (dex == 4) {
|
// Ö´Ðа´¹«Ë¾Ãû³ÆÉý¼¶
|
devicesToUpgrade = Dell_tag.getLocationTagsByProperty("company", value);
|
}
|
|
// ÑéÖ¤ÊÇ·ñÓÐÉ豸ÐèÒªÉý¼¶
|
if (devicesToUpgrade.isEmpty()) {
|
JOptionPane.showMessageDialog(this, messages.getString("NO_DEVICES_TO_UPGRADE"),
|
messages.getString("WARNING"), JOptionPane.WARNING_MESSAGE);
|
return;
|
}
|
|
FirmwareURL = firmwareUrl; // ¹Ì¼þÉý¼¶µØÖ·
|
isOpenUpgrade = true; // ÊÇ·ñ¿ªÆôÁËÉý¼¶¹¦ÄÜ
|
needUpgradeList = devicesToUpgrade; // ÐèÒªÉý¼¶µÄÉ豸¼¯ºÏ
|
|
// Ö´ÐÐÉý¼¶
|
performUpgrade(devicesToUpgrade, firmwareUrl);
|
}
|
|
private void performUpgrade(List<LocationTag> devices, String firmwareUrl) {
|
// ¹¹½¨É豸±àºÅÁбí×Ö·û´®
|
StringBuilder deviceListBuilder = new StringBuilder();
|
int maxDisplay = 20;
|
int displayCount = Math.min(devices.size(), maxDisplay);
|
|
for (int i = 0; i < displayCount; i++) {
|
if (i > 0) {
|
deviceListBuilder.append(", ");
|
}
|
deviceListBuilder.append(devices.get(i).getDeviceNumber());
|
}
|
|
if (devices.size() > maxDisplay) {
|
deviceListBuilder.append(messages.getString("UPGRADE_DEVICE_ELLIPSIS"))
|
.append(devices.size())
|
.append(messages.getString("UPGRADE_DEVICE_UNIT"));
|
}
|
|
// ´´½¨°üº¬É豸ÁбíºÍ¹Ì¼þµØÖ·µÄÍêÕûÏûÏ¢
|
String message = messages.getString("UPGRADE_CONFIRMATION_HEADER") +
|
deviceListBuilder.toString() +
|
"\n\n" + messages.getString("FIRMWARE_URL_LABEL") + ": " + firmwareUrl +
|
"\n\n" + String.format(messages.getString("TOTAL_DEVICES_COUNT"), devices.size());
|
|
JOptionPane.showMessageDialog(this,
|
message,
|
messages.getString("INFO"), JOptionPane.INFORMATION_MESSAGE);
|
}
|
|
// Ìí¼Ó´°¿Ú¹Ø±Õ¼àÌýÆ÷
|
private void addWindowCloseListener() {
|
// »ñÈ¡¶¥²ã´°¿Ú
|
Window window = SwingUtilities.getWindowAncestor(this);
|
if (window != null) {
|
window.addWindowListener(new WindowAdapter() {
|
@Override
|
public void windowClosing(WindowEvent e) {
|
isOpenUpgrade = false;
|
}
|
|
@Override
|
public void windowClosed(WindowEvent e) {
|
isOpenUpgrade = false;
|
}
|
});
|
}
|
}
|
|
public static String getFirmwareURL() {
|
return FirmwareURL;
|
}
|
|
public static boolean isOpenUpgrade() {
|
return isOpenUpgrade;
|
}
|
|
public static List<LocationTag> getNeedUpgradeList() {
|
return needUpgradeList;
|
}
|
}
|