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 }