1 package at.ac.tuwien.sbc.valesriegler.group.gui;
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;
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;
23 import at.ac.tuwien.sbc.valesriegler.common.Util;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
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;
35 * Base Frame of the Group UI
37 * @author Gregor Riegler <gregor DOT riegler AT gmail DOT com>
40 @SuppressWarnings("serial")
41 public class GroupFrame extends JFrame {
42 private static final Logger log = LoggerFactory.getLogger(GroupFrame.class);
44 public GroupFrame(GroupOverviewModel groupModel, DeliveryOverviewModel deliveryModel) {
46 JPanel wrapper = new JPanel();
47 GridLayout wrapperLayout = new GridLayout(3, 1);
48 wrapper.setLayout(wrapperLayout);
50 // Create Wizard-like panel for the creation of groups
51 initGroupCreation(wrapper);
53 // Create the panel for the group overview table
54 initGroupOverview(wrapper, groupModel);
56 // Create the panel for the deliveries overview table
57 initDeliveriesOverview(wrapper, deliveryModel);
59 setContentPane(wrapper);
60 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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);
73 // When 'next' is clicked the second, final panel of the Group Creation
74 // Wizard should be shown
75 next.addActionListener(new ActionListener() {
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,
83 groupCreationPanel.setCreateAndCancelHandler(groupCreationHandler);
84 groupCreationHandler.showGroupCreationDetailPanel();
89 GridLayout creationPanelLayout = new GridLayout(3, 1);
90 chooseGroupSizePanel.setLayout(creationPanelLayout);
91 creationPanel.setBorder(new TitledBorder("Create Groups"));
93 creationPanel.add(chooseGroupSizePanel);
94 chooseGroupSizePanel.add(creationLabel);
95 chooseGroupSizePanel.add(spinner);
96 chooseGroupSizePanel.add(next);
98 wrapper.add(creationPanel);
101 private void initGroupOverview(JPanel wrapper, GroupOverviewModel groupModel) {
102 JPanel tablePanel = new JPanel();
103 Util.createTableInTitledPanel(tablePanel, groupModel, "Group Overview");
104 wrapper.add(tablePanel);
107 private void initDeliveriesOverview(JPanel wrapper, DeliveryOverviewModel deliveryModel) {
108 JPanel tablePanel = new JPanel();
109 Util.createTableInTitledPanel(tablePanel, deliveryModel, "Deliveries Overview");
110 wrapper.add(tablePanel);
114 * Handles the Wizard-like creation of groups.
116 * Give an instance of this class as a callback to the Panel from which a
117 * group creation request should be issued
119 class GroupCreationHandler {
120 private JPanel creationPanel;
121 private JPanel chooseGroupSizePanel;
122 private JPanel groupCreationPanel;
124 public GroupCreationHandler(JPanel creationPanel, JPanel chooseGroupSizePanel, JPanel groupCreationPanel) {
125 this.creationPanel = creationPanel;
126 this.chooseGroupSizePanel = chooseGroupSizePanel;
127 this.groupCreationPanel = groupCreationPanel;
130 public void showGroupCreationDetailPanel() {
131 chooseGroupSizePanel.setVisible(false);
132 creationPanel.add(groupCreationPanel);
135 public void handleGroupCreation(GroupCreationRequest gc) {
136 chooseGroupSizePanel.setVisible(true);
137 creationPanel.remove(groupCreationPanel);
138 creationPanel.repaint();
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));
152 Order order = new Order(group, pizzaOrders);
153 for (PizzaOrder pizzaOrder : order.getOrderedPizzas()) {
154 pizzaOrder.setOrderId(order.getId());
156 group.getGroupData().setOrder(order);
157 order.setNumberOfPizzas(order.getOrderedPizzas().size());
159 newGroups.add(group);
161 GroupOverviewModel groupModel = GroupAgent.getInstance().getGroupModel();
162 groupModel.addItems(newGroups);
163 GroupAgent.getInstance().onGroupsCreated(newGroups);
166 public void handleCancel() {
167 chooseGroupSizePanel.setVisible(true);
168 creationPanel.remove(groupCreationPanel);
169 creationPanel.repaint();