]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
Adjust Pizzeria GUI to display delivery orders. Show pizzeria identifier in Group...
[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 java.awt.GridBagConstraints;
4 import java.awt.GridBagLayout;
5 import java.awt.GridLayout;
6 import java.util.ArrayList;
7 import java.util.List;
8
9 import javax.swing.JFrame;
10 import javax.swing.JLabel;
11 import javax.swing.JOptionPane;
12 import javax.swing.JPanel;
13 import javax.swing.JTable;
14 import javax.swing.ListSelectionModel;
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
21 import at.ac.tuwien.sbc.valesriegler.common.Util;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
26 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent.TablesCreatedHandler;
27 import at.ac.tuwien.sbc.valesriegler.types.GroupData;
28 import at.ac.tuwien.sbc.valesriegler.types.Table;
29
30 /**
31  * Base Frame of the Pizzeria GUI
32  * 
33  * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
34  */
35 public class PizzeriaFrame extends JFrame {
36         private static final Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
37         
38         private static final String WRONG_INPUT = "Wrong input";
39         private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
40         private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
41         private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
42         private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
43         private static String PIZZAS_CAPTION = "Pizzas of order %d";
44         private static String FREE_TABLES = "There are currently %d free table(s)";
45
46         private TablesCreatedHandler onTablesCreatedHandler;
47
48         public PizzeriaFrame() {
49                 super("Pizzeria");
50         }
51
52         public void start() {
53                 
54
55                 JPanel wrapper = new JPanel();
56                 GridLayout wrapperLayout = new GridLayout(3, 2);
57                 wrapper.setLayout(wrapperLayout);
58
59                 // Create the tables overview
60                 initTablesOverview(wrapper);
61
62                 // Create the waiting groups table overview
63                 initWaitingGroupsOverview(wrapper);
64
65         // Create the overview table of deliveries
66         JTable deliveryTable = initDeliveryOverview(wrapper);
67
68         // Create the details table for the deliveries containing the pizza, waiter and driver information
69         initDeliveryDetails(wrapper, deliveryTable);
70
71                 // Create the overview table of the orders
72                 JTable ordersTable = initOrdersOverview(wrapper);
73
74                 // Create the order detail tables
75                 initOrdersDetails(wrapper, ordersTable);
76
77                 setContentPane(wrapper);
78                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
79                 
80                 initModels();
81         }
82
83         private int getNumberOfTables() {
84                 int numberOfTables;
85                 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
86                 try {
87                         numberOfTables = Integer.parseInt(numberOfTablesInput);
88                 } catch (NumberFormatException e) {
89                         JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
90                                         JOptionPane.ERROR_MESSAGE);
91                         return getNumberOfTables();
92                 }
93
94                 if (numberOfTables < 1) {
95                         JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
96                                         JOptionPane.ERROR_MESSAGE);
97                         return getNumberOfTables();
98                 }
99
100                 return numberOfTables;
101         }
102         private void initModels() {
103                 PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
104
105                 // When the tables get created in the first place, the handler is informed
106                 int numberOfTables = getNumberOfTables();
107                 List<Table> freeTablesCreated = PizzeriaAgent.getInstance().getTablesModel().createFreeTables(numberOfTables);
108                 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
109
110         }
111
112     private void initDeliveryDetails(JPanel wrapper, JTable deliveryTable) {
113                 JPanel detailWrapper = new JPanel();
114                 GridLayout wrapperLayout = new GridLayout(2, 1);
115                 detailWrapper.setLayout(wrapperLayout);
116
117                 final JPanel detailsPanel = new JPanel();
118                 final JPanel pizzasPanel = new JPanel();
119                 Util.createTableInTitledPanel(detailsPanel, PizzeriaAgent.getInstance().getDeliveryDetailsModel(), "");
120                 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfDeliveryModel(), "");
121
122                 /**
123                  * Update the displayed order in the waiter and pizza detail tables when an
124                  * order gets selected in the orders table
125                  */
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                 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
134                 detailsPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
135                 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
136                 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
137                 PizzeriaAgent.getInstance().getPizzasOfOrderModel().setCurrentOrder(currentGroup.getOrder());
138
139                 detailsPanel.setVisible(true);
140                 pizzasPanel.setVisible(true);
141             }
142         });
143
144                 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
145                    When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
146                 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
147             @Override
148             public void tableChanged(TableModelEvent e) {
149                 PizzeriaAgent.getInstance().getPizzasOfOrderModel().fireTableDataChanged();
150                 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
151             }
152         });
153
154                 detailWrapper.add(detailsPanel);
155                 detailWrapper.add(pizzasPanel);
156                 detailsPanel.setVisible(false);
157                 pizzasPanel.setVisible(false);
158
159                 wrapper.add(detailWrapper);
160
161         }
162
163         private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
164                 JPanel detailWrapper = new JPanel();
165                 GridLayout wrapperLayout = new GridLayout(2, 1);
166                 detailWrapper.setLayout(wrapperLayout);
167
168                 final JPanel waitersPanel = new JPanel();
169                 final JPanel pizzasPanel = new JPanel();
170                 Util.createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
171                 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasOfOrderModel(), "");
172
173                 /**
174                  * Update the displayed order in the waiter and pizza detail tables when an
175                  * order gets selected in the orders table
176                  */
177                 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
178                         @Override
179                         public void valueChanged(ListSelectionEvent e) {
180                                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
181                                 int minIndex = lsm.getMinSelectionIndex();
182                                 if(minIndex < 0) return;
183                                 
184                                 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
185                                 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
186                                 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
187                                 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
188                                 PizzeriaAgent.getInstance().getPizzasOfOrderModel().setCurrentOrder(currentGroup.getOrder());
189
190                                 waitersPanel.setVisible(true);
191                                 pizzasPanel.setVisible(true);
192                         }
193                 });
194                 
195                 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
196                    When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
197                 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
198                         @Override
199                         public void tableChanged(TableModelEvent e) {
200                                 PizzeriaAgent.getInstance().getPizzasOfOrderModel().fireTableDataChanged();
201                                 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
202                         }
203                 });
204
205                 detailWrapper.add(waitersPanel);
206                 detailWrapper.add(pizzasPanel);
207                 waitersPanel.setVisible(false);
208                 pizzasPanel.setVisible(false);
209
210                 wrapper.add(detailWrapper);
211
212         }
213
214         private JTable initOrdersOverview(JPanel wrapper) {
215                 JPanel tablePanel = new JPanel();
216                 JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
217
218                 wrapper.add(tablePanel);
219
220                 return orderTable;
221         }
222
223     private JTable initDeliveryOverview(JPanel wrapper) {
224         JPanel deliveryPanel = new JPanel();
225         JTable deliveryTable = Util.createTableInTitledPanel(deliveryPanel, PizzeriaAgent.getInstance().getDeliveryOrdersModel(), "Delivery Orders");
226
227         wrapper.add(deliveryPanel);
228
229         return deliveryTable;
230     }
231
232         private void initWaitingGroupsOverview(JPanel wrapper) {
233                 JPanel tablePanel = new JPanel();
234                 Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
235
236                 wrapper.add(tablePanel);
237         }
238
239         private void initTablesOverview(JPanel wrapper) {
240                 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
241                 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
242                 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
243                 Util.createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
244
245                 PizzeriaAgent.getInstance().getTablesModel()
246                                 .addTableModelListener(new TableModelListener() {
247                                         @Override
248                                         public void tableChanged(TableModelEvent e) {
249                                                 String numberOfFreeTables = getNumberOfFreeTables();
250                                                 log.info("Number of free tables changed: {}",
251                                                                 numberOfFreeTables);
252
253                                                 freeTablesLabel.setText(numberOfFreeTables);
254                                         }
255                                 });
256                 
257
258                 wrapper.add(scrollPanePanel);
259         }
260
261
262         private String getNumberOfFreeTables() {
263                 return String.format(FREE_TABLES,  PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
264         }
265
266         public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
267                 onTablesCreatedHandler = tablesCreatedHandler;
268         }
269
270 }