package com.egantt.model.drawing.axis.interval;
import java.util.Iterator;
import java.util.List;
import com.egantt.model.drawing.DrawingPart;
import com.egantt.model.drawing.DrawingState;
import com.egantt.model.drawing.DrawingTransform;
import com.egantt.model.drawing.axis.AxisInterval;
public class DrawingStateInterval implements AxisInterval {
protected final Object axis;
protected final List <DrawingState> drawingStates;
public DrawingStateInterval(Object axis, List <DrawingState> drawingStates) {
this.axis = axis;
this.drawingStates = drawingStates;
}
// ________________________________________________________________________
public DrawingState get(int index) {
return drawingStates.get(index);
}
public boolean contains(DrawingState state) {
return drawingStates.contains(state);
}
public int indexOf(DrawingState state) {
return drawingStates.indexOf(state);
}
public int size() {
return drawingStates.size();
}
// ________________________________________________________________________
public Object getStart() {
AxisInterval lhs = getInterval();
return lhs != null ? lhs.getStart() : null;
}
public Object getFinish() {
AxisInterval lhs = getInterval();
return lhs != null ? lhs.getFinish() : null;
}
public Object getRange() {
AxisInterval lhs = getInterval();
return lhs != null ? lhs.getRange() : null;
}
public boolean contains(AxisInterval rhs) {
AxisInterval lhs = getInterval();
return lhs != null ? lhs.contains(rhs) : false;
}
public boolean containsValue(Object rhs) {
AxisInterval lhs = getInterval();
return lhs != null ? lhs.containsValue(rhs) : false;
}
public boolean intersects(AxisInterval rhs) {
AxisInterval lhs = getInterval();
return lhs != null ? lhs.intersects(rhs) : false;
}
public AxisInterval union(AxisInterval rhs) {
AxisInterval lhs = getInterval();
return lhs != null ? lhs.union(rhs) : rhs;
}
// ________________________________________________________________________
protected AxisInterval getInterval() {
AxisInterval result = null;
for (Iterator iter = drawingStates.iterator(); iter.hasNext();) {
final DrawingState state = (DrawingState) iter.next();
AxisInterval interval = getInterval(state, axis);
result = result != null
? result.union(interval) : interval;
}
return result;
}
// ________________________________________________________________________
public static AxisInterval getInterval(DrawingState state, Object axis) {
AxisInterval result = null;
for (Iterator parts = state.parts(); parts.hasNext();) {
final DrawingPart part = (DrawingPart) parts.next();
if (part.isSummaryPart())
continue;
int index = part.keys().indexOf(axis);
if (index < 0)
continue;
AxisInterval intervals[] = part.getInterval();
if (intervals == null || intervals[index] == null)
continue;
result = intervals[index].union(result);
}
return result;
}
public DrawingTransform getTransform() {
AxisInterval interval = getInterval();
return interval != null ? interval.getTransform() : null;
}
}