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