]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/TextElementHandler.java
f7dd3a0fda9f66aa675a6fcc7d31ac0f9f801db2
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / elements / TextElementHandler.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
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
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.diagram.elements;
13
14 import java.awt.Color;
15 import java.awt.Font;
16 import java.awt.geom.Rectangle2D;
17
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;
23
24 /**
25  * ElementHandler for text elements
26  * In-line editing supported.
27  * 
28  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
29  */
30 public class TextElementHandler extends TextElementNoBounds implements InternalSize {
31
32     private static final long serialVersionUID = 2560598115620905271L;
33
34     public static final TextElementHandler INSTANCE         = new TextElementHandler();
35
36     public TextElementHandler() {
37         super();
38     }
39
40     public TextElementHandler(double originX, double originY, Alignment horizontalAlignment) {
41         super(originX, originY, horizontalAlignment);
42     }
43
44     public TextElementHandler(double originX, double originY, Alignment horizontalAlignment, double borderWidth) {
45         super(originX, originY, horizontalAlignment, borderWidth);
46     }
47
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);
51     }
52     
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);
56         }
57     
58         public TextElementHandler(double originX, double originY, Alignment horizontalAlignment,
59                         Alignment verticalAlignment, double borderWidth, double paddingX, double paddingY, boolean editable,
60                         double scale) {
61                 super(originX, originY, horizontalAlignment, verticalAlignment, borderWidth, paddingX, paddingY, editable, scale);
62         }
63
64         @Override
65     public Rectangle2D getBounds(IElement e, Rectangle2D size) {
66         return calculateBounds(e, size, horizontalAlignment, verticalAlignment, scale, paddingX, paddingY);
67     }
68     
69     public static Rectangle2D calculateBounds(
70             IElement e,
71             Rectangle2D size, 
72             Alignment horizontalAlignment, 
73             Alignment verticalAlignment,
74             double scale,
75             double paddingX,
76             double paddingY) {
77         
78         TextNode node = (TextNode) e.getHint(SG_NODE);
79         Rectangle2D b = e.getHint(ElementHints.KEY_BOUNDS);
80
81         if (size == null)
82             size = new Rectangle2D.Double();
83         if (node != null)
84             size.setRect(node.getBoundsInLocal());
85         else if(b != null && ElementUtils.getHintOrDefault(e, ElementHints.KEY_RESIZABLE, false))
86             size.setRect(b);
87         else {
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);
92             else {
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());
97                     
98                     Rectangle2D r = n.getBoundsInLocal();
99                     size.setFrame(r);
100                     return r;
101             }
102         }
103         return size;
104         
105     }
106     
107     
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();
113         }
114         return bounds.getX();
115     }
116
117 }