1 package at.ac.tuwien.sbc.valesriegler.pizzeria.gui;
3 import java.awt.GridBagConstraints;
4 import java.awt.GridBagLayout;
5 import java.awt.GridLayout;
6 import java.awt.Insets;
7 import java.util.ArrayList;
10 import javax.swing.JFrame;
11 import javax.swing.JLabel;
12 import javax.swing.JOptionPane;
13 import javax.swing.JPanel;
14 import javax.swing.JScrollPane;
15 import javax.swing.JTable;
16 import javax.swing.ListSelectionModel;
17 import javax.swing.ScrollPaneConstants;
18 import javax.swing.SwingUtilities;
19 import javax.swing.border.TitledBorder;
20 import javax.swing.event.ListSelectionEvent;
21 import javax.swing.event.ListSelectionListener;
22 import javax.swing.event.TableModelEvent;
23 import javax.swing.event.TableModelListener;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 import at.ac.tuwien.sbc.valesriegler.DEP_Order;
29 import at.ac.tuwien.sbc.valesriegler.DEP_Table;
30 import at.ac.tuwien.sbc.valesriegler.common.TableModel;
31 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
32 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent.TablesCreatedHandler;
33 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.GroupsOverviewModel;
34 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.OrdersOverviewModel;
35 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.PizzasOfOrderModel;
36 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.TablesOverviewModel;
37 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.WaitersOfOrderModel;
38 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
39 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrderStatus;
40 import at.ac.tuwien.sbc.valesriegler.types.PizzaType;
43 * Base Frame of the Pizzeria GUI
45 * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
47 public class PizzeriaFrame extends JFrame {
48 private static final Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
50 private static final String WRONG_INPUT = "Wrong input";
51 private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
52 private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
53 private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
54 private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
55 private static String PIZZAS_CAPTION = "Pizzas of order %d";
56 private static String FREE_TABLES = "There are currently %d free table(s)";
58 private TablesCreatedHandler onTablesCreatedHandler;
60 public PizzeriaFrame() {
67 JPanel wrapper = new JPanel();
68 GridLayout wrapperLayout = new GridLayout(2, 2);
69 wrapper.setLayout(wrapperLayout);
71 // Create the tables overview
72 initTablesOverview(wrapper);
74 // Create the waiting groups table overview
75 initWaitingGroupsOverview(wrapper);
77 // Create the overview table of the orders
78 JTable ordersTable = initOrdersOverview(wrapper);
80 // Create the order detail tables
81 initOrdersDetails(wrapper, ordersTable);
83 setContentPane(wrapper);
84 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
89 private int getNumberOfTables() {
91 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
93 numberOfTables = Integer.parseInt(numberOfTablesInput);
94 } catch (NumberFormatException e) {
95 JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
96 JOptionPane.ERROR_MESSAGE);
97 return getNumberOfTables();
100 if (numberOfTables < 1) {
101 JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
102 JOptionPane.ERROR_MESSAGE);
103 return getNumberOfTables();
106 return numberOfTables;
109 public void initModels() {
110 List<DEP_Order> orders = getOrdersTestData();
111 PizzeriaAgent.getInstance().getOrdersModel().setItems(orders);
113 // When the tables get created in the first place, the handler is informed
114 int numberOfTables = getNumberOfTables();
115 List<DEP_Table> freeTablesCreated = PizzeriaAgent.getInstance().getTablesModel().createFreeTables(numberOfTables);
116 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
120 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
121 JPanel detailWrapper = new JPanel();
122 GridLayout wrapperLayout = new GridLayout(2, 1);
123 detailWrapper.setLayout(wrapperLayout);
125 final JPanel waitersPanel = new JPanel();
126 final JPanel pizzasPanel = new JPanel();
127 createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
128 createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasModel(), "");
131 * Update the displayed order in the waiter and pizza detail tables when an
132 * order gets selected in the orders table
134 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
136 public void valueChanged(ListSelectionEvent e) {
137 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
138 int minIndex = lsm.getMinSelectionIndex();
140 DEP_Order currentOrder = PizzeriaAgent.getInstance().getOrdersModel().getOrderOfRow(minIndex);
141 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentOrder.getId())));
142 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentOrder.getId())));
143 PizzeriaAgent.getInstance().getWaitersModel().setCurrentOrder(currentOrder);
144 PizzeriaAgent.getInstance().getPizzasModel().setCurrentOrder(currentOrder);
146 waitersPanel.setVisible(true);
147 pizzasPanel.setVisible(true);
151 detailWrapper.add(waitersPanel);
152 detailWrapper.add(pizzasPanel);
153 waitersPanel.setVisible(false);
154 pizzasPanel.setVisible(false);
156 wrapper.add(detailWrapper);
160 private JTable initOrdersOverview(JPanel wrapper) {
161 JPanel tablePanel = new JPanel();
162 JTable orderTable = createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
164 wrapper.add(tablePanel);
169 private void initWaitingGroupsOverview(JPanel wrapper) {
170 JPanel tablePanel = new JPanel();
171 createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Groups");
173 wrapper.add(tablePanel);
176 private void initTablesOverview(JPanel wrapper) {
177 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
178 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
179 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
180 createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
182 PizzeriaAgent.getInstance().getTablesModel()
183 .addTableModelListener(new TableModelListener() {
185 public void tableChanged(TableModelEvent e) {
186 String numberOfFreeTables = getNumberOfFreeTables();
187 log.info("Number of free tables changed: {}",
190 freeTablesLabel.setText(numberOfFreeTables);
196 wrapper.add(scrollPanePanel);
199 private JTable createTableInTitledPanel(JPanel wrapperPanel, TableModel<?> model, String title) {
200 JTable table = new JTable(model);
201 wrapperPanel.setLayout(new GridBagLayout());
202 GridBagConstraints c = new GridBagConstraints();
206 c.insets = new Insets(10, 10, 10, 10);
207 c.fill = GridBagConstraints.BOTH;
208 JScrollPane scrollPane = new JScrollPane(table);
210 wrapperPanel.setBorder(new TitledBorder(title));
211 scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
212 wrapperPanel.add(scrollPane, c);
218 * not necessary in production
220 private List<DEP_Order> getOrdersTestData() {
221 List<DEP_Order> orders = new ArrayList<>();
222 DEP_Order order1 = new DEP_Order();
223 DEP_Order order2 = new DEP_Order();
224 DEP_Order order3 = new DEP_Order();
225 DEP_Order order4 = new DEP_Order();
232 order1.setWaiterIdOfOrder(4);
233 order2.setWaiterIdOfServing(2);
235 List<PizzaOrder> pizzas = new ArrayList<>();
236 PizzaOrder pizzaOrder1 = new PizzaOrder(PizzaType.CARDINALE);
237 pizzaOrder1.setStatus(PizzaOrderStatus.DONE);
238 pizzas.add(pizzaOrder1);
239 order1.setPizzaOrders(pizzas);
248 private String getNumberOfFreeTables() {
249 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
252 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
253 onTablesCreatedHandler = tablesCreatedHandler;