]> git.somenet.org - pub/jan/sbc.git/blob - src/main/java/at/ac/tuwien/sbc/valesriegler/group/gui/GroupFrame.java
Create DeliveryGroup, DeliveryGroupData, DeliveryStatus. Add Deliveries overview...
[pub/jan/sbc.git] / src / main / java / at / ac / tuwien / sbc / valesriegler / group / gui / GroupFrame.java
1 package at.ac.tuwien.sbc.valesriegler.group.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.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
9 import java.util.ArrayList;
10 import java.util.List;
11
12 import javax.swing.JButton;
13 import javax.swing.JFrame;
14 import javax.swing.JLabel;
15 import javax.swing.JPanel;
16 import javax.swing.JScrollPane;
17 import javax.swing.JSpinner;
18 import javax.swing.JTable;
19 import javax.swing.ScrollPaneConstants;
20 import javax.swing.SpinnerNumberModel;
21 import javax.swing.border.TitledBorder;
22
23 import at.ac.tuwien.sbc.valesriegler.common.Util;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import at.ac.tuwien.sbc.valesriegler.group.Group;
28 import at.ac.tuwien.sbc.valesriegler.group.GroupAgent;
29 import at.ac.tuwien.sbc.valesriegler.pizzeria.gui.PizzeriaFrame;
30 import at.ac.tuwien.sbc.valesriegler.types.Order;
31 import at.ac.tuwien.sbc.valesriegler.types.PizzaOrder;
32 import at.ac.tuwien.sbc.valesriegler.types.PizzaType;
33
34 /**
35  * Base Frame of the Group UI
36  * 
37  * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
38  * 
39  */
40 @SuppressWarnings("serial")
41 public class GroupFrame extends JFrame {
42         private static final Logger log = LoggerFactory.getLogger(GroupFrame.class);
43         
44         public GroupFrame(GroupOverviewModel groupModel, DeliveryOverviewModel deliveryModel) {
45                 super("Groups");
46                 JPanel wrapper = new JPanel();
47                 GridLayout wrapperLayout = new GridLayout(3, 1);
48                 wrapper.setLayout(wrapperLayout);
49
50                 // Create Wizard-like panel for the creation of groups
51                 initGroupCreation(wrapper);
52
53                 // Create the panel for the group overview table
54                 initGroupOverview(wrapper, groupModel);
55
56         // Create the panel for the deliveries overview table
57         initDeliveriesOverview(wrapper, deliveryModel);
58
59         setContentPane(wrapper);
60                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
61         }
62
63
64
65     private void initGroupCreation(JPanel wrapper) {
66                 final JPanel creationPanel = new JPanel();
67                 final JPanel chooseGroupSizePanel = new JPanel();
68                 JLabel creationLabel = new JLabel("How many members should the group have?");
69                 JButton next = new JButton("Next");
70                 SpinnerNumberModel model = new SpinnerNumberModel(1, 1, 4, 1);
71                 final JSpinner spinner = new JSpinner(model);
72
73                 // When 'next' is clicked the second, final panel of the Group Creation
74                 // Wizard should be shown
75                 next.addActionListener(new ActionListener() {
76                         @Override
77                         public void actionPerformed(ActionEvent e) {
78                                 int numberMembers = (int) spinner.getValue();
79                                 final GroupCreationPanel groupCreationPanel = new GroupCreationPanel(numberMembers);
80                                 GroupCreationHandler groupCreationHandler = new GroupCreationHandler(creationPanel, chooseGroupSizePanel,
81                                                 groupCreationPanel);
82
83                                 groupCreationPanel.setCreateAndCancelHandler(groupCreationHandler);
84                                 groupCreationHandler.showGroupCreationDetailPanel();
85
86                         }
87                 });
88
89                 GridLayout creationPanelLayout = new GridLayout(3, 1);
90                 chooseGroupSizePanel.setLayout(creationPanelLayout);
91                 creationPanel.setBorder(new TitledBorder("Create Groups"));
92
93                 creationPanel.add(chooseGroupSizePanel);
94                 chooseGroupSizePanel.add(creationLabel);
95                 chooseGroupSizePanel.add(spinner);
96                 chooseGroupSizePanel.add(next);
97
98                 wrapper.add(creationPanel);
99         }
100
101         private void initGroupOverview(JPanel wrapper, GroupOverviewModel groupModel) {
102         JPanel tablePanel = new JPanel();
103         Util.createTableInTitledPanel(tablePanel, groupModel, "Group Overview");
104         wrapper.add(tablePanel);
105         }
106
107     private void initDeliveriesOverview(JPanel wrapper, DeliveryOverviewModel deliveryModel) {
108         JPanel tablePanel = new JPanel();
109         Util.createTableInTitledPanel(tablePanel, deliveryModel, "Deliveries Overview");
110         wrapper.add(tablePanel);
111     }
112
113         /**
114          * Handles the Wizard-like creation of groups.
115          * <p />
116          * Give an instance of this class as a callback to the Panel from which a
117          * group creation request should be issued
118          */
119         class GroupCreationHandler {
120                 private JPanel creationPanel;
121                 private JPanel chooseGroupSizePanel;
122                 private JPanel groupCreationPanel;
123
124                 public GroupCreationHandler(JPanel creationPanel, JPanel chooseGroupSizePanel, JPanel groupCreationPanel) {
125                         this.creationPanel = creationPanel;
126                         this.chooseGroupSizePanel = chooseGroupSizePanel;
127                         this.groupCreationPanel = groupCreationPanel;
128                 }
129
130                 public void showGroupCreationDetailPanel() {
131                         chooseGroupSizePanel.setVisible(false);
132                         creationPanel.add(groupCreationPanel);
133                 }
134
135                 public void handleGroupCreation(GroupCreationRequest gc) {
136                         chooseGroupSizePanel.setVisible(true);
137                         creationPanel.remove(groupCreationPanel);
138                         creationPanel.repaint();
139
140                         createGroups(gc);
141                 }
142
143                 public void createGroups(GroupCreationRequest gc) {
144                         List<Group> newGroups = new ArrayList<>();
145                         for (int i = 0; i < gc.numberOfGroups; i++) {
146                                 Group group = new Group();
147                                 group.getGroupData().setSize(gc.size);
148                                 List<PizzaOrder> pizzaOrders = new ArrayList<>();
149                                 for (PizzaType pt : gc.pizzaTypes) {
150                                         pizzaOrders.add(new PizzaOrder(pt));
151                                 }
152                                 Order order = new Order(group, pizzaOrders);
153                                 for (PizzaOrder pizzaOrder : order.getOrderedPizzas()) {
154                                         pizzaOrder.setOrderId(order.getId());
155                                 }
156                                 group.getGroupData().setOrder(order);
157                                 order.setNumberOfPizzas(order.getOrderedPizzas().size());
158
159                                 newGroups.add(group);
160                         }
161                         GroupOverviewModel groupModel = GroupAgent.getInstance().getGroupModel();
162                         groupModel.addItems(newGroups);
163                         GroupAgent.getInstance().onGroupsCreated(newGroups);
164                 }
165
166                 public void handleCancel() {
167                         chooseGroupSizePanel.setVisible(true);
168                         creationPanel.remove(groupCreationPanel);
169                         creationPanel.repaint();
170                 }
171         }
172
173 }