content: 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;
  	}
  }