From: <jde...@us...> - 2012-02-27 21:27:51
|
Revision: 16340 http://pcgen.svn.sourceforge.net/pcgen/?rev=16340&view=rev Author: jdempsey Date: 2012-02-27 21:27:44 +0000 (Mon, 27 Feb 2012) Log Message: ----------- Fix bug: SORTKEY not being respected Issue#: CODE-1296 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/util/Comparators.java Modified: Trunk/pcgen/code/src/java/pcgen/util/Comparators.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/Comparators.java 2012-02-27 20:15:35 UTC (rev 16339) +++ Trunk/pcgen/code/src/java/pcgen/util/Comparators.java 2012-02-27 21:27:44 UTC (rev 16340) @@ -25,6 +25,10 @@ import java.util.Comparator; import java.util.Date; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.enumeration.StringKey; +import pcgen.gui2.util.treetable.TreeTableNode; + /** * * @author Connor Petty <mis...@gm...> @@ -44,6 +48,7 @@ private static final NumberComparator nC = new NumberComparator(); private static final DateComparator dC = new DateComparator(); private static final HashCodeComparator hCC = new HashCodeComparator(); + private static final TreeTableNodeComparator treeNodeComp = new TreeTableNodeComparator(); public static <T> Comparator<T> toStringComparator() { @@ -61,6 +66,14 @@ } /** + * @return A comparator for use with the contents of tree table nodes. + */ + public static Comparator<Object> treeTableNodeComparator() + { + return treeNodeComp; + } + + /** * TODO: perhaps keep instance references to commonly used InverseComparators? * @param comparator * @return new InverseComparator instance @@ -119,6 +132,10 @@ { return (Comparator<? super T>) ignoreCaseStringComparator(); } + else if (c == TreeTableNode.class) + { + return (Comparator<? super T>) treeTableNodeComparator(); + } return toStringComparator(); } @@ -181,6 +198,51 @@ } + /** + * A <code>Comparator</code> to compare tree table nodes. This respects SORTKEY for the contained object. + */ + private static final class TreeTableNodeComparator implements Comparator<Object>, + Serializable + { + + /** {@inheritDoc} */ + public int compare(Object o1, Object o2) + { + String key1 = getSortKey(o1); + String key2 = getSortKey(o2); + final Collator collator = Collator.getInstance(); + + if (!key1.equals(key2)) + { + return collator.compare(key1, key2); + } + return collator.compare(String.valueOf(o1), String.valueOf(o2)); + } + + private String getSortKey(Object obj1) + { + String key; + if (obj1 == null) + { + key = ""; + } + else if (obj1 instanceof CDOMObject) + { + CDOMObject co = (CDOMObject) obj1; + key = co.get(StringKey.SORT_KEY); + if (key == null) + { + key = co.getDisplayName(); + } + } + else + { + key = obj1.toString(); + } + return key; + } + } + private static final class ToStringIgnoreCaseCollator<E> implements Comparator<E>, Serializable { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |