]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
Support for space notifications for pizzeria and group agents. Change table model...
[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.awt.Insets;
7 import java.util.ArrayList;
8 import java.util.List;
9
10 import javax.swing.JFrame;
11 import javax.swing.JLabel;
12 import javax.swing.JOptionPane;
13 import javax.swing.JPanel;
14 import javax.swing.JScrollPane;
15 import javax.swing.JTable;
16 import javax.swing.ListSelectionModel;
17 import javax.swing.ScrollPaneConstants;
18 import javax.swing.SwingUtilities;
19 import javax.swing.border.TitledBorder;
20 import javax.swing.event.ListSelectionEvent;
21 import javax.swing.event.ListSelectionListener;
22 import javax.swing.event.TableModelEvent;
23 import javax.swing.event.TableModelListener;
24
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 import at.ac.tuwien.sbc.valesriegler.DEP_Order;
29 import at.ac.tuwien.sbc.valesriegler.DEP_Table;
30 import at.ac.tuwien.sbc.valesriegler.common.TableModel;
31 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent;
32 import at.ac.tuwien.sbc.valesriegler.pizzeria.PizzeriaAgent.TablesCreatedHandler;
33 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.GroupsOverviewModel;
34 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.OrdersOverviewModel;
35 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.PizzasOfOrderModel;
36 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.TablesOverviewModel;
37 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.WaitersOfOrderModel;
38 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
39 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrderStatus;
40 import at.ac.tuwien.sbc.valesriegler.types.PizzaType;
41
42 /**
43  * Base Frame of the Pizzeria GUI
44  * 
45  * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
46  */
47 public class PizzeriaFrame extends JFrame {
48         private static final Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
49         
50         private static final String WRONG_INPUT = "Wrong input";
51         private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
52         private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
53         private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
54         private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
55         private static String PIZZAS_CAPTION = "Pizzas of order %d";
56         private static String FREE_TABLES = "There are currently %d free table(s)";
57
58         private TablesCreatedHandler onTablesCreatedHandler;
59
60         public PizzeriaFrame() {
61                 super("Pizzeria");
62         }
63
64         public void start() {
65                 
66
67                 JPanel wrapper = new JPanel();
68                 GridLayout wrapperLayout = new GridLayout(2, 2);
69                 wrapper.setLayout(wrapperLayout);
70
71                 // Create the tables overview
72                 initTablesOverview(wrapper);
73
74                 // Create the waiting groups table overview
75                 initWaitingGroupsOverview(wrapper);
76
77                 // Create the overview table of the orders
78                 JTable ordersTable = initOrdersOverview(wrapper);
79
80                 // Create the order detail tables
81                 initOrdersDetails(wrapper, ordersTable);
82
83                 setContentPane(wrapper);
84                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
85                 
86                 initModels();
87         }
88
89         private int getNumberOfTables() {
90                 int numberOfTables;
91                 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
92                 try {
93                         numberOfTables = Integer.parseInt(numberOfTablesInput);
94                 } catch (NumberFormatException e) {
95                         JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
96                                         JOptionPane.ERROR_MESSAGE);
97                         return getNumberOfTables();
98                 }
99
100                 if (numberOfTables < 1) {
101                         JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
102                                         JOptionPane.ERROR_MESSAGE);
103                         return getNumberOfTables();
104                 }
105
106                 return numberOfTables;
107         }
108
109         public void initModels() {
110                 List<DEP_Order> orders = getOrdersTestData();
111                 PizzeriaAgent.getInstance().getOrdersModel().setItems(orders);
112
113                 // When the tables get created in the first place, the handler is informed
114                 int numberOfTables = getNumberOfTables();
115                 List<DEP_Table> freeTablesCreated = PizzeriaAgent.getInstance().getTablesModel().createFreeTables(numberOfTables);
116                 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
117
118         }
119
120         private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
121                 JPanel detailWrapper = new JPanel();
122                 GridLayout wrapperLayout = new GridLayout(2, 1);
123                 detailWrapper.setLayout(wrapperLayout);
124
125                 final JPanel waitersPanel = new JPanel();
126                 final JPanel pizzasPanel = new JPanel();
127                 createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
128                 createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasModel(), "");
129
130                 /**
131                  * Update the displayed order in the waiter and pizza detail tables when an
132                  * order gets selected in the orders table
133                  */
134                 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
135                         @Override
136                         public void valueChanged(ListSelectionEvent e) {
137                                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
138                                 int minIndex = lsm.getMinSelectionIndex();
139
140                                 DEP_Order currentOrder = PizzeriaAgent.getInstance().getOrdersModel().getOrderOfRow(minIndex);
141                                 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentOrder.getId())));
142                                 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentOrder.getId())));
143                                 PizzeriaAgent.getInstance().getWaitersModel().setCurrentOrder(currentOrder);
144                                 PizzeriaAgent.getInstance().getPizzasModel().setCurrentOrder(currentOrder);
145
146                                 waitersPanel.setVisible(true);
147                                 pizzasPanel.setVisible(true);
148                         }
149                 });
150
151                 detailWrapper.add(waitersPanel);
152                 detailWrapper.add(pizzasPanel);
153                 waitersPanel.setVisible(false);
154                 pizzasPanel.setVisible(false);
155
156                 wrapper.add(detailWrapper);
157
158         }
159
160         private JTable initOrdersOverview(JPanel wrapper) {
161                 JPanel tablePanel = new JPanel();
162                 JTable orderTable = createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
163
164                 wrapper.add(tablePanel);
165
166                 return orderTable;
167         }
168
169         private void initWaitingGroupsOverview(JPanel wrapper) {
170                 JPanel tablePanel = new JPanel();
171                 createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Groups");
172
173                 wrapper.add(tablePanel);
174         }
175
176         private void initTablesOverview(JPanel wrapper) {
177                 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
178                 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
179                 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
180                 createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
181
182                 PizzeriaAgent.getInstance().getTablesModel()
183                                 .addTableModelListener(new TableModelListener() {
184                                         @Override
185                                         public void tableChanged(TableModelEvent e) {
186                                                 String numberOfFreeTables = getNumberOfFreeTables();
187                                                 log.info("Number of free tables changed: {}",
188                                                                 numberOfFreeTables);
189
190                                                 freeTablesLabel.setText(numberOfFreeTables);
191
192                                         }
193                                 });
194                 
195
196                 wrapper.add(scrollPanePanel);
197         }
198
199         private JTable createTableInTitledPanel(JPanel wrapperPanel, TableModel<?> model, String title) {
200                 JTable table = new JTable(model);
201                 wrapperPanel.setLayout(new GridBagLayout());
202                 GridBagConstraints c = new GridBagConstraints();
203                 c.gridx = 0;
204                 c.weightx = 1;
205                 c.weighty = 1;
206                 c.insets = new Insets(10, 10, 10, 10);
207                 c.fill = GridBagConstraints.BOTH;
208                 JScrollPane scrollPane = new JScrollPane(table);
209
210                 wrapperPanel.setBorder(new TitledBorder(title));
211                 scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
212                 wrapperPanel.add(scrollPane, c);
213
214                 return table;
215         }
216
217         /**
218          * not necessary in production
219          */
220         private List<DEP_Order> getOrdersTestData() {
221                 List<DEP_Order> orders = new ArrayList<>();
222                 DEP_Order order1 = new DEP_Order();
223                 DEP_Order order2 = new DEP_Order();
224                 DEP_Order order3 = new DEP_Order();
225                 DEP_Order order4 = new DEP_Order();
226
227                 order1.setId(1);
228                 order2.setId(2);
229                 order3.setId(3);
230                 order4.setId(4);
231
232                 order1.setWaiterIdOfOrder(4);
233                 order2.setWaiterIdOfServing(2);
234
235                 List<PizzaOrder> pizzas = new ArrayList<>();
236                 PizzaOrder pizzaOrder1 = new PizzaOrder(PizzaType.CARDINALE);
237                 pizzaOrder1.setStatus(PizzaOrderStatus.DONE);
238                 pizzas.add(pizzaOrder1);
239                 order1.setPizzaOrders(pizzas);
240
241                 orders.add(order1);
242                 orders.add(order2);
243                 orders.add(order3);
244                 orders.add(order4);
245                 return orders;
246         }
247
248         private String getNumberOfFreeTables() {
249                 return String.format(FREE_TABLES,  PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
250         }
251
252         public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
253                 onTablesCreatedHandler = tablesCreatedHandler;
254         }
255
256 }