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    }