package devopsdistilled.operp.client.business.sales.panes;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
import devopsdistilled.operp.client.abstracts.EntityOperation;
import devopsdistilled.operp.client.abstracts.EntityPane;
import devopsdistilled.operp.client.business.sales.controllers.SaleDescRowController;
import devopsdistilled.operp.client.business.sales.panes.controllers.SaleDescRowPaneController;
import devopsdistilled.operp.client.business.sales.panes.models.observers.SaleDescRowPaneModelObserver;
import devopsdistilled.operp.client.stock.models.observers.StockModelObserver;
import devopsdistilled.operp.server.data.entity.business.SaleDescRow;
import devopsdistilled.operp.server.data.entity.items.Item;
import devopsdistilled.operp.server.data.entity.stock.Stock;
import devopsdistilled.operp.server.data.entity.stock.Warehouse;
public class SaleDescRowPane
extends
EntityPane<SaleDescRow, SaleDescRowController, SaleDescRowPaneController>
implements SaleDescRowPaneModelObserver, StockModelObserver {
private final JPanel pane;
private final JTextField priceField;
private final JTextField quantityField;
private final JComboBox<Item> itemCombo;
private final JComboBox<Warehouse> warehouseCombo;
private final JLabel lblFromWarehouse;
public SaleDescRowPane() {
pane = new JPanel();
pane.setLayout(new MigLayout("", "[][grow]", "[][][][]"));
warehouseCombo = new JComboBox<>();
warehouseCombo.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
Warehouse selWarehouse = (Warehouse) e.getItem();
updateItems(getController().getItemsInWarehouse(
selWarehouse));
}
}
});
lblFromWarehouse = new JLabel("From Warehouse");
pane.add(lblFromWarehouse, "cell 0 0,alignx trailing");
pane.add(warehouseCombo, "cell 1 0,growx");
JLabel lblItem = new JLabel("Item");
pane.add(lblItem, "cell 0 1,alignx trailing");
itemCombo = new JComboBox<>();
itemCombo.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
Item selItem = (Item) e.getItem();
getController().getModel().getEntity().setItem(selItem);
Double price = selItem.getPrice();
priceField.setText(price.toString());
getController().getModel().getEntity().setRate(price);
Long quantity = getController().getQuantityOfItem(selItem);
quantityField.setText(quantity.toString());
}
}
});
pane.add(itemCombo, "cell 1 1,growx");
JLabel lblPrice = new JLabel("Price");
pane.add(lblPrice, "cell 0 2,alignx trailing");
priceField = new JTextField();
priceField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
try {
Double price = Double.parseDouble(priceField.getText()
.trim());
getController().getModel().getEntity().setRate(price);
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(getPane(),
"Price Field must be numeric value");
priceField.setText("0");
getController().getModel().getEntity().setRate(0.0);
}
}
});
pane.add(priceField, "cell 1 2,growx");
priceField.setColumns(10);
JLabel lblQuantity = new JLabel("Quantity");
pane.add(lblQuantity, "cell 0 3,alignx trailing");
quantityField = new JTextField();
quantityField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
try {
Long quantity = Long.parseLong(quantityField.getText()
.trim());
getController().getModel().getEntity()
.setQuantity(quantity);
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(getPane(),
"Quantity Field must be numeric value");
quantityField.setText("0");
getController().getModel().getEntity().setQuantity(0L);
}
}
});
pane.add(quantityField, "cell 1 3,growx");
quantityField.setColumns(10);
}
@Override
public void resetComponents() {
// TODO Auto-generated method stub
itemCombo.setSelectedItem(null);
quantityField.setText("");
priceField.setText("");
}
@Override
public SaleDescRowController getEntityController() {
// TODO Auto-generated method stub
return null;
}
@Override
public JComponent getPane() {
return pane;
}
@Override
public void updateEntity(SaleDescRow saleDescRow,
EntityOperation entityOperation) {
if (EntityOperation.Create == entityOperation) {
} else if (EntityOperation.Edit == entityOperation) {
itemCombo.addItem(saleDescRow.getItem());
priceField.setText(saleDescRow.getRate().toString());
quantityField.setText(saleDescRow.getQuantity().toString());
}
}
private void updateItems(List<Item> items) {
Item prevSelected = (Item) itemCombo.getSelectedItem();
itemCombo.removeAllItems();
for (Item item : items) {
itemCombo.addItem(item);
if (prevSelected != null)
if (prevSelected.compareTo(item) == 0)
itemCombo.setSelectedItem(item);
}
}
private void updateWarehouses(List<Warehouse> warehouses) {
Warehouse prevSelected = (Warehouse) warehouseCombo.getSelectedItem();
warehouseCombo.removeAllItems();
for (Warehouse warehouse : warehouses) {
warehouseCombo.addItem(warehouse);
if (prevSelected != null)
if (prevSelected.compareTo(warehouse) == 0)
itemCombo.setSelectedItem(warehouse);
}
}
@Override
public void updateStock(List<Stock> stocks) {
Set<Warehouse> warehouseSet = new HashSet<>();
for (Stock stock : stocks)
if (stock.getQuantity().compareTo(0L) > 0)
warehouseSet.add(stock.getWarehouse());
List<Warehouse> warehouses = new LinkedList<>(warehouseSet);
updateWarehouses(warehouses);
}
}