/*
* IceBox - inventory management software for restaurants
* Copyright (C) 2016 Delwink, LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3 only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package com.delwink.icebox.swing;
import com.delwink.icebox.Inventory;
import com.delwink.icebox.InventoryItem;
import com.delwink.icebox.Order;
import com.delwink.icebox.lang.Lang;
import com.delwink.icebox.table.OrderTableModel;
import com.github.lgooddatepicker.components.DatePicker;
import com.github.lgooddatepicker.optionalusertools.DateChangeListener;
import com.github.lgooddatepicker.zinternaltools.DateChangeEvent;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TreeSet;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import org.threeten.bp.LocalDate;
/**
* Dialog for editing orders.
* @author David McMackins II
*/
public class OrderEditor extends JDialog {
private final DatePicker ORDER_DATE_FIELD;
private final JButton ADD_BUTTON, CANCEL_BUTTON, SAVE_BUTTON;
private final JComboBox NEW_ITEM_MENU;
private final JTable BOM;
private final JTextField ORDER_NUMBER_FIELD;
private final Order ORDER;
private boolean orderNumberChanged = false;
public OrderEditor(Frame parent, Inventory inventory, Order order) {
super(parent, Lang.get("OrderEditor.title"));
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setModal(true);
ORDER = order;
ORDER_DATE_FIELD = new DatePicker();
ORDER_DATE_FIELD.setDate(LocalDate.ofEpochDay(ORDER.getOrderDate().getTime() / (3600 * 24 * 1000)));
ORDER_DATE_FIELD.addDateChangeListener(new DateChangeListener() {
@Override
public void dateChanged(DateChangeEvent dce) {
ORDER.setOrderDate(new Date(dce.getNewDate().toEpochDay()));
}
});
ORDER_NUMBER_FIELD = new JTextField(15);
ORDER_NUMBER_FIELD.setText(ORDER.getOrderNumber());
ORDER_NUMBER_FIELD.getDocument().addDocumentListener(new TextChangeListener() {
@Override
public void textChanged(DocumentEvent e) {
ORDER.setOrderNumber(ORDER_NUMBER_FIELD.getText());
orderNumberChanged = true;
}
});
BOM = new JTable(new OrderTableModel(ORDER));
JScrollPane bomPane = new JScrollPane(BOM);
final List itemIDs = new ArrayList<>();
NEW_ITEM_MENU = new JComboBox<>();
for (InventoryItem item : new TreeSet<>(inventory.getItems())) {
String name = item.getName();
for (int i = 0; i < NEW_ITEM_MENU.getItemCount(); ++i) {
if (NEW_ITEM_MENU.getItemAt(i).equals(name)) {
name += " (id=" + item.getID() + ")";
break;
}
}
NEW_ITEM_MENU.addItem(name);
itemIDs.add(item.getID());
}
ADD_BUTTON = new JButton("+");
ADD_BUTTON.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ORDER.setItem(itemIDs.get(NEW_ITEM_MENU.getSelectedIndex()), 0);
BOM.setModel(new OrderTableModel(ORDER));
}
});
final ActionListener doneEditingListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
};
CANCEL_BUTTON = new JButton(Lang.get("cancel"));
CANCEL_BUTTON.addActionListener(doneEditingListener);
SAVE_BUTTON = new JButton(Lang.get("save"));
SAVE_BUTTON.addActionListener(doneEditingListener);
JPanel orderHeader = new JPanel();
orderHeader.setLayout(new BoxLayout(orderHeader, BoxLayout.Y_AXIS));
JPanel orderNumberBox = new JPanel(new FlowLayout(FlowLayout.RIGHT));
orderNumberBox.add(new JLabel(Lang.get("Order.number")));
orderNumberBox.add(ORDER_NUMBER_FIELD);
JPanel orderDateBox = new JPanel(new FlowLayout(FlowLayout.RIGHT));
orderDateBox.add(new JLabel(Lang.get("Order.date")));
orderDateBox.add(ORDER_DATE_FIELD);
orderHeader.add(orderNumberBox);
orderHeader.add(orderDateBox);
JPanel buttonBox = new JPanel(new BorderLayout());
JPanel leftButtonBox = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel rightButtonBox = new JPanel(new FlowLayout(FlowLayout.RIGHT));
leftButtonBox.add(ADD_BUTTON);
leftButtonBox.add(NEW_ITEM_MENU);
buttonBox.add(leftButtonBox, BorderLayout.WEST);
rightButtonBox.add(CANCEL_BUTTON);
rightButtonBox.add(SAVE_BUTTON);
buttonBox.add(rightButtonBox, BorderLayout.EAST);
setLayout(new BorderLayout());
add(orderHeader, BorderLayout.NORTH);
add(bomPane, BorderLayout.CENTER);
add(buttonBox, BorderLayout.SOUTH);
pack();
centorOnParent();
}
public boolean isOrderNumberChanged() {
return orderNumberChanged;
}
/**
* Overrides the order number changed flag.
* @param b Whether to say the order number has changed.
*/
public void setOrderNumberChanged(boolean b) {
orderNumberChanged = b;
}
public Order getOrder() {
return ORDER;
}
public void addSaveListener(ActionListener al) {
SAVE_BUTTON.addActionListener(al);
}
}