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.SMarket;
017 import market.swing.CCSStrategyMarket;
018 import market.swing.CmpNumbers;
019 import market.swing.JTADescriptionArea;
020 import sale.FormSheet;
021 import sale.FormSheetContentCreator;
022 import sale.UIGate;
023 import util.swing.AbstractTableEntryDescriptor;
024 import data.CountingStock;
025 import data.DataBasket;
026 import data.stdforms.TwoTableFormSheet;
027 import data.swing.CountingStockTableModel;
028
029
030 /**
031 * This FormSheet is used by the manager to purchase new items for the market's stock.
032 */
033 public class FSManagerPurchase {
034
035 /**
036 * Creates a {@link TwoTableFormSheet}. The look of the table is defined by the
037 * {@link TEDManagerPurchase}.
038 *
039 * @param gate the gate on which the TwoTableFormSheet should be displayed. It must not be null,
040 * because a valid gate is needed to enable the shifting of items between the tables.
041 * @param cs the CountingStock in which the items that the manager selected for purchase are stored.
042 * @param db the transaction's DataBasket.
043 *
044 * @return the created TwoTableFormSheet.
045 */
046 public static TwoTableFormSheet create(UIGate gate, CountingStock cs, DataBasket db) {
047 final TwoTableFormSheet ttfs = TwoTableFormSheet.create(
048 "Einkauf", //Caption
049 SMarket.getArticleCatalog(), //TableSources
050 cs,
051 db, //DB
052 gate, //UIGate
053 null, null, //Initial Comparators
054 false, //Display zeros
055 new TEDManagerPurchase(true), new TEDManagerPurchase(false), //TableEntryDescriptors
056 new CCSStrategyMarket() //MoveStrategy
057 );
058 ttfs.addContentCreator(new FormSheetContentCreator() {
059 protected void createFormSheetContent(final FormSheet fs) {
060 //define components
061 JPanel jpMain = new JPanel();
062 JPanel jpUpper = new JPanel();
063 JPanel jpTables = new JPanel();
064 JPanel jpDescription = new JPanel();
065 JScrollPane jsc = new JScrollPane();
066 final JTADescriptionArea da = new JTADescriptionArea();
067 GridBagConstraints c = new GridBagConstraints();
068 GridBagLayout gridbag = new GridBagLayout();
069 //add Listener to table that reacts on selection change
070 ttfs.getLeftTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
071 public void valueChanged(ListSelectionEvent e) {
072 if (!e.getValueIsAdjusting()) {
073 da.setDescription(Conversions.recordToCIArticle(
074 ttfs.getLeftSelectedRecord()));
075 }
076 }
077 });
078 //add components
079 jpTables = (JPanel)fs.getComponent();
080 jpDescription.setLayout(new BoxLayout(jpDescription, BoxLayout.X_AXIS));
081 jpDescription.add(jsc);
082 jsc.setViewportView(da);
083 jpMain.setLayout(new BoxLayout(jpMain, BoxLayout.Y_AXIS));
084 jpMain.add(jpTables);
085 jpMain.add(Box.createVerticalStrut(10));
086 jpMain.add(jpDescription);
087 fs.setComponent(jpMain);
088 fs.removeAllButtons();
089 fs.addButton("Kaufen", ButtonIDs.BTN_BUY, null);
090 }
091 });
092 return ttfs;
093 }
094 }
095
096 /**
097 * The {@link util.swing.TableEntryDescriptor} used by {@link FSManagerPurchase}.
098 */
099 class TEDManagerPurchase extends AbstractTableEntryDescriptor {
100
101 /**
102 * Is queried to determine whether this TED is used for the left or for the right table.
103 */
104 private boolean left;
105 private Comparator sortOfferSum = new CmpNumbers(CmpNumbers.OFFER, CmpNumbers.SUMMED);
106 private Comparator sortOfferNoSum = new CmpNumbers(CmpNumbers.OFFER, CmpNumbers.SINGLE);
107 private Comparator sortCount = new CmpNumbers(CmpNumbers.COUNT);
108
109 /**
110 * @param left <ul><li>true: Use this TableEntryDescriptor for the left table.</li>
111 * <li>false: Use this TableEntryDescriptor for the right table.</li</ul>
112 */
113 public TEDManagerPurchase(boolean left) {
114 this.left = left;
115 }
116
117 /**
118 * @return the number of the table's columns.
119 */
120 public int getColumnCount() {
121 return 3;
122 }
123
124 /**
125 * @param nIndex the affected column.
126 * @return columns' names.
127 */
128 public String getColumnName(int nIndex) {
129 return (new String[]{ "Artikel", left ? "Kategorie" : "Preis", left ? "Preis" : "Anzahl"}) [nIndex];
130 }
131
132 /**
133 * @param nIndex the affected column.
134 * @return columns' classes. They indicate how column's values should be aligned.
135 */
136 public Class getColumnClass (int nIndex) {
137 return (new Class[] {String.class, left ? String.class : Number.class, Number.class}) [nIndex];
138 }
139
140 /**
141 * @param oRecord the affected table record.
142 * @param nIndex the affected column.
143 * @return columns' values
144 */
145 public Object getValueAt(Object oRecord, int nIndex) {
146 CountingStockTableModel.Record stockitem = null;
147 CIArticle article = Conversions.recordToCIArticle(oRecord);
148 int count = 0;
149 if (!left) {
150 count = ((CountingStockTableModel.Record)oRecord).getCount();
151 }
152 switch (nIndex) {
153 case 0: return article.getArticleName();
154 case 1: return left ? article.getCategory() :
155 Conversions.doubleToCurrency(count * article.getOffer());
156 case 2: return left ? Conversions.doubleToCurrency(article.getOffer()) :
157 new Integer(count).toString();
158 }
159 return null;
160 }
161
162 /**
163 * Determines if columns can be sorted by the user.
164 *
165 * @param nIndex the affected column.
166 * @return <ul><li>true: columns can be sorted</li>
167 * <li>false: columns cannot be sorted</li></ul>
168 */
169 public boolean canSortByColumn(int nIndex) {
170 return true;
171 }
172
173 /**
174 * @param nIndex the affected column.
175 * @return the {@link Comparator} to be used when sorting the column.
176 */
177 public Comparator getColumnOrder(int nIndex) {
178 switch(nIndex) {
179 case 1: return left ? null : sortOfferSum;
180 case 2: return left ? sortOfferNoSum : sortCount;
181 }
182 return null;
183 }
184 }