001 package market.stdform; 002 003 import java.awt.GridBagConstraints; 004 import java.awt.GridBagLayout; 005 import java.awt.GridLayout; 006 import java.awt.event.ItemEvent; 007 import java.awt.event.ItemListener; 008 009 import javax.swing.Box; 010 import javax.swing.BoxLayout; 011 import javax.swing.JComboBox; 012 import javax.swing.JPanel; 013 import javax.swing.JScrollPane; 014 import javax.swing.event.ListSelectionEvent; 015 import javax.swing.event.ListSelectionListener; 016 017 import market.CFilter; 018 import market.CIArticle; 019 import market.Conversions; 020 import market.SMarket; 021 import market.swing.ComponentFactory; 022 import market.swing.JCTimeRangeBoxes; 023 import market.swing.JTADescriptionArea; 024 import sale.FormSheet; 025 import sale.FormSheetContentCreator; 026 import util.swing.AbstractTableEntryDescriptor; 027 import util.swing.TableEntryDescriptor; 028 import data.Catalog; 029 import data.stdforms.SingleTableFormSheet; 030 import data.swing.CatalogTableModel; 031 032 /** 033 * This FormSheet is used to choose the article and the range of time for which statistics 034 * should be computed. 035 */ 036 public class FSManagerArticleStatsMain { 037 038 private static JComboBox jcbFromMonth; 039 private static JComboBox jcbToMonth; 040 private static JComboBox jcbFromYear; 041 private static JComboBox jcbToYear; 042 private static JCTimeRangeBoxes jctrb = new JCTimeRangeBoxes(); 043 044 /** 045 * Creates a {@link SingleTableFormSheet} with some extra components. The look of the table is 046 * defined by the {@link TEDManagerArticleStatsMain}. 047 * 048 * @return the created SingleTableFormSheet. 049 */ 050 public static SingleTableFormSheet create() { 051 final TableEntryDescriptor ted = new TEDManagerArticleStatsMain(); 052 final Catalog source = SMarket.getArticleCatalog(); 053 final SingleTableFormSheet stfs = SingleTableFormSheet.create( 054 "Artikelstatistik", 055 source, 056 null, //UIGate 057 ted //TED 058 ); 059 stfs.addContentCreator(new FormSheetContentCreator() { 060 protected void createFormSheetContent(final FormSheet fs) { 061 JPanel jpMain = new JPanel(); 062 JPanel jpTable = new JPanel(); 063 JPanel jpFilter = new JPanel(); 064 JPanel jpUpper = new JPanel(); 065 JPanel jpTimeRange = new JPanel(); 066 JPanel jpChooseArticle = new JPanel(); 067 JPanel jpFromSelection = new JPanel(); 068 JPanel jpFromDropdown = new JPanel(); 069 JPanel jpToSelection = new JPanel(); 070 JPanel jpToDropdown = new JPanel(); 071 JPanel jpDescription = new JPanel(); 072 jcbFromYear = jctrb.getFromYearBox(); 073 jcbToYear = jctrb.getToYearBox(); 074 jcbFromMonth = jctrb.getFromMonthBox(); 075 jcbToMonth = jctrb.getToMonthBox(); 076 JScrollPane jsc = new JScrollPane(); 077 GridBagConstraints c = new GridBagConstraints(); 078 GridBagLayout gridbag = new GridBagLayout(); 079 final JComboBox jcbFilter = new JComboBox(SMarket.getArticleCategories()); 080 jcbFilter.addItemListener(new ItemListener() { 081 public void itemStateChanged(ItemEvent e) { 082 if (e.getStateChange() == e.SELECTED) { 083 int i = jcbFilter.getSelectedIndex(); 084 CFilter cf = new CFilter(source, i); //filter CatalogItems 085 stfs.setTableModel(new CatalogTableModel(cf, null, null, ted)); 086 } 087 } 088 }); 089 final JTADescriptionArea da = new JTADescriptionArea(); 090 //add Listener to table that reacts on selection change 091 stfs.getTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() { 092 public void valueChanged(ListSelectionEvent e) { 093 if (!e.getValueIsAdjusting()) { 094 da.setDescription(Conversions.recordToCIArticle(stfs.getSelectedRecord())); 095 } 096 } 097 }); 098 jpUpper.setLayout(gridbag); 099 c.gridx = 0; 100 c.weightx = 0; 101 c.weighty = 1; 102 c.gridy = 0; 103 c.fill = GridBagConstraints.BOTH; 104 gridbag.setConstraints(jpTimeRange, c); 105 c.gridx = 1; 106 c.weightx = 1; 107 c.weighty = 1; 108 c.gridy = 0; 109 c.fill = GridBagConstraints.BOTH; 110 gridbag.setConstraints(jpTable, c); 111 c.gridx = 2; 112 c.weightx = 0; 113 c.weighty = 1; 114 c.gridy = 0; 115 c.fill = GridBagConstraints.BOTH; 116 gridbag.setConstraints(jpFilter, c); 117 jpUpper.add(jpTimeRange); 118 jpTimeRange.setLayout(new BoxLayout(jpTimeRange, BoxLayout.Y_AXIS)); 119 jpTimeRange.add(jpFromSelection); 120 jpFromSelection.setBorder(ComponentFactory.createInsetBorder("von")); 121 jpFromSelection.add(jpFromDropdown); 122 jpFromDropdown.setLayout(new GridLayout(2,1)); 123 jpFromDropdown.add(jcbFromMonth); 124 jpFromDropdown.add(jcbFromYear); 125 jpTimeRange.add(jpToSelection); 126 jpToSelection.setBorder(ComponentFactory.createInsetBorder("bis")); 127 jpToSelection.add(jpToDropdown); 128 jpToDropdown.setLayout(new GridLayout(2,1)); 129 jpToDropdown.add(jcbToMonth); 130 jpToDropdown.add(jcbToYear); 131 jpUpper.add(jpTable); 132 jpTable.setLayout(new BoxLayout(jpTable, BoxLayout.X_AXIS)); 133 jpTable.add(fs.getComponent()); 134 jpUpper.add(jpFilter); 135 jpFilter.add(jcbFilter); 136 jpDescription.setLayout(new BoxLayout(jpDescription, BoxLayout.X_AXIS)); 137 jpDescription.add(jsc); 138 jsc.setViewportView(da); 139 140 jpMain.setLayout(new BoxLayout(jpMain, BoxLayout.Y_AXIS)); 141 jpMain.add(jpUpper); 142 jpMain.add(Box.createVerticalStrut(10)); 143 jpMain.add(jpDescription); 144 145 fs.setComponent(jpMain); 146 fs.removeAllButtons(); 147 fs.addButton("Details", ButtonIDs.BTN_DETAIL, null); 148 } 149 }); 150 return stfs; 151 } 152 153 /** 154 * @return the class that controls and evaluates the {@link JComboBox JComboBoxes}. 155 */ 156 public JCTimeRangeBoxes getTimeRangeBoxes() { 157 return jctrb; 158 } 159 } 160 161 162 /** 163 * The {@link TableEntryDescriptor} used by {@link FSManagerArticleStatsMain}. 164 */ 165 class TEDManagerArticleStatsMain extends AbstractTableEntryDescriptor { 166 167 /** 168 * @return the number of the table's columns. 169 */ 170 public int getColumnCount() { 171 return 2; 172 } 173 174 /** 175 * @param nIndex the affected column. 176 * @return columns' names. 177 */ 178 public String getColumnName(int nIndex) { 179 return (new String[]{ "Artikel", "Kategorie"}) [nIndex]; 180 } 181 182 /** 183 * @param nIndex the affected column. 184 * @return columns' classes. They indicate how column's values should be aligned. 185 */ 186 public Class getColumnClass (int nIndex) { 187 return String.class; 188 } 189 190 /** 191 * @param oRecord the affected table record. 192 * @param nIndex the affected column. 193 * @return columns' values 194 */ 195 public Object getValueAt(Object oRecord, int nIndex) { 196 CIArticle article = Conversions.recordToCIArticle(oRecord); 197 switch (nIndex) { 198 case 0: return article.getArticleName(); 199 case 1: return article.getCategory(); 200 } 201 return null; 202 } 203 204 /** 205 * Determines if columns can be sorted by the user. 206 * 207 * @param nIndex the affected column. 208 * @return <ul><li>true: columns can be sorted</li> 209 * <li>false: columns cannot be sorted</li></ul> 210 */ 211 public boolean canSortByColumn(int nIndex) { 212 return true; 213 } 214 } 215