/**
* @(#)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 {
protected final GraphicsContext graphicsContext;
protected 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;
}
}
}