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.border.TitledBorder;
18 import javax.swing.event.ListSelectionEvent;
19 import javax.swing.event.ListSelectionListener;
20 import javax.swing.event.TableModelEvent;
21 import javax.swing.event.TableModelListener;
23 import at.ac.tuwien.sbc.valesriegler.common.PizzaType;
24 import at.ac.tuwien.sbc.valesriegler.common.TableModel;
25 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
26 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent.TablesCreatedHandler;
27 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.PizzaOrder.PizzaOrderStatus;
28 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.GroupsOverviewModel;
29 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.OrdersOverviewModel;
30 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.PizzasOfOrderModel;
31 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.TablesOverviewModel;
32 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.WaitersOfOrderModel;
35 * Base Frame of the Pizzeria GUI
37 * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
39 public class PizzeriaFrame extends JFrame {
40 private static final String WRONG_INPUT = "Wrong input";
41 private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
42 private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
43 private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
44 private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
45 private static String PIZZAS_CAPTION = "Pizzas of order %d";
46 private static String FREE_TABLES = "There are currently %d free table(s)";
48 private OrdersOverviewModel ordersModel;
49 private GroupsOverviewModel groupModel;
50 private TablesOverviewModel tablesModel;
51 private WaitersOfOrderModel waitersModel;
52 private PizzasOfOrderModel pizzasModel;
54 private TablesCreatedHandler onTablesCreatedHandler;
56 public PizzeriaFrame(OrdersOverviewModel ordersModel, GroupsOverviewModel groupModel, TablesOverviewModel tablesModel, WaitersOfOrderModel waitersModel, PizzasOfOrderModel pizzasModel) {
59 this.ordersModel = ordersModel;
60 this.groupModel = groupModel;
61 this.tablesModel = tablesModel;
62 this.waitersModel = waitersModel;
63 this.pizzasModel = pizzasModel;
69 JPanel wrapper = new JPanel();
70 GridLayout wrapperLayout = new GridLayout(2, 2);
71 wrapper.setLayout(wrapperLayout);
73 // Create the tables overview
74 initTablesOverview(wrapper);
76 // Create the waiting groups table overview
77 initWaitingGroupsOverview(wrapper);
79 // Create the overview table of the orders
80 JTable ordersTable = initOrdersOverview(wrapper);
82 // Create the order detail tables
83 initOrdersDetails(wrapper, ordersTable);
85 setContentPane(wrapper);
86 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
89 private int getNumberOfTables() {
91 String numberOfTablesInput = JOptionPane
92 .showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
94 numberOfTables = Integer.parseInt(numberOfTablesInput);
95 } catch (NumberFormatException e) {
96 JOptionPane.showMessageDialog(this,
97 YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
98 JOptionPane.ERROR_MESSAGE);
99 return getNumberOfTables();
102 if (numberOfTables < 1) {
103 JOptionPane.showMessageDialog(this,
104 THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
105 JOptionPane.ERROR_MESSAGE);
106 return getNumberOfTables();
109 return numberOfTables;
112 private void initModels() {
113 List<Order> orders = getOrdersTestData();
114 ordersModel.setItems(orders);
116 // When the tables get created in the first place, the handler is informed
117 int numberOfTables = getNumberOfTables();
118 List<Table> freeTablesCreated = tablesModel.createFreeTables(numberOfTables);
119 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
123 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
124 JPanel detailWrapper = new JPanel();
125 GridLayout wrapperLayout = new GridLayout(2, 1);
126 detailWrapper.setLayout(wrapperLayout);
128 final JPanel waitersPanel = new JPanel();
129 final JPanel pizzasPanel = new JPanel();
130 createTableInTitledPanel(waitersPanel, waitersModel, "");
131 createTableInTitledPanel(pizzasPanel, pizzasModel, "");
134 * Update the displayed order in the waiter and pizza detail tables when
135 * an order gets selected in the orders table
137 ordersTable.getSelectionModel().addListSelectionListener(
138 new ListSelectionListener() {
140 public void valueChanged(ListSelectionEvent e) {
141 ListSelectionModel lsm = (ListSelectionModel) e
143 int minIndex = lsm.getMinSelectionIndex();
145 Order currentOrder = ordersModel
146 .getOrderOfRow(minIndex);
147 waitersPanel.setBorder(new TitledBorder(String.format(
148 WAITER_IDS_CAPTION, currentOrder.getId())));
149 pizzasPanel.setBorder(new TitledBorder(String.format(
150 PIZZAS_CAPTION, currentOrder.getId())));
151 waitersModel.setCurrentOrder(currentOrder);
152 pizzasModel.setCurrentOrder(currentOrder);
154 waitersPanel.setVisible(true);
155 pizzasPanel.setVisible(true);
159 detailWrapper.add(waitersPanel);
160 detailWrapper.add(pizzasPanel);
161 waitersPanel.setVisible(false);
162 pizzasPanel.setVisible(false);
164 wrapper.add(detailWrapper);
168 private JTable initOrdersOverview(JPanel wrapper) {
169 JPanel tablePanel = new JPanel();
170 JTable orderTable = createTableInTitledPanel(tablePanel, ordersModel,
173 wrapper.add(tablePanel);
178 private void initWaitingGroupsOverview(JPanel wrapper) {
179 JPanel tablePanel = new JPanel();
180 createTableInTitledPanel(tablePanel, groupModel, "Groups");
182 wrapper.add(tablePanel);
185 private void initTablesOverview(JPanel wrapper) {
186 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
187 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
188 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
189 createTableInTitledPanel(scrollPanePanel, tablesModel, "Tables");
191 tablesModel.addTableModelListener(new TableModelListener() {
193 public void tableChanged(TableModelEvent e) {
194 freeTablesLabel.setText(getNumberOfFreeTables());
198 wrapper.add(scrollPanePanel);
201 private JTable createTableInTitledPanel(JPanel wrapperPanel,
202 TableModel<?> model, String title) {
203 JTable table = new JTable(model);
204 wrapperPanel.setLayout(new GridBagLayout());
205 GridBagConstraints c = new GridBagConstraints();
209 c.insets = new Insets(10, 10, 10, 10);
210 c.fill = GridBagConstraints.BOTH;
211 JScrollPane scrollPane = new JScrollPane(table);
213 wrapperPanel.setBorder(new TitledBorder(title));
214 scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
215 wrapperPanel.add(scrollPane, c);
221 * not necessary in production
223 private List<Order> getOrdersTestData() {
224 List<Order> orders = new ArrayList<>();
225 Order order1 = new Order();
226 Order order2 = new Order();
227 Order order3 = new Order();
228 Order order4 = new Order();
235 order1.setWaiterIdOfOrder(4);
236 order2.setWaiterIdOfServing(2);
238 List<PizzaOrder> pizzas = new ArrayList<>();
239 PizzaOrder pizzaOrder1 = new PizzaOrder();
240 pizzaOrder1.setPizzaType(PizzaType.CARDINALE);
241 pizzaOrder1.setStatus(PizzaOrderStatus.DONE);
242 pizzaOrder1.setCookId(3);
243 pizzas.add(pizzaOrder1);
244 order1.setPizzaOrders(pizzas);
253 private String getNumberOfFreeTables() {
254 return String.format(FREE_TABLES, tablesModel.getNumberOfFreeTables());
257 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
258 this.onTablesCreatedHandler = tablesCreatedHandler;