blob: cbc9d79b0214fd071814f4783bf921a671702556 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.configuration;
import java.util.Comparator;
import java.util.List;
/**
* a comparator to sort an element list.
*
* @author Jinhua Xi
* @since 1.0
*
*/
public class OrderedListComparator implements Comparator {
// sort the baselist according to the sorted list
// any item in sorted list but not in base list are ignored
// any item in base list but not in sorted list keeps the original order
List baseList;
List sortedList;
OrderedListComparator(List baseList, List sortedList) {
this.baseList = baseList;
this.sortedList = sortedList;
}
/**
* compare to objects.
*/
public int compare(Object e1, Object e2) {
int i1, i2;
if (sortedList != null) {
i1 = sortedList.lastIndexOf(e1);
i2 = sortedList.lastIndexOf(e2);
if (i1 >= 0 || i2 >= 0) {
// if not in the sorted list, find the immediate predicessor
// that is in the list and compare to it.
// if no such element, compare to the original list
if (i1 < 0) {
i1 = findComparableIndex(e1);
}
if (i2 < 0) {
i2 = findComparableIndex(e2);
}
if (i1 >= 0 && i2 >= 0 && i1 != i2) {
return i1 - i2;
}
}
}
return originalOrder(e1, e2);
}
private int findComparableIndex(Object e) {
int i2 = -1;
for (int i = baseList.lastIndexOf(e); i >= 0; i--) {
Object o = baseList.get(i);
i2 = sortedList.lastIndexOf(o);
if (i2 >= 0) {
break;
}
}
return i2;
}
private int originalOrder(Object e1, Object e2) {
int i1, i2;
if (baseList != null) {
i1 = baseList.lastIndexOf(e1);
i2 = baseList.lastIndexOf(e2);
return i1 - i2;
}
return 0;
}
}