diff --git a/medical_invoice.pdf b/medical_invoice.pdf index 29a5c56..74b8008 100644 Binary files a/medical_invoice.pdf and b/medical_invoice.pdf differ diff --git a/src/main/java/BsK/client/ui/assets/font/SVN-Arial Bold.ttf b/src/main/java/BsK/client/ui/assets/font/SVN-Arial Bold.ttf new file mode 100644 index 0000000..b8a5542 Binary files /dev/null and b/src/main/java/BsK/client/ui/assets/font/SVN-Arial Bold.ttf differ diff --git a/src/main/java/BsK/client/ui/assets/font/SVN-Arial Regular.ttf b/src/main/java/BsK/client/ui/assets/font/SVN-Arial Regular.ttf new file mode 100644 index 0000000..c2fb14a Binary files /dev/null and b/src/main/java/BsK/client/ui/assets/font/SVN-Arial Regular.ttf differ 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 57ee088..0cf2cac 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/CheckUpPage.java @@ -130,6 +130,8 @@ public class CheckUpPage extends JPanel { sidebar.add(label); } + + // Make the sidebar scrollable JScrollPane sidebarScrollPane = new JScrollPane(sidebar); sidebarScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/MedicalInvoiceWithGUI.java b/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/MedicalInvoiceWithGUI.java index 582abde..7e6cdb0 100644 --- a/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/MedicalInvoiceWithGUI.java +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/PrintDialog/MedicalInvoiceWithGUI.java @@ -2,9 +2,12 @@ package BsK.client.ui.component.CheckUpPage.PrintDialog; import com.itextpdf.io.image.ImageData; import com.itextpdf.io.image.ImageDataFactory; +import com.itextpdf.kernel.font.PdfFont; +import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; +import com.itextpdf.layout.borders.Border; import com.itextpdf.layout.element.*; import com.itextpdf.layout.element.Image; import com.itextpdf.layout.property.UnitValue; @@ -108,22 +111,64 @@ public class MedicalInvoiceWithGUI { PdfDocument pdfDoc = new PdfDocument(writer); Document document = new Document(pdfDoc); + + String boldFontPath = "src/main/java/BsK/client/ui/assets/font/SVN-Arial Bold.ttf"; // Update with your font path + PdfFont boldFont = PdfFontFactory.createFont(boldFontPath, "Identity-H", true); + + String fontPath = "src/main/java/BsK/client/ui/assets/font/SVN-Arial Regular.ttf"; // Update with your font path + PdfFont font = PdfFontFactory.createFont(fontPath, "Identity-H", true); + // Add logo String logoPath = "/Users/lethanhdat/Documents/GitHub/ldS_BsK/src/main/java/BsK/client/ui/assets/icon/add.png"; // Path to your logo ImageData imageData = ImageDataFactory.create(logoPath); - Image logo = new Image(imageData).scaleToFit(100, 100); + Image logo = new Image(imageData).scaleToFit(75, 75); logo.setFixedPosition(50, 750); document.add(logo); // Add clinic information - String clinicInfo = "Your Clinic Name\n123 Clinic Street\nCity, State, ZIP\nPhone: (123) 456-7890\nEmail: clinic@example.com"; - Paragraph clinicInfoParagraph = new Paragraph(clinicInfo).setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT); + String clinicInfo = "Phòng khám BSK\nĐức Hòa Long An\nPhone: (123) 456-7890\nNgày khám: 30 tháng 2 năm 2025\n\n"; + Paragraph clinicInfoParagraph = new Paragraph(clinicInfo) + .setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT) + .setFont(font); document.add(clinicInfoParagraph); - // Add patient and doctor names - String patientDoctorInfo = "Patient: John Doe\nDoctor: Dr. Jane Smith"; - Paragraph patientDoctorParagraph = new Paragraph(patientDoctorInfo); - document.add(patientDoctorParagraph); + // Add title + String title = "Toa thuốc\n\n"; + Paragraph titleParagraph = new Paragraph(title) + .setFontSize(24).setFont(boldFont) + .setTextAlignment(com.itextpdf.layout.property.TextAlignment.CENTER); + document.add(titleParagraph); + + // Create a table with 2 columns, each taking 50% of the width + Table patientDoctorTable = new Table(UnitValue.createPercentArray(new float[]{50, 50})) + .setWidth(UnitValue.createPercentValue(100)); + +// Add patient and doctor information in the first column (left-aligned) + Cell patientDoctorCell = new Cell() + .add(new Paragraph("Họ tên bệnh nhân: Lê Nguyễn A\nSố điện thoại: 0123456789\n" + + "Địa chỉ: 123 Patient Street")) + .setTextAlignment(com.itextpdf.layout.property.TextAlignment.LEFT) + .setBorder(Border.NO_BORDER) + .setFont(font); + patientDoctorTable.addCell(patientDoctorCell); + +// Add date and invoice information in the second column (right-aligned) + Cell moreInfoCell = new Cell() + .add(new Paragraph("Phái: Nam\nTuổi: 25\nNgày sinh: 01/01/2000\n" + + "Bác sĩ: Nguyễn Văn B")) + .setTextAlignment(com.itextpdf.layout.property.TextAlignment.LEFT) + .setBorder(Border.NO_BORDER) + .setFont(font); + patientDoctorTable.addCell(moreInfoCell); + +// Add the table to the document + document.add(patientDoctorTable); + + // Diagnosis and notes + String diagnosisNotes = "Chẩn đoán: Cảm cúm\nGhi chú: Nghỉ ngơi và uống nhiều nước"; + Paragraph diagnosisNotesParagraph = new Paragraph(diagnosisNotes).setFont(font); + document.add(diagnosisNotesParagraph); + // Add services and medicine table Table table = new Table(UnitValue.createPercentArray(new float[]{4, 2, 2})) @@ -139,13 +184,11 @@ public class MedicalInvoiceWithGUI { table.addCell("$10"); document.add(table); - // Add diagnosis and notes - String diagnosisNotes = "Diagnosis: Flu\nNotes: Rest and hydration recommended"; - Paragraph diagnosisNotesParagraph = new Paragraph(diagnosisNotes); - document.add(diagnosisNotesParagraph); // Add signature area - Paragraph signatureArea = new Paragraph("\n\n\nSignature: ________________________"); + Paragraph signatureArea = new Paragraph("\n\n\nChữ Ký: ________________________") + .setFont(font) + .setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT); document.add(signatureArea); document.close(); diff --git a/src/main/java/BsK/client/ui/component/CheckUpPage/SidebarAnimationDemo.java b/src/main/java/BsK/client/ui/component/CheckUpPage/SidebarAnimationDemo.java new file mode 100644 index 0000000..46d07e7 --- /dev/null +++ b/src/main/java/BsK/client/ui/component/CheckUpPage/SidebarAnimationDemo.java @@ -0,0 +1,122 @@ +package BsK.client.ui.component.CheckUpPage; + +import javax.swing.*; +import java.awt.*; + +public class SidebarAnimationDemo { + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> { + JFrame frame = new JFrame("Sidebar Animation"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(800, 500); + frame.setLayout(new BorderLayout()); + + // Sidebar with gradient + JPanel sidebar = new JPanel() { + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2d = (Graphics2D) g; + int width = getWidth(); + int height = getHeight(); + Color color1 = new Color(63, 81, 181); + Color color2 = new Color(33, 150, 243); + GradientPaint gp = new GradientPaint(0, 0, color1, 0, height, color2); + g2d.setPaint(gp); + g2d.fillRect(0, 0, width, height); + } + }; + sidebar.setLayout(new GridLayout(15, 1)); + sidebar.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + sidebar.setPreferredSize(new Dimension(0, 500)); // Initially hidden + + // Sidebar items + String[] sidebarItems = {"Thống kê", "Thăm khám", "Dữ liệu bệnh nhân", "Kho", "Người dùng", "Thông tin"}; + String[] destination = {"DashboardPage", "CheckUpPage", "PatientDataPage", "InventoryPage", "UserPage", "InfoPage"}; + for (int i = 0; i < sidebarItems.length; i++) { + String item = sidebarItems[i]; + String dest = destination[i]; + JLabel label = new JLabel(item); + label.setForeground(Color.WHITE); + label.setHorizontalAlignment(SwingConstants.CENTER); + label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + label.setFont(new Font("Arial", Font.BOLD, 14)); + + // Add hover and click effects + label.addMouseListener(new java.awt.event.MouseAdapter() { + @Override + public void mouseClicked(java.awt.event.MouseEvent e) { + System.out.println("Navigating to: " + dest); + // mainFrame.showPage(dest); // Example navigation call + } + + @Override + public void mouseEntered(java.awt.event.MouseEvent e) { + label.setForeground(new Color(200, 230, 255)); // Highlight on hover + } + + @Override + public void mouseExited(java.awt.event.MouseEvent e) { + label.setForeground(Color.WHITE); // Restore original color + } + }); + + sidebar.add(label); + } + + frame.add(sidebar, BorderLayout.WEST); + + // Main content with toggle button + JPanel mainContent = new JPanel(new BorderLayout()); + JLabel contentLabel = new JLabel("Main Content Area"); + contentLabel.setHorizontalAlignment(SwingConstants.CENTER); + mainContent.add(contentLabel, BorderLayout.CENTER); + + JButton toggleButton = new JButton("Toggle Sidebar"); + mainContent.add(toggleButton, BorderLayout.SOUTH); + + frame.add(mainContent, BorderLayout.CENTER); + + // Sidebar animation variables + boolean[] isSidebarOpen = {false}; // Track the sidebar state + + // Toggle button action + toggleButton.addActionListener(e -> { + new Timer(10, event -> { + int currentWidth = sidebar.getWidth(); + if (!isSidebarOpen[0]) { + if (currentWidth < 200) { // Expand to target width + sidebar.setPreferredSize(new Dimension(currentWidth + 10, 500)); + sidebar.revalidate(); + } else { + isSidebarOpen[0] = true; + ((Timer) event.getSource()).stop(); + } + } else { + if (currentWidth > 0) { // Retract to hidden + sidebar.setPreferredSize(new Dimension(currentWidth - 10, 500)); + sidebar.revalidate(); + } else { + isSidebarOpen[0] = false; + ((Timer) event.getSource()).stop(); + } + } + }).start(); + }); + + frame.setVisible(true); + + // Animate sidebar on startup + Timer timer = new Timer(10, event -> { + int currentWidth = sidebar.getWidth(); + if (currentWidth < 200) { // Target width + sidebar.setPreferredSize(new Dimension(currentWidth + 10, 500)); + sidebar.revalidate(); + } else { + ((Timer) event.getSource()).stop(); // Stop animation + } + }); + timer.start(); + }); + } +}