001 import sale.*;
002 import data.*;
003 import data.ooimpl.*;
004 import data.stdforms.*;
005 import data.swing.*;
006 import data.events.*;
007 import users.*;
008
009 import java.util.*;
010
011 import javax.swing.*;
012
013
014 /**
015 * Prozess zur Bestandsanzeige und zum Editieren des Bestandes.
016 */
017 public class SeeVideoStockProcess extends SaleProcess
018 {
019
020 //// attributes ////////////////////////////////////////////////////////////
021
022 // Gates
023 protected UIGate selectionGate;
024
025
026 //// constructor ///////////////////////////////////////////////////////////
027
028 /**
029 * Erzeugt ein neues Objekt der Klasse <CODE>SeeVideoStockProcess</CODE>.
030 */
031 public SeeVideoStockProcess()
032 {
033 super ("SeeVideoProcess");
034 }
035
036 //// protected methods /////////////////////////////////////////////////////
037
038 /**
039 * Baut die Oberfläche für den Verleihvorgang auf.
040 */
041 protected void setupMachine()
042 {
043 // Auswahl-Gate anlegen
044 selectionGate = new UIGate(null, null);
045
046 // Der Datenkorb des Prozesses
047 final DataBasket db = getBasket();
048
049 // Video-Katalog holen
050 final Catalog videoCatalog = Shop.getTheShop().getCatalog("Video-Catalog");
051
052 // Der Bestand der Videos
053 final CountingStockImpl videoStock = (CountingStockImpl)Shop.getTheShop().
054 getStock("Video-Countingstock");
055
056 // darzustellendes Formsheet erstellen
057 final SingleTableFormSheet stfs =
058 SingleTableFormSheet.create("See videos in stock and edit Process",
059 videoStock,
060 selectionGate,
061 db,
062 true,
063 new EditableVideoStockTED(videoStock, db)
064 );
065
066
067 // FormSheetContentCreator am Auswahl-Gate anmelden
068 stfs.addContentCreator(
069 new FormSheetContentCreator()
070 {
071 protected void createFormSheetContent(FormSheet fs)
072 {
073 // alle vorhandenen Buttons entfernen
074 fs.removeAllButtons();
075
076 // neuen "New"-Button einbauen
077 fs.addButton ("New", 100,
078 new sale.Action()
079 {
080 public void doAction (SaleProcess p, SalesPoint sp)
081 {
082 // Anlegen eines neuen Videos
083 // Eingabefelder erzeugen
084 JTextField jTextField1 = new JTextField();
085 JTextField jTextField2 = new JTextField();
086 JTextField jTextField3 = new JTextField();
087 JTextField jTextField4 = new JTextField();
088
089 // neues JPanel anlegen und vertikales Boxlayout setzen
090 JPanel jTextPanel = new JPanel();
091 jTextPanel.setLayout(new BoxLayout(jTextPanel,
092 BoxLayout.Y_AXIS));
093
094 // Label und Paßwortfelder einfuegen
095 jTextPanel.add(new JLabel("Name"));
096 jTextPanel.add(jTextField1);
097 jTextPanel.add(new JLabel("Buy (in Pf)"));
098 jTextPanel.add(jTextField2);
099 jTextPanel.add(new JLabel("Sell (in Pf)"));
100 jTextPanel.add(jTextField3);
101 jTextPanel.add(new JLabel("Amount"));
102 jTextPanel.add(jTextField4);
103 // Dialog darstellen
104 JOptionPane.showMessageDialog (null,
105 jTextPanel,
106 "New Video-Cassette",
107 JOptionPane.QUESTION_MESSAGE);
108
109 // Name des Videos
110 String name = jTextField1.getText();
111
112 // Verkaufspreis
113 int buy = 0;
114 try {
115 buy = (new Integer(jTextField2.getText())).intValue();
116 }
117 catch (NumberFormatException ne) {}
118
119 // Einkaufspreis
120 int sell = 0;
121 try {
122 sell = (new Integer(jTextField3.getText())).intValue();
123 }
124 catch (NumberFormatException ne) {}
125
126 // Anzahl
127 int amount = 0;
128 try {
129 amount = (new Integer(jTextField4.getText())).intValue();
130 }
131 catch (NumberFormatException ne) {}
132
133 // ueberpruefen, ob Eingabe korrekt
134 if (sell > 0 && buy > 0 && amount > 0 && !name.equals(""))
135 {
136 // in Katalog uebernehmen
137 try {
138 videoCatalog.add(new VideoCassette(name, new QuoteValue
139 (new IntegerValue (buy), new IntegerValue (sell))), db);
140
141 // in Bestand uebernehmen
142 videoStock.add(name, amount, db);
143 }
144
145 // Element existiert bereits
146 catch (DuplicateKeyException dke) {
147 JOptionPane.showMessageDialog(null, "Element exists");
148 }
149 }
150
151 // Eingabe fehlerhaft
152 else
153 {
154 JOptionPane.showMessageDialog(null,
155 "The given input was not correct!");
156 }
157 }
158 }
159 );
160
161 // neuen "Remove"-Button einbauen
162 fs.addButton ("Remove", 101,
163 new sale.Action()
164 {
165 public void doAction (SaleProcess p, SalesPoint sp)
166 {
167 // markierte Zeile holen
168 Object record = stfs.getSelectedRecord();
169 if (record != null)
170 {
171 VideoCassette videoCassette = (VideoCassette)
172 ((data.swing.CountingStockTableModel.Record) record).getDescriptor();
173
174 // Anzahl der entliehenen Videos bestimmen
175 int rented = 0;
176 if (VideoMachine.getAllCustomer() != null)
177 {
178 Iterator i = VideoMachine.getAllCustomer().iterator();
179 while (i.hasNext())
180 rented = rented +
181 ((Customer)i.next()).getStoringStock().countItems(
182 videoCassette.getName(), null);
183 }
184
185 // ueberpruefen, ob gewaehltes Video ausgeliehen
186 if (rented <= 0)
187 {
188 // loeschen des gewaehlten Eintrags
189 try {
190 videoCatalog.remove(videoCassette, db);
191 }
192 catch (VetoException ve) {
193 ve.printStackTrace();
194 JOptionPane.showMessageDialog(null,
195 "The selected item can't be removed!");
196 }
197 }
198
199 // ausgeliehen Videos vorhanden
200 else
201 {
202 JOptionPane.showMessageDialog(null,
203 "There are still rented videos!");
204 }
205 }
206 }
207 }
208 );
209
210 // neuen "Ok"-Button einbauen
211 fs.addButton ("Ok", 102,
212 new sale.Action()
213 {
214 public void doAction (SaleProcess p, SalesPoint sp)
215 {
216 // Transition zum Commit-Gate als naechste Transition setzen
217 selectionGate.setNextTransition(
218 GateChangeTransition.CHANGE_TO_COMMIT_GATE);
219 }
220 }
221 );
222
223 // neuen "Cancel"-Button einbauen
224 fs.addButton ("Cancel", 103,
225 new sale.Action()
226 {
227 public void doAction (SaleProcess p, SalesPoint sp)
228 {
229 // Transition zum Rollback-Gate als naechste Transition setzen
230 selectionGate.setNextTransition(
231 GateChangeTransition.CHANGE_TO_ROLLBACK_GATE);
232 }
233 }
234 );
235
236 }
237 }
238 );
239 }
240
241
242 //// public methods ////////////////////////////////////////////////////////
243
244 /**
245 * Gibt das Startgate des Prozesses zurück.
246 */
247 public Gate getInitialGate()
248 {
249 // Automat aufbauen
250 setupMachine();
251
252 // ...und Auswahl-Gate als Startgate zurueckgeben
253 return selectionGate;
254 }
255
256 /**
257 * Übergibt das Log-Gate. Hier das Stop-Gate, da beim Beenden des
258 * Prozesses kein Log-Eintrag geschrieben werden soll.
259 */
260 public Gate getLogGate()
261 {
262 return getStopGate();
263 }
264
265 }