/* * Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC * All rights reserved. * * The source code of this document is proprietary work, and is not licensed for * distribution. For information about licensing, contact Sam Harwell at: * sam@tunnelvisionlabs.com */ package org.antlr.works.editor.grammar.syndiag; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; public class PlusBlock extends Block { public static int POSITIVE_LOOPBACK_HEIGHT = 20; private final boolean _greedy; public PlusBlock(boolean greedy) { super(greedy ? POSITIVE_LOOPBACK_HEIGHT : 0, greedy ? 0 : POSITIVE_LOOPBACK_HEIGHT); _greedy = greedy; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = null; Object prevAaHint = null; if (g instanceof Graphics2D) { g2 = (Graphics2D)g; prevAaHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING); } try { if (g2 != null) { g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } int loopbackPositionY; if (_greedy) { loopbackPositionY = getY() + getTopGutterHeight() / 2; } else { loopbackPositionY = getHeight() - getBottomGutterHeight() / 2; } int leftJoinLineX = getLeftJoinLineX(); int rightJoinLineX = getRightJoinLineX(); int topOfJoinLineY = getTopOfJoinLineY(); // extend vertical join line on left connecting alts g.drawLine(leftJoinLineX, loopbackPositionY, leftJoinLineX, topOfJoinLineY); // draw horizontal loopback line g.drawLine(leftJoinLineX, loopbackPositionY, rightJoinLineX, loopbackPositionY); // extend vertical line on right connecting alts g.drawLine(rightJoinLineX, loopbackPositionY, rightJoinLineX, topOfJoinLineY); if (g2 != null) { if (_greedy) { Diagram.drawArrow(leftJoinLineX, topOfJoinLineY, Math.PI / 2, g2); } else { Diagram.drawArrow(leftJoinLineX, topOfJoinLineY, -Math.PI / 2, g2); } } } finally { if (g2 != null) { g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, prevAaHint); } } } }