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