package com.floreantpos.ui.ticket; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import com.floreantpos.model.Ticket; import com.floreantpos.model.TicketItem; import com.floreantpos.model.TicketItemModifier; import com.floreantpos.model.TicketItemModifierGroup; public class TicketTableModel extends AbstractTableModel { private JTable table; protected Ticket ticket; protected final HashMap<String, Object> tableRows = new HashMap<String, Object>(); protected String[] columnNames = { "itemQuantity", "itemName", "itemSubtotalPrice" }; private boolean forReciptPrint; private boolean printCookingInstructions; public TicketTableModel() { } public TicketTableModel(Ticket ticket) { setTicket(ticket); } public int getItemCount() { return tableRows.size(); } public int getRowCount() { int size = tableRows.size(); if (forReciptPrint) { return size; } if (size < 30) { size = 30; } return size; } public int getActualRowCount() { return tableRows.size(); } public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int column) { return columnNames[column]; } public Object getValueAt(int rowIndex, int columnIndex) { Object value = tableRows.get(String.valueOf(rowIndex)); if (value instanceof TicketItem) { TicketItem ticketItem = (TicketItem) value; switch (columnIndex) { case 0: return Integer.valueOf(ticketItem.getItemCount()); case 1: return ticketItem.getName(); case 2: return Double.valueOf(ticketItem.getSubtotalAmountWithoutModifiers()); } } if (value instanceof TicketItemModifier) { TicketItemModifier modifier = (TicketItemModifier) value; switch (columnIndex) { case 0: if (modifier.getModifierType() == TicketItemModifier.NO_MODIFIER) { return null; } return Integer.valueOf(modifier.getItemCount()); case 1: String display = modifier.getName(); if (modifier.getModifierType() == TicketItemModifier.NO_MODIFIER) { display = " - No " + display; return display; } else if (modifier.getModifierType() == TicketItemModifier.EXTRA_MODIFIER) { display = " - Extra " + display; return display; } return " - " + display; case 2: if (modifier.getModifierType() == TicketItemModifier.NO_MODIFIER) { return null; } return modifier.getTotalAmount(); } } return null; } private void calculateRows() { tableRows.clear(); int rowNum = 0; if (ticket == null || ticket.getTicketItems() == null) return; List<TicketItem> ticketItems = ticket.getTicketItems(); for (TicketItem ticketItem : ticketItems) { ticketItem.setTableRowNum(rowNum); tableRows.put(String.valueOf(rowNum), ticketItem); rowNum++; List<TicketItemModifierGroup> ticketItemModifierGroups = ticketItem.getTicketItemModifierGroups(); if (ticketItemModifierGroups != null) { for (TicketItemModifierGroup ticketItemModifierGroup : ticketItemModifierGroups) { List<TicketItemModifier> ticketItemModifiers = ticketItemModifierGroup.getTicketItemModifiers(); if (ticketItemModifiers != null) { for (TicketItemModifier itemModifier : ticketItemModifiers) { itemModifier.setTableRowNum(rowNum); tableRows.put(String.valueOf(rowNum), itemModifier); rowNum++; } } } } } } public void addTicketItem(TicketItem ticketItem) { if (ticketItem.isHasModifiers()) { List<TicketItem> ticketItems = ticket.getTicketItems(); ticketItems.add(ticketItem); calculateRows(); fireTableDataChanged(); } else { List<TicketItem> ticketItems = ticket.getTicketItems(); boolean exists = false; for (TicketItem item : ticketItems) { if (item.getName().equals(ticketItem.getName())) { int itemCount = item.getItemCount(); item.setItemCount(++itemCount); exists = true; table.repaint(); return; } } if (!exists) { ticket.addToticketItems(ticketItem); calculateRows(); fireTableDataChanged(); } } } public void addAllTicketItem(TicketItem ticketItem) { if (ticketItem.isHasModifiers()) { List<TicketItem> ticketItems = ticket.getTicketItems(); ticketItems.add(ticketItem); calculateRows(); fireTableDataChanged(); } else { List<TicketItem> ticketItems = ticket.getTicketItems(); boolean exists = false; for (TicketItem item : ticketItems) { if (item.getName().equals(ticketItem.getName())) { int itemCount = item.getItemCount(); itemCount += ticketItem.getItemCount(); item.setItemCount(itemCount); exists = true; table.repaint(); return; } } if (!exists) { ticket.addToticketItems(ticketItem); calculateRows(); fireTableDataChanged(); } } } public boolean containsTicketItem(TicketItem ticketItem) { if (ticketItem.isHasModifiers()) return false; List<TicketItem> ticketItems = ticket.getTicketItems(); for (TicketItem item : ticketItems) { if (item.getName().equals(ticketItem.getName())) { return true; } } return false; } public void removeModifier(TicketItem parent, TicketItemModifier modifierToDelete) { TicketItemModifierGroup ticketItemModifierGroup = modifierToDelete.getParent(); List<TicketItemModifier> ticketItemModifiers = ticketItemModifierGroup.getTicketItemModifiers(); for (Iterator iter = ticketItemModifiers.iterator(); iter.hasNext();) { TicketItemModifier modifier = (TicketItemModifier) iter.next(); if (modifier.getItemId() == modifierToDelete.getItemId()) { iter.remove(); if(modifier.isPrintedToKitchen()) { ticket.addDeletedItems(modifier); } calculateRows(); fireTableDataChanged(); return; } } } public Object delete(int index) { if (index < 0 || index >= tableRows.size()) return null; Object object = tableRows.get(String.valueOf(index)); if (object instanceof TicketItem) { TicketItem ticketItem = (TicketItem) object; int rowNum = ticketItem.getTableRowNum(); List<TicketItem> ticketItems = ticket.getTicketItems(); for (Iterator iter = ticketItems.iterator(); iter.hasNext();) { TicketItem item = (TicketItem) iter.next(); if (item.getTableRowNum() == rowNum) { iter.remove(); if(item.isPrintedToKitchen()) { ticket.addDeletedItems(item); } break; } } } else if (object instanceof TicketItemModifier) { TicketItemModifier itemModifier = (TicketItemModifier) object; TicketItemModifierGroup ticketItemModifierGroup = itemModifier.getParent(); List<TicketItemModifier> ticketItemModifiers = ticketItemModifierGroup.getTicketItemModifiers(); if (ticketItemModifiers != null) { for (Iterator iterator = ticketItemModifiers.iterator(); iterator.hasNext();) { TicketItemModifier element = (TicketItemModifier) iterator.next(); if (itemModifier.getTableRowNum() == element.getTableRowNum()) { iterator.remove(); if(element.isPrintedToKitchen()) { ticket.addDeletedItems(element); } } } } } calculateRows(); fireTableDataChanged(); return object; } public Object get(int index) { if (index < 0 || index >= tableRows.size()) return null; return tableRows.get(String.valueOf(index)); } public int indexOf(Object o) { Collection collection = tableRows.values(); int i = 0; for (Iterator iter = collection.iterator(); iter.hasNext();) { if (iter.next() == o) { //return i; } ++i; } return 0; } public JTable getTable() { return table; } public void setTable(JTable table) { this.table = table; } public Ticket getTicket() { return ticket; } public void setTicket(Ticket ticket) { this.ticket = ticket; calculateRows(); } public void update() { calculateRows(); fireTableDataChanged(); } public boolean isForReciptPrint() { return forReciptPrint; } public void setForReciptPrint(boolean forReciptPrint) { this.forReciptPrint = forReciptPrint; } public boolean isPrintCookingInstructions() { return printCookingInstructions; } public void setPrintCookingInstructions(boolean printCookingInstructions) { this.printCookingInstructions = printCookingInstructions; } }