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 DeliveryGroupData groupOfRow = deliveryOrdersModel.getHasOrderById(currentOrder.getGroupId());
155 pizzasOfDeliveryModel.setCurrentOrder(groupOfRow.getOrder());
156 deliveryDetailsModel.setCurrentDelivery(groupOfRow);
158 pizzasOfDeliveryModel.fireTableDataChanged();
159 deliveryDetailsModel.fireTableDataChanged();
163 detailWrapper.add(detailsPanel);
164 detailWrapper.add(pizzasPanel);
165 detailsPanel.setVisible(false);
166 pizzasPanel.setVisible(false);
168 wrapper.add(detailWrapper);
172 private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
173 JPanel detailWrapper = new JPanel();
174 GridLayout wrapperLayout = new GridLayout(2, 1);
175 detailWrapper.setLayout(wrapperLayout);
177 final JPanel waitersPanel = new JPanel();
178 final JPanel pizzasPanel = new JPanel();
179 Util.createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
180 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfOrderModel(), "");
183 * Update the displayed order in the waiter and pizza detail tables when an
184 * order gets selected in the orders table
186 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
188 public void valueChanged(ListSelectionEvent e) {
189 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
190 int minIndex = lsm.getMinSelectionIndex();
191 if (minIndex < 0) return;
193 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
194 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
195 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
196 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
197 PizzeriaAgent.getInstance().getPizzasOfOrderModel().setCurrentOrder(currentGroup.getOrder());
199 waitersPanel.setVisible(true);
200 pizzasPanel.setVisible(true);
204 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
205 When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
206 final OrdersOverviewModel ordersModel = PizzeriaAgent.getInstance().getOrdersModel();
207 ordersModel.addTableModelListener(new TableModelListener() {
209 public void tableChanged(TableModelEvent e) {
210 final PizzasOfOrderModel pizzasOfOrderModel = PizzeriaAgent.getInstance().getPizzasOfOrderModel();
211 final WaitersOfOrderModel waitersModel = PizzeriaAgent.getInstance().getWaitersModel();
213 final Order currentOrder = pizzasOfOrderModel.getCurrentOrder();
214 if (currentOrder == null) return;
215 final int groupId = currentOrder.getGroupId();
216 final GroupData groupOfRow = ordersModel.getHasOrderById(currentOrder.getGroupId());
218 pizzasOfOrderModel.setCurrentOrder(groupOfRow.getOrder());
219 waitersModel.setCurrentGroup(groupOfRow);
221 pizzasOfOrderModel.fireTableDataChanged();
222 waitersModel.fireTableDataChanged();
226 detailWrapper.add(waitersPanel);
227 detailWrapper.add(pizzasPanel);
228 waitersPanel.setVisible(false);
229 pizzasPanel.setVisible(false);
231 wrapper.add(detailWrapper);
235 private JTable initOrdersOverview(JPanel wrapper) {
236 JPanel tablePanel = new JPanel();
237 JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
239 wrapper.add(tablePanel);
244 private JTable initDeliveryOverview(JPanel wrapper) {
245 JPanel deliveryPanel = new JPanel();
246 JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
248 wrapper.add(deliveryPanel);
250 return deliveryTable;
253 private void initWaitingGroupsOverview(JPanel wrapper) {
254 JPanel tablePanel = new JPanel();
255 Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
257 wrapper.add(tablePanel);
260 private void initTablesOverview(JPanel wrapper) {
261 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
262 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
263 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
264 Util.createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
266 PizzeriaAgent.getInstance().getTablesModel()
267 .addTableModelListener(new TableModelListener() {
269 public void tableChanged(TableModelEvent e) {
270 String numberOfFreeTables = getNumberOfFreeTables();
271 log.info("Number of free tables changed: {}",
274 freeTablesLabel.setText(numberOfFreeTables);
279 wrapper.add(scrollPanePanel);
283 private String getNumberOfFreeTables() {
284 return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
287 public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
288 onTablesCreatedHandler = tablesCreatedHandler;