]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
[XVSM] Some simulation improvments, documentation
[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 int groupId = currentOrder.getGroupId();
154                 final DeliveryGroupData groupOfRow = deliveryOrdersModel.getGroupOfRow(currentOrder.getId()-1);
155
156                 pizzasOfDeliveryModel.setCurrentOrder(groupOfRow.getOrder());
157                 deliveryDetailsModel.setCurrentDelivery(groupOfRow);
158
159                 pizzasOfDeliveryModel.fireTableDataChanged();
160                 deliveryDetailsModel.fireTableDataChanged();
161             }
162         });
163
164         detailWrapper.add(detailsPanel);
165         detailWrapper.add(pizzasPanel);
166         detailsPanel.setVisible(false);
167         pizzasPanel.setVisible(false);
168
169         wrapper.add(detailWrapper);
170
171     }
172
173     private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
174         JPanel detailWrapper = new JPanel();
175         GridLayout wrapperLayout = new GridLayout(2, 1);
176         detailWrapper.setLayout(wrapperLayout);
177
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(), "");
182
183         /**
184          * Update the displayed order in the waiter and pizza detail tables when an
185          * order gets selected in the orders table
186          */
187         ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
188             @Override
189             public void valueChanged(ListSelectionEvent e) {
190                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
191                 int minIndex = lsm.getMinSelectionIndex();
192                 if (minIndex < 0) return;
193
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());
199
200                 waitersPanel.setVisible(true);
201                 pizzasPanel.setVisible(true);
202             }
203         });
204                 
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() {
209             @Override
210             public void tableChanged(TableModelEvent e) {
211                 final PizzasOfOrderModel pizzasOfOrderModel = PizzeriaAgent.getInstance().getPizzasOfOrderModel();
212                 final WaitersOfOrderModel waitersModel = PizzeriaAgent.getInstance().getWaitersModel();
213
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);
218
219                 pizzasOfOrderModel.setCurrentOrder(groupOfRow.getOrder());
220                 waitersModel.setCurrentGroup(groupOfRow);
221
222                 pizzasOfOrderModel.fireTableDataChanged();
223                 waitersModel.fireTableDataChanged();
224             }
225         });
226
227         detailWrapper.add(waitersPanel);
228         detailWrapper.add(pizzasPanel);
229         waitersPanel.setVisible(false);
230         pizzasPanel.setVisible(false);
231
232         wrapper.add(detailWrapper);
233
234     }
235
236     private JTable initOrdersOverview(JPanel wrapper) {
237         JPanel tablePanel = new JPanel();
238         JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
239
240         wrapper.add(tablePanel);
241
242         return orderTable;
243     }
244
245     private JTable initDeliveryOverview(JPanel wrapper) {
246         JPanel deliveryPanel = new JPanel();
247         JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
248
249         wrapper.add(deliveryPanel);
250
251         return deliveryTable;
252     }
253
254     private void initWaitingGroupsOverview(JPanel wrapper) {
255         JPanel tablePanel = new JPanel();
256         Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
257
258         wrapper.add(tablePanel);
259     }
260
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");
266
267         PizzeriaAgent.getInstance().getTablesModel()
268                 .addTableModelListener(new TableModelListener() {
269                     @Override
270                     public void tableChanged(TableModelEvent e) {
271                         String numberOfFreeTables = getNumberOfFreeTables();
272                         log.info("Number of free tables changed: {}",
273                                 numberOfFreeTables);
274
275                         freeTablesLabel.setText(numberOfFreeTables);
276                     }
277                 });
278
279
280         wrapper.add(scrollPanePanel);
281     }
282
283
284     private String getNumberOfFreeTables() {
285         return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
286     }
287
288     public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
289         onTablesCreatedHandler = tablesCreatedHandler;
290     }
291
292 }