1 package at.ac.tuwien.sbc.valesriegler.pizzeria.gui;
3 import at.ac.tuwien.sbc.valesriegler.common.Util;
4 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
5 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent.TablesCreatedHandler;
6 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.*;
7 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
8 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
9 import at.ac.tuwien.sbc.valesriegler.types.Order;
10 import at.ac.tuwien.sbc.valesriegler.types.Table;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
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 java.util.ArrayList;
22 import java.util.List;
25 * Base Frame of the Pizzeria GUI
27 * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
29 public class PizzeriaFrame extends JFrame {
30 private static final Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
32 private static final String WRONG_INPUT = "Wrong input";
33 private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
34 private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
35 private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
36 private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
37 private static String PIZZAS_CAPTION = "Pizzas of order %d";
38 private static String FREE_TABLES = "There are currently %d free table(s)";
40 private TablesCreatedHandler onTablesCreatedHandler;
42 public PizzeriaFrame() {
49 JPanel wrapper = new JPanel();
50 GridLayout wrapperLayout = new GridLayout(3, 2);
51 wrapper.setLayout(wrapperLayout);
53 // Create the tables overview
54 initTablesOverview(wrapper);
56 // Create the waiting groups table overview
57 initWaitingGroupsOverview(wrapper);
59 // Create the overview table of deliveries
60 JTable deliveryTable = initDeliveryOverview(wrapper);
62 // Create the details table for the deliveries containing the pizza, waiter and driver information
63 initDeliveryDetails(wrapper, deliveryTable);
65 // Create the overview table of the orders
66 JTable ordersTable = initOrdersOverview(wrapper);
68 // Create the order detail tables
69 initOrdersDetails(wrapper, ordersTable);
71 setContentPane(wrapper);
72 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
77 private int getNumberOfTables() {
79 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
81 numberOfTables = Integer.parseInt(numberOfTablesInput);
82 } catch (NumberFormatException e) {
83 JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
84 JOptionPane.ERROR_MESSAGE);
85 return getNumberOfTables();
88 if (numberOfTables < 1) {
89 JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
90 JOptionPane.ERROR_MESSAGE);
91 return getNumberOfTables();
94 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 initDeliveryDetails(JPanel wrapper, JTable deliveryTable) {
108 JPanel detailWrapper = new JPanel();
109 GridLayout wrapperLayout = new GridLayout(2, 1);
110 detailWrapper.setLayout(wrapperLayout);
112 final JPanel detailsPanel = new JPanel();
113 final JPanel pizzasPanel = new JPanel();
114 Util.createTableInTitledPanel(detailsPanel, PizzeriaAgent.getInstance().getDeliveryDetailsModel(), "");
115 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfDeliveryModel(), "");
118 * Update the displayed order in the waiter and pizza detail tables when an
119 * order gets selected in the orders table
121 final DeliveryOrdersModel deliveryOrdersModel = PizzeriaAgent.getInstance().getDeliveryOrdersModel();
122 deliveryTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
124 public void valueChanged(ListSelectionEvent e) {
125 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
126 int minIndex = lsm.getMinSelectionIndex();
127 if (minIndex < 0) return;
129 DeliveryGroupData currentGroup = deliveryOrdersModel.getGroupOfRow(minIndex);
130 final Order order = currentGroup.getOrder();
131 detailsPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, order.getId())));
132 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, order.getId())));
133 PizzeriaAgent.getInstance().getDeliveryDetailsModel().setCurrentDelivery(currentGroup);
134 PizzeriaAgent.getInstance().getPizzasOfDeliveryModel().setCurrentOrder(order);
136 detailsPanel.setVisible(true);
137 pizzasPanel.setVisible(true);
141 deliveryOrdersModel.addTableModelListener(new TableModelListener() {
143 public void tableChanged(TableModelEvent e) {
144 final PizzasOfOrderModel pizzasOfDeliveryModel = PizzeriaAgent.getInstance().getPizzasOfDeliveryModel();
145 final DeliveryDetailsModel deliveryDetailsModel = PizzeriaAgent.getInstance().getDeliveryDetailsModel();
147 final Order currentOrder = pizzasOfDeliveryModel.getCurrentOrder();
148 if (currentOrder == null) return;
149 final int groupId = currentOrder.getGroupId();
150 final DeliveryGroupData groupOfRow = deliveryOrdersModel.getGroupOfRow(currentOrder.getId()-1);
152 pizzasOfDeliveryModel.setCurrentOrder(groupOfRow.getOrder());
153 deliveryDetailsModel.setCurrentDelivery(groupOfRow);
155 pizzasOfDeliveryModel.fireTableDataChanged();
156 deliveryDetailsModel.fireTableDataChanged();
160 detailWrapper.add(detailsPanel);
161 detailWrapper.add(pizzasPanel);
162 detailsPanel.setVisible(false);
163 pizzasPanel.setVisible(false);
165 wrapper.add(detailWrapper);
169 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
170 JPanel detailWrapper = new JPanel();
171 GridLayout wrapperLayout = new GridLayout(2, 1);
172 detailWrapper.setLayout(wrapperLayout);
174 final JPanel waitersPanel = new JPanel();
175 final JPanel pizzasPanel = new JPanel();
176 Util.createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
177 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfOrderModel(), "");
180 * Update the displayed order in the waiter and pizza detail tables when an
181 * order gets selected in the orders table
183 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
185 public void valueChanged(ListSelectionEvent e) {
186 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
187 int minIndex = lsm.getMinSelectionIndex();
188 if (minIndex < 0) return;
190 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
191 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
192 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
193 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
194 PizzeriaAgent.getInstance().getPizzasOfOrderModel().setCurrentOrder(currentGroup.getOrder());
196 waitersPanel.setVisible(true);
197 pizzasPanel.setVisible(true);
201 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
202 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
203 final OrdersOverviewModel ordersModel = PizzeriaAgent.getInstance().getOrdersModel();
204 ordersModel.addTableModelListener(new TableModelListener() {
206 public void tableChanged(TableModelEvent e) {
207 final PizzasOfOrderModel pizzasOfOrderModel = PizzeriaAgent.getInstance().getPizzasOfOrderModel();
208 final WaitersOfOrderModel waitersModel = PizzeriaAgent.getInstance().getWaitersModel();
210 final Order currentOrder = pizzasOfOrderModel.getCurrentOrder();
211 if (currentOrder == null) return;
212 final int groupId = currentOrder.getGroupId();
213 final GroupData groupOfRow = ordersModel.getGroupOfRow(currentOrder.getId()-1);
215 pizzasOfOrderModel.setCurrentOrder(groupOfRow.getOrder());
216 waitersModel.setCurrentGroup(groupOfRow);
218 pizzasOfOrderModel.fireTableDataChanged();
219 waitersModel.fireTableDataChanged();
223 detailWrapper.add(waitersPanel);
224 detailWrapper.add(pizzasPanel);
225 waitersPanel.setVisible(false);
226 pizzasPanel.setVisible(false);
228 wrapper.add(detailWrapper);
232 private JTable initOrdersOverview(JPanel wrapper) {
233 JPanel tablePanel = new JPanel();
234 JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
236 wrapper.add(tablePanel);
241 private JTable initDeliveryOverview(JPanel wrapper) {
242 JPanel deliveryPanel = new JPanel();
243 JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
245 wrapper.add(deliveryPanel);
247 return deliveryTable;
250 private void initWaitingGroupsOverview(JPanel wrapper) {
251 JPanel tablePanel = new JPanel();
252 Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
254 wrapper.add(tablePanel);
257 private void initTablesOverview(JPanel wrapper) {
258 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
259 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
260 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
261 Util.createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
263 PizzeriaAgent.getInstance().getTablesModel()
264 .addTableModelListener(new TableModelListener() {
266 public void tableChanged(TableModelEvent e) {
267 String numberOfFreeTables = getNumberOfFreeTables();
268 log.info("Number of free tables changed: {}",
271 freeTablesLabel.setText(numberOfFreeTables);
276 wrapper.add(scrollPanePanel);
280 private String getNumberOfFreeTables() {
281 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
284 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
285 onTablesCreatedHandler = tablesCreatedHandler;