/*
* 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.InventoryItem;
import com.delwink.icebox.lang.Lang;
import com.delwink.icebox.table.InventoryItemTableModel;
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.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class InventoryItemEditor extends JDialog {
private final List CHANGES;
private final Inventory INVENTORY;
private final List ADDED;
private final JButton ADD_BUTTON, CANCEL_BUTTON, SAVE_BUTTON;
private final JTable TABLE;
public InventoryItemEditor(Frame parent, Inventory inventory) {
super(parent, Lang.get("InventoryItemEditor.title"));
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setModal(true);
INVENTORY = inventory;
CHANGES = new ArrayList<>();
ADDED = new ArrayList<>();
TABLE = new JTable(new InventoryItemTableModel(INVENTORY));
JScrollPane tablePane = new JScrollPane(TABLE);
ADD_BUTTON = new JButton("+");
ADD_BUTTON.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
InventoryItem item = new InventoryItem(INVENTORY.getNextID());
ADDED.add(item);
INVENTORY.addNewItem(item);
TABLE.setModel(new InventoryItemTableModel(INVENTORY));
}
});
final ActionListener cancelListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (InventoryItem item : ADDED)
INVENTORY.deleteItem(item.getID());
dispose();
}
};
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
cancelListener.actionPerformed(null);
}
});
CANCEL_BUTTON = new JButton(Lang.get("cancel"));
CANCEL_BUTTON.addActionListener(cancelListener);
SAVE_BUTTON = new JButton(Lang.get("save"));
SAVE_BUTTON.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (Change change : CHANGES) {
InventoryItem item = change.getItem();
switch (change.getType()) {
case NAME:
item.setName((String) change.getData());
break;
case UNIT:
item.setUnit((String) change.getData());
break;
case REORDER:
item.setReorderAt((Integer) change.getData());
break;
}
}
try (OutputStream stream = new FileOutputStream(DataDir.INVENTORY_FILE)) {
INVENTORY.saveXml(stream);
} catch (IOException ex) {
Logger.getLogger(InventoryItemEditor.class.getName()).log(Level.SEVERE, null, ex);
}
dispose();
}
});
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);
buttonBox.add(leftButtonBox, BorderLayout.WEST);
rightButtonBox.add(CANCEL_BUTTON);
rightButtonBox.add(SAVE_BUTTON);
buttonBox.add(rightButtonBox);
setLayout(new BorderLayout());
add(tablePane, BorderLayout.CENTER);
add(buttonBox, BorderLayout.SOUTH);
pack();
centorOnParent();
}
public void addSaveListener(ActionListener al) {
SAVE_BUTTON.addActionListener(al);
}
private static class Change {
private final InventoryItem ITEM;
private final Object DATA;
private final Type TYPE;
protected Change(InventoryItem item, Type type, Object data) {
ITEM = item;
TYPE = type;
DATA = data;
}
public InventoryItem getItem() {
return ITEM;
}
public Type getType() {
return TYPE;
}
public Object getData() {
return DATA;
}
protected enum Type {
NAME,
UNIT,
REORDER
}
}
}