3b93347146c4939c89b273699554417aa9007b2a
[debian/jabref.git] / src / java / net / sf / jabref / FieldComparator.java
1 package net.sf.jabref;
2
3 import net.sf.jabref.BibtexEntry;
4 import net.sf.jabref.GUIGlobals;
5 import net.sf.jabref.AuthorList;
6 import net.sf.jabref.imports.ImportFormatReader;
7
8 import java.util.Comparator;
9
10 /**
11  * Created by IntelliJ IDEA.
12  * User: alver
13  * Date: Oct 13, 2005
14  * Time: 10:10:04 PM
15  * To change this template use File | Settings | File Templates.
16  */
17 public class FieldComparator implements Comparator {
18
19         private String field;
20         private boolean isNameField, isTypeHeader;
21         private int multiplier;
22
23     public FieldComparator(String field) {
24         this(field, false);
25     }
26
27     public FieldComparator(String field, boolean reversed) {
28         this.field = field;
29         multiplier = reversed ? -1 : 1;
30         isNameField = (field.equals("author") || field.equals("editor"));
31         isTypeHeader = field.equals(GUIGlobals.TYPE_HEADER);
32     }
33
34     public int compare(Object o1, Object o2) {
35          BibtexEntry e1 = (BibtexEntry)o1,
36                  e2 = (BibtexEntry)o2;
37
38         Object f1 = e1.getField(field),
39             f2 = e2.getField(field);
40
41
42             // If the field is author or editor, we rearrange names so they are
43             // sorted according to last name.
44             if (isNameField) {
45                 if (f1 != null)
46                         f1 = AuthorList.fixAuthorForAlphabetization((String)f1);
47                 if (f2 != null)
48                         f2 = AuthorList.fixAuthorForAlphabetization((String)f2);
49             }
50         else if (isTypeHeader) {
51           // Sort by type.
52           f1 = e1.getType().getName();
53           f2 = e2.getType().getName();
54         }
55
56             if ((f1 == null) && (f2 == null)) return 0;
57             if ((f1 != null) && (f2 == null)) return -1*multiplier;
58             if (f1 == null) return multiplier;
59
60             int result = 0;
61
62             if ((f1 instanceof Integer) && (f2 instanceof Integer)) {
63                     result = -(((Integer) f1).compareTo((Integer) f2));
64             } else if (f2 instanceof Integer) {
65                     Integer f1AsInteger = new Integer(f1.toString());
66                     result = -((f1AsInteger).compareTo((Integer) f2));
67             } else if (f1 instanceof Integer) {
68                 Integer f2AsInteger = new Integer(f2.toString());
69                 result = -(((Integer) f1).compareTo(f2AsInteger));
70         } else {
71                 String ours = ((String) f1).toLowerCase(),
72                 theirs = ((String) f2).toLowerCase();
73                 result = ours.compareTo(theirs);
74         }
75
76         return result*multiplier;
77     }
78
79 }