]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
[XVSM] Some GroupAgent Container Refactoring. Full Driver<->DeliveryCustomer communic...
[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         initModels();
75     }
76
77     private int getNumberOfTables() {
78         int numberOfTables;
79         String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
80         try {
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();
86         }
87
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();
92         }
93
94         return numberOfTables;
95     }
96
97     private void initModels() {
98         PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
99
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);
104
105     }
106
107     private void initDeliveryDetails(JPanel wrapper, JTable deliveryTable) {
108         JPanel detailWrapper = new JPanel();
109         GridLayout wrapperLayout = new GridLayout(2, 1);
110         detailWrapper.setLayout(wrapperLayout);
111
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(), "");
116
117         /**
118          * Update the displayed order in the waiter and pizza detail tables when an
119          * order gets selected in the orders table
120          */
121         final DeliveryOrdersModel deliveryOrdersModel = PizzeriaAgent.getInstance().getDeliveryOrdersModel();
122         deliveryTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
123             @Override
124             public void valueChanged(ListSelectionEvent e) {
125                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
126                 int minIndex = lsm.getMinSelectionIndex();
127                 if (minIndex < 0) return;
128
129                 DeliveryGroupData currentGroup = deliveryOrdersModel.getGroupOfRow(minIndex + 1);
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);
135
136                 detailsPanel.setVisible(true);
137                 pizzasPanel.setVisible(true);
138             }
139         });
140
141         deliveryOrdersModel.addTableModelListener(new TableModelListener() {
142             @Override
143             public void tableChanged(TableModelEvent e) {
144                 final PizzasOfOrderModel pizzasOfDeliveryModel = PizzeriaAgent.getInstance().getPizzasOfDeliveryModel();
145                 final DeliveryDetailsModel deliveryDetailsModel = PizzeriaAgent.getInstance().getDeliveryDetailsModel();
146
147                 final Order currentOrder = pizzasOfDeliveryModel.getCurrentOrder();
148                 if (currentOrder == null) return;
149                 final int groupId = currentOrder.getGroupId();
150                 final DeliveryGroupData groupOfRow = deliveryOrdersModel.getGroupOfRow(groupId);
151
152                 pizzasOfDeliveryModel.setCurrentOrder(groupOfRow.getOrder());
153                 deliveryDetailsModel.setCurrentDelivery(groupOfRow);
154
155                 pizzasOfDeliveryModel.fireTableDataChanged();
156                 deliveryDetailsModel.fireTableDataChanged();
157             }
158         });
159
160         detailWrapper.add(detailsPanel);
161         detailWrapper.add(pizzasPanel);
162         detailsPanel.setVisible(false);
163         pizzasPanel.setVisible(false);
164
165         wrapper.add(detailWrapper);
166
167     }
168
169     private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
170         JPanel detailWrapper = new JPanel();
171         GridLayout wrapperLayout = new GridLayout(2, 1);
172         detailWrapper.setLayout(wrapperLayout);
173
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(), "");
178
179         /**
180          * Update the displayed order in the waiter and pizza detail tables when an
181          * order gets selected in the orders table
182          */
183         ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
184             @Override
185             public void valueChanged(ListSelectionEvent e) {
186                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
187                 int minIndex = lsm.getMinSelectionIndex();
188                 if (minIndex < 0) return;
189
190                 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex + 1);
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());
195
196                 waitersPanel.setVisible(true);
197                 pizzasPanel.setVisible(true);
198             }
199         });
200                 
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() {
205             @Override
206             public void tableChanged(TableModelEvent e) {
207                 final PizzasOfOrderModel pizzasOfOrderModel = PizzeriaAgent.getInstance().getPizzasOfOrderModel();
208                 final WaitersOfOrderModel waitersModel = PizzeriaAgent.getInstance().getWaitersModel();
209
210                 final Order currentOrder = pizzasOfOrderModel.getCurrentOrder();
211                 if (currentOrder == null) return;
212                 final int groupId = currentOrder.getGroupId();
213                 final GroupData groupOfRow = ordersModel.getGroupOfRow(groupId);
214
215                 pizzasOfOrderModel.setCurrentOrder(groupOfRow.getOrder());
216                 waitersModel.setCurrentGroup(groupOfRow);
217
218                 pizzasOfOrderModel.fireTableDataChanged();
219                 waitersModel.fireTableDataChanged();
220             }
221         });
222
223         detailWrapper.add(waitersPanel);
224         detailWrapper.add(pizzasPanel);
225         waitersPanel.setVisible(false);
226         pizzasPanel.setVisible(false);
227
228         wrapper.add(detailWrapper);
229
230     }
231
232     private JTable initOrdersOverview(JPanel wrapper) {
233         JPanel tablePanel = new JPanel();
234         JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
235
236         wrapper.add(tablePanel);
237
238         return orderTable;
239     }
240
241     private JTable initDeliveryOverview(JPanel wrapper) {
242         JPanel deliveryPanel = new JPanel();
243         JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
244
245         wrapper.add(deliveryPanel);
246
247         return deliveryTable;
248     }
249
250     private void initWaitingGroupsOverview(JPanel wrapper) {
251         JPanel tablePanel = new JPanel();
252         Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
253
254         wrapper.add(tablePanel);
255     }
256
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");
262
263         PizzeriaAgent.getInstance().getTablesModel()
264                 .addTableModelListener(new TableModelListener() {
265                     @Override
266                     public void tableChanged(TableModelEvent e) {
267                         String numberOfFreeTables = getNumberOfFreeTables();
268                         log.info("Number of free tables changed: {}",
269                                 numberOfFreeTables);
270
271                         freeTablesLabel.setText(numberOfFreeTables);
272                     }
273                 });
274
275
276         wrapper.add(scrollPanePanel);
277     }
278
279
280     private String getNumberOfFreeTables() {
281         return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
282     }
283
284     public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
285         onTablesCreatedHandler = tablesCreatedHandler;
286     }
287
288 }