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 }