/* * @(#)BasicRangePainter.java * * Copyright 2002 EGANTT LLP. All rights reserved. * PROPRIETARY/QPL. Use is subject to license terms. */ package com.egantt.drawing.painter.range; import com.egantt.awt.graphics.GraphicsContext; import com.egantt.awt.graphics.GraphicsManager; import com.egantt.awt.graphics.GraphicsState; import com.egantt.drawing.DrawingPainter; import com.egantt.drawing.painter.RangePainter; import com.egantt.model.drawing.StateResources; import com.egantt.model.drawing.painter.PainterState; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.Shape; /** * Relies on the availabiltiy of other plotters to perform the paint */ public class BasicRangePainter implements RangePainter { protected final GraphicsManager graphics; protected final boolean alwaysPaint; protected DrawingPainter painter; protected GraphicsState state; protected RangeModel model; public BasicRangePainter(GraphicsManager graphics, boolean alwaysPaint) { this.alwaysPaint = alwaysPaint; this.graphics = graphics; } // __________________________________________________________________________ public void setModel(RangeModel model) { this.model = model; } public void setPainter(DrawingPainter painter) { this.painter = painter; } public void setState(GraphicsState state) { this.state = state; } // __________________________________________________________________________ /** * This paint essentially uses a fences and posts algorithm, we are given the * the posts from the GranularityHelper but we need to calculate the fences */ public synchronized Shape paint(Object key, Graphics g, Rectangle bounds, PainterState state, GraphicsContext context) { // start the drawing this.state.initialise(g); Graphics vg = this.state.create(bounds.x, bounds.y, bounds.width, bounds.height); for (RangeIterator iter = model.iterator(key, g, bounds, state, context); iter.hasNext();) { Rectangle rect = (Rectangle) iter.next(); if (rect == null) continue; Object data = iter.getKey(); if (iter.getKey() == null) continue; // :: hack !WHY! vg = graphics.create(data, vg, context); Object gran = state.get(StateResources.GRANULARITY_KEY); GraphicsContext granularityContext = model.getContext(gran, context); // don't plot plotters, that aren't really plottable if (alwaysPaint || painter.width(data, vg, rect, granularityContext) <= rect.width) { painter.paint(data, vg, rect, state, granularityContext); } } this.state.terminate(g); return bounds; } public long width(Object data, Object granularity, Graphics vg, Rectangle rect, GraphicsContext context) { vg = graphics.create(data, vg, context); return painter.width(data, vg, rect, model.getContext(granularity, context)); } public long width(Object key, Graphics g, Rectangle bounds, GraphicsContext context) { return bounds.width; } }