001 package market.swing; 002 003 import java.io.Serializable; 004 import java.util.Comparator; 005 006 import market.CIArticle; 007 import market.Conversions; 008 import data.swing.CountingStockTableModel; 009 010 /** 011 * Compares {@link market.CIArticle CIArticles} by numbers. 012 */ 013 public class CmpNumbers implements Comparator<Object>, Serializable { 014 015 /** 016 * ID for serialization. 017 */ 018 private static final long serialVersionUID = -5452700622015217873L; 019 public static final int BID = 0; 020 public static final int OFFER = 1; 021 public static final int COUNT = 2; 022 public static final boolean SUMMED = true; 023 public static final boolean SINGLE = false; 024 025 private int chosen; 026 private boolean summed; 027 028 /** 029 * @param chosen <ul><li>0: CIArticles are compared by their bid</li> 030 * <li>1: CIArticles are compared by their offer</li> 031 * <li>2: CIArticles are compared by their amount</li></ul> 032 */ 033 034 public CmpNumbers(int chosen) { 035 this.chosen = chosen; 036 this.summed = false; 037 } 038 039 /** 040 * @param chosen <ul><li>0: CIArticles are compared by their bid</li> 041 * <li>1: CIArticles are compared by their offer</li> 042 * <li>2: CIArticles are compared by their amount</li></ul> 043 * 044 * @param summed Tells the comparator if value to be sorted has been multiplied with the amount 045 * of items of a CountingStock or not. This depends, wether the corresponding table shows just the 046 * single price of an Article or the summed up prize of a whole bunch of Articles of a kind. 047 * This parameter only takes effect for CountingStockRecords 048 */ 049 public CmpNumbers(int chosen, boolean summed) { 050 this.chosen = chosen; 051 this.summed = summed; 052 } 053 054 /** 055 * The actual comparison. 056 * @param o1 the first CIArticle. 057 * @param o2 the second CIArticle. 058 * @return an int representing the result of the comparison. 059 */ 060 public int compare(Object o1, Object o2) { 061 CIArticle c1 = Conversions.recordToCIArticle(o1); 062 CIArticle c2 = Conversions.recordToCIArticle(o2); 063 int count1 = 1; 064 int count2 = 1; 065 int amount1 = 1; 066 int amount2 = 1; 067 //CountingStockTableObjects have extra value count, so evaluate them first 068 if (o1 instanceof CountingStockTableModel.Record) { 069 count1 = ((CountingStockTableModel.Record)o1).getCount(); 070 count2 = ((CountingStockTableModel.Record)o2).getCount(); 071 } 072 if (summed) { 073 amount1 = count1; 074 amount2 = count2; 075 } 076 switch (chosen) { 077 case BID: return amount1 * c1.getBid() - amount2 * c2.getBid(); 078 case OFFER: return amount1 * c1.getOffer() - amount2 * c2.getOffer(); 079 case COUNT: return count1 - count2; 080 } 081 return 0; 082 } 083 }