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 private static final long serialVersionUID = 9002356431043143409L;
050 public void error(SaleProcess p, int nErrorCode) {
051 if(nErrorCode==FormSheetStrategy.ErrorHandler.NOT_ENOUGH_ELEMENTS_ERROR){
052 p.getCurrentGate();
053 }
054 else p.error(nErrorCode);
055 }
056 });
057 final TwoTableFormSheet ttfs = TwoTableFormSheet.create(
058 "Produktauswahl",
059 offer,
060 shoppingBasket,
061 db,
062 uig,
063 null,
064 null,
065 false, false,
066 getTED(),
067 getTED(),
068 cscss);
069
070 ttfs.addContentCreator(new FormSheetContentCreator(){
071 private static final long serialVersionUID = 3127106951584690470L;
072 protected void createFormSheetContent(FormSheet fs) {
073 JPanel jpMain = new JPanel();
074 JPanel jpUpper = new JPanel();
075 JPanel jpTables = new JPanel();
076 JPanel jpDescription = new JPanel();
077 JScrollPane jsc = new JScrollPane();
078 final JTADescriptionArea da = new JTADescriptionArea();
079 GridBagConstraints c = new GridBagConstraints();
080 GridBagLayout gridbag = new GridBagLayout();
081
082 ttfs.getLeftTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
083 public void valueChanged(ListSelectionEvent e) {
084 if (!e.getValueIsAdjusting()&&(ttfs.getLeftSelectedRecord()!=null)) da.setDescription(Conversions.recordToCIArticle(ttfs.getLeftSelectedRecord()));
085 }
086 });
087
088 jpTables = (JPanel)fs.getComponent();
089 jpUpper.setLayout(gridbag);
090 c.gridx = 0;
091 c.weightx = 1;
092 c.weighty = 1;
093 c.gridy = 0;
094 c.fill = GridBagConstraints.BOTH;
095 gridbag.setConstraints(jpTables, c);
096 jpUpper.add(jpTables);
097 jpDescription.setLayout(new BoxLayout(jpDescription, BoxLayout.X_AXIS));
098 jpDescription.add(jsc);
099 jsc.setViewportView(da);
100
101 jpMain.setLayout(new BoxLayout(jpMain, BoxLayout.Y_AXIS));
102 jpMain.add(jpUpper);
103 jpMain.add(Box.createVerticalStrut(10));
104 jpMain.add(jpDescription);
105 fs.setComponent(jpMain);
106
107 fs.removeAllButtons();
108 fs.addButton("Kaufen", ButtonIDs.BTN_BUY, null);
109 fs.addButton("Zurück", ButtonIDs.BTN_BACK, null);
110 }
111 });
112 return ttfs;
113 }
114
115 /**
116 * @return the TableEntryDescriptor of the table.
117 */
118 private static TableEntryDescriptor getTED(){
119 return new AbstractTableEntryDescriptor(){
120 private static final long serialVersionUID = -3039507143399314727L;
121 public int getColumnCount() {
122 return 4;
123 }
124
125 public String getColumnName(int nIdx) {
126 return (new String[]{ "Artikel", "Kategorie", "Preis", "Anzahl"}) [nIdx];
127 }
128
129 public Class<?> getColumnClass(int nIdx) {
130 return (new Class<?>[] {String.class, String.class, Number.class, Number.class}) [nIdx];
131 }
132
133 public Object getValueAt(Object oRecord, int nIdx) {
134 CIArticle article = Conversions.recordToCIArticle(oRecord);
135 int count = ((CountingStockTableModel.Record)oRecord).getCount();
136 switch (nIdx) {
137 case 0: return article.getArticleName();
138 case 1: return article.getCategory();
139 case 2: return Conversions.valueToCurrency(CIArticle.getCatalogItemValue().getValue(article));
140 case 3: return new Integer(count).toString();
141 }
142 return null;
143 }
144
145 public boolean canSortByColumn(int nIndex) {
146 return true;
147 }
148
149 public Comparator<Object> getColumnOrder(int nIndex) {
150 switch (nIndex) {
151 case 1: return null ;
152 case 2: return new CmpNumbers(CmpNumbers.BID);
153 case 3: return new CmpNumbers(CmpNumbers.COUNT);
154 default: return null;
155 }
156 }
157 };
158 }
159 }