/*
* 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.DataDir;
import com.delwink.icebox.Inventory;
import com.delwink.icebox.Order;
import com.delwink.icebox.lang.Lang;
import com.delwink.icebox.table.OrderListTableModel;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
/**
* Dialog for selecting an order to edit.
* @author David McMackins II
*/
public class OrderListDialog extends JDialog {
private final JButton ADD_BUTTON;
private final JTable LIST_TABLE;
private final Inventory INVENTORY;
/**
* Creates a new list dialog.
* @param parent The parent frame of this dialog.
* @param inventory The inventory whose orders will be listed.
*/
public OrderListDialog(final Frame parent, Inventory inventory) {
super(parent, Lang.get("OrderList.title"));
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setModal(true);
INVENTORY = inventory;
LIST_TABLE = new JTable(new OrderListTableModel(INVENTORY));
JScrollPane tablePane = new JScrollPane(LIST_TABLE);
final WindowListener doneEditingListener = new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
OrderListDialog.this.setVisible(true);
}
};
final ActionListener orderSavedListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
// I'm sorry
OrderEditor editor = (OrderEditor) button.getParent().getParent().getParent().getParent().getParent().getParent();
Order order = editor.getOrder();
if (editor.isOrderNumberChanged()) {
List orders = INVENTORY.getOrders();
String orig = order.getOrderNumber();
int suffix = 1;
for (int i = 0; i < orders.size(); ++i) {
Order o = orders.get(i);
if (o.getOrderNumber().equals(order.getOrderNumber()) && o != order) {
order.setOrderNumber(String.format("%s (%d)", orig, suffix++));
i = -1; // will be 0 on next loop to restart it
}
}
}
LIST_TABLE.setModel(new OrderListTableModel(INVENTORY));
try (OutputStream os = new FileOutputStream(DataDir.INVENTORY_FILE)) {
INVENTORY.saveXml(os);
} catch (IOException ex) {
Logger.getLogger(OrderListDialog.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
LIST_TABLE.addMouseListener(new DoubleClickListener() {
@Override
public void mouseDoubleClicked(MouseEvent e) {
int row = LIST_TABLE.getSelectedRow();
String orderNumber = (String) LIST_TABLE.getModel().getValueAt(row, 0);
Order order = null;
for (Order o : INVENTORY.getOrders()) {
if (o.getOrderNumber().equals(orderNumber)) {
order = o;
break;
}
}
if (order == null)
throw new IllegalStateException("Order with number \"" + orderNumber + "\" does not exist!");
OrderEditor editor = new OrderEditor(parent, INVENTORY, order);
editor.addSaveListener(orderSavedListener);
editor.addWindowListener(doneEditingListener);
OrderListDialog.this.setVisible(false);
editor.setVisible(true);
}
});
ADD_BUTTON = new JButton("+");
ADD_BUTTON.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final Order order = new Order(INVENTORY, Lang.get("Order.new"), new Date());
OrderEditor editor = new OrderEditor(parent, INVENTORY, order);
editor.setOrderNumberChanged(true); // since order name might conflict
editor.addSaveListener(orderSavedListener);
editor.addWindowListener(doneEditingListener);
editor.addSaveListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
INVENTORY.addOrder(order);
}
});
OrderListDialog.this.setVisible(false);
editor.setVisible(true);
}
});
JPanel buttonBox = new JPanel(new BorderLayout());
JPanel leftButtonBox = new JPanel(new FlowLayout(FlowLayout.LEFT));
leftButtonBox.add(ADD_BUTTON);
buttonBox.add(leftButtonBox, BorderLayout.WEST);
setLayout(new BorderLayout());
add(tablePane, BorderLayout.CENTER);
add(buttonBox, BorderLayout.SOUTH);
pack();
centorOnParent();
}
}