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.util.ArrayList;
9 import javax.swing.JFrame;
10 import javax.swing.JLabel;
11 import javax.swing.JOptionPane;
12 import javax.swing.JPanel;
13 import javax.swing.JTable;
14 import javax.swing.ListSelectionModel;
15 import javax.swing.border.TitledBorder;
16 import javax.swing.event.ListSelectionEvent;
17 import javax.swing.event.ListSelectionListener;
18 import javax.swing.event.TableModelEvent;
19 import javax.swing.event.TableModelListener;
21 import at.ac.tuwien.sbc.valesriegler.common.Util;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
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.types.GroupData;
28 import at.ac.tuwien.sbc.valesriegler.types.Order;
29 import at.ac.tuwien.sbc.valesriegler.types.Table;
32 * Base Frame of the Pizzeria GUI
34 * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
36 public class PizzeriaFrame extends JFrame {
37 private static final Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
39 private static final String WRONG_INPUT = "Wrong input";
40 private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
41 private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
42 private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
43 private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
44 private static String PIZZAS_CAPTION = "Pizzas of order %d";
45 private static String FREE_TABLES = "There are currently %d free table(s)";
47 private TablesCreatedHandler onTablesCreatedHandler;
49 public PizzeriaFrame() {
56 JPanel wrapper = new JPanel();
57 GridLayout wrapperLayout = new GridLayout(2, 2);
58 wrapper.setLayout(wrapperLayout);
60 // Create the tables overview
61 initTablesOverview(wrapper);
63 // Create the waiting groups table overview
64 initWaitingGroupsOverview(wrapper);
66 // Create the overview table of the orders
67 JTable ordersTable = initOrdersOverview(wrapper);
69 // Create the order detail tables
70 initOrdersDetails(wrapper, ordersTable);
72 setContentPane(wrapper);
73 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
78 private int getNumberOfTables() {
80 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
82 numberOfTables = Integer.parseInt(numberOfTablesInput);
83 } catch (NumberFormatException e) {
84 JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
85 JOptionPane.ERROR_MESSAGE);
86 return getNumberOfTables();
89 if (numberOfTables < 1) {
90 JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
91 JOptionPane.ERROR_MESSAGE);
92 return getNumberOfTables();
95 return numberOfTables;
97 private void initModels() {
98 PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
100 // When the tables get created in the first place, the handler is informed
101 int numberOfTables = getNumberOfTables();
102 List<Table> freeTablesCreated = PizzeriaAgent.getInstance().getTablesModel().createFreeTables(numberOfTables);
103 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
107 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
108 JPanel detailWrapper = new JPanel();
109 GridLayout wrapperLayout = new GridLayout(2, 1);
110 detailWrapper.setLayout(wrapperLayout);
112 final JPanel waitersPanel = new JPanel();
113 final JPanel pizzasPanel = new JPanel();
114 Util.createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
115 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasModel(), "");
118 * Update the displayed order in the waiter and pizza detail tables when an
119 * order gets selected in the orders table
121 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
123 public void valueChanged(ListSelectionEvent e) {
124 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
125 int minIndex = lsm.getMinSelectionIndex();
126 if(minIndex < 0) return;
128 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
129 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
130 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
131 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
132 PizzeriaAgent.getInstance().getPizzasModel().setCurrentOrder(currentGroup.getOrder());
134 waitersPanel.setVisible(true);
135 pizzasPanel.setVisible(true);
139 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
140 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
141 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
143 public void tableChanged(TableModelEvent e) {
144 PizzeriaAgent.getInstance().getPizzasModel().fireTableDataChanged();
145 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
149 detailWrapper.add(waitersPanel);
150 detailWrapper.add(pizzasPanel);
151 waitersPanel.setVisible(false);
152 pizzasPanel.setVisible(false);
154 wrapper.add(detailWrapper);
158 private JTable initOrdersOverview(JPanel wrapper) {
159 JPanel tablePanel = new JPanel();
160 JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
162 wrapper.add(tablePanel);
167 private void initWaitingGroupsOverview(JPanel wrapper) {
168 JPanel tablePanel = new JPanel();
169 Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
171 wrapper.add(tablePanel);
174 private void initTablesOverview(JPanel wrapper) {
175 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
176 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
177 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
178 Util.createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
180 PizzeriaAgent.getInstance().getTablesModel()
181 .addTableModelListener(new TableModelListener() {
183 public void tableChanged(TableModelEvent e) {
184 String numberOfFreeTables = getNumberOfFreeTables();
185 log.info("Number of free tables changed: {}",
188 freeTablesLabel.setText(numberOfFreeTables);
193 wrapper.add(scrollPanePanel);
197 private String getNumberOfFreeTables() {
198 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
201 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
202 onTablesCreatedHandler = tablesCreatedHandler;