]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/pizzeria/gui/PizzeriaFrame.java
Some space refactoring. Doing away with unnecessary containers. Auto-Reloading of...
[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                 /* The PizzaModel and WaitersModel and their tables only show the selected entry in the orders table
144                    When the table model of the orders model changes the PizzaModel and WaitersModel have to update, too */
145                 PizzeriaAgent.getInstance().getOrdersModel().addTableModelListener(new TableModelListener() {
146                         @Override
147                         public void tableChanged(TableModelEvent e) {
148                                 PizzeriaAgent.getInstance().getPizzasModel().fireTableDataChanged();
149                                 PizzeriaAgent.getInstance().getWaitersModel().fireTableDataChanged();
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, PizzeriaAgent.getInstance().getOrdersModel(), "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, PizzeriaAgent.getInstance().getGroupModel(), "Waiting 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, PizzeriaAgent.getInstance().getTablesModel(), "Tables");
183
184                 PizzeriaAgent.getInstance().getTablesModel()
185                                 .addTableModelListener(new TableModelListener() {
186                                         @Override
187                                         public void tableChanged(TableModelEvent e) {
188                                                 String numberOfFreeTables = getNumberOfFreeTables();
189                                                 log.info("Number of free tables changed: {}",
190                                                                 numberOfFreeTables);
191
192                                                 freeTablesLabel.setText(numberOfFreeTables);
193                                         }
194                                 });
195                 
196
197                 wrapper.add(scrollPanePanel);
198         }
199
200         private JTable createTableInTitledPanel(JPanel wrapperPanel, TableModel<?> model, String title) {
201                 JTable table = new JTable(model);
202                 wrapperPanel.setLayout(new GridBagLayout());
203                 GridBagConstraints c = new GridBagConstraints();
204                 c.gridx = 0;
205                 c.weightx = 1;
206                 c.weighty = 1;
207                 c.insets = new Insets(10, 10, 10, 10);
208                 c.fill = GridBagConstraints.BOTH;
209                 JScrollPane scrollPane = new JScrollPane(table);
210
211                 wrapperPanel.setBorder(new TitledBorder(title));
212                 scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
213                 wrapperPanel.add(scrollPane, c);
214
215                 return table;
216         }
217
218         /**
219          * not necessary in production
220          */
221         private List<Order> getOrdersTestData() { // TODO: useful way to get data.
222                 List<Order> orders = new ArrayList<>();
223                 // Order order1 = new Order();
224                 // Order order2 = new Order();
225                 // Order order3 = new Order();
226                 // Order order4 = new Order();
227                 
228                 // order1.setWaiterIdOfOrder(4);
229                 // order2.setWaiterIdOfServing(2);
230                 
231                 // List<PizzaOrder> pizzas = new ArrayList<>();
232                 // PizzaOrder pizzaOrder1 = new PizzaOrder(PizzaType.CARDINALE);
233                 // pizzaOrder1.setStatus(PizzaOrderStatus.DONE);
234                 // pizzas.add(pizzaOrder1);
235                 // order1.setPizzaOrders(pizzas);
236
237                 // orders.add(order1);
238                 // orders.add(order2);
239                 // orders.add(order3);
240                 // orders.add(order4);
241                 return orders;
242         }
243
244         private String getNumberOfFreeTables() {
245                 return String.format(FREE_TABLES,  PizzeriaAgent.getInstance().getTablesModel().getNumberOfFreeTables());
246         }
247
248         public void setOnTablesCreatedHandler(PizzeriaAgent.TablesCreatedHandler tablesCreatedHandler) {
249                 onTablesCreatedHandler = tablesCreatedHandler;
250         }
251
252 }