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