content: /*
   * @(#)AbstractPartPainter.java
   *
   * Copyright 2002 EGANTT LLP. All rights reserved.
   * PROPRIETARY/QPL. Use is subject to license terms.
   */
  
  package com.egantt.drawing.component.painter.part;
  
  import java.awt.Component;
  import java.awt.Graphics;
  import java.awt.Insets;
  import java.awt.Rectangle;
  import java.util.Iterator;
  
  import com.egantt.awt.graphics.GraphicsState;
  import com.egantt.drawing.component.painter.PartPainter;
  import com.egantt.drawing.component.painter.part.view.BasicPartView;
  import com.egantt.model.drawing.ContextResources;
  import com.egantt.model.drawing.DrawingContext;
  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;
  import com.egantt.model.drawing.axis.AxisView;
  import com.egantt.swing.cell.CellState;
  
  public abstract class AbstractPartPainter implements PartPainter
  {
  	private DrawingContext context = null;
  	
  	protected Insets insets;
  	protected PartView view = new BasicPartView();
  
  	// _________________________________________________________________________
  
  	/**
  	 *  Optional Argument the DrawingContext can be overriden as this point if not
  	 *  this will come via the Paint method call.
  	 */
  	public void setContext(DrawingContext context)
  	{
  		this.context = context;
  	}
  
  	public void setInsets(Insets insets)
  	{
  		this.insets = insets;
  	}
  
  	public void setView(PartView view)
  	{
  		this.view = view;
  	}
  
  	// _________________________________________________________________________
  
  	/**
  	 *  Implementation in paintProtected
  	 */
  	public final void paint(Component c, DrawingPart part, GraphicsState graphics, CellState cellState, DrawingContext context)
  	{
  		paintProtected(c, part, graphics, cellState, this.context != null ? this.context : context);
  	}
  	
  	//	________________________________________________________________________
  	
  	protected void paintProtected(Component c, DrawingPart part, GraphicsState graphics, CellState cellState, DrawingContext context)
  	{
  		final Object [] keys  = part.keys().toArray();
  		final AxisInterval intervals [] = new AxisInterval[keys.length];
  		final DrawingTransform transforms [] = new DrawingTransform [keys.length];
  
  		DrawingState drawing = cellState.getDrawing();
  		for (int i=0; i < keys.length; i++)
  		{
  			AxisView view = (AxisView) context.get(keys[i], ContextResources.AXIS_VIEW);
  			drawing.put(keys[i], view);
  
  			intervals[i] = view.getInterval();
  			transforms[i] = view.getTransform();
  		}
  
  		for (Iterator iter = part.values(intervals); iter.hasNext();)
  		{
  			Object key = iter.next();
  
  			Rectangle bounds = view.create(c, part.getInterval(key, intervals), transforms);
  
  			if (bounds == null)
  				continue;
  
  			if (!part.isSummaryPart())
  				drawing.put(key, bounds);
  
  			Graphics g = insets != null
  				? graphics.create(bounds.x + insets.left
  				, bounds.y + insets.top, bounds.width + insets.right
  				, bounds.height + insets.bottom)
  				: graphics.create(bounds.x, bounds.y,
  					bounds.width , bounds.height);
  
  			if (g != null)
  				paint(key, c, part, cellState, transforms, g, context);
  		}
  	}
  
  	protected abstract void paint(Object key, Component c, DrawingPart part,
  		CellState cellState, DrawingTransform transforms[], Graphics g, DrawingContext context);
  }
  