001 package market.stdform;
002
003 import java.util.Comparator;
004
005 import market.Conversions;
006 import market.SMarket;
007 import market.UCustomer;
008 import market.UMUserBase;
009 import market.event.MarketEventAdapter;
010 import market.statistics.Statistics;
011 import market.swing.CmpCustomersNumbers;
012 import sale.FormSheet;
013 import sale.FormSheetContentCreator;
014 import users.UserManagerFilter;
015 import users.stdforms.UserTableFormSheet;
016 import util.swing.AbstractTableEntryDescriptor;
017
018 /**
019 * This FormSheet displays all customers of the market in a table, along with some statistics. From here,
020 * a customer whose complete statistics wish to be viewed can be selected.
021 */
022 public class FSManagerCustomerStatsMain extends UserTableFormSheet {
023
024 /**
025 * Creates a {@link UserTableFormSheet}. The look of the table is
026 * defined by the {@link TEDManagerCustomerStatsMain}.
027 */
028 public FSManagerCustomerStatsMain() {
029 super("Kundenstatistik", new UserManagerFilter(UMUserBase.getGlobalBase().getCustomers()),
030 null, null, null, new TEDManagerCustomerStatsMain());
031 addContentCreator(new FormSheetContentCreator() {
032 public void createFormSheetContent(final FormSheet fs) {
033 fs.removeAllButtons();
034 fs.addButton("Details", ButtonIDs.BTN_DETAIL, null);
035 }
036 });
037 //update view when time advances
038 SMarket.addEventListener(new MarketEventAdapter() {
039 public void timeAdvanced() {
040 ((util.swing.TableSorter)getTable().getModel()).fireTableDataChanged();
041 }
042 });
043 }
044 }
045
046 /**
047 * The {@link util.swing.TableEntryDescriptor} used by {@link FSManagerCustomerStatsMain}.
048 */
049 class TEDManagerCustomerStatsMain extends AbstractTableEntryDescriptor {
050
051 private Comparator salesVolume = new CmpCustomersNumbers(CmpCustomersNumbers.SALES_VOLUME);
052 private Comparator discount = new CmpCustomersNumbers(CmpCustomersNumbers.DISCOUNT);
053
054 /**
055 * @return the number of the table's columns.
056 */
057 public int getColumnCount() {
058 return 4;
059 }
060
061 /**
062 * @param nIndex the affected column.
063 * @return columns' names.
064 */
065 public String getColumnName(int nIndex) {
066 return (new String[]{"Name", "Mitglied seit", "Anrechenbarer Umsatz", "Rabatt"}) [nIndex];
067 }
068
069 /**
070 * @param nIndex the affected column.
071 * @return columns' classes. They indicate how column's values should be aligned.
072 */
073 public Class getColumnClass (int nIndex) {
074 return new Class[] {String.class, String.class, Integer.class, Integer.class}[nIndex];
075 }
076
077 /**
078 * @param oRecord the affected table record.
079 * @param nIndex the affected column.
080 * @return columns' values
081 */
082 public Object getValueAt(Object oRecord, int nIndex) {
083 UCustomer usr = (UCustomer)oRecord;
084 switch (nIndex) {
085 case 0:
086 return usr.getSurname() + ", " + usr.getFirstName();
087 case 1:
088 return usr.getDayOfRegistration();
089 case 2:
090 return Conversions.doubleToCurrency(Statistics.getAllowableCustomerRevenue(usr), " Euro");
091 case 3:
092 return Conversions.fixedDecimal(100 * usr.getDiscount(), 3) + " %";
093 }
094 return null;
095 }
096
097 /**
098 * Determines if columns can be sorted by the user.
099 *
100 * @param nIndex the affected column.
101 * @return <ul><li>true: columns can be sorted</li>
102 * <li>false: columns cannot be sorted</li></ul>
103 */
104 public boolean canSortByColumn(int nIndex) {
105 return true;
106 }
107
108 /**
109 * @param nIndex the affected column.
110 * @return the {@link Comparator} to be used when sorting the column.
111 */
112 public Comparator getColumnOrder(int nIndex) {
113 switch (nIndex) {
114 case 2:
115 return salesVolume;
116 case 3:
117 return discount;
118 }
119 return null;
120 }
121 }