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.Table;
31 * Base Frame of the Pizzeria GUI
33 * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
35 public class PizzeriaFrame extends JFrame {
36 private static final Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
38 private static final String WRONG_INPUT = "Wrong input";
39 private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
40 private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
41 private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
42 private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
43 private static String PIZZAS_CAPTION = "Pizzas of order %d";
44 private static String FREE_TABLES = "There are currently %d free table(s)";
46 private TablesCreatedHandler onTablesCreatedHandler;
48 public PizzeriaFrame() {
55 JPanel wrapper = new JPanel();
56 GridLayout wrapperLayout = new GridLayout(3, 2);
57 wrapper.setLayout(wrapperLayout);
59 // Create the tables overview
60 initTablesOverview(wrapper);
62 // Create the waiting groups table overview
63 initWaitingGroupsOverview(wrapper);
65 // Create the overview table of deliveries
66 JTable deliveryTable = initDeliveryOverview(wrapper);
68 // Create the details table for the deliveries containing the pizza, waiter and driver information
69 initDeliveryDetails(wrapper, deliveryTable);
71 // Create the overview table of the orders
72 JTable ordersTable = initOrdersOverview(wrapper);
74 // Create the order detail tables
75 initOrdersDetails(wrapper, ordersTable);
77 setContentPane(wrapper);
78 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
83 private int getNumberOfTables() {
85 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
87 numberOfTables = Integer.parseInt(numberOfTablesInput);
88 } catch (NumberFormatException e) {
89 JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
90 JOptionPane.ERROR_MESSAGE);
91 return getNumberOfTables();
94 if (numberOfTables < 1) {
95 JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
96 JOptionPane.ERROR_MESSAGE);
97 return getNumberOfTables();
100 return numberOfTables;
102 private void initModels() {
103 PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
105 // When the tables get created in the first place, the handler is informed
106 int numberOfTables = getNumberOfTables();
107 List<Table> freeTablesCreated = PizzeriaAgent.getInstance().getTablesModel().createFreeTables(numberOfTables);
108 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
112 private void initDeliveryDetails(JPanel wrapper, JTable deliveryTable) {
113 JPanel detailWrapper = new JPanel();
114 GridLayout wrapperLayout = new GridLayout(2, 1);
115 detailWrapper.setLayout(wrapperLayout);
117 final JPanel detailsPanel = new JPanel();
118 final JPanel pizzasPanel = new JPanel();
119 Util.createTableInTitledPanel(detailsPanel, PizzeriaAgent.getInstance().getDeliveryDetailsModel(), "");
120 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfDeliveryModel(), "");
123 * Update the displayed order in the waiter and pizza detail tables when an
124 * order gets selected in the orders table
126 deliveryTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
128 public void valueChanged(ListSelectionEvent e) {
129 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
130 int minIndex = lsm.getMinSelectionIndex();
131 if (minIndex < 0) return;
133 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
134 detailsPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
135 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
136 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
137 PizzeriaAgent.getInstance().getPizzasOfOrderModel().setCurrentOrder(currentGroup.getOrder());
139 detailsPanel.setVisible(true);
140 pizzasPanel.setVisible(true);
144 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
145 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
146 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
148 public void tableChanged(TableModelEvent e) {
149 PizzeriaAgent.getInstance().getPizzasOfOrderModel().fireTableDataChanged();
150 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
154 detailWrapper.add(detailsPanel);
155 detailWrapper.add(pizzasPanel);
156 detailsPanel.setVisible(false);
157 pizzasPanel.setVisible(false);
159 wrapper.add(detailWrapper);
163 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
164 JPanel detailWrapper = new JPanel();
165 GridLayout wrapperLayout = new GridLayout(2, 1);
166 detailWrapper.setLayout(wrapperLayout);
168 final JPanel waitersPanel = new JPanel();
169 final JPanel pizzasPanel = new JPanel();
170 Util.createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
171 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfOrderModel(), "");
174 * Update the displayed order in the waiter and pizza detail tables when an
175 * order gets selected in the orders table
177 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
179 public void valueChanged(ListSelectionEvent e) {
180 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
181 int minIndex = lsm.getMinSelectionIndex();
182 if(minIndex < 0) return;
184 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
185 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
186 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
187 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
188 PizzeriaAgent.getInstance().getPizzasOfOrderModel().setCurrentOrder(currentGroup.getOrder());
190 waitersPanel.setVisible(true);
191 pizzasPanel.setVisible(true);
195 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
196 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
197 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
199 public void tableChanged(TableModelEvent e) {
200 PizzeriaAgent.getInstance().getPizzasOfOrderModel().fireTableDataChanged();
201 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
205 detailWrapper.add(waitersPanel);
206 detailWrapper.add(pizzasPanel);
207 waitersPanel.setVisible(false);
208 pizzasPanel.setVisible(false);
210 wrapper.add(detailWrapper);
214 private JTable initOrdersOverview(JPanel wrapper) {
215 JPanel tablePanel = new JPanel();
216 JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
218 wrapper.add(tablePanel);
223 private JTable initDeliveryOverview(JPanel wrapper) {
224 JPanel deliveryPanel = new JPanel();
225 JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
227 wrapper.add(deliveryPanel);
229 return deliveryTable;
232 private void initWaitingGroupsOverview(JPanel wrapper) {
233 JPanel tablePanel = new JPanel();
234 Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
236 wrapper.add(tablePanel);
239 private void initTablesOverview(JPanel wrapper) {
240 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
241 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
242 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
243 Util.createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
245 PizzeriaAgent.getInstance().getTablesModel()
246 .addTableModelListener(new TableModelListener() {
248 public void tableChanged(TableModelEvent e) {
249 String numberOfFreeTables = getNumberOfFreeTables();
250 log.info("Number of free tables changed: {}",
253 freeTablesLabel.setText(numberOfFreeTables);
258 wrapper.add(scrollPanePanel);
262 private String getNumberOfFreeTables() {
263 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
266 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
267 onTablesCreatedHandler = tablesCreatedHandler;