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 protected void createFormSheetContent(final FormSheet fs) { 043 //define components 044 JPanel jpMain = new JPanel(); 045 JPanel jpTable = new JPanel(); 046 JPanel jpInfo = new JPanel(); 047 JScrollPane jsp = (JScrollPane)fs.getComponent(); 048 GridBagConstraints c = new GridBagConstraints(); 049 GridBagLayout gridbag = new GridBagLayout(); 050 //add components 051 jpTable.setLayout(gridbag); 052 c.gridx = 0; 053 c.weightx = 1; 054 c.weighty = 1; 055 c.gridy = 0; 056 c.fill = GridBagConstraints.BOTH; 057 gridbag.setConstraints(jsp, c); 058 jpTable.add(jsp); 059 jpInfo.setLayout(new BoxLayout(jpInfo, BoxLayout.Y_AXIS)); 060 jpInfo.add(new JLabel("Gesamtpreis: " + 061 Conversions.doubleToCurrency(opo.getOrdersValue().doubleValue(), " Euro"))); 062 jpInfo.add(new JLabel("Lieferung kommt in " + opo.getDaysTillArrival() + " Tagen an.")); 063 064 jpMain.setLayout(new BoxLayout(jpMain, BoxLayout.Y_AXIS)); 065 jpMain.add(jpTable); 066 jpMain.add(Box.createVerticalStrut(10)); 067 jpMain.add(jpInfo); 068 fs.setComponent(jpMain); 069 fs.removeAllButtons(); 070 fs.addButton("Zurück", ButtonIDs.BTN_BACK, null); 071 } 072 }); 073 return stfs; 074 } 075 } 076 077 /** 078 * The {@link util.swing.TableEntryDescriptor} used by {@link FSManagerOpenPurchaseOrderDetail}. 079 */ 080 class TEDManagerOpenPurchaseOrderDetail extends AbstractTableEntryDescriptor { 081 082 private Comparator sortOfferNoSum = new CmpNumbers(CmpNumbers.OFFER, CmpNumbers.SINGLE); 083 private Comparator sortOfferSum = new CmpNumbers(CmpNumbers.OFFER, CmpNumbers.SUMMED); 084 private Comparator sortCount = new CmpNumbers(CmpNumbers.COUNT); 085 086 /** 087 * @return the number of the table's columns. 088 */ 089 public int getColumnCount() { 090 return 5; 091 } 092 093 /** 094 * @param nIndex the affected column. 095 * @return columns' names. 096 */ 097 public String getColumnName(int nIndex) { 098 return (new String[]{ "Artikel", "Kategorie", "Einzeleinkaufspreis", "Anzahl", "Summe"}) [nIndex]; 099 } 100 101 /** 102 * @param nIndex the affected column. 103 * @return columns' classes. They indicate how column's values should be aligned. 104 */ 105 public Class getColumnClass (int nIndex) { 106 return (new Class[] {String.class, String.class, Number.class, Number.class, Number.class}) [nIndex]; 107 } 108 109 /** 110 * @param oRecord the affected table record. 111 * @param nIndex the affected column. 112 * @return columns' values 113 */ 114 public Object getValueAt(Object oRecord, int nIndex) { 115 CIArticle article = Conversions.recordToCIArticle(oRecord); 116 int count = ((CountingStockTableModel.Record)oRecord).getCount(); 117 switch (nIndex) { 118 case 0: return article.getArticleName(); 119 case 1: return article.getCategory(); 120 case 2: return Conversions.doubleToCurrency(article.getOffer()); 121 case 3: return new Integer(count).toString(); 122 case 4: return Conversions.doubleToCurrency(count * article.getOffer()); 123 } 124 return null; 125 } 126 127 /** 128 * Determines if columns can be sorted by the user. 129 * 130 * @param nIndex the affected column. 131 * @return <ul><li>true: columns can be sorted</li> 132 * <li>false: columns cannot be sorted</li></ul> 133 */ 134 public boolean canSortByColumn(int nIndex) { 135 return true; 136 } 137 138 /** 139 * @param nIndex the affected column. 140 * @return the {@link Comparator} to be used when sorting the column. 141 */ 142 public Comparator getColumnOrder(int nIndex) { 143 switch(nIndex) { 144 case 2: return sortOfferNoSum; 145 case 3: return sortCount; 146 case 4: return sortOfferSum; 147 } 148 return null; 149 } 150 }