package org.ovirt.engine.ui.uicommonweb.models;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
public class SortedListModel<T> extends ListModel<T> {
static class SortSensitiveComparator<T> implements Comparator<T> {
private final Comparator<? super T> comparator;
private final boolean sortAscending;
SortSensitiveComparator(Comparator<? super T> comparator, boolean sortAscending) {
assert comparator != null : "comparator cannot be null"; //$NON-NLS-1$
this.comparator = comparator;
this.sortAscending = sortAscending;
}
@Override
public int compare(T a, T b) {
return sortAscending ? comparator.compare(a, b) : comparator.compare(b, a);
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof SortSensitiveComparator)) {
return false;
}
SortSensitiveComparator<?> other = (SortSensitiveComparator<?>) obj;
return Objects.equals(comparator, other.comparator)
&& sortAscending == other.sortAscending;
}
@Override
public int hashCode() {
return Objects.hash(
comparator,
sortAscending
);
}
}
protected Comparator<T> comparator;
public SortedListModel(Comparator<? super T> comparator) {
super();
setComparator(comparator);
}
public SortedListModel() {
this(null);
}
public final void setComparator(Comparator<? super T> comparator) {
setComparator(comparator, true);
}
public void setComparator(Comparator<? super T> comparator, boolean sortAscending) {
this.comparator = (comparator != null) ? new SortSensitiveComparator<>(comparator, sortAscending) : null;
}
@Override
public void setItems(Collection<T> value) {
Collection<T> sortedItems = sortItems(value);
super.setItems(sortedItems);
}
protected final Collection<T> sortItems(Collection<T> items) {
if (items == null || comparator == null) {
return items;
}
List<T> sortedList = new ArrayList<>(items);
Collections.sort(sortedList, comparator);
return sortedList;
}
}