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.border.TitledBorder;
19 import javax.swing.event.ListSelectionEvent;
20 import javax.swing.event.ListSelectionListener;
21 import javax.swing.event.TableModelEvent;
22 import javax.swing.event.TableModelListener;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
27 import at.ac.tuwien.sbc.valesriegler.common.TableModel;
28 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
29 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent.TablesCreatedHandler;
30 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
31 import at.ac.tuwien.sbc.valesriegler.types.Order;
32 import at.ac.tuwien.sbc.valesriegler.types.Table;
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 Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
42 private static final String WRONG_INPUT = "Wrong input";
43 private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
44 private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
45 private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
46 private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
47 private static String PIZZAS_CAPTION = "Pizzas of order %d";
48 private static String FREE_TABLES = "There are currently %d free table(s)";
50 private TablesCreatedHandler onTablesCreatedHandler;
52 public PizzeriaFrame() {
59 JPanel wrapper = new JPanel();
60 GridLayout wrapperLayout = new GridLayout(2, 2);
61 wrapper.setLayout(wrapperLayout);
63 // Create the tables overview
64 initTablesOverview(wrapper);
66 // Create the waiting groups table overview
67 initWaitingGroupsOverview(wrapper);
69 // Create the overview table of the orders
70 JTable ordersTable = initOrdersOverview(wrapper);
72 // Create the order detail tables
73 initOrdersDetails(wrapper, ordersTable);
75 setContentPane(wrapper);
76 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
81 private int getNumberOfTables() {
83 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
85 numberOfTables = Integer.parseInt(numberOfTablesInput);
86 } catch (NumberFormatException e) {
87 JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
88 JOptionPane.ERROR_MESSAGE);
89 return getNumberOfTables();
92 if (numberOfTables < 1) {
93 JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
94 JOptionPane.ERROR_MESSAGE);
95 return getNumberOfTables();
98 return numberOfTables;
100 private void initModels() {
101 // List<Order> orders = getOrdersTestData();
102 PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
104 // When the tables get created in the first place, the handler is informed
105 int numberOfTables = getNumberOfTables();
106 List<Table> freeTablesCreated = PizzeriaAgent.getInstance().getTablesModel().createFreeTables(numberOfTables);
107 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
111 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
112 JPanel detailWrapper = new JPanel();
113 GridLayout wrapperLayout = new GridLayout(2, 1);
114 detailWrapper.setLayout(wrapperLayout);
116 final JPanel waitersPanel = new JPanel();
117 final JPanel pizzasPanel = new JPanel();
118 createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
119 createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasModel(), "");
122 * Update the displayed order in the waiter and pizza detail tables when an
123 * order gets selected in the orders table
125 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
127 public void valueChanged(ListSelectionEvent e) {
128 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
129 int minIndex = lsm.getMinSelectionIndex();
130 if(minIndex < 0) return;
132 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
133 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
134 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
135 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
136 PizzeriaAgent.getInstance().getPizzasModel().setCurrentOrder(currentGroup.getOrder());
138 waitersPanel.setVisible(true);
139 pizzasPanel.setVisible(true);
143 detailWrapper.add(waitersPanel);
144 detailWrapper.add(pizzasPanel);
145 waitersPanel.setVisible(false);
146 pizzasPanel.setVisible(false);
148 wrapper.add(detailWrapper);
152 private JTable initOrdersOverview(JPanel wrapper) {
153 JPanel tablePanel = new JPanel();
154 JTable orderTable = createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
156 wrapper.add(tablePanel);
161 private void initWaitingGroupsOverview(JPanel wrapper) {
162 JPanel tablePanel = new JPanel();
163 createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
165 wrapper.add(tablePanel);
168 private void initTablesOverview(JPanel wrapper) {
169 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
170 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
171 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
172 createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
174 PizzeriaAgent.getInstance().getTablesModel()
175 .addTableModelListener(new TableModelListener() {
177 public void tableChanged(TableModelEvent e) {
178 String numberOfFreeTables = getNumberOfFreeTables();
179 log.info("Number of free tables changed: {}",
182 freeTablesLabel.setText(numberOfFreeTables);
188 wrapper.add(scrollPanePanel);
191 private JTable createTableInTitledPanel(JPanel wrapperPanel, TableModel<?> model, String title) {
192 JTable table = new JTable(model);
193 wrapperPanel.setLayout(new GridBagLayout());
194 GridBagConstraints c = new GridBagConstraints();
198 c.insets = new Insets(10, 10, 10, 10);
199 c.fill = GridBagConstraints.BOTH;
200 JScrollPane scrollPane = new JScrollPane(table);
202 wrapperPanel.setBorder(new TitledBorder(title));
203 scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
204 wrapperPanel.add(scrollPane, c);
210 * not necessary in production
212 private List<Order> getOrdersTestData() { // TODO: useful way to get data.
213 List<Order> orders = new ArrayList<>();
214 // Order order1 = new Order();
215 // Order order2 = new Order();
216 // Order order3 = new Order();
217 // Order order4 = new Order();
219 // order1.setWaiterIdOfOrder(4);
220 // order2.setWaiterIdOfServing(2);
222 // List<PizzaOrder> pizzas = new ArrayList<>();
223 // PizzaOrder pizzaOrder1 = new PizzaOrder(PizzaType.CARDINALE);
224 // pizzaOrder1.setStatus(PizzaOrderStatus.DONE);
225 // pizzas.add(pizzaOrder1);
226 // order1.setPizzaOrders(pizzas);
228 // orders.add(order1);
229 // orders.add(order2);
230 // orders.add(order3);
231 // orders.add(order4);
235 private String getNumberOfFreeTables() {
236 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
239 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
240 onTablesCreatedHandler = tablesCreatedHandler;