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.JComponent;
010 import javax.swing.JPanel;
011 import javax.swing.JScrollPane;
012 import javax.swing.JTextArea;
013 import javax.swing.event.TableModelEvent;
014 import javax.swing.event.TableModelListener;
015
016 import market.CIArticle;
017 import market.Conversions;
018 import market.SICustomer;
019 import market.swing.CmpNumbers;
020 import market.swing.ComponentFactory;
021 import sale.FormSheet;
022 import sale.FormSheetContentCreator;
023 import util.swing.AbstractTableEntryDescriptor;
024 import util.swing.TableEntryDescriptor;
025 import data.CountingStock;
026 import data.stdforms.SingleTableFormSheet;
027 import data.swing.CountingStockTableModel;
028
029 /**
030 * This FormSheet shows the order of the customer that has to be deduct in a table,
031 * it also shows a message-field containing information about removed articles that aren`t avaible yet.
032 */
033 public class FSSellerOrderTable {
034
035 /**
036 * @return the order-table.
037 *
038 * @param shoppingBasket the shopping-basket of the customer that has to be deduct.
039 * @param sic the SICustomer in the till-queue related to the customer.
040 */
041 public static SingleTableFormSheet getOrderTable(CountingStock shoppingBasket, final SICustomer sic){
042
043 final SingleTableFormSheet stfs = SingleTableFormSheet.create(
044 "Kundenauftrag",
045 shoppingBasket,
046 null,
047 getTED());
048
049 stfs.addContentCreator(new FormSheetContentCreator(){
050 private static final long serialVersionUID = -4851008955900433637L;
051 protected void createFormSheetContent(FormSheet fs) {
052 JPanel jp_main = new JPanel();
053 JPanel jp_upper = new JPanel();
054 JComponent jp_table = new JPanel();
055 JPanel jp_message = new JPanel();
056 JScrollPane jsc = new JScrollPane();
057 final JTextArea jta = new JTextArea(10, 200);
058 String missingA = sic.getMissingArticles();
059 if(missingA.length()>1) jta.setText(getMessage(missingA));
060 GridBagConstraints c = new GridBagConstraints();
061 GridBagLayout gridbag = new GridBagLayout();
062
063 stfs.getTable().getModel().addTableModelListener(new TableModelListener(){
064 public void tableChanged(TableModelEvent e) {
065 String s = sic.getMissingArticles();
066 if(s.length()>1) jta.setText(getMessage(s));
067 }
068 });
069
070 jp_table = fs.getComponent();
071 jp_upper.setLayout(gridbag);
072 c.gridx = 0;
073 c.weightx = 1;
074 c.weighty = 1;
075 c.gridy = 0;
076 c.fill = GridBagConstraints.BOTH;
077 gridbag.setConstraints(jp_table, c);
078 jp_upper.add(jp_table);
079 jp_message.setBorder(ComponentFactory.createInsetBorder("Benachrichtigung"));
080 jp_message.setLayout(new BoxLayout(jp_message, BoxLayout.X_AXIS));
081 jp_message.add(jsc);
082 jsc.setViewportView(jta);
083
084 jp_main.setLayout(new BoxLayout(jp_main, BoxLayout.Y_AXIS));
085 jp_main.add(jp_upper);
086 jp_main.add(Box.createVerticalStrut(10));
087 jp_main.add(jp_message);
088 fs.setComponent(jp_main);
089
090 fs.removeAllButtons();
091 fs.addButton("Abrechnen",ButtonIDs.BTN_ACCEPT , null);
092 fs.addButton("Zurück",ButtonIDs.BTN_BACK , null);
093 }
094 });
095 return stfs;
096 }
097
098 /**
099 * @return the message to be shown if articles are missing.
100 *
101 * @param missingA String containing counts and articles that are missed
102 */
103 private static String getMessage(String missingA){
104 return new String("Aufgrund eines vorübergehenden Engpasses\n"+
105 "mussten wir folgende Artikel aus ihrer Bestellung entfernen:"+missingA);
106 }
107
108 /**
109 * @return the TableEntryDescriptor of the table.
110 */
111 private static TableEntryDescriptor getTED(){
112 AbstractTableEntryDescriptor ted = new AbstractTableEntryDescriptor(){
113 private static final long serialVersionUID = 8304801171873992253L;
114
115 public int getColumnCount() {
116 return 3;
117 }
118
119 public String getColumnName(int nIdx) {
120 return (new String[]{ "Artikel", "Preis", "Anzahl"}) [nIdx];
121 }
122
123 public Class<?> getColumnClass(int nIdx) {
124 return (new Class[] {String.class, Number.class, Number.class}) [nIdx];
125 }
126
127 public Object getValueAt(Object oRecord, int nIdx) {
128 CIArticle article = Conversions.recordToCIArticle(oRecord);
129 int count = ((CountingStockTableModel.Record)oRecord).getCount();
130 switch (nIdx) {
131 case 0:
132 return article.getArticleName();
133 case 1:
134 return Conversions.valueToCurrency(
135 CIArticle.getCatalogItemValue().getValue(article));
136 case 2:
137 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<Object> getColumnOrder(int nIndex) {
147 switch (nIndex) {
148 case 1: return new CmpNumbers(CmpNumbers.BID);
149 case 2: return new CmpNumbers(CmpNumbers.COUNT);
150 default: return null;
151 }
152 }
153 };
154 return ted;
155 }
156 }