]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/TextElementHandler.java
39ca504aabd071d6fc5279405ba9122023dc41ec
[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 getBounds(e, size, horizontalAlignment, verticalAlignment, scale, paddingX, paddingY);
67     }
68         
69         public static Rectangle2D getBounds(
70             IElement e,
71             Rectangle2D size, 
72             Alignment horizontalAlignment, 
73             Alignment verticalAlignment,
74             double scale,
75             double paddingX,
76             double paddingY) {
77         TextNode node = (TextNode) e.getHint(SG_NODE);
78         Rectangle2D b = e.getHint(ElementHints.KEY_BOUNDS);
79         
80         if (size == null)
81             size = new Rectangle2D.Double();
82         if (node != null)
83             size.setRect(node.getBoundsInLocal());
84         else if(b != null && ElementUtils.getHintOrDefault(e, ElementHints.KEY_RESIZABLE, false))
85             size.setRect(b);
86         else calculateBounds(e, size, horizontalAlignment, verticalAlignment, scale, paddingX, paddingY);
87         
88         return size;
89         }
90     
91     public static Rectangle2D calculateBounds(
92             IElement e,
93             Rectangle2D size, 
94             Alignment horizontalAlignment, 
95             Alignment verticalAlignment,
96             double scale,
97             double paddingX,
98             double paddingY) {
99
100         if (size == null)
101             size = new Rectangle2D.Double();
102         
103         String text = e.getHint(ElementHints.KEY_TEXT);
104         Font font = e.getHint(ElementHints.KEY_FONT);
105         if(text == null || font == null) {
106            size.setFrame(0, 0, 0, 0);
107         } else {
108             TextNode n= new TextNode();
109             n.init(text, font, Color.black, 0.0, 0.0, scale);
110             n.setHorizontalAlignment((byte)horizontalAlignment.ordinal());
111             n.setVerticalAlignment((byte)verticalAlignment.ordinal());
112             n.setPadding(paddingX, paddingY);
113             Rectangle2D r = n.getBoundsInLocal();
114             size.setFrame(r);
115             return r;
116         }   
117         return size;
118         
119     }
120     
121     
122     public static double getAlignedXCoordinate(Rectangle2D bounds, Alignment horizontalAlignment) {
123         if(horizontalAlignment == Alignment.CENTER) {
124             return bounds.getX() - bounds.getWidth() / 2;
125         } else if(horizontalAlignment == Alignment.TRAILING) {
126             return - bounds.getWidth();
127         }
128         return bounds.getX();
129     }
130
131 }