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);
74 GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
75 this.setMaximizedBounds(env.getMaximumWindowBounds());
76 this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);
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;
101 private void initModels() {
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 initDeliveryDetails(JPanel wrapper, JTable deliveryTable) {
112 JPanel detailWrapper = new JPanel();
113 GridLayout wrapperLayout = new GridLayout(2, 1);
114 detailWrapper.setLayout(wrapperLayout);
116 final JPanel detailsPanel = new JPanel();
117 final JPanel pizzasPanel = new JPanel();
118 Util.createTableInTitledPanel(detailsPanel, PizzeriaAgent.getInstance().getDeliveryDetailsModel(), "");
119 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfDeliveryModel(), "");
122 * Update the displayed order in the waiter and pizza detail tables when an
123 * order gets selected in the orders table
125 final DeliveryOrdersModel deliveryOrdersModel = PizzeriaAgent.getInstance().getDeliveryOrdersModel();
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 DeliveryGroupData currentGroup = deliveryOrdersModel.getGroupOfRow(minIndex);
134 final Order order = currentGroup.getOrder();
135 detailsPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, order.getId())));
136 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, order.getId())));
137 PizzeriaAgent.getInstance().getDeliveryDetailsModel().setCurrentDelivery(currentGroup);
138 PizzeriaAgent.getInstance().getPizzasOfDeliveryModel().setCurrentOrder(order);
140 detailsPanel.setVisible(true);
141 pizzasPanel.setVisible(true);
145 deliveryOrdersModel.addTableModelListener(new TableModelListener() {
147 public void tableChanged(TableModelEvent e) {
148 final PizzasOfOrderModel pizzasOfDeliveryModel = PizzeriaAgent.getInstance().getPizzasOfDeliveryModel();
149 final DeliveryDetailsModel deliveryDetailsModel = PizzeriaAgent.getInstance().getDeliveryDetailsModel();
151 final Order currentOrder = pizzasOfDeliveryModel.getCurrentOrder();
152 if (currentOrder == null) return;
153 final int groupId = currentOrder.getGroupId();
154 final DeliveryGroupData groupOfRow = deliveryOrdersModel.getGroupOfRow(currentOrder.getId()-1);
156 pizzasOfDeliveryModel.setCurrentOrder(groupOfRow.getOrder());
157 deliveryDetailsModel.setCurrentDelivery(groupOfRow);
159 pizzasOfDeliveryModel.fireTableDataChanged();
160 deliveryDetailsModel.fireTableDataChanged();
164 detailWrapper.add(detailsPanel);
165 detailWrapper.add(pizzasPanel);
166 detailsPanel.setVisible(false);
167 pizzasPanel.setVisible(false);
169 wrapper.add(detailWrapper);
173 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
174 JPanel detailWrapper = new JPanel();
175 GridLayout wrapperLayout = new GridLayout(2, 1);
176 detailWrapper.setLayout(wrapperLayout);
178 final JPanel waitersPanel = new JPanel();
179 final JPanel pizzasPanel = new JPanel();
180 Util.createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
181 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfOrderModel(), "");
184 * Update the displayed order in the waiter and pizza detail tables when an
185 * order gets selected in the orders table
187 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
189 public void valueChanged(ListSelectionEvent e) {
190 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
191 int minIndex = lsm.getMinSelectionIndex();
192 if (minIndex < 0) return;
194 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
195 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
196 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
197 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
198 PizzeriaAgent.getInstance().getPizzasOfOrderModel().setCurrentOrder(currentGroup.getOrder());
200 waitersPanel.setVisible(true);
201 pizzasPanel.setVisible(true);
205 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
206 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
207 final OrdersOverviewModel ordersModel = PizzeriaAgent.getInstance().getOrdersModel();
208 ordersModel.addTableModelListener(new TableModelListener() {
210 public void tableChanged(TableModelEvent e) {
211 final PizzasOfOrderModel pizzasOfOrderModel = PizzeriaAgent.getInstance().getPizzasOfOrderModel();
212 final WaitersOfOrderModel waitersModel = PizzeriaAgent.getInstance().getWaitersModel();
214 final Order currentOrder = pizzasOfOrderModel.getCurrentOrder();
215 if (currentOrder == null) return;
216 final int groupId = currentOrder.getGroupId();
217 final GroupData groupOfRow = ordersModel.getGroupOfRow(currentOrder.getId()-1);
219 pizzasOfOrderModel.setCurrentOrder(groupOfRow.getOrder());
220 waitersModel.setCurrentGroup(groupOfRow);
222 pizzasOfOrderModel.fireTableDataChanged();
223 waitersModel.fireTableDataChanged();
227 detailWrapper.add(waitersPanel);
228 detailWrapper.add(pizzasPanel);
229 waitersPanel.setVisible(false);
230 pizzasPanel.setVisible(false);
232 wrapper.add(detailWrapper);
236 private JTable initOrdersOverview(JPanel wrapper) {
237 JPanel tablePanel = new JPanel();
238 JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
240 wrapper.add(tablePanel);
245 private JTable initDeliveryOverview(JPanel wrapper) {
246 JPanel deliveryPanel = new JPanel();
247 JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
249 wrapper.add(deliveryPanel);
251 return deliveryTable;
254 private void initWaitingGroupsOverview(JPanel wrapper) {
255 JPanel tablePanel = new JPanel();
256 Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
258 wrapper.add(tablePanel);
261 private void initTablesOverview(JPanel wrapper) {
262 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
263 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
264 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
265 Util.createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
267 PizzeriaAgent.getInstance().getTablesModel()
268 .addTableModelListener(new TableModelListener() {
270 public void tableChanged(TableModelEvent e) {
271 String numberOfFreeTables = getNumberOfFreeTables();
272 log.info("Number of free tables changed: {}",
275 freeTablesLabel.setText(numberOfFreeTables);
280 wrapper.add(scrollPanePanel);
284 private String getNumberOfFreeTables() {
285 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
288 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
289 onTablesCreatedHandler = tablesCreatedHandler;