]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
Ask for number of tables on start of the Pizzeria GUI
[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.GridLayout;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import javax.swing.JFrame;
8 import javax.swing.JLabel;
9 import javax.swing.JOptionPane;
10 import javax.swing.JPanel;
11 import javax.swing.JScrollPane;
12 import javax.swing.JTable;
13 import javax.swing.ListSelectionModel;
14 import javax.swing.border.TitledBorder;
15 import javax.swing.event.ListSelectionEvent;
16 import javax.swing.event.ListSelectionListener;
17 import javax.swing.event.TableModelEvent;
18 import javax.swing.event.TableModelListener;
19
20 import at.ac.tuwien.sbc.valesriegler.common.PizzaType;
21 import at.ac.tuwien.sbc.valesriegler.common.TableModel;
22 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.PizzaOrder.PizzaOrderStatus;
23 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.Table.TableStatus;
24 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.GroupsOverviewModel;
25 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.OrdersOverviewModel;
26 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.PizzasOfOrderModel;
27 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.TablesOverviewModel;
28 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.tablemodels.WaitersOfOrderModel;
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 String WRONG_INPUT = "Wrong input";
37         private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
38         private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
39         private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
40         private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
41         private static String PIZZAS_CAPTION = "Pizzas of order %d";
42         private static String FREE_TABLES = "There are currently %d free table(s)";
43         
44         private OrdersOverviewModel ordersModel;
45         private GroupsOverviewModel groupModel;
46         private TablesOverviewModel tablesModel;
47         private WaitersOfOrderModel waitersModel;
48         private PizzasOfOrderModel pizzasModel;
49         
50
51         public PizzeriaFrame() {
52                 super("Pizzeria");
53                 
54                 initModels();
55                 
56                 JPanel wrapper = new JPanel();
57                 GridLayout wrapperLayout = new GridLayout(2, 2);
58                 wrapper.setLayout(wrapperLayout);
59                 
60                 // Create the tables overview
61                 initTablesOverview(wrapper);
62                 
63                 // Create the waiting groups table overview
64                 initWaitingGroupsOverview(wrapper);
65                 
66                 //Create the overview table of the orders
67                 JTable ordersTable = initOrdersOverview(wrapper);
68                 
69                 // Create the order detail tables
70                 initOrdersDetails(wrapper, ordersTable);
71                 
72                 setContentPane(wrapper);
73                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
74         }
75
76         private int getNumberOfTables() {
77                 int numberOfTables;
78                 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
79                 try {
80                         numberOfTables = Integer.parseInt(numberOfTablesInput);
81                 } catch (NumberFormatException e) {
82                         JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT, JOptionPane.ERROR_MESSAGE);
83                         return getNumberOfTables();
84                 }
85                 
86                 if(numberOfTables < 1) {
87                         JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT, JOptionPane.ERROR_MESSAGE);
88                         return getNumberOfTables();
89                 }
90                 
91                 return numberOfTables;
92         }
93
94         private void initModels() {
95                 List<Order> orders = getOrdersTestData();
96                 
97                 ordersModel = new OrdersOverviewModel(orders);
98                 groupModel = new GroupsOverviewModel();
99                 tablesModel = new TablesOverviewModel(getNumberOfTables());
100                 waitersModel = new WaitersOfOrderModel();
101                 pizzasModel = new PizzasOfOrderModel();
102         }
103
104         private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
105                 JPanel detailWrapper = new JPanel();
106                 GridLayout wrapperLayout = new GridLayout(2, 1);
107                 detailWrapper.setLayout(wrapperLayout);
108                 
109                 final JPanel waitersPanel = new JPanel();
110                 final JPanel pizzasPanel = new JPanel();
111                 createTableInTitledPanel(waitersPanel, waitersModel, "");
112                 createTableInTitledPanel(pizzasPanel, pizzasModel, "");
113                 
114                 /**
115                  * Update the displayed order in the waiter and pizza detail tables when an order
116                  * gets selected in the orders table
117                  */
118                 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
119                         @Override
120                         public void valueChanged(ListSelectionEvent e) {
121                                   ListSelectionModel lsm = (ListSelectionModel)e.getSource();
122                               int minIndex = lsm.getMinSelectionIndex();
123                                
124                               Order currentOrder = ordersModel.getOrderOfRow(minIndex);
125                               waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION,currentOrder.getId())));
126                               pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION,currentOrder.getId())));
127                               waitersModel.setCurrentOrder(currentOrder);
128                               pizzasModel.setCurrentOrder(currentOrder);
129                               
130                               waitersPanel.setVisible(true);
131                               pizzasPanel.setVisible(true);
132                         }
133                 });
134                 
135                 detailWrapper.add(waitersPanel);
136                 detailWrapper.add(pizzasPanel);
137                 waitersPanel.setVisible(false);
138                 pizzasPanel.setVisible(false);
139                 
140                 wrapper.add(detailWrapper);
141                 
142         }
143
144         private JTable initOrdersOverview(JPanel wrapper) {
145                 JPanel tablePanel = new JPanel();
146                 JTable orderTable = createTableInTitledPanel(tablePanel, ordersModel, "Orders");
147                 
148                 wrapper.add(tablePanel);
149                 
150                 return orderTable;
151         }
152
153         private void initWaitingGroupsOverview(JPanel wrapper) {
154                 JPanel tablePanel = new JPanel();
155                 createTableInTitledPanel(tablePanel, groupModel, "Groups");
156                 
157                 wrapper.add(tablePanel);
158         }
159
160         private void initTablesOverview(JPanel wrapper) {
161                 JPanel tablePanel = new JPanel();
162                 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
163                 tablePanel.add(freeTablesLabel);
164                 createTableInTitledPanel(tablePanel, tablesModel, "Tables");
165                 
166                 tablesModel.addTableModelListener(new TableModelListener() {
167                         @Override
168                         public void tableChanged(TableModelEvent e) {
169                                 freeTablesLabel.setText(getNumberOfFreeTables());
170                         }
171                 });
172                 
173                 
174                 wrapper.add(tablePanel);
175         }
176         
177         
178         private JTable createTableInTitledPanel(JPanel wrapperPanel, TableModel<?> model, String title) {
179                 JTable table = new JTable(model);
180                 JScrollPane scrollPane = new JScrollPane(table);
181                 
182                 wrapperPanel.setBorder(new TitledBorder(title));
183                 scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
184                 wrapperPanel.add(scrollPane);
185                 
186                 return table;
187         }
188         
189         private List<Order> getOrdersTestData() {
190                 List<Order> orders = new ArrayList<>();
191                 Order order1 = new Order();
192                 Order order2 = new Order();
193                 Order order3 = new Order();
194                 Order order4 = new Order();
195                 
196                 order1.setId(1);
197                 order2.setId(2);
198                 order3.setId(3);
199                 order4.setId(4);
200                 
201                 order1.setWaiterIdOfOrder(4);
202                 order2.setWaiterIdOfServing(2);
203                 
204                 List<PizzaOrder> pizzas = new ArrayList<>();
205                 PizzaOrder pizzaOrder1 = new PizzaOrder();
206                 pizzaOrder1.setPizzaType(PizzaType.CARDINALE);
207                 pizzaOrder1.setStatus(PizzaOrderStatus.DONE);
208                 pizzaOrder1.setCookId(3);
209                 pizzas.add(pizzaOrder1);
210                 order1.setPizzaOrders(pizzas);
211                 
212                 orders.add(order1);
213                 orders.add(order2);
214                 orders.add(order3);
215                 orders.add(order4);
216                 return orders;
217         }
218
219         private String getNumberOfFreeTables() {
220                 return String.format(FREE_TABLES, tablesModel.getNumberOfFreeTables());
221         }
222
223 }