001 package data.stdforms.twotableformsheet; 002 003 import sale.*; 004 005 import data.*; 006 import data.stdforms.*; 007 008 import users.*; 009 010 /** 011 * MoveStrategy for a Catalog source and a CountingStock destination. 012 * 013 * @author Steffen Zschaler 014 * @version 2.0 20/08/1999 015 * @since v2.0 016 */ 017 public class CCSStrategy extends MoveStrategy { 018 019 /** 020 * Get the sub-process that will move items from the source to the destination. 021 * 022 * @param p the process into which the sub-process wil be embedded. 023 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 024 * @param cSource the source Catalog. 025 * @param csDest the destination CountingStock. 026 * @param db the DataBasket relative to which to perform the operation. 027 * @param ci the CatalogItem that is selected in the source. 028 * @param nCount the number of items to be moved. 029 * @param ttfs the FormSheet that triggers the process. 030 * 031 * @override Never 032 */ 033 public Transition getMoveToDestProcess(SaleProcess p, SalesPoint sp, Catalog cSource, 034 CountingStock csDest, DataBasket db, CatalogItem ci, int nCount, TwoTableFormSheet ttfs) { 035 return new GateChangeTransition(getCheckMoveToDestGate(p, sp, cSource, csDest, db, ci, nCount, ttfs)); 036 } 037 038 /** 039 * Get the first gate of the sub-process that will move items from the source to the destination. 040 * 041 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that 042 * performs it.</p> 043 * 044 * @param p the process into which the sub-process wil be embedded. 045 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 046 * @param cSource the source Catalog. 047 * @param csDest the destination CountingStock. 048 * @param db the DataBasket relative to which to perform the operation. 049 * @param ci the CatalogItem that is selected in the source. 050 * @param nCount the number of items to be moved. 051 * @param ttfs the FormSheet that triggers the process. 052 * 053 * @override Never Instead, override {@link #checkMoveToDest} and/or {@link #moveToDest}. 054 */ 055 protected Gate getCheckMoveToDestGate(SaleProcess p, final SalesPoint sp, final Catalog cSource, 056 final CountingStock csDest, final DataBasket db, final CatalogItem ci, final int nCount, 057 final TwoTableFormSheet ttfs) { 058 return new Gate() { 059 public Transition getNextTransition(SaleProcess p, User u) throws InterruptedException { 060 int nCheckReturn = checkMoveToDest(p, sp, cSource, csDest, db, ci, nCount); 061 062 if (nCheckReturn == 0) { 063 return new Transition() { 064 public Gate perform(SaleProcess p, User u) { 065 moveToDest(p, sp, cSource, csDest, db, ci, nCount); 066 067 return ttfs.getGate(); 068 } 069 }; 070 } else { 071 error(p, nCheckReturn); 072 073 return new GateChangeTransition(ttfs.getGate()); 074 } 075 } 076 }; 077 } 078 079 /** 080 * Move the indicated number of items as indicated into the destination Stock. You can assume that you are 081 * in a {@link Transition}. 082 * 083 * @param p the process into which the sub-process wil be embedded. 084 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 085 * @param cSource the source Catalog. 086 * @param csDest the destination CountingStock. 087 * @param db the DataBasket relative to which to perform the operation. 088 * @param ci the CatalogItem that is selected in the source. 089 * @param nCount the number of items to be moved. 090 * 091 * @override Sometimes 092 */ 093 protected void moveToDest(SaleProcess p, SalesPoint sp, Catalog cSource, CountingStock csDest, 094 DataBasket db, CatalogItem ci, int nCount) { 095 csDest.add(ci.getName(), nCount, db); 096 } 097 098 /** 099 * Check whether the indicated move is allowable. If so, return 0, otherwise return a non-zero error value 100 * that can be passed on to {@link sale.stdforms.FormSheetStrategy#error}. You can assume that you are at a {@link Gate}. 101 * 102 * @param p the process into which the sub-process wil be embedded. 103 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 104 * @param cSource the source Catalog. 105 * @param csDest the destination CountingStock. 106 * @param db the DataBasket relative to which to perform the operation. 107 * @param ci the CatalogItem that is selected in the source. 108 * @param nCount the number of items to be moved. 109 * 110 * @override Sometimes The default implementation returns 0. 111 */ 112 protected int checkMoveToDest(SaleProcess p, SalesPoint sp, Catalog cSource, CountingStock csDest, 113 DataBasket db, CatalogItem ci, int nCount) throws InterruptedException { 114 return 0; 115 } 116 117 /** 118 * Get the sub-process that will move items from the destination to the source. 119 * 120 * @param p the process into which the sub-process wil be embedded. 121 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 122 * @param cSource the source Catalog. 123 * @param csDest the destination CountingStock. 124 * @param db the DataBasket relative to which to perform the operation. 125 * @param ci the CatalogItem that is selected in the destination. 126 * @param nCount the number of items to be moved. 127 * @param ttfs the FormSheet that triggers the process. 128 * 129 * @override Never 130 */ 131 public Transition getMoveToSourceProcess(SaleProcess p, SalesPoint sp, Catalog cSource, 132 CountingStock csDest, DataBasket db, CatalogItem ci, int nCount, TwoTableFormSheet ttfs) { 133 return new GateChangeTransition(getCheckMoveToSourceGate(p, sp, cSource, csDest, db, ci, nCount, ttfs)); 134 } 135 136 /** 137 * Get the first gate of the sub-process that will move items from the destination to the source. 138 * 139 * <p>This Gate will check whether the move is allowable, and if so, will trigger a Transition that 140 * performs it.</p> 141 * 142 * @param p the process into which the sub-process wil be embedded. 143 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 144 * @param cSource the source Catalog. 145 * @param csDest the destination CountingStock. 146 * @param db the DataBasket relative to which to perform the operation. 147 * @param ci the CatalogItem that is selected in the destination. 148 * @param nCount the number of items to be moved. 149 * @param ttfs the FormSheet that triggers the process. 150 * 151 * @override Never Instead, override {@link #checkMoveToSource} and/or {@link #moveToSource}. 152 */ 153 protected Gate getCheckMoveToSourceGate(SaleProcess p, final SalesPoint sp, final Catalog cSource, 154 final CountingStock csDest, final DataBasket db, final CatalogItem ci, final int nCount, 155 final TwoTableFormSheet ttfs) { 156 return new Gate() { 157 public Transition getNextTransition(SaleProcess p, User u) throws InterruptedException { 158 int nCheckReturn = checkMoveToSource(p, sp, cSource, csDest, db, ci, nCount); 159 160 if (nCheckReturn == 0) { 161 return new Transition() { 162 public Gate perform(SaleProcess p, User u) { 163 moveToSource(p, sp, cSource, csDest, db, ci, nCount); 164 165 return ttfs.getGate(); 166 } 167 }; 168 } else { 169 error(p, nCheckReturn); 170 171 return new GateChangeTransition(ttfs.getGate()); 172 } 173 } 174 }; 175 } 176 177 /** 178 * Move the indicated number of items as indicated from the destination Stock. You can assume that you are 179 * in a {@link Transition}. 180 * 181 * @param p the process into which the sub-process wil be embedded. 182 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 183 * @param cSource the source Catalog. 184 * @param csDest the destination CountingStock. 185 * @param db the DataBasket relative to which to perform the operation. 186 * @param ci the CatalogItem that is selected in the destination. 187 * @param nCount the number of items to be moved. 188 * 189 * @override Sometimes 190 */ 191 protected void moveToSource(SaleProcess p, SalesPoint sp, Catalog cSource, CountingStock csDest, 192 DataBasket db, CatalogItem ci, int nCount) { 193 try { 194 csDest.remove(ci.getName(), nCount, db); 195 } 196 catch (NotEnoughElementsException nee) { 197 error(p, NOT_ENOUGH_ELEMENTS_ERROR); 198 } 199 catch (data.events.VetoException ve) { 200 error(p, REMOVE_VETO_EXCEPTION); 201 } 202 } 203 204 /** 205 * Check whether the indicated move is allowable. If so, return 0, otherwise return a non-zero error value 206 * that can be passed on to {@link sale.stdforms.FormSheetStrategy#error}. You can assume that you are at a {@link Gate}. 207 * 208 * @param p the process into which the sub-process wil be embedded. 209 * @param sp the SalesPoint, if any, at which the FormSheet is being displayed. 210 * @param cSource the source Catalog. 211 * @param csDest the destination CountingStock. 212 * @param db the DataBasket relative to which to perform the operation. 213 * @param ci the CatalogItem that is selected in the destination. 214 * @param nCount the number of items to be moved. 215 * 216 * @override Sometimes The default implementation returns 0. 217 */ 218 protected int checkMoveToSource(SaleProcess p, SalesPoint sp, Catalog cSource, CountingStock csDest, 219 DataBasket db, CatalogItem ci, int nCount) throws InterruptedException { 220 return 0; 221 } 222 }