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