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 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
144 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
145 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
147 public void tableChanged(TableModelEvent e) {
148 PizzeriaAgent.getInstance().getPizzasModel().fireTableDataChanged();
149 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
153 detailWrapper.add(waitersPanel);
154 detailWrapper.add(pizzasPanel);
155 waitersPanel.setVisible(false);
156 pizzasPanel.setVisible(false);
158 wrapper.add(detailWrapper);
162 private JTable initOrdersOverview(JPanel wrapper) {
163 JPanel tablePanel = new JPanel();
164 JTable orderTable = createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
166 wrapper.add(tablePanel);
171 private void initWaitingGroupsOverview(JPanel wrapper) {
172 JPanel tablePanel = new JPanel();
173 createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
175 wrapper.add(tablePanel);
178 private void initTablesOverview(JPanel wrapper) {
179 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
180 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
181 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
182 createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
184 PizzeriaAgent.getInstance().getTablesModel()
185 .addTableModelListener(new TableModelListener() {
187 public void tableChanged(TableModelEvent e) {
188 String numberOfFreeTables = getNumberOfFreeTables();
189 log.info("Number of free tables changed: {}",
192 freeTablesLabel.setText(numberOfFreeTables);
197 wrapper.add(scrollPanePanel);
200 private JTable createTableInTitledPanel(JPanel wrapperPanel, TableModel<?> model, String title) {
201 JTable table = new JTable(model);
202 wrapperPanel.setLayout(new GridBagLayout());
203 GridBagConstraints c = new GridBagConstraints();
207 c.insets = new Insets(10, 10, 10, 10);
208 c.fill = GridBagConstraints.BOTH;
209 JScrollPane scrollPane = new JScrollPane(table);
211 wrapperPanel.setBorder(new TitledBorder(title));
212 scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
213 wrapperPanel.add(scrollPane, c);
219 * not necessary in production
221 private List<Order> getOrdersTestData() { // TODO: useful way to get data.
222 List<Order> orders = new ArrayList<>();
223 // Order order1 = new Order();
224 // Order order2 = new Order();
225 // Order order3 = new Order();
226 // Order order4 = new Order();
228 // order1.setWaiterIdOfOrder(4);
229 // order2.setWaiterIdOfServing(2);
231 // List<PizzaOrder> pizzas = new ArrayList<>();
232 // PizzaOrder pizzaOrder1 = new PizzaOrder(PizzaType.CARDINALE);
233 // pizzaOrder1.setStatus(PizzaOrderStatus.DONE);
234 // pizzas.add(pizzaOrder1);
235 // order1.setPizzaOrders(pizzas);
237 // orders.add(order1);
238 // orders.add(order2);
239 // orders.add(order3);
240 // orders.add(order4);
244 private String getNumberOfFreeTables() {
245 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
248 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
249 onTablesCreatedHandler = tablesCreatedHandler;