001 package data.stdforms.singletableformsheet; 002 003 import sale.*; 004 import sale.stdforms.*; 005 006 import data.*; 007 import data.stdforms.*; 008 009 import users.*; 010 011 /** 012 * Strategy that can be associated to the "Remove" button of a SingleTableFormSheet that displays 013 * the contents of a Catalog. 014 * 015 * @author Steffen Zschaler 016 * @version 2.0 20/08/1999 017 * @since v2.0 018 */ 019 public class DefaultRemoveCatalogItemStrategy extends EditButtonStrategy { 020 021 /** 022 * The Catalog that is being edited. 023 * 024 * @serial 025 */ 026 protected Catalog m_cCatalog; 027 028 /** 029 * Create a new DefaultRemoveCatalogItemStrategy. 030 * 031 * @param c the Catalog to be edited. Must be the same that is displayed by the {@link SingleTableFormSheet}. 032 */ 033 public DefaultRemoveCatalogItemStrategy(Catalog c) { 034 super(); 035 036 m_cCatalog = c; 037 } 038 039 /** 040 * @override Never 041 */ 042 public Transition getEditProcess(SingleTableFormSheet stfs, SaleProcess p, SalesPoint sp) { 043 return new GateChangeTransition(getCheckGate(stfs)); 044 } 045 046 /** 047 * Get the Gate that checks whether the removal is allowed. If this is the case, the Gate must be left 048 * through {@link #getRemoveTransition}, otherwise, a transition to the 049 * {@link SingleTableFormSheet#getGate SingleTableFormSheet's gate} should be triggered. 050 * 051 * @override Sometimes The default implementation puts up a MsgForm asking for the user to confirm the 052 * removal. Caption and text of the message are obtained via {@link #getConfirmationCaption} and 053 * {@link #getConfirmationText}, resp. 054 * 055 * @param stfs the FormSheet that triggered the operation. 056 */ 057 protected Gate getCheckGate(final SingleTableFormSheet stfs) { 058 CatalogItem ci = (CatalogItem)stfs.getSelectedRecord(); 059 FormSheet fs = new MsgForm(getConfirmationCaption(stfs, ci), getConfirmationText(stfs, ci)); 060 061 final UIGate uigCheckGate = new UIGate(fs, null); 062 063 fs.addContentCreator(new FormSheetContentCreator() { 064 protected void createFormSheetContent(FormSheet fs) { 065 fs.removeAllButtons(); 066 067 fs.addButton("Yes", FormSheet.BTNID_OK, new Action() { 068 public void doAction(SaleProcess p, SalesPoint sp) { 069 uigCheckGate.setNextTransition(getRemoveTransition(stfs)); 070 } 071 }); 072 073 fs.addButton("No", FormSheet.BTNID_CANCEL, new Action() { 074 public void doAction(SaleProcess p, SalesPoint sp) { 075 uigCheckGate.setNextTransition(new GateChangeTransition(stfs.getGate())); 076 } 077 }); 078 } 079 }); 080 081 return uigCheckGate; 082 } 083 084 /** 085 * Get the caption for the default confirmation {@link MsgForm}. 086 * 087 * @param stfs the FormSheet that triggered the operation. 088 * @param ci the CatalogItem that is going to be removed. 089 * 090 * @override Sometimes The default implementation returns 091 * <code>(stfs.getCaption() + " - Confirmation")</code>. 092 */ 093 protected String getConfirmationCaption(SingleTableFormSheet stfs, CatalogItem ci) { 094 return (stfs.getCaption() + " - Confirmation"); 095 } 096 097 /** 098 * Get the text for the default confirmation {@link MsgForm}. 099 * 100 * @param stfs the FormSheet that triggered the operation. 101 * @param ci the CatalogItem that is going to be removed. 102 * 103 * @override Sometimes The default implementation returns 104 * <code>("Are you sure, you want to remove \"" + ci.getName() + "\"?")</code>. 105 */ 106 protected String getConfirmationText(SingleTableFormSheet stfs, CatalogItem ci) { 107 return ("Are you sure, you want to remove \"" + ci.getName() + "\"?"); 108 } 109 110 /** 111 * Get the transition that performs the actual removal. This basically calls {@link #doRemove}. 112 * 113 * @param stfs the FormSheet that triggered the operation. 114 * 115 * @override Never Instead, override {@link #doRemove}. 116 */ 117 protected Transition getRemoveTransition(final SingleTableFormSheet stfs) { 118 return new Transition() { 119 public Gate perform(SaleProcess p, User u) { 120 doRemove(p, (CatalogItem)stfs.getSelectedRecord(), p.getBasket()); 121 122 return stfs.getGate(); 123 } 124 }; 125 } 126 127 /** 128 * Perform the actual removal. 129 * 130 * <p>Any error condition should be passed on to {@link FormSheetStrategy#error} in 131 * {@link FormSheetStrategy}.</p> 132 * 133 * @override Sometimes 134 * 135 * @param p the process in which this sub-process will be implanted. 136 * @param ci the CatalogItem to be removed. Can be <code>null</code>. 137 * @param db the DataBasket relative to which to perform the operation. 138 */ 139 protected void doRemove(SaleProcess p, CatalogItem ci, DataBasket db) { 140 if (ci != null) { 141 try { 142 m_cCatalog.remove(ci, db); 143 } 144 catch (data.events.VetoException ve) { 145 error(p, REMOVE_VETO_EXCEPTION); 146 } 147 } 148 } 149 }