package info.limpet.stackedcharts.ui.editor.figures; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.PointList; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Display; public class ArrowFigure extends Figure { private static final int ARROW_HEAD_LENGTH = 10; private static final int ARROW_HEAD_HALF_WIDTH = 8; private boolean horizontal; public ArrowFigure(boolean horizontal) { this.setHorizontal(horizontal); Color color = Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY); setBackgroundColor(color); setForegroundColor(color); } @Override protected void paintFigure(Graphics graphics) { super.paintFigure(graphics); Rectangle clientArea = getClientArea(); Point top = clientArea.getTop(); Point right = clientArea.getRight(); final int oldWid = graphics.getLineWidth(); graphics.setLineWidth(3); PointList points = new PointList(); if (isHorizontal()) { graphics.drawLine(clientArea.getLeft(), right); points.addPoint(right); points.addPoint(right.getCopy().translate(-ARROW_HEAD_LENGTH, -ARROW_HEAD_HALF_WIDTH)); points.addPoint(right.getCopy().translate(-ARROW_HEAD_LENGTH, ARROW_HEAD_HALF_WIDTH)); } else { graphics.drawLine(clientArea.getBottom(), top); points.addPoint(top); points.addPoint(top.getCopy().translate(ARROW_HEAD_HALF_WIDTH, ARROW_HEAD_LENGTH)); points.addPoint(top.getCopy().translate(-ARROW_HEAD_HALF_WIDTH, ARROW_HEAD_LENGTH)); } graphics.fillPolygon(points); graphics.setLineWidth(oldWid); } public boolean isHorizontal() { return horizontal; } public void setHorizontal(boolean horizontal) { this.horizontal = horizontal; if (horizontal) { setPreferredSize(-1, 20); } else { setPreferredSize(20, -1); } repaint(); } }