1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.diagram.elements;
14 import java.awt.Color;
16 import java.awt.geom.Rectangle2D;
18 import org.simantics.g2d.element.ElementHints;
19 import org.simantics.g2d.element.ElementUtils;
20 import org.simantics.g2d.element.IElement;
21 import org.simantics.g2d.element.handler.InternalSize;
22 import org.simantics.g2d.utils.Alignment;
25 * ElementHandler for text elements
26 * In-line editing supported.
28 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
30 public class TextElementHandler extends TextElementNoBounds implements InternalSize {
32 private static final long serialVersionUID = 2560598115620905271L;
34 public static final TextElementHandler INSTANCE = new TextElementHandler();
36 public TextElementHandler() {
40 public TextElementHandler(double originX, double originY, Alignment horizontalAlignment) {
41 super(originX, originY, horizontalAlignment);
44 public TextElementHandler(double originX, double originY, Alignment horizontalAlignment, double borderWidth) {
45 super(originX, originY, horizontalAlignment, borderWidth);
48 public TextElementHandler(double originX, double originY, Alignment horizontalAlignment, double borderWidth,
49 double paddingX, double paddingY, boolean editable) {
50 super(originX, originY, horizontalAlignment, borderWidth, paddingX, paddingY, editable);
53 public TextElementHandler(double originX, double originY, Alignment horizontalAlignment, double borderWidth,
54 double paddingX, double paddingY, boolean editable, double scale) {
55 super(originX, originY, horizontalAlignment, borderWidth, paddingX, paddingY, editable, scale);
58 public TextElementHandler(double originX, double originY, Alignment horizontalAlignment,
59 Alignment verticalAlignment, double borderWidth, double paddingX, double paddingY, boolean editable,
61 super(originX, originY, horizontalAlignment, verticalAlignment, borderWidth, paddingX, paddingY, editable, scale);
65 public Rectangle2D getBounds(IElement e, Rectangle2D size) {
66 return calculateBounds(e, size, horizontalAlignment, verticalAlignment, scale, paddingX, paddingY);
69 public static Rectangle2D calculateBounds(
72 Alignment horizontalAlignment,
73 Alignment verticalAlignment,
78 TextNode node = (TextNode) e.getHint(SG_NODE);
79 Rectangle2D b = e.getHint(ElementHints.KEY_BOUNDS);
82 size = new Rectangle2D.Double();
84 size.setRect(node.getBoundsInLocal());
85 else if(b != null && ElementUtils.getHintOrDefault(e, ElementHints.KEY_RESIZABLE, false))
88 String text = e.getHint(ElementHints.KEY_TEXT);
89 Font font = e.getHint(ElementHints.KEY_FONT);
90 if(text == null || font == null)
91 size.setFrame(0, 0, 0, 0);
93 TextNode n= new TextNode();
94 n.init(text, font, Color.black, 0.0, 0.0, scale);
95 n.setHorizontalAlignment((byte)horizontalAlignment.ordinal());
96 n.setVerticalAlignment((byte)verticalAlignment.ordinal());
98 Rectangle2D r = n.getBoundsInLocal();
108 public static double getAlignedXCoordinate(Rectangle2D bounds, Alignment horizontalAlignment) {
109 if(horizontalAlignment == Alignment.CENTER) {
110 return bounds.getX() - bounds.getWidth() / 2;
111 } else if(horizontalAlignment == Alignment.TRAILING) {
112 return - bounds.getWidth();
114 return bounds.getX();