content: /**
   * @(#)BasicPartPainter.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.Rectangle;
  import java.util.Iterator;
  
  import com.egantt.awt.graphics.GraphicsContext;
  import com.egantt.awt.graphics.GraphicsManager;
  import com.egantt.awt.graphics.context.CompoundContext;
  import com.egantt.awt.graphics.manager.BasicGraphicsManager;
  import com.egantt.drawing.DrawingPainter;
  import com.egantt.model.drawing.ContextResources;
  import com.egantt.model.drawing.DrawingContext;
  import com.egantt.model.drawing.DrawingPart;
  import com.egantt.model.drawing.DrawingTransform;
  import com.egantt.model.drawing.StateResources;
  import com.egantt.model.drawing.painter.PainterState;
  import com.egantt.swing.cell.CellState;
  
  public class BasicPartPainter extends AbstractPartPainter
  {
  	protected GraphicsManager graphics = new BasicGraphicsManager();
  
  	// _________________________________________________________________________
  
  	public void setGraphicsManager(GraphicsManager graphics)
  	{
  		this.graphics = graphics;
  	}
  
  	// _________________________________________________________________________
  
  	protected void paint(Object key, Component c, DrawingPart part, CellState cellState,
  											 DrawingTransform[] transforms, Graphics g, DrawingContext context)
  	{
  		// Graphics configuration
  		Iterator contexts = context.iterator(part.getContext(key), ContextResources.GRAPHICS_CONTEXT);
  		Iterator painters = context.iterator(part.getPainter(key), ContextResources.DRAWING_PAINTER);
  
  		// Paint code
  		PainterState painterState = null; 
  		{
  			Object stateKey = part.getState(key);
  			if (stateKey == null)
  			{
  				if (true) System.out.println("paint - Drawing part: '" + part + "' has no state defined for: '" + stateKey + "'");
  				return;
  			}
  			painterState = (PainterState) context.get(part.getState(key), ContextResources.PAINTER_STATE);
  		}
  		
  		if (painterState == null) {
  			if (true) System.out.println("paint - Drawing part: '" + part + "' has no state defined for part state: '" + part.getState(key) + "'");
  			return;
  		}
  		
  		painterState.initialise();
  
  		painterState.put(StateResources.COMPONENT, c);
  		painterState.put(StateResources.CELL_STATE, cellState);
  		painterState.put(StateResources.DRAWING_PART, part);
  		painterState.put(StateResources.TRANSFORMS, transforms);
  
  		paintComponent(key, g, g.getClipBounds(), painterState, painters, contexts, context);
  
  		painterState.terminate();
  	}
  
  	// __________________________________________________________________________
  
  	protected void paintComponent(Object key, Graphics device, Rectangle deviceBounds,
  			PainterState state, Iterator painters, Iterator contexts, DrawingContext context)
  	{
  		while (contexts.hasNext() && painters.hasNext())
  		{
  			final GraphicsContext graphicsContext =
  				new LocalGraphicsContext((GraphicsContext) contexts.next(), context);
  
  			DrawingPainter drawingPainter = (DrawingPainter) painters.next();
  			drawingPainter.paint(key, graphics.create(key, device, graphicsContext),
  				deviceBounds, state, graphicsContext);
  		}
  	}
  	
  	//	________________________________________________________________________
  	
  	protected final class LocalGraphicsContext implements CompoundContext {
  	
  		private final GraphicsContext graphicsContext;
  		private final DrawingContext context;
  		
  		public LocalGraphicsContext(GraphicsContext graphicsContext, DrawingContext context) {
  			this.graphicsContext = graphicsContext;
  			this.context = context;
  		}
  		
  		public Object get(Object key, Object type) {
  		
  			Object value = graphicsContext.get(key, type);
  			if (value != null)
  				return value;
  			
  			return (type instanceof Class) ? context.get(key, (Class) type) : null;
  		}
  
  		public Object get(Object key, Object group, Object type) {
  			if (! (graphicsContext instanceof CompoundContext))
  				return get(key, type);
  			
  			Object value = ((CompoundContext)graphicsContext).get(key, group, type);
  			if (value != null)
  				return value;
  			
  			return (type instanceof Class) ? context.get(key, (Class) type) : null;
  		}
  	}
  }