/**
* @(#)AbstractLinkTaskPainter.java
*
* Copyright 2002 EGANTT LLP. All rights reserved.
* PROPRIETARY/QPL. Use is subject to license terms.
*/
package com.egantt.drawing.painter.gantt;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Shape;
import javax.swing.JTable;
import com.egantt.awt.graphics.GraphicsContext;
import com.egantt.drawing.DrawingPainter;
import com.egantt.model.drawing.ContextResources;
import com.egantt.model.drawing.DrawingPart;
import com.egantt.model.drawing.DrawingState;
import com.egantt.model.drawing.StateResources;
import com.egantt.model.drawing.axis.AxisInterval;
import com.egantt.model.drawing.axis.AxisView;
import com.egantt.model.drawing.axis.interval.DrawingStateInterval;
import com.egantt.model.drawing.painter.PainterState;
import com.egantt.swing.cell.CellState;
import com.egantt.util.Trace;
public abstract class AbstractLinkTaskPainter implements DrawingPainter {
private static final boolean TRACE = Trace
.getEnable(AbstractLinkTaskPainter.class.getName());
protected String axis = "xAxis";
// ________________________________________________________________________
public Shape paint(Object key, Graphics g, Rectangle bounds,
PainterState state, GraphicsContext context) {
CellState cellState = (CellState) state.get(StateResources.CELL_STATE);
DrawingPart part = (DrawingPart) state.get(StateResources.DRAWING_PART);
AxisView view = (AxisView) context
.get(axis, ContextResources.AXIS_VIEW);
if (view == null) {
if (TRACE)
Trace.out.println("paint: Axis not defined in context [" + axis
+ "]");
return bounds;
}
JTable table = (JTable) cellState.getSource();
DrawingState drawingState = (DrawingState) table.getValueAt(cellState
.getRow(), cellState.getColumn());
DrawingStateInterval interval = (DrawingStateInterval) part
.getInterval(key, new AxisInterval[] {})[2];
int startIndex = Integer.MAX_VALUE;
int finishIndex = Integer.MIN_VALUE;
for (int i = 0; i < interval.size(); i++) {
int newIndex = indexOfDrawingState(table, interval.get(i),
cellState);
if (newIndex >= 0) {
startIndex = Math.min(startIndex, newIndex);
finishIndex = Math.max(finishIndex, newIndex);
}
}
int index = indexOfDrawingState(table, drawingState, cellState);
AxisInterval localInterval = DrawingStateInterval.getInterval(
drawingState, axis);
if (index == startIndex && interval.contains(drawingState)) {
paintStart(interval, localInterval, view, key, g, bounds, state,
context);
} else if (index == finishIndex && interval.contains(drawingState)) {
paintFinish(interval, localInterval, view, key, g, bounds, state,
context);
} else if (cellState.getRow() >= startIndex
&& cellState.getRow() <= finishIndex) {
paintOther(interval, view, key, g, bounds, state, context);
}
return bounds;
}
public long width(Object key, Graphics g, Rectangle bounds,
GraphicsContext context) {
return bounds.width;
}
// ________________________________________________________________________
protected abstract void paintStart(DrawingStateInterval interval,
AxisInterval localInterval, AxisView view, Object key, Graphics g,
Rectangle bounds, PainterState state, GraphicsContext context);
protected abstract void paintOther(DrawingStateInterval interval,
AxisView view, Object key, Graphics g, Rectangle bounds,
PainterState state, GraphicsContext context);
protected abstract void paintFinish(DrawingStateInterval interval,
AxisInterval localInterval, AxisView view, Object key, Graphics g,
Rectangle bounds, PainterState state, GraphicsContext context);
// ________________________________________________________________________
protected int indexOfDrawingState(JTable table, DrawingState state,
CellState cellState) {
for (int i = 0; i < table.getRowCount(); i++) {
Object value = table.getValueAt(i, cellState.getColumn());
if (value != null && value.equals(state))
return i;
}
return -1;
}
}