]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
GUI fix for Tables OutOfBoundsException
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / pizzeria / gui / PizzeriaFrame.java
1 package at.ac.tuwien.sbc.valesriegler.pizzeria.gui;
2
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;
13
14 import javax.swing.*;
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;
20 import java.awt.*;
21 import java.util.ArrayList;
22 import java.util.List;
23
24 /**
25  * Base Frame of the Pizzeria GUI
26  *
27  * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
28  */
29 public class PizzeriaFrame extends JFrame {
30     private static final Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
31
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)";
39
40     private TablesCreatedHandler onTablesCreatedHandler;
41
42     public PizzeriaFrame() {
43         super("Pizzeria");
44     }
45
46     public void start() {
47
48
49         JPanel wrapper = new JPanel();
50         GridLayout wrapperLayout = new GridLayout(3, 2);
51         wrapper.setLayout(wrapperLayout);
52
53         // Create the tables overview
54         initTablesOverview(wrapper);
55
56         // Create the waiting groups table overview
57         initWaitingGroupsOverview(wrapper);
58
59         // Create the overview table of deliveries
60         JTable deliveryTable = initDeliveryOverview(wrapper);
61
62         // Create the details table for the deliveries containing the pizza, waiter and driver information
63         initDeliveryDetails(wrapper, deliveryTable);
64
65         // Create the overview table of the orders
66         JTable ordersTable = initOrdersOverview(wrapper);
67
68         // Create the order detail tables
69         initOrdersDetails(wrapper, ordersTable);
70
71         setContentPane(wrapper);
72         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
73
74         GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
75         this.setMaximizedBounds(env.getMaximumWindowBounds());
76         this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);
77
78         initModels();
79     }
80
81     private int getNumberOfTables() {
82         int numberOfTables;
83         String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
84         try {
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();
90         }
91
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();
96         }
97
98         return numberOfTables;
99     }
100
101     private void initModels() {
102         PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
103
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);
108
109     }
110
111     private void initDeliveryDetails(JPanel wrapper, JTable deliveryTable) {
112         JPanel detailWrapper = new JPanel();
113         GridLayout wrapperLayout = new GridLayout(2, 1);
114         detailWrapper.setLayout(wrapperLayout);
115
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(), "");
120
121         /**
122          * Update the displayed order in the waiter and pizza detail tables when an
123          * order gets selected in the orders table
124          */
125         final DeliveryOrdersModel deliveryOrdersModel = PizzeriaAgent.getInstance().getDeliveryOrdersModel();
126         deliveryTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
127             @Override
128             public void valueChanged(ListSelectionEvent e) {
129                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
130                 int minIndex = lsm.getMinSelectionIndex();
131                 if (minIndex < 0) return;
132
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);
139
140                 detailsPanel.setVisible(true);
141                 pizzasPanel.setVisible(true);
142             }
143         });
144
145         deliveryOrdersModel.addTableModelListener(new TableModelListener() {
146             @Override
147             public void tableChanged(TableModelEvent e) {
148                 final PizzasOfOrderModel pizzasOfDeliveryModel = PizzeriaAgent.getInstance().getPizzasOfDeliveryModel();
149                 final DeliveryDetailsModel deliveryDetailsModel = PizzeriaAgent.getInstance().getDeliveryDetailsModel();
150
151                 final Order currentOrder = pizzasOfDeliveryModel.getCurrentOrder();
152                 if (currentOrder == null) return;
153                 final DeliveryGroupData groupOfRow = deliveryOrdersModel.getHasOrderById(currentOrder.getGroupId());
154
155                 pizzasOfDeliveryModel.setCurrentOrder(groupOfRow.getOrder());
156                 deliveryDetailsModel.setCurrentDelivery(groupOfRow);
157
158                 pizzasOfDeliveryModel.fireTableDataChanged();
159                 deliveryDetailsModel.fireTableDataChanged();
160             }
161         });
162
163         detailWrapper.add(detailsPanel);
164         detailWrapper.add(pizzasPanel);
165         detailsPanel.setVisible(false);
166         pizzasPanel.setVisible(false);
167
168         wrapper.add(detailWrapper);
169
170     }
171
172     private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
173         JPanel detailWrapper = new JPanel();
174         GridLayout wrapperLayout = new GridLayout(2, 1);
175         detailWrapper.setLayout(wrapperLayout);
176
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(), "");
181
182         /**
183          * Update the displayed order in the waiter and pizza detail tables when an
184          * order gets selected in the orders table
185          */
186         ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
187             @Override
188             public void valueChanged(ListSelectionEvent e) {
189                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
190                 int minIndex = lsm.getMinSelectionIndex();
191                 if (minIndex < 0) return;
192
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());
198
199                 waitersPanel.setVisible(true);
200                 pizzasPanel.setVisible(true);
201             }
202         });
203                 
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() {
208             @Override
209             public void tableChanged(TableModelEvent e) {
210                 final PizzasOfOrderModel pizzasOfOrderModel = PizzeriaAgent.getInstance().getPizzasOfOrderModel();
211                 final WaitersOfOrderModel waitersModel = PizzeriaAgent.getInstance().getWaitersModel();
212
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());
217
218                 pizzasOfOrderModel.setCurrentOrder(groupOfRow.getOrder());
219                 waitersModel.setCurrentGroup(groupOfRow);
220
221                 pizzasOfOrderModel.fireTableDataChanged();
222                 waitersModel.fireTableDataChanged();
223             }
224         });
225
226         detailWrapper.add(waitersPanel);
227         detailWrapper.add(pizzasPanel);
228         waitersPanel.setVisible(false);
229         pizzasPanel.setVisible(false);
230
231         wrapper.add(detailWrapper);
232
233     }
234
235     private JTable initOrdersOverview(JPanel wrapper) {
236         JPanel tablePanel = new JPanel();
237         JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
238
239         wrapper.add(tablePanel);
240
241         return orderTable;
242     }
243
244     private JTable initDeliveryOverview(JPanel wrapper) {
245         JPanel deliveryPanel = new JPanel();
246         JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
247
248         wrapper.add(deliveryPanel);
249
250         return deliveryTable;
251     }
252
253     private void initWaitingGroupsOverview(JPanel wrapper) {
254         JPanel tablePanel = new JPanel();
255         Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
256
257         wrapper.add(tablePanel);
258     }
259
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");
265
266         PizzeriaAgent.getInstance().getTablesModel()
267                 .addTableModelListener(new TableModelListener() {
268                     @Override
269                     public void tableChanged(TableModelEvent e) {
270                         String numberOfFreeTables = getNumberOfFreeTables();
271                         log.info("Number of free tables changed: {}",
272                                 numberOfFreeTables);
273
274                         freeTablesLabel.setText(numberOfFreeTables);
275                     }
276                 });
277
278
279         wrapper.add(scrollPanePanel);
280     }
281
282
283     private String getNumberOfFreeTables() {
284         return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
285     }
286
287     public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
288         onTablesCreatedHandler = tablesCreatedHandler;
289     }
290
291 }