001 package market.stdform; 002 003 import java.awt.GridBagConstraints; 004 import java.awt.GridBagLayout; 005 import java.util.Comparator; 006 007 import javax.swing.Box; 008 import javax.swing.BoxLayout; 009 import javax.swing.JPanel; 010 import javax.swing.JScrollPane; 011 import javax.swing.event.ListSelectionEvent; 012 import javax.swing.event.ListSelectionListener; 013 014 import market.CIArticle; 015 import market.Conversions; 016 import market.swing.CmpNumbers; 017 import market.swing.JTADescriptionArea; 018 import sale.FormSheet; 019 import sale.FormSheetContentCreator; 020 import sale.SaleProcess; 021 import sale.UIGate; 022 import sale.stdforms.FormSheetStrategy; 023 import util.swing.AbstractTableEntryDescriptor; 024 import util.swing.TableEntryDescriptor; 025 import data.CountingStock; 026 import data.DataBasket; 027 import data.stdforms.TwoTableFormSheet; 028 import data.stdforms.twotableformsheet.CSCSStrategy; 029 import data.swing.CountingStockTableModel; 030 031 /** 032 * This FormSheet displays a TwoTableFormSheet where customers can choose articles from the offer 033 * and put them in there shopping-baskets, furthermore there is a description-field at which 034 * a short description of the selected product is shown. 035 */ 036 public class FSCustomerOfferTable { 037 038 /** 039 * @return the offer to shopping-basket table. 040 * 041 * @param offer the markets offer. 042 * @param shoppingBasket the shopping-basket of the customer. 043 * @param db the DataBasket related to the transfers between offer and shopping-basket. 044 * @param uig the UIGate at which this FormSheet is shown. 045 */ 046 public static TwoTableFormSheet getOfferFormSheet(CountingStock offer, CountingStock shoppingBasket, DataBasket db, UIGate uig){ 047 CSCSStrategy cscss = new CSCSStrategy(); 048 cscss.setErrorHandler(new FormSheetStrategy.ErrorHandler(){ 049 public void error(SaleProcess p, int nErrorCode) { 050 if(nErrorCode==FormSheetStrategy.ErrorHandler.NOT_ENOUGH_ELEMENTS_ERROR){ 051 p.getCurrentGate(); 052 } 053 else p.error(nErrorCode); 054 } 055 }); 056 final TwoTableFormSheet ttfs = TwoTableFormSheet.create( 057 "Produktauswahl", 058 offer, 059 shoppingBasket, 060 db, 061 uig, 062 null, 063 null, 064 false, false, 065 getTED(), 066 getTED(), 067 cscss); 068 069 ttfs.addContentCreator(new FormSheetContentCreator(){ 070 protected void createFormSheetContent(FormSheet fs) { 071 JPanel jpMain = new JPanel(); 072 JPanel jpUpper = new JPanel(); 073 JPanel jpTables = new JPanel(); 074 JPanel jpDescription = new JPanel(); 075 JScrollPane jsc = new JScrollPane(); 076 final JTADescriptionArea da = new JTADescriptionArea(); 077 GridBagConstraints c = new GridBagConstraints(); 078 GridBagLayout gridbag = new GridBagLayout(); 079 080 ttfs.getLeftTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() { 081 public void valueChanged(ListSelectionEvent e) { 082 if (!e.getValueIsAdjusting()&&(ttfs.getLeftSelectedRecord()!=null)) da.setDescription(Conversions.recordToCIArticle(ttfs.getLeftSelectedRecord())); 083 } 084 }); 085 086 jpTables = (JPanel)fs.getComponent(); 087 jpUpper.setLayout(gridbag); 088 c.gridx = 0; 089 c.weightx = 1; 090 c.weighty = 1; 091 c.gridy = 0; 092 c.fill = GridBagConstraints.BOTH; 093 gridbag.setConstraints(jpTables, c); 094 jpUpper.add(jpTables); 095 jpDescription.setLayout(new BoxLayout(jpDescription, BoxLayout.X_AXIS)); 096 jpDescription.add(jsc); 097 jsc.setViewportView(da); 098 099 jpMain.setLayout(new BoxLayout(jpMain, BoxLayout.Y_AXIS)); 100 jpMain.add(jpUpper); 101 jpMain.add(Box.createVerticalStrut(10)); 102 jpMain.add(jpDescription); 103 fs.setComponent(jpMain); 104 105 fs.removeAllButtons(); 106 fs.addButton("Kaufen", ButtonIDs.BTN_BUY, null); 107 fs.addButton("Zurück", ButtonIDs.BTN_BACK, null); 108 } 109 }); 110 return ttfs; 111 } 112 113 /** 114 * @return the TableEntryDescriptor of the table. 115 */ 116 private static TableEntryDescriptor getTED(){ 117 return new AbstractTableEntryDescriptor(){ 118 public int getColumnCount() { 119 return 4; 120 } 121 122 public String getColumnName(int nIdx) { 123 return (new String[]{ "Artikel", "Kategorie", "Preis", "Anzahl"}) [nIdx]; 124 } 125 126 public Class getColumnClass(int nIdx) { 127 return (new Class[] {String.class, String.class, Number.class, Number.class}) [nIdx]; 128 } 129 130 public Object getValueAt(Object oRecord, int nIdx) { 131 CIArticle article = Conversions.recordToCIArticle(oRecord); 132 int count = ((CountingStockTableModel.Record)oRecord).getCount(); 133 switch (nIdx) { 134 case 0: return article.getArticleName(); 135 case 1: return article.getCategory(); 136 case 2: return Conversions.valueToCurrency(CIArticle.getCatalogItemValue().getValue(article)); 137 case 3: return new Integer(count).toString(); 138 } 139 return null; 140 } 141 142 public boolean canSortByColumn(int nIndex) { 143 return true; 144 } 145 146 public Comparator getColumnOrder(int nIndex) { 147 switch (nIndex) { 148 case 1: return null ; 149 case 2: return new CmpNumbers(CmpNumbers.BID); 150 case 3: return new CmpNumbers(CmpNumbers.COUNT); 151 default: return null; 152 } 153 } 154 }; 155 } 156 }