/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package openbook.client; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.SwingWorker; import jpa.tools.swing.EntityDataModel; import jpa.tools.swing.EntityTableView; import jpa.tools.swing.ErrorDialog; import openbook.domain.PurchaseOrder; import openbook.server.OpenBookService; /** * A page to control delivery of pending orders. * * @author Pinaki Poddar * */ @SuppressWarnings("serial") public class DeliveryPage extends JPanel { private final JButton _deliver; private EntityTableView<PurchaseOrder> _orders; private final OpenBookService _service; private final JLabel _title; private final JRadioButton _showPending; private final JRadioButton _showDelivered; private final JRadioButton _showBoth; public DeliveryPage(final OpenBookService service) { setLayout(new BorderLayout()); _service = service; _orders = new EntityTableView<PurchaseOrder>(PurchaseOrder.class, getOrders(PurchaseOrder.Status.PENDING), EntityDataModel.ALL_ATTR, service.getUnit()); _title = new JLabel(_orders.getDataModel().getRowCount() + " " + PurchaseOrder.Status.PENDING + " PurchaseOrder"); _deliver = new JButton("Deliver Pending Orders"); JPanel statusPanel = new JPanel(); ButtonGroup statusSelection = new ButtonGroup(); _showPending = new JRadioButton("Pending"); _showDelivered = new JRadioButton("Delivered"); _showBoth = new JRadioButton("All"); _showPending.setSelected(true); statusSelection.add(_showPending); statusSelection.add(_showDelivered); statusSelection.add(_showBoth); statusPanel.add(_showBoth); statusPanel.add(_showPending); statusPanel.add(_showDelivered); JPanel actionPanel = new JPanel(); actionPanel.add(_deliver); add(statusPanel, BorderLayout.NORTH); add(_orders, BorderLayout.CENTER); add(actionPanel, BorderLayout.SOUTH); _showBoth.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { List<PurchaseOrder> selected = getOrders(null); _orders.getDataModel().updateData(selected); _title.setText(selected.size() + " PurchaseOrder"); } }); _showPending.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { List<PurchaseOrder> selected = getOrders(PurchaseOrder.Status.PENDING); _orders.getDataModel().updateData(selected); _title.setText(selected.size() + " Pending PurchaseOrder"); } }); _showDelivered.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { List<PurchaseOrder> selected = getOrders(PurchaseOrder.Status.DELIVERED); _orders.getDataModel().updateData(selected); _title.setText(selected.size() + " Delivered PurchaseOrder"); } }); _deliver.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new SwingWorker<List<PurchaseOrder>, Void>() { @Override protected List<PurchaseOrder> doInBackground() throws Exception { List<PurchaseOrder> updated = new ArrayList<PurchaseOrder>(); EntityDataModel<PurchaseOrder> orders = _orders.getDataModel(); int n = orders.getRowCount(); for (int i = 0; i < n; i++) { PurchaseOrder order = orders.getRow(i); if (order.getStatus() == PurchaseOrder.Status.PENDING) { updated.add(_service.deliver(order)); } } return updated; } @Override public void done() { try { List<PurchaseOrder> updated = get(10, TimeUnit.SECONDS); _orders.getDataModel().updateData(updated); _title.setText(updated.size() + "" + " Updated PurchaseOrder"); } catch (Exception e) { new ErrorDialog(e).setVisible(true); } } }.execute(); } }); } /** * Gets the orders in a background (i.e. not AWT event dispatch thread) * thread. <br> * But blocks painting anyway, because that is what is intended. * */ private List<PurchaseOrder> getOrders(final PurchaseOrder.Status status) { SwingWorker<List<PurchaseOrder>, Void> worker = new SwingWorker<List<PurchaseOrder>, Void>() { @Override protected List<PurchaseOrder> doInBackground() throws Exception { return _service.getOrders(status, null); } }; worker.execute(); try { return worker.get(); } catch (Exception e) { new ErrorDialog(e).setVisible(true); return Collections.emptyList(); } } }