]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
Create DeliveryGroup, DeliveryGroupData, DeliveryStatus. Add Deliveries overview...
[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.util.ArrayList;
7 import java.util.List;
8
9 import javax.swing.JFrame;
10 import javax.swing.JLabel;
11 import javax.swing.JOptionPane;
12 import javax.swing.JPanel;
13 import javax.swing.JTable;
14 import javax.swing.ListSelectionModel;
15 import javax.swing.border.TitledBorder;
16 import javax.swing.event.ListSelectionEvent;
17 import javax.swing.event.ListSelectionListener;
18 import javax.swing.event.TableModelEvent;
19 import javax.swing.event.TableModelListener;
20
21 import at.ac.tuwien.sbc.valesriegler.common.Util;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
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.types.GroupData;
28 import at.ac.tuwien.sbc.valesriegler.types.Order;
29 import at.ac.tuwien.sbc.valesriegler.types.Table;
30
31 /**
32  * Base Frame of the Pizzeria GUI
33  * 
34  * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
35  */
36 public class PizzeriaFrame extends JFrame {
37         private static final Logger log = LoggerFactory.getLogger(PizzeriaFrame.class);
38         
39         private static final String WRONG_INPUT = "Wrong input";
40         private static final String THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1 = "The number must be greater or equal to 1";
41         private static final String YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER = "Your input cannot be parsed as a number!";
42         private static final String PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE = "Please input the number of tables to create";
43         private static String WAITER_IDS_CAPTION = "Waiter-IDs of order %d";
44         private static String PIZZAS_CAPTION = "Pizzas of order %d";
45         private static String FREE_TABLES = "There are currently %d free table(s)";
46
47         private TablesCreatedHandler onTablesCreatedHandler;
48
49         public PizzeriaFrame() {
50                 super("Pizzeria");
51         }
52
53         public void start() {
54                 
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                 initModels();
76         }
77
78         private int getNumberOfTables() {
79                 int numberOfTables;
80                 String numberOfTablesInput = JOptionPane.showInputDialog(PLEASE_INPUT_THE_NUMBER_OF_TABLES_TO_CREATE);
81                 try {
82                         numberOfTables = Integer.parseInt(numberOfTablesInput);
83                 } catch (NumberFormatException e) {
84                         JOptionPane.showMessageDialog(this, YOUR_INPUT_CANNOT_BE_PARSED_AS_A_NUMBER, WRONG_INPUT,
85                                         JOptionPane.ERROR_MESSAGE);
86                         return getNumberOfTables();
87                 }
88
89                 if (numberOfTables < 1) {
90                         JOptionPane.showMessageDialog(this, THE_NUMBER_MUST_BE_GREATER_OR_EQUAL_TO_1, WRONG_INPUT,
91                                         JOptionPane.ERROR_MESSAGE);
92                         return getNumberOfTables();
93                 }
94
95                 return numberOfTables;
96         }
97         private void initModels() {
98                 PizzeriaAgent.getInstance().getOrdersModel().setItems(new ArrayList<GroupData>());
99
100                 // When the tables get created in the first place, the handler is informed
101                 int numberOfTables = getNumberOfTables();
102                 List<Table> freeTablesCreated = PizzeriaAgent.getInstance().getTablesModel().createFreeTables(numberOfTables);
103                 onTablesCreatedHandler.freeTablesCreated(freeTablesCreated);
104
105         }
106
107         private void initOrdersDetails(JPanel wrapper, JTable ordersTable) {
108                 JPanel detailWrapper = new JPanel();
109                 GridLayout wrapperLayout = new GridLayout(2, 1);
110                 detailWrapper.setLayout(wrapperLayout);
111
112                 final JPanel waitersPanel = new JPanel();
113                 final JPanel pizzasPanel = new JPanel();
114                 Util.createTableInTitledPanel(waitersPanel, PizzeriaAgent.getInstance().getWaitersModel(), "");
115                 Util.createTableInTitledPanel(pizzasPanel, PizzeriaAgent.getInstance().getPizzasModel(), "");
116
117                 /**
118                  * Update the displayed order in the waiter and pizza detail tables when an
119                  * order gets selected in the orders table
120                  */
121                 ordersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
122                         @Override
123                         public void valueChanged(ListSelectionEvent e) {
124                                 ListSelectionModel lsm = (ListSelectionModel) e.getSource();
125                                 int minIndex = lsm.getMinSelectionIndex();
126                                 if(minIndex < 0) return;
127                                 
128                                 GroupData currentGroup = PizzeriaAgent.getInstance().getOrdersModel().getGroupOfRow(minIndex);
129                                 waitersPanel.setBorder(new TitledBorder(String.format(WAITER_IDS_CAPTION, currentGroup.getOrder().getId())));
130                                 pizzasPanel.setBorder(new TitledBorder(String.format(PIZZAS_CAPTION, currentGroup.getOrder().getId())));
131                                 PizzeriaAgent.getInstance().getWaitersModel().setCurrentGroup(currentGroup);
132                                 PizzeriaAgent.getInstance().getPizzasModel().setCurrentOrder(currentGroup.getOrder());
133
134                                 waitersPanel.setVisible(true);
135                                 pizzasPanel.setVisible(true);
136                         }
137                 });
138                 
139                 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
140                    When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
141                 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
142                         @Override
143                         public void tableChanged(TableModelEvent e) {
144                                 PizzeriaAgent.getInstance().getPizzasModel().fireTableDataChanged();
145                                 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
146                         }
147                 });
148
149                 detailWrapper.add(waitersPanel);
150                 detailWrapper.add(pizzasPanel);
151                 waitersPanel.setVisible(false);
152                 pizzasPanel.setVisible(false);
153
154                 wrapper.add(detailWrapper);
155
156         }
157
158         private JTable initOrdersOverview(JPanel wrapper) {
159                 JPanel tablePanel = new JPanel();
160                 JTable orderTable = Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getOrdersModel(), "Orders");
161
162                 wrapper.add(tablePanel);
163
164                 return orderTable;
165         }
166
167         private void initWaitingGroupsOverview(JPanel wrapper) {
168                 JPanel tablePanel = new JPanel();
169                 Util.createTableInTitledPanel(tablePanel, PizzeriaAgent.getInstance().getGroupModel(), "Waiting groups");
170
171                 wrapper.add(tablePanel);
172         }
173
174         private void initTablesOverview(JPanel wrapper) {
175                 JPanel scrollPanePanel = new JPanel(new GridBagLayout());
176                 final JLabel freeTablesLabel = new JLabel(getNumberOfFreeTables());
177                 scrollPanePanel.add(freeTablesLabel, new GridBagConstraints());
178                 Util.createTableInTitledPanel(scrollPanePanel, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
179
180                 PizzeriaAgent.getInstance().getTablesModel()
181                                 .addTableModelListener(new TableModelListener() {
182                                         @Override
183                                         public void tableChanged(TableModelEvent e) {
184                                                 String numberOfFreeTables = getNumberOfFreeTables();
185                                                 log.info("Number of free tables changed: {}",
186                                                                 numberOfFreeTables);
187
188                                                 freeTablesLabel.setText(numberOfFreeTables);
189                                         }
190                                 });
191                 
192
193                 wrapper.add(scrollPanePanel);
194         }
195
196
197         private String getNumberOfFreeTables() {
198                 return String.format(FREE_TABLES,  PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
199         }
200
201         public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
202                 onTablesCreatedHandler = tablesCreatedHandler;
203         }
204
205 }