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() {
46 public PizzeriaFrame(String id) {
47 super("Pizzeria: " + id);
53 JPanel wrapper = new JPanel();
54 GridLayout wrapperLayout = new GridLayout(3, 2);
55 wrapper.setLayout(wrapperLayout);
57 // Create the tables overview
58 initTablesOverview(wrapper);
60 // Create the waiting groups table overview
61 initWaitingGroupsOverview(wrapper);
63 // Create the overview table of deliveries
64 JTable deliveryTable = initDeliveryOverview(wrapper);
66 // Create the details table for the deliveries containing the pizza, waiter and driver information
67 initDeliveryDetails(wrapper, deliveryTable);
69 // Create the overview table of the orders
70 JTable ordersTable = initOrdersOverview(wrapper);
72 // Create the order detail tables
73 initOrdersDetails(wrapper, ordersTable);
75 setContentPane(wrapper);
76 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
78 GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
79 this.setMaximizedBounds(env.getMaximumWindowBounds());
80 this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);
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 < 0) {
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;
105 private void initModels() {
106 PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
108 // When the tables get created in the first place, the handler is informed
109 int numberOfTables = getNumberOfTables();
110 List<Table> freeTablesCreated = PizzeriaAgent.getInstance().getTablesModel().createFreeTables(numberOfTables);
111 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
115 private void initDeliveryDetails(JPanel wrapper, JTable deliveryTable) {
116 JPanel detailWrapper = new JPanel();
117 GridLayout wrapperLayout = new GridLayout(2, 1);
118 detailWrapper.setLayout(wrapperLayout);
120 final JPanel detailsPanel = new JPanel();
121 final JPanel pizzasPanel = new JPanel();
122 Util.createTableInTitledPanel(detailsPanel, PizzeriaAgent.getInstance().getDeliveryDetailsModel(), "");
123 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfDeliveryModel(), "");
126 * Update the displayed order in the waiter and pizza detail tables when an
127 * order gets selected in the orders table
129 final DeliveryOrdersModel deliveryOrdersModel = PizzeriaAgent.getInstance().getDeliveryOrdersModel();
130 deliveryTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
132 public void valueChanged(ListSelectionEvent e) {
133 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
134 int minIndex = lsm.getMinSelectionIndex();
135 if (minIndex < 0) return;
137 DeliveryGroupData currentGroup = deliveryOrdersModel.getGroupOfRow(minIndex);
138 final Order order = currentGroup.getOrder();
139 detailsPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, order.getId())));
140 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, order.getId())));
141 PizzeriaAgent.getInstance().getDeliveryDetailsModel().setCurrentDelivery(currentGroup);
142 PizzeriaAgent.getInstance().getPizzasOfDeliveryModel().setCurrentOrder(order);
144 detailsPanel.setVisible(true);
145 pizzasPanel.setVisible(true);
149 deliveryOrdersModel.addTableModelListener(new TableModelListener() {
151 public void tableChanged(TableModelEvent e) {
152 final PizzasOfOrderModel pizzasOfDeliveryModel = PizzeriaAgent.getInstance().getPizzasOfDeliveryModel();
153 final DeliveryDetailsModel deliveryDetailsModel = PizzeriaAgent.getInstance().getDeliveryDetailsModel();
155 final Order currentOrder = pizzasOfDeliveryModel.getCurrentOrder();
156 if (currentOrder == null) return;
157 final DeliveryGroupData groupOfRow = deliveryOrdersModel.getHasOrderById(currentOrder.getGroupId());
159 pizzasOfDeliveryModel.setCurrentOrder(groupOfRow.getOrder());
160 deliveryDetailsModel.setCurrentDelivery(groupOfRow);
162 pizzasOfDeliveryModel.fireTableDataChanged();
163 deliveryDetailsModel.fireTableDataChanged();
167 detailWrapper.add(detailsPanel);
168 detailWrapper.add(pizzasPanel);
169 detailsPanel.setVisible(false);
170 pizzasPanel.setVisible(false);
172 wrapper.add(detailWrapper);
176 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
177 JPanel detailWrapper = new JPanel();
178 GridLayout wrapperLayout = new GridLayout(2, 1);
179 detailWrapper.setLayout(wrapperLayout);
181 final JPanel waitersPanel = new JPanel();
182 final JPanel pizzasPanel = new JPanel();
183 Util.createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
184 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfOrderModel(), "");
187 * Update the displayed order in the waiter and pizza detail tables when an
188 * order gets selected in the orders table
190 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
192 public void valueChanged(ListSelectionEvent e) {
193 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
194 int minIndex = lsm.getMinSelectionIndex();
195 if (minIndex < 0) return;
197 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
198 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
199 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
200 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
201 PizzeriaAgent.getInstance().getPizzasOfOrderModel().setCurrentOrder(currentGroup.getOrder());
203 waitersPanel.setVisible(true);
204 pizzasPanel.setVisible(true);
208 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
209 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
210 final OrdersOverviewModel ordersModel = PizzeriaAgent.getInstance().getOrdersModel();
211 ordersModel.addTableModelListener(new TableModelListener() {
213 public void tableChanged(TableModelEvent e) {
214 final PizzasOfOrderModel pizzasOfOrderModel = PizzeriaAgent.getInstance().getPizzasOfOrderModel();
215 final WaitersOfOrderModel waitersModel = PizzeriaAgent.getInstance().getWaitersModel();
217 final Order currentOrder = pizzasOfOrderModel.getCurrentOrder();
218 if (currentOrder == null) return;
219 final int groupId = currentOrder.getGroupId();
220 final GroupData groupOfRow = ordersModel.getHasOrderById(currentOrder.getGroupId());
222 pizzasOfOrderModel.setCurrentOrder(groupOfRow.getOrder());
223 waitersModel.setCurrentGroup(groupOfRow);
225 pizzasOfOrderModel.fireTableDataChanged();
226 waitersModel.fireTableDataChanged();
230 detailWrapper.add(waitersPanel);
231 detailWrapper.add(pizzasPanel);
232 waitersPanel.setVisible(false);
233 pizzasPanel.setVisible(false);
235 wrapper.add(detailWrapper);
239 private JTable initOrdersOverview(JPanel wrapper) {
240 JPanel tablePanel = new JPanel();
241 JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
243 wrapper.add(tablePanel);
248 private JTable initDeliveryOverview(JPanel wrapper) {
249 JPanel deliveryPanel = new JPanel();
250 JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
252 wrapper.add(deliveryPanel);
254 return deliveryTable;
257 private void initWaitingGroupsOverview(JPanel wrapper) {
258 JPanel tablePanel = new JPanel();
259 Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
261 wrapper.add(tablePanel);
264 private void initTablesOverview(JPanel wrapper) {
265 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
266 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
267 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
268 Util.createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
270 PizzeriaAgent.getInstance().getTablesModel()
271 .addTableModelListener(new TableModelListener() {
273 public void tableChanged(TableModelEvent e) {
274 String numberOfFreeTables = getNumberOfFreeTables();
275 log.info("Number of free tables changed: {}",
278 freeTablesLabel.setText(numberOfFreeTables);
283 wrapper.add(scrollPanePanel);
287 private String getNumberOfFreeTables() {
288 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
291 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
292 onTablesCreatedHandler = tablesCreatedHandler;