001 package videoautomat.contentcreator;
002 import javax.swing.Box;
003 import javax.swing.BoxLayout;
004 import javax.swing.JComponent;
005 import javax.swing.JLabel;
006 import javax.swing.JPanel;
007
008 import sale.FormSheet;
009 import sale.FormSheetContentCreator;
010 import sale.FormSheet.FormButton;
011 import videoautomat.SaleProcessRent;
012 import videoautomat.contentcreator.stdactions.TransitWithAction;
013 import videoautomat.transition.RentPayConfirmTransition;
014 import videoautomat.transition.RentPayRollbackTransition;
015 import data.CatalogItemValue;
016 import data.DataBasket;
017 import data.IntegerValue;
018 import data.NumberValue;
019 import data.events.StockChangeAdapter;
020 import data.events.StockChangeEvent;
021 import data.ooimpl.MoneyBagImpl;
022 /**
023 * Changes the FormSheet layout and adds some labels and a listener
024 * to change the pay button state.
025 *
026 * @author Tobias Ruch
027 */
028 public class RentPayFSContentCreator extends FormSheetContentCreator {
029 /** String of the pay value */
030 private String payValue;
031 /** Process in which the FormSheet and so the content creator is used */
032 private SaleProcessRent processRent;
033
034 /**
035 * Creates the content creator.
036 * @param process - <code>SaleProcessRent</code> in which the ContentCreator is use to have access to some
037 * process data
038 */
039 public RentPayFSContentCreator(SaleProcessRent process){
040 this.processRent = process;
041 payValue = "";
042 }
043
044 /**
045 * Changes the FormSheetContent of the gives <code>FormSheet</code>.
046 * Adds labels, button and there actions
047 * @param fs - a <code>FormSheet</code> which should be changed.
048 */
049 protected void createFormSheetContent(FormSheet fs) {
050 JComponent jc = new JPanel();
051 jc.setLayout(new BoxLayout(jc, BoxLayout.Y_AXIS));
052 jc.add(Box.createVerticalStrut(10));
053 jc.add(new JLabel("You have to pay: " + payValue));
054 jc.add(Box.createVerticalStrut(10));
055 jc.add(fs.getComponent());
056
057 fs.setComponent(jc);
058 fs.removeAllButtons();
059
060 fs.addButton("Pay", 1, new TransitWithAction(new RentPayConfirmTransition()));
061
062 fs.addButton("Cancel", 2, new TransitWithAction(new RentPayRollbackTransition()));
063 fs.getButton(1).setEnabled(false);
064 setButtonStockListener(fs.getButton(1));
065 }
066
067
068 public void setPayValue(String payValue){
069 this.payValue = payValue;
070 }
071 /**
072 * Adds an implementation of the <code>StockChangeListener</code> to the given button, so that this button gets
073 * enabled if there is enough money in the temporar-moneybag and otherwise it gets disabled
074 *
075 * @param fb
076 * the <code>FormButton</code> the listener should en/disable
077 */
078 private void setButtonStockListener(final FormButton fb) {
079 final MoneyBagImpl bag = (MoneyBagImpl) processRent.getContext().getProcessData(SaleProcessRent.MB_TEMP_KEY);
080 final DataBasket basket = processRent.getBasket();
081 final NumberValue nv_sum = (NumberValue) processRent.getContext().getProcessData(SaleProcessRent.SUM_KEY);
082
083 //new StockChangeApdater, which is extended by an anonymous class
084 //which overrides the addedStockItems method
085
086 StockChangeAdapter sca = new StockChangeAdapter() {
087 public void addedStockItems(StockChangeEvent e) {
088
089
090 if (bag.sumStock(basket, new CatalogItemValue(), new IntegerValue(0))
091 .compareTo(nv_sum)>= 0){
092 fb.setEnabled(true);
093 }
094 }
095 public void removedStockItems(StockChangeEvent e) {
096 if (bag.sumStock(basket, new CatalogItemValue(), new IntegerValue(0))
097 .compareTo(nv_sum) < 0){
098 fb.setEnabled(false);
099 }
100 }
101 };
102
103 bag.addStockChangeListener(sca);
104 }
105 }