package org.codecranachan.asteroidpush.base.workshop;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;
import org.codecranachan.asteroidpush.base.workshop.assembly.Part;
public class PartSelector {
private Vector<PartFactory> factories;
private PartFactory selected;
public PartFactory getSelected() {
return selected;
}
public Part getNewPart() {
if (selected == null) {
return null;
} else {
return selected.createPart();
}
}
public void selectNext() {
if (selected == null) {
selectByIndex(0);
} else {
selectRelative(1);
}
}
public void selectPrevious() {
if (selected == null) {
selectByIndex(factories.size() - 1);
} else {
selectRelative(-1);
}
}
private void selectRelative(int dir) {
if (factories.isEmpty()) {
selected = null;
return;
}
int index = factories.indexOf(selected) + dir;
if (index > 0) {
index = index % factories.size();
} else {
index = factories.size() - index;
}
selectByIndex(index);
}
public void selectByIndex(int index) {
if (index < 0 || index >= factories.size()) {
selected = null;
} else {
selected = factories.get(index);
}
}
public void clearSelection() {
selected = null;
}
public PartSelector() {
factories = new Vector<PartFactory>();
selected = null;
}
public void addPartFactories(Collection<PartFactory> factories) {
this.factories.addAll(factories);
Collections.sort(this.factories, new FactoryComparator());
}
public Vector<PartFactory> getPartFactories() {
return factories;
}
}
class FactoryComparator implements Comparator<PartFactory> {
public int compare(PartFactory first, PartFactory second) {
return String.CASE_INSENSITIVE_ORDER.compare(first.getName(),
second.getName());
}
}