@Override
	protected void drawInternalU(UGraphic ug, Area area, boolean withShadow) {
		final StringBounder stringBounder = ug.getStringBounder();
		final double textHeight = getTextHeight(stringBounder);

		ug.getParam().setColor(getForegroundColor());
		final double x2 = arrowWidth - 3;

		if (getArrowConfiguration().isDotted()) {
			stroke(ug, 2, 2);
		}

		final double dx1 = area.getDeltaX1() < 0 ? area.getDeltaX1() : 0;
		final double dx2 = area.getDeltaX1() > 0 ? -area.getDeltaX1() : 0;

		ug.draw(dx1, textHeight, new ULine(x2 - dx1, 0));

		final double textAndArrowHeight = textHeight + getArrowOnlyHeight(stringBounder);

		ug.draw(x2, textHeight, new ULine(0, textAndArrowHeight - textHeight));
		ug.draw(dx2, textAndArrowHeight, new ULine(x2 - dx2, 0));

		if (getArrowConfiguration().isDotted()) {
			ug.getParam().setStroke(new UStroke());
		}

		if (getArrowConfiguration().getHead() == ArrowHead.ASYNC) {
			if (getArrowConfiguration().getPart() != ArrowPart.BOTTOM_PART) {
				ug.draw(dx2, textAndArrowHeight, new ULine(getArrowDeltaX(), -getArrowDeltaY()));
			}
			if (getArrowConfiguration().getPart() != ArrowPart.TOP_PART) {
				ug.draw(dx2, textAndArrowHeight, new ULine(getArrowDeltaX(), getArrowDeltaY()));
			}
		} else {
			ug.getParam().setBackcolor(getForegroundColor());
			final UPolygon polygon = getPolygon(textAndArrowHeight);
			ug.draw(dx2, 0, polygon);
			ug.getParam().setBackcolor(null);
		}

		getTextBlock().drawU(ug, getMarginX1(), 0);
	}