001    import sale.*;
002    import data.*;
003    import data.ooimpl.*;
004    import data.swing.*;
005    import data.events.*;
006    import util.swing.*;
007    
008    import java.util.*;
009    
010    import javax.swing.*;
011    import javax.swing.table.*;
012    
013    
014    /**
015     * Ein TableEntryDescriptor zur ausführlichen Darstellung des
016     * Videobestandes.
017     */
018    public class EditableVideoStockTED extends AbstractTableEntryDescriptor
019    {
020    
021      //// attributes ////////////////////////////////////////////////////////////
022    
023      private CountingStockImpl videoCountingStock;     // darzustellender Bestand
024      private DataBasket db;                            // verwendeter Datenkorb
025    
026      // Variablen zur Formatierung der Darstellung
027      private TableCellRenderer tcrMoney;
028      private TableCellRenderer tcrName;
029      private TableCellRenderer tcrCount;
030    
031      //// constructor ///////////////////////////////////////////////////////////
032    
033      /**
034       * Erzeugt ein neues Objekt der Klasse <CODE>EditableVideoStockTED</CODE>.
035       * Es wird der darzustellende <CODE>CountingStock</CODE> und der zu
036       * verwendende <CODE>DataBasket</CODE> übergeben.
037       */
038      public EditableVideoStockTED(CountingStockImpl videoCountingStock, DataBasket db)
039      {
040        super();
041        this.videoCountingStock = videoCountingStock;
042        this.db = db;
043        // Initialisierung der Variablen zu Darstellung der
044        // einzelnen Formate
045        tcrMoney = new CurrencyRenderer((Currency)Shop.getTheShop().getCatalog("DM"));
046        tcrName  = new DefaultTableCellRenderer();
047        tcrCount = new DefaultTableCellRenderer();
048    
049        // Ausrichtung fuer die Darstellung der Anzahl
050        ((DefaultTableCellRenderer)tcrCount).setHorizontalAlignment(
051          SwingConstants.CENTER);
052      }
053    
054      //// public methods ////////////////////////////////////////////////////////
055    
056      /**
057       * Liefert die Anzahl der anzuzeigenden Spalten.
058       */
059      public int getColumnCount()
060      {
061        return 5;
062      }
063    
064      /**
065       * Liefert die Spaltennamen.
066       */
067      public String getColumnName(int index)
068      {
069        return (new String[] {"Name",
070                              "Buy",
071                              "Sell",
072                              "Pieces in Stock",
073                              "Rent Pieces"})[index];
074      }
075    
076      /**
077       * Legt die Darstellung für die einzelnen Spalten fest.
078       */
079      public TableCellRenderer getCellRenderer(int index)
080      {
081        switch (index) 
082        {
083          case 0: return tcrName;
084          case 1: return tcrMoney;
085          case 2: return tcrMoney;
086          default: return tcrCount;
087        }
088      }
089    
090      /**
091       * Wird aufgerufen, wenn <CODE>getCellRenderer()</CODE> oder
092       * <CODE>getCellEditor() null</CODE> zurückgeben. 
093       */
094      public Class getColumnClass(int index)
095      {
096        return null;
097      }
098    
099      /**
100       * Liefert den Zelleninhalt für das übergebene Objekt
101       * und die angegebene Spalte.
102       */
103      public Object getValueAt(Object record, int index)
104      {
105        // Videokassette bestimmen
106        VideoCassette videoCassette = (VideoCassette)((CountingStockTableModel.Record)record).getDescriptor();
107        // Anzahl im Automaten ermitteln
108        int count = ((CountingStockTableModel.Record)record).getCount();
109    
110        // Spalteneintrag zurueckgeben
111        switch (index) 
112        {
113          case 0:
114            if (videoCassette != null) 
115              return videoCassette.getName();
116            else 
117              return "";
118          case 1: 
119            return ((QuoteValue)videoCassette.getValue()).getOffer();
120          case 2: 
121            return ((QuoteValue)videoCassette.getValue()).getBid();
122          case 3:   
123            return new IntegerValue(count);
124          case 4:
125          // Anzahl der ausgeliehenen Videos ermitteln
126            int rented = 0;
127            try {
128              Iterator i = VideoMachine.getAllCustomer().iterator();
129              while (i.hasNext()) 
130              {
131              rented = rented +
132                ((Customer)i.next()).getStoringStock().countItems(
133                  videoCassette.getName(), null);
134              }
135            }
136                 catch (NullPointerException npe) {}
137            // und zurueckgeben
138                 return new IntegerValue(rented);
139          default:
140            return null;
141        }
142      }
143    
144      /**
145       * Definiert die Spalten, die editierbar sein sollen.
146       */
147      public boolean isElementEditable(Object record, int index)
148      {
149        return ((index == 1) || (index == 2));
150      }
151    
152      /**
153       * Liefert für die zu editierenden Spalten den
154       * <CODE>TableCellEditor</CODE> zurück. In diesem Fall
155       * eine Instanz der Klasse <CODE>DMCellEditor</CODE>.
156       */
157      public TableCellEditor getCellEditor(int index)
158      {
159        // Preise zu editieren?
160        if (index == 1 || index == 2)
161          return new DMCellEditor(new String[1], "");
162         // restliche Felder
163        else
164          return super.getCellEditor(index);
165      }
166    
167      /**
168       * Überträgt den eingegebenen Wert in das jeweilige
169       * Objekt.
170       */
171      public void setValueAt(Object record, int index, Object value)
172      {
173        VideoCassette videoCassette =
174         (VideoCassette)((data.swing.CountingStockTableModel.Record)
175           record).getDescriptor();
176        try {
177          VideoCassette videoCassetteToEdit =
178            (VideoCassette)videoCountingStock.getCatalog(null).get(
179              videoCassette.getName(), db, true);
180          QuoteValue quoteValue = (QuoteValue)videoCassetteToEdit.getValue();
181          if (index == 1)
182            videoCassetteToEdit.setValue(new QuoteValue(quoteValue.getBid(),(Value)value));
183          if (index == 2)
184            videoCassetteToEdit.setValue(new QuoteValue((Value)value,quoteValue.getOffer()));
185        }
186        catch (VetoException ve) {
187          JOptionPane.showMessageDialog(null,
188            "The editing of that food item was vetoed. It might be in use.");
189        }
190      }
191    
192    }