001 import sale.*;
002 import sale.events.*;
003 import sale.stdforms.*;
004 import data.events.*;
005 import data.ooimpl.*;
006 import log.*;
007 import log.stdforms.*;
008
009 import java.io.*;
010
011
012 /**
013 * Diese Klasse implementiert das Büro. Hier kann der Manager das
014 * Logfile einsehen und Videos nachkaufen oder aus dem Bestand nehmen.
015 */
016 public class Office extends SalesPoint
017 {
018 //// attributes ////////////////////////////////////////////////////////////
019
020 // Managerpasswort
021 private static String password;
022
023
024 //// constructor ///////////////////////////////////////////////////////////
025
026 /**
027 * Konstuktor erzeugt ein neues Objekt der Klasse <CODE>Office</CODE>.
028 */
029 public Office(String name)
030 {
031 super(name);
032
033 // neuen StockChangeListener am Geldbestand des Automaten anmelden
034 ((MoneyBagImpl)Shop.getTheShop().getStock("coin slot")).
035 addStockChangeListener(
036 new StockChangeAdapter()
037 {
038 // StockItem wurde hinzugefuegt
039 public void commitAddStockItems (StockChangeEvent sce)
040 {
041 // der Geldbestand hat sich geaendert, FormSheet neu darstellen
042 refreshOfficeDisplay();
043 }
044
045 // StockItem wurde geloescht
046 public void commitRemoveStockItems (StockChangeEvent sce)
047 {
048 // der Geldbestand hat sich geaendert, FormSheet neu darstellen
049 commitAddStockItems(sce);
050 }
051 }
052 );
053
054 // neuen TimerListener am Timer des Automaten anmelden
055 Shop.getTheShop().getTimer().addTimerListener(
056 new TimerAdapter()
057 {
058 public void onGoneAhead (TimerEvent trEvt)
059 {
060 // wurde Zeit weitergeschalten, FormSheet neu darstellen
061 refreshOfficeDisplay();
062 }
063 }
064 );
065 }
066
067 /**
068 * Stellt nach Veränderungen der Daten das FormSheet neu dar
069 */
070 protected void refreshOfficeDisplay()
071 {
072 if (getCurrentProcess() == null && hasUseableDisplay (null))
073 try {
074 setFormSheet (null, getDefaultFormSheet());
075 }
076 catch (InterruptedException iexc) {
077 System.err.println ("Update interrupted");
078 }
079 }
080
081 //// public methods ///////////////////////////////////////////////////////
082
083 /**
084 * Gibt das Standard-FormSheet für das Büro zurück.
085 */
086 public FormSheet getDefaultFormSheet()
087 {
088 return new FormSheet("Office", new DefaultOfficeFormCreator(this), false);
089 }
090
091 /**
092 * Gibt das Standard-MenuSheet zurück.
093 */
094 public MenuSheet getDefaultMenuSheet()
095 {
096 // neues Menue anlegen, wird Wartungsmenue
097 MenuSheet msSubMenu = new MenuSheet("Maintenance");
098
099 // neuen Menuepunkt zum Weiterschalten der Zeit anlegen
100 msSubMenu.add(new MenuSheetItem ("Advance time",
101 new sale.Action()
102 {
103 public void doAction(SaleProcess p, SalesPoint sp)
104 {
105 // Zeit weiterschalten
106 Shop.getTheShop().getTimer().goAhead();
107 }
108 }
109 ));
110
111 // neuen Menuepunkt zum Einsehen der Log-Datei anlegen
112 msSubMenu.add (new MenuSheetItem ("See log file",
113 new sale.Action()
114 {
115 public void doAction (SaleProcess p, SalesPoint sp)
116 {
117 try {
118 // LogTableForm erzeugen
119 FileInputStream fis = new FileInputStream ("machine.log");
120 LogInputStream lis = new LogInputStream (fis);
121 LogTableForm ltf = new LogTableForm ("View log file", lis);
122
123 // "Cancel"-Button entfernen
124 ltf.removeButton (FormSheet.BTNID_CANCEL);
125
126 // FormSheet setzen
127 setFormSheet (null, ltf);
128 }
129
130 // falls Datei nicht existiert
131 catch (FileNotFoundException fnfexc) {
132 try {
133 setFormSheet(null, new MsgForm("Error", "Log file not found."));
134 }
135 catch (InterruptedException iexc) {}
136 }
137
138 // falls Fehler beim Lesen der Datei
139 catch (IOException ioexc) {
140 try {
141 setFormSheet(null, new MsgForm("Error", "Log file corrupt. It might be empty."));
142 }
143 catch (InterruptedException iexc) {}
144 }
145
146 // falls Setzen des FormSheets unterbrochen
147 catch (InterruptedException iexc) {
148 try {
149 setFormSheet (null, new MsgForm ("Error", iexc.toString()));
150 }
151 catch (InterruptedException iexc2) {}
152 }
153 }
154 }
155 ));
156
157
158 // neuen Menuepunkt zum Einsehen und Editieren des Bestandes
159 msSubMenu.add(new MenuSheetItem ("Edit Video-Stock",
160 new sale.Action()
161 {
162 public void doAction(SaleProcess p, SalesPoint sp)
163 {
164 // Code zum Ausfuehren des Prozesses
165 sp.runProcess(new SeeVideoStockProcess());
166 }
167 }
168 ));
169
170 // neues Menue anlegen, wird Menueleiste
171 MenuSheet msMenu = new MenuSheet("office menu");
172
173 // Wartungsmenue in Menueleiste des Bueros einbauen
174 msMenu.add(msSubMenu);
175
176 // Menüleiste zurückgeben
177 return msMenu;
178 }
179
180
181
182 /**
183 * Setzt das Managerpasswort.
184 */
185 public static void setPassword(String password)
186 {
187 Office.password = password;
188 }
189
190
191 /**
192 * Testet ob das übergebene Passwort das Managerpasswort ist.
193 */
194 public static boolean testPassword(String password)
195 {
196 return password.equals(Office.password);
197 }
198
199 }