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