import javax.swing.*; import java.awt.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class BorrowingFormPanel extends JPanel { private final LibraryController controller; private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public BorrowingFormPanel(LibraryController controller) { this.controller = controller; buildUI(); } private void buildUI() { setLayout(new BorderLayout()); JLabel header = new JLabel("Borrowing Management", SwingConstants.CENTER); header.setFont(new Font("Arial", Font.BOLD, 18)); add(header, BorderLayout.NORTH); JPanel form = new JPanel(new GridLayout(9, 2, 10, 10)); JTextField memberField = new JTextField(); JTextField isbnField = new JTextField(); JTextField dateField = new JTextField("2025-11-30"); JButton createBtn = new JButton("Create Borrowing"); JTextField searchMemberField = new JTextField(); JButton searchMemberBtn = new JButton("View Borrowings by Member"); JTextField searchBookField = new JTextField(); JButton searchBookBtn = new JButton("View Borrowings by Book"); form.add(new JLabel("Member ID:")); form.add(memberField); form.add(new JLabel("Book ISBN:")); form.add(isbnField); form.add(new JLabel("Borrow Date (YYYY-MM-DD):")); form.add(dateField); form.add(createBtn); form.add(new JLabel()); form.add(new JLabel("Search Member Borrowings:")); form.add(new JLabel()); form.add(searchMemberField); form.add(searchMemberBtn); form.add(new JLabel("Search Book Borrowings:")); form.add(new JLabel()); form.add(searchBookField); form.add(searchBookBtn); JPanel formWrapper = new JPanel(new FlowLayout(FlowLayout.LEFT)); formWrapper.add(form); add(formWrapper, BorderLayout.WEST); JTextArea output = new JTextArea(); output.setEditable(false); add(new JScrollPane(output), BorderLayout.CENTER); createBtn.addActionListener(e -> { String memberId = memberField.getText().trim(); String isbn = isbnField.getText().trim(); String dateStr = dateField.getText().trim(); if (memberId.isEmpty() || isbn.isEmpty() || dateStr.isEmpty()) { JOptionPane.showMessageDialog(this, "Please fill all fields."); return; } // ------ Check Member ------ Member m = controller.findMember(memberId); if (m == null) { JOptionPane.showMessageDialog(this, "Member not found: " + memberId); return; } // ------ Check Book ------ Book b = controller.findBook(isbn); if (b == null) { JOptionPane.showMessageDialog(this, "Book not found: " + isbn); return; } // ------ Parse Date ------ Date borrowDate; try { borrowDate = sdf.parse(dateStr); } catch (ParseException ex) { JOptionPane.showMessageDialog(this, "Invalid date format. Use YYYY-MM-DD."); return; } // ------ Create Borrowing ------ Borrowing bor = new Borrowing(m, b, borrowDate, null); controller.addBorrowing(bor); output.setText("Borrowing created:\n" + m.getId() + " -> " + b.getIsbn() + " on " + sdf.format(borrowDate)); }); searchMemberBtn.addActionListener(e -> { String id = searchMemberField.getText().trim(); var list = controller.getBorrowingsForMember(id); if (list.isEmpty()) { output.setText("No borrowings for member: " + id); return; } StringBuilder sb = new StringBuilder("Borrowings for member " + id + ":\n"); for (Borrowing b : list) { sb.append("• Book: ").append(b.getBook().getTitle()) .append(" (").append(b.getBorrowDate()).append(")\n"); } output.setText(sb.toString()); }); searchBookBtn.addActionListener(e -> { String isbn = searchBookField.getText().trim(); var list = controller.getBorrowingsForBook(isbn); if (list.isEmpty()) { output.setText("No borrowings for book: " + isbn); return; } StringBuilder sb = new StringBuilder("Borrowings for book " + isbn + ":\n"); for (Borrowing b : list) { sb.append("• Member: ").append(b.getMember().getName()) .append(" (").append(b.getBorrowDate()).append(")\n"); } output.setText(sb.toString()); }); } }