]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/TextElementHandler.java
Use paddings when calculating Text bounds.
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / elements / TextElementHandler.java
index a39ef4f5790ccd7556d976350d6883c8818a7277..39ca504aabd071d6fc5279405ba9122023dc41ec 100644 (file)
  *******************************************************************************/
 package org.simantics.diagram.elements;
 
+import java.awt.Color;
 import java.awt.Font;
-import java.awt.font.FontRenderContext;
-import java.awt.font.TextLayout;
-import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
 
 import org.simantics.g2d.element.ElementHints;
@@ -52,45 +50,70 @@ public class TextElementHandler extends TextElementNoBounds implements InternalS
         super(originX, originY, horizontalAlignment, borderWidth, paddingX, paddingY, editable);
     }
     
+    public TextElementHandler(double originX, double originY, Alignment horizontalAlignment, double borderWidth,
+                       double paddingX, double paddingY, boolean editable, double scale) {
+               super(originX, originY, horizontalAlignment, borderWidth, paddingX, paddingY, editable, scale);
+       }
+    
+       public TextElementHandler(double originX, double originY, Alignment horizontalAlignment,
+                       Alignment verticalAlignment, double borderWidth, double paddingX, double paddingY, boolean editable,
+                       double scale) {
+               super(originX, originY, horizontalAlignment, verticalAlignment, borderWidth, paddingX, paddingY, editable, scale);
+       }
 
-    @Override
+       @Override
     public Rectangle2D getBounds(IElement e, Rectangle2D size) {
-        return calculateBounds(e, size, horizontalAlignment, SCALE, paddingX, paddingY);
+        return getBounds(e, size, horizontalAlignment, verticalAlignment, scale, paddingX, paddingY);
     }
-    
-    public static Rectangle2D calculateBounds(
+       
+       public static Rectangle2D getBounds(
             IElement e,
             Rectangle2D size, 
             Alignment horizontalAlignment, 
+            Alignment verticalAlignment,
             double scale,
             double paddingX,
             double paddingY) {
-        
         TextNode node = (TextNode) e.getHint(SG_NODE);
         Rectangle2D b = e.getHint(ElementHints.KEY_BOUNDS);
-
+        
         if (size == null)
             size = new Rectangle2D.Double();
         if (node != null)
             size.setRect(node.getBoundsInLocal());
         else if(b != null && ElementUtils.getHintOrDefault(e, ElementHints.KEY_RESIZABLE, false))
             size.setRect(b);
-        else {
-            String text = e.getHint(ElementHints.KEY_TEXT);
-            Font font = e.getHint(ElementHints.KEY_FONT);
-            if(text == null || font == null)
-                size.setFrame(0, 0, 0, 0);
-            else {
-                FontRenderContext FRC = new FontRenderContext(new AffineTransform(), true, true);
-                TextLayout tl = new TextLayout(text, font, FRC);
-                Rectangle2D bounds = tl.getLogicalHighlightShape(0, text.length()).getBounds2D();   
-                size.setFrame(
-                        getAlignedXCoordinate(bounds, horizontalAlignment) * scale - paddingX,
-                        bounds.getY() * scale -paddingY, 
-                        bounds.getWidth()* scale + paddingX + paddingX, 
-                        bounds.getHeight()* scale + paddingY + paddingY);
-            }
-        }
+        else calculateBounds(e, size, horizontalAlignment, verticalAlignment, scale, paddingX, paddingY);
+        
+        return size;
+       }
+    
+    public static Rectangle2D calculateBounds(
+            IElement e,
+            Rectangle2D size, 
+            Alignment horizontalAlignment, 
+            Alignment verticalAlignment,
+            double scale,
+            double paddingX,
+            double paddingY) {
+
+       if (size == null)
+            size = new Rectangle2D.Double();
+       
+        String text = e.getHint(ElementHints.KEY_TEXT);
+        Font font = e.getHint(ElementHints.KEY_FONT);
+        if(text == null || font == null) {
+           size.setFrame(0, 0, 0, 0);
+        } else {
+            TextNode n= new TextNode();
+            n.init(text, font, Color.black, 0.0, 0.0, scale);
+            n.setHorizontalAlignment((byte)horizontalAlignment.ordinal());
+            n.setVerticalAlignment((byte)verticalAlignment.ordinal());
+            n.setPadding(paddingX, paddingY);
+            Rectangle2D r = n.getBoundsInLocal();
+            size.setFrame(r);
+            return r;
+        }   
         return size;
         
     }