diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java index 1f56025..3bde78c 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java @@ -36,7 +36,6 @@ public class CheckUpPage extends JPanel { private String[][] queue; private String[][] history; - private String[][] medicine; private DefaultTableModel model, historyModel; private JTable table1, historyTable; private final ResponseListener doctorGeneralInfoListener = this::handleGetDoctorGeneralInfoResponse; @@ -336,6 +335,11 @@ public class CheckUpPage extends JPanel { break; } case "medicine": + // If there is no user selected, show a warning message + if (checkupIdField.getText().isEmpty()) { + JOptionPane.showMessageDialog(null, "Please select a patient from the queue"); + return; + } // Open medicine dialog MedicineDialog dialog = new MedicineDialog(mainFrame); dialog.setVisible(true); diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/MedicineWindow/MedicineDialog.java b/src/main/java/BsK/client/ui/component/CheckUpPage/MedicineWindow/MedicineDialog.java index d780a81..120aa88 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/MedicineWindow/MedicineDialog.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/MedicineWindow/MedicineDialog.java @@ -1,103 +1,200 @@ -package BsK.client.ui.component.CheckUpPage.MedicineWindow;//package BsK.client.ui.component.CheckUpPage.MedicineWindow; -// -//import javax.swing.*; -//import javax.swing.table.DefaultTableModel; -//import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator; -//import java.awt.*; -//import java.util.List; -// -//public class MedicineDialog extends JDialog { -// private JComboBox medicineNameComboBox; -// private JTextField dosageField; -// private JTextField frequencyField; -// private JTextField quantityField; -// private JTextField priceField; -// private DefaultTableModel tableModel; -// -// // Example list of medicine names for autocomplete -// private List medicineList = List.of( -// "Paracetamol|20|4", "Ibuprofen|20|4", "Aspirin|400|2", "Amoxicillin|32|4", -// "Ciprofloxacin|323|4", "Doxycycline|43|43", "Metformin|332|23", "Atorvastatin|232|32" -// ); -// -// public MedicineDialog(Frame parent) { -// super(parent, "Enter Medicine Details", true); -// setLayout(new BorderLayout()); -// -// // Create a panel to hold the input fields -// JPanel inputPanel = new JPanel(new GridLayout(0, 2, 5, 5)); -// inputPanel.add(new JLabel("Medicine Name:")); -// medicineNameComboBox = new JComboBox<>(medicineList.toArray(new String[0])); -// medicineNameComboBox.setEditable(true); -// AutoCompleteDecorator.decorate(medicineNameComboBox); -// inputPanel.add(medicineNameComboBox); -// -// inputPanel.add(new JLabel("Dosage:")); -// dosageField = new JTextField(); -// inputPanel.add(dosageField); -// inputPanel.add(new JLabel("Frequency:")); -// frequencyField = new JTextField(); -// inputPanel.add(frequencyField); -// inputPanel.add(new JLabel("Quantity:")); -// quantityField = new JTextField(); -// inputPanel.add(quantityField); -// inputPanel.add(new JLabel("Price:")); -// priceField = new JTextField(); -// inputPanel.add(priceField); -// -// // Create a table to display selected medicines -// String[] columnNames = {"Medicine Name", "Dosage", "Frequency", "Quantity", "Price"}; -// tableModel = new DefaultTableModel(columnNames, 0); -// JTable table = new JTable(tableModel); -// JScrollPane tableScrollPane = new JScrollPane(table); -// -// // Create a panel for add and remove buttons -// JPanel buttonPanel = new JPanel(); -// JButton addButton = new JButton("Add"); -// JButton removeButton = new JButton("Remove"); -// buttonPanel.add(addButton); -// buttonPanel.add(removeButton); -// -// // Add action listeners for buttons -// addButton.addActionListener(e -> { -// String medicineName = (String) medicineNameComboBox.getSelectedItem(); -// String dosage = dosageField.getText(); -// String frequency = frequencyField.getText(); -// String quantity = quantityField.getText(); -// String price = priceField.getText(); -// tableModel.addRow(new Object[]{medicineName, dosage, frequency, quantity, price}); -// }); -// -// removeButton.addActionListener(e -> { -// int selectedRow = table.getSelectedRow(); -// if (selectedRow != -1) { -// tableModel.removeRow(selectedRow); -// } -// }); -// -// // Add components to the dialog -// add(inputPanel, BorderLayout.NORTH); -// add(tableScrollPane, BorderLayout.CENTER); -// add(buttonPanel, BorderLayout.SOUTH); -// -// // Set dialog properties -// pack(); -// setLocationRelativeTo(parent); -// } -// -// public static void main(String[] args) { -// JFrame frame = new JFrame(); -// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -// frame.setSize(400, 300); -// frame.setVisible(true); -// -// JButton openDialogButton = new JButton("Open Medicine Dialog"); -// openDialogButton.addActionListener(e -> { -// MedicineDialog dialog = new MedicineDialog(frame); -// dialog.setVisible(true); -// }); -// -// frame.add(openDialogButton, BorderLayout.CENTER); -// } -//} +package BsK.client.ui.component.CheckUpPage.MedicineWindow; +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableRowSorter; + +import BsK.client.network.handler.ClientHandler; +import BsK.client.network.handler.ResponseListener; +import BsK.common.packet.req.GetDoctorGeneralInfo; +import BsK.common.packet.req.GetMedInfoRequest; +import BsK.common.packet.res.GetMedInfoResponse; +import BsK.common.util.network.NetworkUtil; +import BsK.server.network.util.UserUtil; +import lombok.extern.slf4j.Slf4j; +import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator; +import java.awt.*; +import java.util.List; + +@Slf4j +public class MedicineDialog extends JDialog { + private JTextField medicineNameField; + private JTextField dosageField; + private JTextField frequencyField; + private JTextField quantityField; + private JTextField priceField; + private DefaultTableModel tableModel; + private String[] medcineColumns = {"Medicine Name", "Medicine Company", "Description"}; + private String[][] medicineData; + private final ResponseListener getMedInfoResponseListener = this::getMedInfoHandler; + + void getMedInfoHandler(GetMedInfoResponse response) { + log.info("Received medicine data"); + medicineData = response.getMedInfo(); + tableModel.setDataVector(medicineData, medcineColumns); + } + + void sendGetMedInfoRequest() { + log.info("Sending GetMedInfoRequest"); + NetworkUtil.sendPacket(ClientHandler.ctx.channel(), new GetMedInfoRequest()); + } + + public MedicineDialog(Frame parent) { + super(parent, "Enter Medicine Details", true); + + // Set the size of the dialog + setSize(800, 300); + + ClientHandler.addResponseListener(GetMedInfoResponse.class, getMedInfoResponseListener); + sendGetMedInfoRequest(); + + setLayout(new BorderLayout()); + + + JPanel inputPanel = new JPanel(); + inputPanel.setLayout(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + + gbc.insets = new Insets(5, 5, 5, 5); // Padding between components + gbc.fill = GridBagConstraints.HORIZONTAL; // Stretch horizontally only + gbc.gridx = 0; + gbc.gridy = 0; + + inputPanel.add(new JLabel("Medicine Name:"), gbc); + gbc.gridx = 1; + medicineNameField = new JTextField(15); + inputPanel.add(medicineNameField, gbc); + + // Listen for changes in the text event + tableModel = new DefaultTableModel(medicineData, medcineColumns); + JTable medicineTable = new JTable(tableModel); + TableRowSorter rowSorter = new TableRowSorter<>(tableModel); + medicineTable.setRowSorter(rowSorter); + medicineTable.setPreferredSize(new Dimension(400, 100)); + JScrollPane scrollPane = new JScrollPane(medicineTable); + + medicineNameField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + filterRows(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + filterRows(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + filterRows(); + } + + private void filterRows() { + String searchText = medicineNameField.getText().trim(); + if (searchText.isEmpty()) { + rowSorter.setRowFilter(null); + } else { + rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + searchText, 0)); + } + } + }); + + gbc.gridx = 0; + gbc.gridy++; + inputPanel.add(new JLabel("Dosage:"), gbc); + gbc.gridx = 1; + dosageField = new JTextField(15); + inputPanel.add(dosageField, gbc); + + gbc.gridx = 0; + gbc.gridy++; + inputPanel.add(new JLabel("Frequency:"), gbc); + gbc.gridx = 1; + frequencyField = new JTextField(15); + inputPanel.add(frequencyField, gbc); + + gbc.gridx = 0; + gbc.gridy++; + inputPanel.add(new JLabel("Quantity:"), gbc); + gbc.gridx = 1; + quantityField = new JTextField(15); + inputPanel.add(quantityField, gbc); + + gbc.gridx = 0; + gbc.gridy++; + inputPanel.add(new JLabel("Price:"), gbc); + gbc.gridx = 1; + priceField = new JTextField(15); + inputPanel.add(priceField, gbc); + + + scrollPane.setPreferredSize(new Dimension(400, 200)); // 200px height + + // Set the split pane + JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, inputPanel, scrollPane); + splitPane.setResizeWeight(0.45); // Allocate more space to the inputPanel + // Wrap the splitPane in a JPanel to control height + JPanel topPanel = new JPanel(new BorderLayout()); + topPanel.add(splitPane, BorderLayout.CENTER); + topPanel.setPreferredSize(new Dimension(600, 250)); + + + // Create a table to display selected medicines + String[] columnNames = {"Medicine Name", "Dosage", "Frequency", "Quantity", "Price"}; + DefaultTableModel selectedTableModel = new DefaultTableModel(columnNames, 0); + JTable selectedTable = new JTable(selectedTableModel); + JScrollPane tableScrollPane = new JScrollPane(selectedTable); + + // Create a panel for add and remove buttons + JPanel buttonPanel = new JPanel(); + JButton addButton = new JButton("Add"); + JButton removeButton = new JButton("Remove"); + buttonPanel.add(addButton); + buttonPanel.add(removeButton); + + addButton.addActionListener(e -> { + int selectedRow = medicineTable.getSelectedRow(); + if (selectedRow != -1) { + int modelRow = medicineTable.convertRowIndexToModel(selectedRow); + Object[] rowData = new Object[tableModel.getColumnCount()]; + for (int i = 0; i < tableModel.getColumnCount(); i++) { + rowData[i] = tableModel.getValueAt(modelRow, i); + } + selectedTableModel.addRow(rowData); + } + }); + + removeButton.addActionListener(e -> { + int selectedRow = selectedTable.getSelectedRow(); + if (selectedRow != -1) { + selectedTableModel.removeRow(selectedRow); + } + }); + + // Add components to the dialog + add(topPanel, BorderLayout.NORTH); + add(tableScrollPane, BorderLayout.CENTER); + add(buttonPanel, BorderLayout.SOUTH); + + // Set dialog properties + pack(); + setLocationRelativeTo(parent); + } + + public static void main(String[] args) { + JFrame frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(400, 300); + frame.setVisible(true); + + JButton openDialogButton = new JButton("Open Medicine Dialog"); + openDialogButton.addActionListener(e -> { + MedicineDialog dialog = new MedicineDialog(frame); + dialog.setVisible(true); + }); + + frame.add(openDialogButton, BorderLayout.CENTER); + } +} diff --git a/src/main/java/BsK/common/packet/req/GetMedInfoRequest.java b/src/main/java/BsK/common/packet/req/GetMedInfoRequest.java new file mode 100644 index 0000000..694d656 --- /dev/null +++ b/src/main/java/BsK/common/packet/req/GetMedInfoRequest.java @@ -0,0 +1,12 @@ +package BsK.common.packet.req; + +import BsK.common.packet.Packet; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@AllArgsConstructor +@Data +public class GetMedInfoRequest implements Packet { +} diff --git a/src/main/java/BsK/common/packet/res/GetMedInfoResponse.java b/src/main/java/BsK/common/packet/res/GetMedInfoResponse.java new file mode 100644 index 0000000..c879912 --- /dev/null +++ b/src/main/java/BsK/common/packet/res/GetMedInfoResponse.java @@ -0,0 +1,13 @@ +package BsK.common.packet.res; + +import BsK.common.packet.Packet; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Data +@AllArgsConstructor +public class GetMedInfoResponse implements Packet { + private String[][] medInfo; +} diff --git a/src/main/java/BsK/server/network/handler/ServerHandler.java b/src/main/java/BsK/server/network/handler/ServerHandler.java index 101eddb..426d9cd 100644 --- a/src/main/java/BsK/server/network/handler/ServerHandler.java +++ b/src/main/java/BsK/server/network/handler/ServerHandler.java @@ -105,7 +105,7 @@ public class ServerHandler extends SimpleChannelInboundHandler resultList = new ArrayList<>(); + while (rs.next()) { + String medName = rs.getString("med_name"); + String medCompany = rs.getString("med_company"); + String medDescription = rs.getString("med_description"); + + String result = String.join("|", medName, medCompany, medDescription); + resultList.add(result); + // log.info(result); + } + + String[] resultString = resultList.toArray(new String[0]); + String[][] resultArray = new String[resultString.length][]; + for (int i = 0; i < resultString.length; i++) { + resultArray[i] = resultString[i].split("\\|"); + } + + UserUtil.sendPacket(user.getSessionId(), new GetMedInfoResponse(resultArray)); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + } } } diff --git a/src/main/resources/database/BSK.db b/src/main/resources/database/BSK.db index 5e49b24..b09a20d 100644 Binary files a/src/main/resources/database/BSK.db and b/src/main/resources/database/BSK.db differ