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