001 package market;
002
003 import java.awt.Rectangle;
004
005 import market.stdform.FSLogOn;
006 import sale.Action;
007 import sale.FormSheet;
008 import sale.Gate;
009 import sale.GateChangeTransition;
010 import sale.SaleProcess;
011 import sale.SalesPoint;
012 import sale.Shop;
013 import sale.UIGate;
014 import sale.stdforms.MsgForm;
015 import users.User;
016 import users.UserManager;
017 import users.stdforms.LogOnForm;
018 import users.swing.UserFilter;
019
020 /**
021 * SaleProcess used to log on a UPerson to the system.
022 */
023 public class SProcessLogOn extends SProcessMarket {
024
025 /**
026 * Stores which kind of person wants to log on, look also at constants in UMUserBase
027 */
028 private int userType;
029
030 /**
031 * UserFilter used to show the right Users in a LogOnForm
032 */
033 private UserFilter uf_filter;
034
035 /**
036 * LogOnForm used by select-user-gate
037 */
038 private LogOnForm lof_selection;
039
040 /**
041 * Gate for selecting username.
042 */
043 private UIGate uig_selectUser = new UIGate(null, null);
044
045 /**
046 * Gate for displaying the log on was unsuccessful.
047 */
048 private UIGate uig_logOnFailed = new UIGate(null, null);
049
050 /**
051 * Gate for displaying the user has already logged on.
052 */
053 private UIGate uig_userIsLogged = new UIGate(null, null);
054
055 /**
056 * Create a new SProcessLogOn
057 *
058 * @param i the kind of User who wants to log on
059 */
060 private SProcessLogOn(int i){
061 super("Log-on-Process");
062 this.userType = i;
063
064 // choice what kind of user wants to log on
065 switch(userType){
066 case UMUserBase.CUSTOMER:
067 uf_filter = ((UMUserBase)UserManager.getGlobalUM()).getCustomers();
068 break;
069 case UMUserBase.WAREHOUSE_WORKER:
070 uf_filter = ((UMUserBase)UserManager.getGlobalUM()).getWarehouseWorker();
071 break;
072 case UMUserBase.SELLER:
073 uf_filter = ((UMUserBase)UserManager.getGlobalUM()).getSeller();
074 break;
075 case UMUserBase.MANAGER:
076 uf_filter = ((UMUserBase)UserManager.getGlobalUM()).getManager();
077 }
078 }
079
080 /**
081 * Attaches a {@link FSLogOn} and its actions to {@link #uig_selectUser}.
082 * @return the set up {@link #uig_selectUser}.
083 */
084 protected Gate getInitialGate() {
085 lof_selection = new FSLogOn(uf_filter);
086 setAction(lof_selection, new Action(){
087 public void doAction(SaleProcess process, SalesPoint point) {
088 int error = 0;
089 lof_selection.ok();
090 User user = lof_selection.getResult();
091 if(UMUserBase.isLoggedOn(user)) error = 1;
092 if(user == null) error = 2;
093 switch (error) {
094 case 1:
095 uig_selectUser.setNextTransition(
096 new GateChangeTransition(getUserIsLoggedGate()));
097 break;
098 case 2:
099 uig_selectUser.setNextTransition(
100 new GateChangeTransition(getLogOnFailedGate()));
101 break;
102 default:
103 process.detachContext();
104 switch(userType){
105 case UMUserBase.CUSTOMER:
106 SPCustomer sp = new SPCustomer(user);
107 SMarket.getTheMarket().removeSalesPoint(point);
108 uig_selectUser.setNextTransition(GateChangeTransition.CHANGE_TO_STOP_GATE);
109 break;
110 case UMUserBase.WAREHOUSE_WORKER:
111 point.attach(user);
112 point.setSalesPointFrameBounds(new Rectangle(0,0,640,480));
113 SMarket.fireUpdateWorkerScreen();
114 point.runProcess(new SProcessWorker(((UStaffer)user).getFullName()));
115 uig_selectUser.setNextTransition(GateChangeTransition.CHANGE_TO_STOP_GATE);
116 break;
117 case UMUserBase.SELLER:
118 point.attach(user);
119 point.setSalesPointFrameBounds(new Rectangle(0,0,640,480));
120 point.runProcess(new SProcessSeller(((UStaffer)user).getFullName()));
121 uig_selectUser.setNextTransition(GateChangeTransition.CHANGE_TO_STOP_GATE);
122 break;
123 case UMUserBase.MANAGER:
124 point.attach(user);
125 point.setSalesPointFrameBounds(new java.awt.Rectangle(0,0,720,540));
126 point.runProcess(new SProcessManager());
127 uig_selectUser.setNextTransition(GateChangeTransition.CHANGE_TO_STOP_GATE);
128 break;
129 }
130 break;
131 }
132 }}, FormSheet.BTNID_OK);
133
134 setAction(lof_selection, new Action(){
135 public void doAction(SaleProcess process, SalesPoint point) throws Throwable {
136 uig_selectUser.setNextTransition(GateChangeTransition.CHANGE_TO_STOP_GATE);
137 point.processFinished(process);
138 SMarket.getTheMarket().removeSalesPoint(point);
139 }
140 }, FormSheet.BTNID_CANCEL);
141
142 uig_selectUser.setFormSheet(lof_selection);
143 return uig_selectUser;
144 }
145
146 /**
147 * Attaches a {@link MsgForm} and its OK-action to {@link #uig_logOnFailed}.
148 * @return the set up {@link #uig_logOnFailed}.
149 */
150 private Gate getLogOnFailedGate(){
151 FormSheet fs = new MsgForm("Anmeldung fehlgeschlagen", "Das System konnte Sie nicht anmelden!\n"
152 + "Bitte überprüfen Sie Nutzernamen und Passwort.");
153 setTransition(fs, new GateChangeTransition(getInitialGate()), FormSheet.BTNID_OK);
154 uig_logOnFailed.setFormSheet(fs);
155 return uig_logOnFailed;
156 }
157
158 /**
159 * Attaches a {@link MsgForm} and its OK-action to {@link #uig_userIsLogged}.
160 * @return the set up {@link #uig_userIsLogged}.
161 */
162 private Gate getUserIsLoggedGate(){
163 FormSheet fs = new MsgForm("Anmeldung fehlgeschlagen", "Sie sind bereits am System angemeldet!");
164 setTransition(fs, new GateChangeTransition(getInitialGate()), FormSheet.BTNID_OK);
165 uig_userIsLogged.setFormSheet(fs);
166 return uig_userIsLogged;
167 }
168
169
170 // ################################### public methods ##################################################
171
172 /**
173 * Returns an Action that initiates a SProcessLogOn
174 *
175 * @param i what kind of user wants to log on, look at the constants of UMUserBase
176 *
177 * @see UMUserBase
178 */
179 public static Action createLogOnProcess(final int i){
180 return new Action(){
181 public void doAction(SaleProcess p, SalesPoint sp) throws Throwable {
182 SProcessLogOn splo = new SProcessLogOn(i);
183 SPListenable point = new SPListenable("Sohn&Sohn");
184 point.setSalesPointFrameBounds(new Rectangle(0,0,500,125));
185 Shop.getTheShop().addSalesPoint(point);
186 point.runProcess(splo);
187 }
188 };
189 }
190 }
191