package nl.infosys.hartigehap.serving.presentation; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UIManager.LookAndFeelInfo; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import nl.infosys.hartigehap.serving.busines.logic.OrderManager; import nl.infosys.hartigehap.serving.busines.logic.OrderRuleManager; import nl.infosys.hartigehap.serving.busines.logic.UserManager; import nl.infosys.hartigehap.util.DateTime; import nl.infosys.hartigehap.util.OSValidator; import nl.infosys.hartigehap.util.Status; /** * The OrderOverviewGUI class * @author infosys * @version 1.46 * @since 12/12/16 */ public class OrderOverviewGUI extends JFrame { private static final long serialVersionUID = -3821975089273688475L; private JTable orderTable; private JTable detailTable; private Dimension screenSize; private DefaultTableModel model; private DefaultTableModel detailModel; private ArrayList orderTableColomnNames; private ArrayList orderTableRows; private ArrayList orderDetailRows; private Timer timertje; private JScrollPane scrollPane; private JScrollPane scrollPane2; private JPanel topPanel; private JPanel rightPanel; private JPanel bottomPanel; private JPanel leftPanel; private JButton btnOpenOrder; private JButton btnClose; private JButton btnStateBezorgd; private JButton btnStateBetaald; private JButton btnPrintBill; private JButton btnGereed; private Color background; private OrderManager manager; private OrderRuleManager orderRuleManager; private UserManager usrManager; private JLabel lblStatus; private JComboBox cbStatus; private DateTime orderDateTime; private DateTime orderDateTimeOpen; private Status status; private int tableNumber; private int tableNumberOpen; private int topPanelHeight; private int bottomPanelHeight; private int scrollPaneHeight; private int scrollPaneWidth; private int leftPanelWidth; private int rightPanelWidth; private int rightPanelHeight; private int btnOpenOrderWidth; private int btnOpenOrderHeight; private int btnOpenOrderY; private int btnOpenOrderX; private int btnCloseWidth; private int btnCloseHeight; private int btnPrintBillWidth; private int btnPrintBillHeight; private int btnPrintBillY; private int btnPrintBillX; private int btnCloseY; private int btnCloseX; private int selectedRow = 0; private boolean haveLastRow = false; /** * The default constructor */ public OrderOverviewGUI(String gebruiker) { usrManager = new UserManager(); if(gebruiker != null) { if(usrManager.userIsValid(gebruiker)) { init(); timerInit(); } else { JOptionPane.showMessageDialog(null, "Het inloggen is mislukt, probeer het opnieuw."); System.exit(0); } } } /** * initializes the whole thing */ private void init() { screenSize = Toolkit.getDefaultToolkit().getScreenSize(); calculateSizes(); background = new Color(61, 61, 61); manager = new OrderManager(); initTable(); initDetailTable(); initFrame(); initRight(); orderTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); orderTable.getTableHeader().setReorderingAllowed(false); detailTable.getTableHeader().setReorderingAllowed(false); scrollPane.setBorder(BorderFactory.createLineBorder(Color.white)); this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); pack(); setVisible(true); } /** * calculates all the sizes needed for the GUI */ private void calculateSizes() { if (OSValidator.validator.isMac()) { screenSize = new Dimension(screenSize.width, screenSize.height - 30); } else if (OSValidator.validator.isWindows()) { // Better look and feel fersure.. try { for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (Exception ex) { ex.printStackTrace(); } } topPanelHeight = 35; leftPanelWidth = 15; bottomPanelHeight = 15; rightPanelWidth = (screenSize.width / 100) * 14; rightPanelHeight = screenSize.height - topPanelHeight - bottomPanelHeight; scrollPaneHeight = (screenSize.height / 2) - topPanelHeight - bottomPanelHeight; scrollPaneWidth = screenSize.width - rightPanelWidth - leftPanelWidth; btnOpenOrderWidth = rightPanelWidth; btnOpenOrderHeight = 40; btnOpenOrderY = 0; btnOpenOrderX = (rightPanelWidth / 2) - (btnOpenOrderWidth / 2); btnCloseWidth = rightPanelWidth; btnCloseHeight = 40; btnCloseY = rightPanelHeight - btnCloseHeight; btnCloseX = (rightPanelWidth / 2) - (btnCloseWidth / 2); btnPrintBillWidth = rightPanelWidth; btnPrintBillHeight = 40; btnPrintBillY = btnOpenOrderY + btnOpenOrderHeight + ( btnOpenOrderHeight / 2 ) + 250; btnPrintBillX = ( rightPanelWidth / 2 ) - ( btnPrintBillWidth / 2 ); } /** * initializes the frame */ private void initFrame() { setTitle("Overzicht Bestellingen"); setBackground(background); setPreferredSize(screenSize); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setLayout(new BorderLayout()); setUndecorated(true); topPanel = new JPanel(); topPanel.setLayout(new BorderLayout()); topPanel.setBackground(background); topPanel.setPreferredSize(new Dimension(screenSize.width, topPanelHeight)); JLabel lblTitle = new JLabel(); lblTitle.setText("De Hartige Hap"); lblTitle.setForeground(Color.white); lblTitle.setFont(new java.awt.Font("Brush Script MT", 0, 30)); topPanel.add(lblTitle, BorderLayout.WEST); leftPanel = new JPanel(); leftPanel.setBackground(background); leftPanel.setPreferredSize(new Dimension(leftPanelWidth, screenSize.height)); bottomPanel = new JPanel(); bottomPanel.setLayout(new BorderLayout()); bottomPanel.setBackground(background); bottomPanel.setPreferredSize(new Dimension(screenSize.width, bottomPanelHeight)); JLabel lblVersion = new JLabel(); lblVersion.setText("V 1.0.62"); lblVersion.setForeground(Color.white); lblVersion.setFont(new Font("BrushScript Std", Font.ITALIC, 10)); bottomPanel.add(lblVersion, BorderLayout.EAST); scrollPane = new JScrollPane(orderTable); scrollPane.setBackground(background); scrollPane.setPreferredSize(new Dimension(scrollPaneWidth, scrollPaneHeight)); scrollPane2 = new JScrollPane(detailTable); scrollPane2.setBackground(background); scrollPane2.setPreferredSize(new Dimension(scrollPaneWidth + 4, scrollPaneHeight)); JPanel splitPanel = new JPanel(); JPanel splitTopPanel = new JPanel(); splitTopPanel.setLayout(new BorderLayout()); splitTopPanel.add(scrollPane, BorderLayout.CENTER); JPanel splitBottomPanel = new JPanel(); splitBottomPanel.setLayout(new BorderLayout()); splitBottomPanel.add(scrollPane2, BorderLayout.CENTER); splitPanel.add(splitTopPanel); splitPanel.add(splitBottomPanel); getContentPane().add(topPanel, BorderLayout.NORTH); getContentPane().add(leftPanel, BorderLayout.WEST); getContentPane().add(bottomPanel, BorderLayout.SOUTH); getContentPane().add(splitPanel, BorderLayout.CENTER); } /** * initializes the table */ private void initTable() { model = new DefaultTableModel(); orderTableColomnNames = new ArrayList(); orderTableRows = new ArrayList(); orderTableColomnNames.add("Tafelnummer"); orderTableColomnNames.add("Datum"); orderTableColomnNames.add("Status"); orderTableColomnNames.add("Totaal Bedrag"); orderTable = new JTable(model) { private static final long serialVersionUID = -2331811544020891226L; @Override public boolean isCellEditable(int rowIndex, int colIndex) { return false; } }; orderTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent lse) { btnStateBezorgd.setEnabled(false); btnStateBetaald.setEnabled(false); btnOpenOrder.setEnabled(true); if (orderTable.getSelectedRow() >= 0 && Integer.parseInt( orderTable.getValueAt( orderTable.getSelectedRow(), 0 ).toString() ) > 0 ) { tableNumber = Integer.parseInt((String) orderTable.getValueAt(orderTable.getSelectedRow(), 0)); orderDateTime = new DateTime("Y-m-d H:i:s", orderTable.getValueAt(orderTable.getSelectedRow(), 1).toString()); } if(tableNumberOpen != 0) { if(tableNumber != tableNumberOpen || (!orderDateTimeOpen.getString("Y-m-d H:i:s").equals(orderDateTime.getString("Y-m-d H:i:s")))) { orderDetailRows.clear(); detailModel.setRowCount(0); changeStatus(); } } } }); for (String colomnName : orderTableColomnNames) { model.addColumn(colomnName); } fillTable(); } /** * initializes the detail table */ private void initDetailTable() { detailModel = new DefaultTableModel(); orderTableColomnNames = new ArrayList(); orderTableRows = new ArrayList(); orderDetailRows = new ArrayList(); orderTableColomnNames.add("Aantal"); orderTableColomnNames.add("Omschrijving"); orderTableColomnNames.add("Naam"); orderTableColomnNames.add("Prijs"); orderTableColomnNames.add("Soort"); detailTable = new JTable(detailModel) { private static final long serialVersionUID = -2331811544020891226L; @Override public boolean isCellEditable(int rowIndex, int colIndex) { return false; } }; detailTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent lse) { btnOpenOrder.setEnabled(true); if (detailTable.getSelectedRow() > 0) { tableNumber = Integer.parseInt((String) detailTable.getValueAt(detailTable.getSelectedRow(), 0)); orderDateTime = new DateTime("Y-m-d H:i:s", orderTable.getValueAt(orderTable.getSelectedRow(), 1).toString()); } } }); for (String colomnName : orderTableColomnNames) { detailModel.addColumn(colomnName); } } /** * change the status of an order */ public void changeStatus() { if(detailTable.getRowCount() > 0) { if(tableNumber == tableNumberOpen && orderDateTimeOpen.getString("Y-m-d H:i:s").equals(orderDateTime.getString("Y-m-d H:i:s"))) { if( Status.valueOf( orderTable.getValueAt(orderTable.getSelectedRow(), 2).toString() ).equals( Status.GEPLAATST ) ) { btnGereed.setEnabled( true ); btnStateBezorgd.setEnabled(false); btnStateBetaald.setEnabled(false); btnPrintBill.setEnabled(false); } else if( Status.valueOf( orderTable.getValueAt(orderTable.getSelectedRow(), 2).toString() ).equals( Status.GEREED ) ) { btnGereed.setEnabled( false ); btnStateBezorgd.setEnabled( true ); btnStateBetaald.setEnabled(false); btnPrintBill.setEnabled(false); } else if( Status.valueOf( orderTable.getValueAt(orderTable.getSelectedRow(), 2).toString() ).equals( Status.WACHT_OP_AFREKENEN ) ) { btnGereed.setEnabled( false ); btnStateBezorgd.setEnabled(false); btnStateBetaald.setEnabled( true ); btnPrintBill.setEnabled(true); } else if( Status.valueOf( orderTable.getValueAt( orderTable.getSelectedRow(), 2 ).toString() ).equals( Status.BETAALD ) ) { btnGereed.setEnabled( false ); btnStateBezorgd.setEnabled( false ); btnStateBetaald.setEnabled(false); btnPrintBill.setEnabled( true ); } else { btnGereed.setEnabled( false ); btnStateBezorgd.setEnabled(false); btnStateBetaald.setEnabled(false); btnPrintBill.setEnabled(false); } } else { btnGereed.setEnabled( false ); btnStateBezorgd.setEnabled(false); btnStateBetaald.setEnabled(false); btnPrintBill.setEnabled(false); } } else { btnGereed.setEnabled( false ); btnStateBezorgd.setEnabled(false); btnStateBetaald.setEnabled(false); btnPrintBill.setEnabled(false); } } /** * fills the detail table with orderrules */ private void detailsOrders() { orderDetailRows.clear(); detailModel.setRowCount(0); orderRuleManager = new OrderRuleManager(); orderDateTimeOpen = orderDateTime; tableNumberOpen = tableNumber; for (String[] orderRule : orderRuleManager.getOrderRules(orderDateTime, tableNumber)) { orderDetailRows.add(orderRule); } for (String[] row : orderDetailRows) { detailModel.addRow(row); } } /** * initializes the right side for the buttons */ private void initRight() { rightPanel = new JPanel(); rightPanel.setLayout(null); rightPanel.setBackground(background); rightPanel.setPreferredSize(new Dimension(rightPanelWidth, rightPanelHeight)); btnOpenOrder = new JButton(); btnOpenOrder.setText("Bestelling openen"); btnOpenOrder.setEnabled(false); btnOpenOrder.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { if (tableNumber > 0) { detailsOrders(); changeStatus(); } } }); btnOpenOrder.setBounds(btnOpenOrderX, btnOpenOrderY, btnOpenOrderWidth, btnOpenOrderHeight); lblStatus = new JLabel(); lblStatus.setText("Status Filter"); lblStatus.setForeground(Color.WHITE); lblStatus.setBounds(btnOpenOrderX, (btnOpenOrderY + btnOpenOrderHeight) + 20, btnOpenOrderWidth, 20); cbStatus = new JComboBox(); cbStatus.setBounds(btnOpenOrderX, (btnOpenOrderY + btnOpenOrderHeight) + 50, btnOpenOrderWidth, 40); cbStatus.addItem(Status.ALLES); cbStatus.addItem(Status.GEPLAATST); cbStatus.addItem(Status.GEREED); cbStatus.addItem(Status.BEZORGD); cbStatus.addItem(Status.WACHT_OP_AFREKENEN); cbStatus.addItem(Status.BETAALD); cbStatus.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { clearTable(); fillTable(); } }); btnClose = new JButton(); btnClose.setText("Afsluiten"); btnClose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { usrManager.logUserOff(); System.exit(0); } }); btnClose.setBounds(btnCloseX, btnCloseY, btnCloseWidth, btnCloseHeight); btnStateBezorgd = new JButton(); btnStateBezorgd.setText("Bezorgd Melden"); btnStateBezorgd.setEnabled(false); btnStateBezorgd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { if (tableNumber > 0) { manager.updateStatus( tableNumber, orderDateTime, Status.BEZORGD ); btnStateBezorgd.setEnabled(false); btnStateBetaald.setEnabled(false); btnGereed.setEnabled( false ); updateTableStatus(); changeStatus(); } } }); btnStateBezorgd.setBounds(btnOpenOrderX, (btnOpenOrderY + btnOpenOrderHeight) + 150, btnOpenOrderWidth, 40); btnStateBetaald = new JButton(); btnStateBetaald.setText("Betaald Melden"); btnStateBetaald.setEnabled(false); btnStateBetaald.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { if (tableNumber > 0) { manager.updateStatus( tableNumber, orderDateTime, Status.BETAALD ); btnStateBezorgd.setEnabled(false); btnStateBetaald.setEnabled(false); btnGereed.setEnabled( false ); updateTableStatus(); changeStatus(); } } }); btnStateBetaald.setBounds(btnOpenOrderX, (btnOpenOrderY + btnOpenOrderHeight) + 200, btnOpenOrderWidth, 40); btnPrintBill = new JButton(); btnPrintBill.setText( "Print Bon" ); btnPrintBill.setBounds( btnPrintBillX, ( btnPrintBillY + btnPrintBillHeight ), btnPrintBillWidth, btnPrintBillHeight ); btnPrintBill.setEnabled( false ); btnPrintBill.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent ae ) { String result = manager.printBill( tableNumber ); if(!result.equals("")) { JOptionPane.showMessageDialog(null, "De bon is opgeslagen in de volgende directory: " + result); Object[] options = {"Ja","Nee"}; int n = JOptionPane.showOptionDialog(null, "Wil je de bon nu openen en uitprinten?", "Bon printen", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, //do not use a custom Icon options, //the titles of buttons options[0]); //default button title if(n == 0) { try { Runtime.getRuntime().exec("notepad " + result); } catch (IOException e) { e.printStackTrace(); } } } else { JOptionPane.showMessageDialog(null, "De bon is niet goed opgeslagen. \nProbeer het opnieuw."); } } }); btnGereed = new JButton(); btnGereed.setText( "Gereed Melden" ); btnGereed.setBounds( btnPrintBillX, ( btnPrintBillY + btnPrintBillHeight ) - 210, btnPrintBillWidth, btnPrintBillHeight ); btnGereed.setEnabled( false ); btnGereed.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent ae ) { if (tableNumber > 0) { manager.updateStatus( tableNumber, orderDateTime, Status.GEACCEPTEERD ); manager.updateStatus( tableNumber, orderDateTime, Status.GEREED ); btnStateBezorgd.setEnabled(false); btnStateBetaald.setEnabled(false); btnGereed.setEnabled( false ); updateTableStatus(); changeStatus(); } } } ); rightPanel.add(btnOpenOrder); rightPanel.add(lblStatus); rightPanel.add(cbStatus); rightPanel.add(btnStateBezorgd); rightPanel.add(btnStateBetaald); rightPanel.add(btnClose); rightPanel.add( btnPrintBill ); rightPanel.add( btnGereed ); getContentPane().add(rightPanel, BorderLayout.EAST); } /** * clears the table */ private void clearTable() { for (int i = model.getRowCount() - 1; i > -1; i--) { model.removeRow(i); } orderTableRows.clear(); } /** * fills the table */ private void fillTable() { haveLastRow = false; selectedRow = 0; status = Status.ALLES; if(cbStatus != null) { status = Status.valueOf( cbStatus.getSelectedItem().toString() ); } for (String[] order : manager.getOrders(status)) { orderTableRows.add(order); } for (String[] row : orderTableRows) { if (!haveLastRow) { if (orderDateTime != null) { DateTime thisDateTime = new DateTime("Y-m-d H:i:s", row[1]); if (thisDateTime.toString().contains(orderDateTime.toString()) && row[0].toString().contains(Integer.toString(tableNumber))) { haveLastRow = true; selectedRow--; } } selectedRow++; } model.addRow(row); } } /** * updates the status int he table */ public void updateTableStatus() { clearTable(); fillTable(); if (haveLastRow) { orderTable.setRowSelectionInterval(selectedRow, selectedRow); } } /** * initializes the timer */ private void timerInit() { ActionListener taskPerformer = new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { clearTable(); fillTable(); if (haveLastRow) { orderTable.setRowSelectionInterval(selectedRow, selectedRow); changeStatus(); } } }; timertje = new Timer(10000, taskPerformer); timertje.start(); } public JTable getOrderTable() { return orderTable; } public JTable getDetailTable() { return detailTable; } public JButton getBtnStateBezorgd() { return btnStateBezorgd; } public JButton getBtnStateBetaald() { return btnStateBetaald; } public JButton getBtnPrintBill() { return btnPrintBill; } public UserManager getUsrManager() { return usrManager; } public DateTime getOrderDateTime() { return orderDateTime; } public DateTime getOrderDateTimeOpen() { return orderDateTimeOpen; } public Status getStatus() { return status; } public int getTableNumber() { return tableNumber; } public int getTableNumberOpen() { return tableNumberOpen; } public DefaultTableModel getModel() { return model; } public void setModel(DefaultTableModel model) { this.model = model; } public DefaultTableModel getDetailModel() { return detailModel; } public void setDetailModel(DefaultTableModel detailModel) { this.detailModel = detailModel; } public void setOrderTable(JTable orderTable) { this.orderTable = orderTable; } public void setDetailTable(JTable detailTable) { this.detailTable = detailTable; } public void setBtnStateBezorgd(JButton btnStateBezorgd) { this.btnStateBezorgd = btnStateBezorgd; } public void setBtnStateBetaald(JButton btnStateBetaald) { this.btnStateBetaald = btnStateBetaald; } public void setBtnPrintBill(JButton btnPrintBill) { this.btnPrintBill = btnPrintBill; } public void setOrderDateTime(DateTime orderDateTime) { this.orderDateTime = orderDateTime; } public void setOrderDateTimeOpen(DateTime orderDateTimeOpen) { this.orderDateTimeOpen = orderDateTimeOpen; } public void setStatus(Status status) { this.status = status; } public void setTableNumber(int tableNumber) { this.tableNumber = tableNumber; } public void setTableNumberOpen(int tableNumberOpen) { this.tableNumberOpen = tableNumberOpen; } }