package devopsdistilled.operp.client.stock.panes; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.List; import javax.inject.Inject; import javax.swing.JButton; 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.SubTaskPane; import devopsdistilled.operp.client.exceptions.EntityValidationException; import devopsdistilled.operp.client.items.controllers.ItemController; import devopsdistilled.operp.client.items.models.observers.ItemModelObserver; import devopsdistilled.operp.client.stock.controllers.WarehouseController; import devopsdistilled.operp.client.stock.models.observers.WarehouseModelObserver; import devopsdistilled.operp.client.stock.panes.controllers.UpdateStockPaneController; import devopsdistilled.operp.client.stock.panes.details.StockKeepingDetailsPane; import devopsdistilled.operp.client.stock.panes.models.observers.UpdateStockPaneModelObserver; import devopsdistilled.operp.server.data.entity.items.Item; import devopsdistilled.operp.server.data.entity.stock.StockKeeper; import devopsdistilled.operp.server.data.entity.stock.Warehouse; public class UpdateStockPane extends SubTaskPane implements UpdateStockPaneModelObserver, ItemModelObserver, WarehouseModelObserver { @Inject private UpdateStockPaneController controller; @Inject private WarehouseController warehouseController; @Inject private ItemController itemController; @Inject private StockKeepingDetailsPane stockKeepingDetailsPane; private final JPanel pane; private final JTextField quantityField; private final JComboBox<Item> comboItems; private final JComboBox<Warehouse> comboWarehouses; private final JTextField noteField; public UpdateStockPane() { pane = new JPanel(); pane.setLayout(new MigLayout("", "[]25[grow]", "[][]")); JLabel lblItemName = new JLabel("Item Name"); pane.add(lblItemName, "cell 0 0,alignx trailing"); comboItems = new JComboBox<Item>(); comboItems.setMinimumSize(new Dimension(100, 24)); comboItems.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { getDialog().pack(); controller.getModel().setItem((Item) e.getItem()); } } }); comboItems.setSelectedItem(null); pane.add(comboItems, "flowx,cell 1 0,growx"); JButton btnNewItem = new JButton("New Item"); btnNewItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { itemController.create(); } }); pane.add(btnNewItem, "cell 1 0"); JLabel lblWarehouseName = new JLabel("Warehouse Name"); pane.add(lblWarehouseName, "cell 0 1,alignx trailing"); comboWarehouses = new JComboBox<Warehouse>(); comboWarehouses.setMinimumSize(new Dimension(100, 24)); comboWarehouses.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { getDialog().pack(); controller.getModel().setWarehouse((Warehouse) e.getItem()); } } }); comboWarehouses.setSelectedItem(null); pane.add(comboWarehouses, "flowx,cell 1 1,growx"); JButton btnNewWarehouse = new JButton("New Warehouse"); btnNewWarehouse.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { warehouseController.create(); } }); pane.add(btnNewWarehouse, "cell 1 1"); JLabel lblQuantity = new JLabel("Quantity"); pane.add(lblQuantity, "cell 0 2,alignx trailing"); quantityField = new JTextField(); quantityField.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { try { Long quantity = Long.parseLong(quantityField.getText() .trim()); controller.getModel().setQuantity(quantity); } catch (NumberFormatException e1) { JOptionPane.showMessageDialog(getPane(), "Quantity field must be numeric value"); } } }); pane.add(quantityField, "cell 1 2,growx"); quantityField.setColumns(15); JButton btnCancel = new JButton("Cancel"); btnCancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { getDialog().dispose(); } }); JLabel lblNote = new JLabel("Note"); pane.add(lblNote, "cell 0 3,alignx trailing"); noteField = new JTextField(); noteField.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { controller.getModel().setNote(noteField.getText().trim()); } }); pane.add(noteField, "cell 1 3,growx"); noteField.setColumns(20); pane.add(btnCancel, "flowx,cell 1 5"); JButton btnUpdate = new JButton("Update"); btnUpdate.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { controller.validate(); StockKeeper stockKeeper = controller.save(); getDialog().dispose(); stockKeepingDetailsPane.show(stockKeeper, getPane()); } catch (EntityValidationException e1) { JOptionPane.showMessageDialog(getPane(), e1.getMessage()); } } }); pane.add(btnUpdate, "cell 1 5"); } @Override public JComponent getPane() { return pane; } @Override public void updateItems(List<Item> items) { Item prevSelected = (Item) comboItems.getSelectedItem(); comboItems.removeAllItems(); for (Item item : items) { comboItems.addItem(item); if (prevSelected != null) if (prevSelected.compareTo(item) == 0) comboItems.setSelectedItem(item); } } @Override public void updateWarehouses(List<Warehouse> warehouses) { Warehouse prevSelected = (Warehouse) comboWarehouses.getSelectedItem(); comboWarehouses.removeAllItems(); for (Warehouse warehouse : warehouses) { comboWarehouses.addItem(warehouse); if (prevSelected != null) if (prevSelected.compareTo(warehouse) == 0) comboWarehouses.setSelectedItem(warehouse); } } }