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.JLabel;
010 import javax.swing.JPanel;
011 import javax.swing.JScrollPane;
012
013 import market.CIArticle;
014 import market.CIOpenPurchaseOrders;
015 import market.Conversions;
016 import market.swing.CmpNumbers;
017 import sale.FormSheet;
018 import sale.FormSheetContentCreator;
019 import util.swing.AbstractTableEntryDescriptor;
020 import data.stdforms.SingleTableFormSheet;
021 import data.swing.CountingStockTableModel;
022
023 /**
024 * This FormSheet displays details of a market's order that has not yet arrived.
025 */
026 public class FSManagerOpenPurchaseOrderDetail {
027
028 /**
029 * Creates a {@link SingleTableFormSheet} with some extra components. The look of the table is
030 * defined by the {@link TEDManagerOpenPurchaseOrderDetail}.
031 *
032 * @return the created SingleTableFormSheet.
033 */
034 public static SingleTableFormSheet create(final CIOpenPurchaseOrders opo) {
035 final SingleTableFormSheet stfs = SingleTableFormSheet.create(
036 "Bestellung " + opo.getOrderNumber() + " vom " + opo.getDate(),
037 opo.getOrders(),
038 null, //DataBasket
039 new TEDManagerOpenPurchaseOrderDetail() //TED
040 );
041 stfs.addContentCreator(new FormSheetContentCreator() {
042 private static final long serialVersionUID = -5344729075434548585L;
043 protected void createFormSheetContent(final FormSheet fs) {
044 //define components
045 JPanel jpMain = new JPanel();
046 JPanel jpTable = new JPanel();
047 JPanel jpInfo = new JPanel();
048 JScrollPane jsp = (JScrollPane)fs.getComponent();
049 GridBagConstraints c = new GridBagConstraints();
050 GridBagLayout gridbag = new GridBagLayout();
051 //add components
052 jpTable.setLayout(gridbag);
053 c.gridx = 0;
054 c.weightx = 1;
055 c.weighty = 1;
056 c.gridy = 0;
057 c.fill = GridBagConstraints.BOTH;
058 gridbag.setConstraints(jsp, c);
059 jpTable.add(jsp);
060 jpInfo.setLayout(new BoxLayout(jpInfo, BoxLayout.Y_AXIS));
061 jpInfo.add(new JLabel("Gesamtpreis: " +
062 Conversions.doubleToCurrency(opo.getOrdersValue().doubleValue(), " Euro")));
063 jpInfo.add(new JLabel("Lieferung kommt in " + opo.getDaysTillArrival() + " Tagen an."));
064
065 jpMain.setLayout(new BoxLayout(jpMain, BoxLayout.Y_AXIS));
066 jpMain.add(jpTable);
067 jpMain.add(Box.createVerticalStrut(10));
068 jpMain.add(jpInfo);
069 fs.setComponent(jpMain);
070 fs.removeAllButtons();
071 fs.addButton("Zurück", ButtonIDs.BTN_BACK, null);
072 }
073 });
074 return stfs;
075 }
076 }
077
078 /**
079 * The {@link util.swing.TableEntryDescriptor} used by {@link FSManagerOpenPurchaseOrderDetail}.
080 */
081 class TEDManagerOpenPurchaseOrderDetail extends AbstractTableEntryDescriptor {
082
083 /**
084 * ID for serialization.
085 */
086 private static final long serialVersionUID = -5641235077828822700L;
087
088 private Comparator<Object> sortOfferNoSum = new CmpNumbers(CmpNumbers.OFFER, CmpNumbers.SINGLE);
089 private Comparator<Object> sortOfferSum = new CmpNumbers(CmpNumbers.OFFER, CmpNumbers.SUMMED);
090 private Comparator<Object> sortCount = new CmpNumbers(CmpNumbers.COUNT);
091
092 /**
093 * @return the number of the table's columns.
094 */
095 public int getColumnCount() {
096 return 5;
097 }
098
099 /**
100 * @param nIndex the affected column.
101 * @return columns' names.
102 */
103 public String getColumnName(int nIndex) {
104 return (new String[]{ "Artikel", "Kategorie", "Einzeleinkaufspreis", "Anzahl", "Summe"}) [nIndex];
105 }
106
107 /**
108 * @param nIndex the affected column.
109 * @return columns' classes. They indicate how column's values should be aligned.
110 */
111 public Class<?> getColumnClass (int nIndex) {
112 return (new Class[] {String.class, String.class, Number.class, Number.class, Number.class}) [nIndex];
113 }
114
115 /**
116 * @param oRecord the affected table record.
117 * @param nIndex the affected column.
118 * @return columns' values
119 */
120 public Object getValueAt(Object oRecord, int nIndex) {
121 CIArticle article = Conversions.recordToCIArticle(oRecord);
122 int count = ((CountingStockTableModel.Record)oRecord).getCount();
123 switch (nIndex) {
124 case 0: return article.getArticleName();
125 case 1: return article.getCategory();
126 case 2: return Conversions.doubleToCurrency(article.getOffer());
127 case 3: return new Integer(count).toString();
128 case 4: return Conversions.doubleToCurrency(count * article.getOffer());
129 }
130 return null;
131 }
132
133 /**
134 * Determines if columns can be sorted by the user.
135 *
136 * @param nIndex the affected column.
137 * @return <ul><li>true: columns can be sorted</li>
138 * <li>false: columns cannot be sorted</li></ul>
139 */
140 public boolean canSortByColumn(int nIndex) {
141 return true;
142 }
143
144 /**
145 * @param nIndex the affected column.
146 * @return the {@link Comparator} to be used when sorting the column.
147 */
148 public Comparator<Object> getColumnOrder(int nIndex) {
149 switch(nIndex) {
150 case 2: return sortOfferNoSum;
151 case 3: return sortCount;
152 case 4: return sortOfferSum;
153 }
154 return null;
155 }
156 }