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