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 at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
23 import at.ac.tuwien.sbc.valesriegler.types.Order;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
27 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
28 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent.TablesCreatedHandler;
29 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
30 import at.ac.tuwien.sbc.valesriegler.types.Table;
33 * Base Frame of the Pizzeria GUI
35 * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
37 public class PizzeriaFrame extends JFrame {
38 private static final Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
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 TablesCreatedHandler onTablesCreatedHandler;
50 public PizzeriaFrame() {
57 JPanel wrapper = new JPanel();
58 GridLayout wrapperLayout = new GridLayout(3, 2);
59 wrapper.setLayout(wrapperLayout);
61 // Create the tables overview
62 initTablesOverview(wrapper);
64 // Create the waiting groups table overview
65 initWaitingGroupsOverview(wrapper);
67 // Create the overview table of deliveries
68 JTable deliveryTable = initDeliveryOverview(wrapper);
70 // Create the details table for the deliveries containing the pizza, waiter and driver information
71 initDeliveryDetails(wrapper, deliveryTable);
73 // Create the overview table of the orders
74 JTable ordersTable = initOrdersOverview(wrapper);
76 // Create the order detail tables
77 initOrdersDetails(wrapper, ordersTable);
79 setContentPane(wrapper);
80 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
85 private int getNumberOfTables() {
87 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
89 numberOfTables = Integer.parseInt(numberOfTablesInput);
90 } catch (NumberFormatException e) {
91 JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
92 JOptionPane.ERROR_MESSAGE);
93 return getNumberOfTables();
96 if (numberOfTables < 1) {
97 JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
98 JOptionPane.ERROR_MESSAGE);
99 return getNumberOfTables();
102 return numberOfTables;
104 private void initModels() {
105 PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
107 // When the tables get created in the first place, the handler is informed
108 int numberOfTables = getNumberOfTables();
109 List<Table> freeTablesCreated = PizzeriaAgent.getInstance().getTablesModel().createFreeTables(numberOfTables);
110 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
114 private void initDeliveryDetails(JPanel wrapper, JTable deliveryTable) {
115 JPanel detailWrapper = new JPanel();
116 GridLayout wrapperLayout = new GridLayout(2, 1);
117 detailWrapper.setLayout(wrapperLayout);
119 final JPanel detailsPanel = new JPanel();
120 final JPanel pizzasPanel = new JPanel();
121 Util.createTableInTitledPanel(detailsPanel, PizzeriaAgent.getInstance().getDeliveryDetailsModel(), "");
122 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfDeliveryModel(), "");
125 * Update the displayed order in the waiter and pizza detail tables when an
126 * order gets selected in the orders table
128 deliveryTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
130 public void valueChanged(ListSelectionEvent e) {
131 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
132 int minIndex = lsm.getMinSelectionIndex();
133 if (minIndex < 0) return;
135 DeliveryGroupData currentGroup = PizzeriaAgent.getInstance().getDeliveryOrdersModel().getGroupOfRow(minIndex);
136 final Order order = currentGroup.getOrder();
137 detailsPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, order.getId())));
138 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, order.getId())));
139 PizzeriaAgent.getInstance().getDeliveryDetailsModel().setCurrentDelivery(currentGroup);
140 PizzeriaAgent.getInstance().getPizzasOfDeliveryModel().setCurrentOrder(order);
142 log.info("THIS IS THE ORDER: {}", order.toString());
144 detailsPanel.setVisible(true);
145 pizzasPanel.setVisible(true);
149 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
150 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
151 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
153 public void tableChanged(TableModelEvent e) {
154 PizzeriaAgent.getInstance().getPizzasOfOrderModel().fireTableDataChanged();
155 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
158 PizzeriaAgent.getInstance().getDeliveryOrdersModel().addTableModelListener(new TableModelListener() {
160 public void tableChanged(TableModelEvent e) {
161 PizzeriaAgent.getInstance().getPizzasOfDeliveryModel().fireTableDataChanged();
162 PizzeriaAgent.getInstance().getDeliveryDetailsModel().fireTableDataChanged();
166 detailWrapper.add(detailsPanel);
167 detailWrapper.add(pizzasPanel);
168 detailsPanel.setVisible(false);
169 pizzasPanel.setVisible(false);
171 wrapper.add(detailWrapper);
175 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
176 JPanel detailWrapper = new JPanel();
177 GridLayout wrapperLayout = new GridLayout(2, 1);
178 detailWrapper.setLayout(wrapperLayout);
180 final JPanel waitersPanel = new JPanel();
181 final JPanel pizzasPanel = new JPanel();
182 Util.createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
183 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfOrderModel(), "");
186 * Update the displayed order in the waiter and pizza detail tables when an
187 * order gets selected in the orders table
189 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
191 public void valueChanged(ListSelectionEvent e) {
192 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
193 int minIndex = lsm.getMinSelectionIndex();
194 if(minIndex < 0) return;
196 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
197 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
198 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
199 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
200 PizzeriaAgent.getInstance().getPizzasOfOrderModel().setCurrentOrder(currentGroup.getOrder());
202 waitersPanel.setVisible(true);
203 pizzasPanel.setVisible(true);
207 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
208 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
209 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
211 public void tableChanged(TableModelEvent e) {
212 PizzeriaAgent.getInstance().getPizzasOfOrderModel().fireTableDataChanged();
213 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
217 detailWrapper.add(waitersPanel);
218 detailWrapper.add(pizzasPanel);
219 waitersPanel.setVisible(false);
220 pizzasPanel.setVisible(false);
222 wrapper.add(detailWrapper);
226 private JTable initOrdersOverview(JPanel wrapper) {
227 JPanel tablePanel = new JPanel();
228 JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
230 wrapper.add(tablePanel);
235 private JTable initDeliveryOverview(JPanel wrapper) {
236 JPanel deliveryPanel = new JPanel();
237 JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
239 wrapper.add(deliveryPanel);
241 return deliveryTable;
244 private void initWaitingGroupsOverview(JPanel wrapper) {
245 JPanel tablePanel = new JPanel();
246 Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
248 wrapper.add(tablePanel);
251 private void initTablesOverview(JPanel wrapper) {
252 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
253 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
254 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
255 Util.createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
257 PizzeriaAgent.getInstance().getTablesModel()
258 .addTableModelListener(new TableModelListener() {
260 public void tableChanged(TableModelEvent e) {
261 String numberOfFreeTables = getNumberOfFreeTables();
262 log.info("Number of free tables changed: {}",
265 freeTablesLabel.setText(numberOfFreeTables);
270 wrapper.add(scrollPanePanel);
274 private String getNumberOfFreeTables() {
275 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
278 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
279 onTablesCreatedHandler = tablesCreatedHandler;