001 package market;
002
003 import sale.Action;
004 import sale.FormSheet;
005 import sale.FormSheetContentCreator;
006 import sale.SaleProcess;
007 import sale.SalesPoint;
008 import sale.Transition;
009 import sale.UIGate;
010
011 /**
012 * Helper class that supports the division of {@link FormSheet} and {@link SaleProcess}.<br>
013 * <br>
014 * Button actions which are attached to the FormSheets in the process are meant to be
015 * reloaded after the shop's state has been saved. Therefore it is necessary to put the assignment of the
016 * button actions to Buttons into a {@link FormSheetContentCreator}.<br>
017 * As this assignment code is always the same, it has been put into this extra class. That makes the original
018 * code more concise.
019 */
020 public abstract class SProcessMarket extends SaleProcess {
021
022 /**
023 * @param name the name of the process.
024 */
025 public SProcessMarket(String name) {
026 super(name);
027 }
028
029 /**
030 * Assigns an {@link Action} to a FormSheet's button using a {@link FormSheetContentCreator}.
031 *
032 * @param formSheet the FormSheet to which the action should be assigned.
033 * @param ac the action to be assigned.
034 * @param btn_id the button ID to which the action should be assigned. A button with this
035 * ID must be defined in the FormSheet itself or a {@link NullPointerException} will occur.
036 */
037 protected void setAction(FormSheet formSheet, final Action ac, final int btn_id){
038 formSheet.addContentCreator(new FormSheetContentCreator(){
039 protected void createFormSheetContent(FormSheet fs) {
040 fs.getButton(btn_id).setAction(ac);
041 }
042 });
043 }
044
045 /**
046 * Assigns an {@link Action}, which consists only of a {@link Transition} to a FormSheet's
047 * button using a {@link FormSheetContentCreator}.<br>
048 * Caution has to be taken when a circular reference occurs.<br>
049 * Example: Method getGateA() has a setTransition-method which changes to gateB using method
050 * getGateB(). This method getGateB() contains a setTransition-method which changes to gateA using
051 * the getGateA()-method. This causes an infinite loop.<br>
052 * In contrast the {@link #setAction(FormSheet, Action, int) setAction()} method works well,
053 * because the transition in it is not run on initialization, but only when the button has been pressed.
054 *
055 * @param formSheet the FormSheet from which the Transition starts.
056 * @param trans the Transition to be performed.
057 * @param btn_id the button ID that causes the transition to start. A button with this
058 * ID must be defined in the FormSheet itself or a {@link NullPointerException} will occur.
059 */
060 protected void setTransition(FormSheet formSheet, final Transition trans, int btn_id){
061 setAction(formSheet,
062 new sale.Action(){
063 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable {
064 if(p.getCurrentGate()instanceof UIGate)
065 ((UIGate)p.getCurrentGate()).setNextTransition(trans);
066 }
067 },
068 btn_id);
069 }
070 }