]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
[XVSM] Add theoretic persistence+recovery support.
[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 PizzeriaFrame(String id) {
47         super("Pizzeria: " + id);
48     }
49
50     public void start() {
51
52
53         JPanel wrapper = new JPanel();
54         GridLayout wrapperLayout = new GridLayout(3, 2);
55         wrapper.setLayout(wrapperLayout);
56
57         // Create the tables overview
58         initTablesOverview(wrapper);
59
60         // Create the waiting groups table overview
61         initWaitingGroupsOverview(wrapper);
62
63         // Create the overview table of deliveries
64         JTable deliveryTable = initDeliveryOverview(wrapper);
65
66         // Create the details table for the deliveries containing the pizza, waiter and driver information
67         initDeliveryDetails(wrapper, deliveryTable);
68
69         // Create the overview table of the orders
70         JTable ordersTable = initOrdersOverview(wrapper);
71
72         // Create the order detail tables
73         initOrdersDetails(wrapper, ordersTable);
74
75         setContentPane(wrapper);
76         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
77
78         GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
79         this.setMaximizedBounds(env.getMaximumWindowBounds());
80         this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);
81
82         initModels();
83     }
84
85     private int getNumberOfTables() {
86         int numberOfTables;
87         String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
88         try {
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();
94         }
95
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();
100         }
101
102         return numberOfTables;
103     }
104
105     private void initModels() {
106         PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
107
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);
112
113     }
114
115     private void initDeliveryDetails(JPanel wrapper, JTable deliveryTable) {
116         JPanel detailWrapper = new JPanel();
117         GridLayout wrapperLayout = new GridLayout(2, 1);
118         detailWrapper.setLayout(wrapperLayout);
119
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(), "");
124
125         /**
126          * Update the displayed order in the waiter and pizza detail tables when an
127          * order gets selected in the orders table
128          */
129         final DeliveryOrdersModel deliveryOrdersModel = PizzeriaAgent.getInstance().getDeliveryOrdersModel();
130         deliveryTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
131             @Override
132             public void valueChanged(ListSelectionEvent e) {
133                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
134                 int minIndex = lsm.getMinSelectionIndex();
135                 if (minIndex < 0) return;
136
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);
143
144                 detailsPanel.setVisible(true);
145                 pizzasPanel.setVisible(true);
146             }
147         });
148
149         deliveryOrdersModel.addTableModelListener(new TableModelListener() {
150             @Override
151             public void tableChanged(TableModelEvent e) {
152                 final PizzasOfOrderModel pizzasOfDeliveryModel = PizzeriaAgent.getInstance().getPizzasOfDeliveryModel();
153                 final DeliveryDetailsModel deliveryDetailsModel = PizzeriaAgent.getInstance().getDeliveryDetailsModel();
154
155                 final Order currentOrder = pizzasOfDeliveryModel.getCurrentOrder();
156                 if (currentOrder == null) return;
157                 final DeliveryGroupData groupOfRow = deliveryOrdersModel.getHasOrderById(currentOrder.getGroupId());
158
159                 pizzasOfDeliveryModel.setCurrentOrder(groupOfRow.getOrder());
160                 deliveryDetailsModel.setCurrentDelivery(groupOfRow);
161
162                 pizzasOfDeliveryModel.fireTableDataChanged();
163                 deliveryDetailsModel.fireTableDataChanged();
164             }
165         });
166
167         detailWrapper.add(detailsPanel);
168         detailWrapper.add(pizzasPanel);
169         detailsPanel.setVisible(false);
170         pizzasPanel.setVisible(false);
171
172         wrapper.add(detailWrapper);
173
174     }
175
176     private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
177         JPanel detailWrapper = new JPanel();
178         GridLayout wrapperLayout = new GridLayout(2, 1);
179         detailWrapper.setLayout(wrapperLayout);
180
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(), "");
185
186         /**
187          * Update the displayed order in the waiter and pizza detail tables when an
188          * order gets selected in the orders table
189          */
190         ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
191             @Override
192             public void valueChanged(ListSelectionEvent e) {
193                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
194                 int minIndex = lsm.getMinSelectionIndex();
195                 if (minIndex < 0) return;
196
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());
202
203                 waitersPanel.setVisible(true);
204                 pizzasPanel.setVisible(true);
205             }
206         });
207                 
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() {
212             @Override
213             public void tableChanged(TableModelEvent e) {
214                 final PizzasOfOrderModel pizzasOfOrderModel = PizzeriaAgent.getInstance().getPizzasOfOrderModel();
215                 final WaitersOfOrderModel waitersModel = PizzeriaAgent.getInstance().getWaitersModel();
216
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());
221
222                 pizzasOfOrderModel.setCurrentOrder(groupOfRow.getOrder());
223                 waitersModel.setCurrentGroup(groupOfRow);
224
225                 pizzasOfOrderModel.fireTableDataChanged();
226                 waitersModel.fireTableDataChanged();
227             }
228         });
229
230         detailWrapper.add(waitersPanel);
231         detailWrapper.add(pizzasPanel);
232         waitersPanel.setVisible(false);
233         pizzasPanel.setVisible(false);
234
235         wrapper.add(detailWrapper);
236
237     }
238
239     private JTable initOrdersOverview(JPanel wrapper) {
240         JPanel tablePanel = new JPanel();
241         JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
242
243         wrapper.add(tablePanel);
244
245         return orderTable;
246     }
247
248     private JTable initDeliveryOverview(JPanel wrapper) {
249         JPanel deliveryPanel = new JPanel();
250         JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
251
252         wrapper.add(deliveryPanel);
253
254         return deliveryTable;
255     }
256
257     private void initWaitingGroupsOverview(JPanel wrapper) {
258         JPanel tablePanel = new JPanel();
259         Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
260
261         wrapper.add(tablePanel);
262     }
263
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");
269
270         PizzeriaAgent.getInstance().getTablesModel()
271                 .addTableModelListener(new TableModelListener() {
272                     @Override
273                     public void tableChanged(TableModelEvent e) {
274                         String numberOfFreeTables = getNumberOfFreeTables();
275                         log.info("Number of free tables changed: {}",
276                                 numberOfFreeTables);
277
278                         freeTablesLabel.setText(numberOfFreeTables);
279                     }
280                 });
281
282
283         wrapper.add(scrollPanePanel);
284     }
285
286
287     private String getNumberOfFreeTables() {
288         return String.format(FREE_TABLES, PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
289     }
290
291     public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
292         onTablesCreatedHandler = tablesCreatedHandler;
293     }
294
295 }