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