/******************************************************************************* * <copyright> * * Copyright (c) 2005, 2012 SAP AG. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API, implementation and documentation * mgorning - Bug 347144 - Angle of MultiText objects can't be modified * mgorning - Bug 377419 - Hide text in underlying GA while DirectEditing is enabled * * </copyright> * *******************************************************************************/ package org.eclipse.graphiti.ui.internal.figures; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.draw2d.text.TextFlow; import org.eclipse.draw2d.text.TextFragmentBox; import org.eclipse.graphiti.mm.algorithms.MultiText; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.ui.internal.config.IConfigurationProviderInternal; public class GFTextFlow extends TextFlow { private MultiText multiText; private boolean suppressText = false; private int currentOffset; private IConfigurationProviderInternal configurationProvider; public GFTextFlow(MultiText multiText, IConfigurationProviderInternal configurationProvider) { this.multiText = multiText; this.configurationProvider = configurationProvider; } @Override public void paint(Graphics graphics) { int angle = 0; angle = Graphiti.getGaService().getAngle(multiText, true); if (angle != 0) { if (getLocalBackgroundColor() != null) graphics.setBackgroundColor(getLocalBackgroundColor()); if (getLocalForegroundColor() != null) graphics.setForegroundColor(getLocalForegroundColor()); if (getLocalFont() != null) graphics.setFont(getLocalFont()); graphics.pushState(); try { Rectangle flowPageFigureBounds = getParent().getBounds(); Rectangle multiTextBounds = getParent().getParent().getBounds(); Point clipLocation = new Point(multiTextBounds.x - flowPageFigureBounds.x, multiTextBounds.y - flowPageFigureBounds.y); Rectangle clip = new Rectangle(clipLocation, multiTextBounds.getSize()); graphics.setClip(clip); paintFigure(graphics); graphics.restoreState(); paintClientArea(graphics); paintBorder(graphics); } finally { graphics.popState(); } } else { super.paint(graphics); } } @Override protected String getBidiSubstring(TextFragmentBox box, int index) { currentOffset = box.offset; return super.getBidiSubstring(box, index); } @Override protected void paintText(Graphics g, String draw, int x, int y, int bidiLevel) { if (suppressText) { return; } int angle = 0; angle = Graphiti.getGaService().getAngle(multiText, true); if (bidiLevel == -1 && angle != 0) { g.pushState(); int xOff = getParent().getBounds().width() / 2; int yOff = getBounds().height() / 2; g.translate(xOff, yOff); g.rotate(angle); if (multiText.getStyleRegions().isEmpty()) { g.drawText(draw, x - xOff, y - yOff); } else { GFFigureUtil.drawRichText(g, draw, x - xOff, y - yOff, bidiLevel, isMirrored(), currentOffset, configurationProvider, multiText); } g.popState(); } else { if (multiText.getStyleRegions().isEmpty()) { super.paintText(g, draw, x, y, bidiLevel); } else { GFFigureUtil.drawRichText(g, draw, x, y, bidiLevel, isMirrored(), currentOffset, configurationProvider, multiText); } } } public void setSuppressText(boolean suppressText) { this.suppressText = suppressText; repaint(); } }