You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2011/10/26 12:10:06 UTC

svn commit: r1189105 [2/2] - in /poi/trunk/src: ooxml/java/org/apache/poi/xslf/model/geom/ ooxml/java/org/apache/poi/xslf/model/geom/expr/ ooxml/java/org/apache/poi/xslf/model/geom/path/ ooxml/java/org/apache/poi/xslf/usermodel/ ooxml/testcases/org/apa...

Added: poi/trunk/src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java?rev=1189105&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java Wed Oct 26 10:10:05 2011
@@ -0,0 +1,46 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.xslf.model.geom;
+
+import java.util.regex.Matcher;
+
+/**
+ * Square Root Formula:
+ * <gd name="x" fmla="sqrt y"/>
+ *
+ * <p>
+ *     Arguments: 1 (fmla="sqrt x")
+ *     Usage: "sqrt x" = sqrt(x) = value of this guide
+ * </p>
+ * @author Yegor Kozlov
+ */
+public class SqrtExpression implements Expression {
+    private String arg;
+
+    SqrtExpression(Matcher m){
+        arg =m.group(1);
+    }
+
+    public double evaluate(Context ctx){
+        double val = ctx.getValue(arg);
+        return Math.sqrt(val);
+    }
+
+}

Added: poi/trunk/src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java?rev=1189105&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java Wed Oct 26 10:10:05 2011
@@ -0,0 +1,50 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.xslf.model.geom;
+
+import java.util.regex.Matcher;
+
+/**
+ * Tangent Formula:
+ *
+ * <gd name="z" fmla="tan x y"/>
+ *
+ * <p>
+ * Arguments: 2 (fmla="tan x y")
+ * Usage: "tan x y" = (x * tan( y )) = value of this guide
+ * </p>
+ *
+ * @author Yegor Kozlov
+ */
+public class TanExpression implements Expression {
+    private String arg1, arg2;
+
+    TanExpression(Matcher m){
+        arg1 = m.group(1);
+        arg2 = m.group(2);
+    }
+
+    public double evaluate(Context ctx){
+        double x = ctx.getValue(arg1);
+        double y = ctx.getValue(arg2);
+        return x * Math.tan(Math.toRadians(y / 60000));
+    }
+
+}

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java?rev=1189105&r1=1189104&r2=1189105&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java Wed Oct 26 10:10:05 2011
@@ -21,6 +21,10 @@ package org.apache.poi.xslf.usermodel;
 
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Units;
+import org.apache.poi.xslf.model.geom.Context;
+import org.apache.poi.xslf.model.geom.CustomGeometry;
+import org.apache.poi.xslf.model.geom.Path;
+import org.apache.poi.xslf.model.geom.PresetGeometries;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuideList;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
@@ -42,6 +46,7 @@ import org.openxmlformats.schemas.presen
 
 import java.awt.*;
 import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
 import java.awt.geom.Rectangle2D;
 import java.util.ArrayList;
 import java.util.List;
@@ -100,39 +105,4 @@ public class XSLFAutoShape extends XSLFT
         }
         return txBody;
     }
-
-    int getAdjustValue(String name, int defaultValue){
-        /*
-        CTShape shape = (CTShape) getXmlObject();
-        CTGeomGuideList av = shape.getSpPr().getPrstGeom().getAvLst();
-        if(av != null){
-            for(CTGeomGuide gd : av.getGdList()){
-                if(gd.getName().equals(name)) {
-                    String fmla = gd.getFmla();
-                    Matcher m = adjPtrn.matcher(fmla);
-                    if(m.matches()){
-                        int val = Integer.parseInt(m.group(1));
-                        return 21600*val/100000;
-                    }
-                }
-            }
-        }
-        */
-        return defaultValue;
-    }
-
-    @Override
-    protected java.awt.Shape getOutline(){
-        java.awt.Shape outline = XSLFPresetGeometry.getOutline(this);
-        Rectangle2D anchor = getAnchor();
-
-        AffineTransform at = new AffineTransform();
-        at.translate(anchor.getX(), anchor.getY());
-        at.scale(
-                1.0f/21600*anchor.getWidth(),
-                1.0f/21600*anchor.getHeight()
-        );
-        return outline == null ? anchor : at.createTransformedShape(outline);
-    }
-
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java?rev=1189105&r1=1189104&r2=1189105&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java Wed Oct 26 10:10:05 2011
@@ -223,18 +223,6 @@ public class XSLFConnectorShape extends 
         }
     }
 
-    @Override
-    protected java.awt.Shape getOutline() {
-        Rectangle2D anchor = getAnchor();
-        double x1 = anchor.getX(),
-                y1 = anchor.getY(),
-                x2 = anchor.getX() + anchor.getWidth(),
-                y2 = anchor.getY() + anchor.getHeight();
-
-
-        return new Line2D.Double(x1, y1, x2, y2);
-    }
-
     Shape getTailDecoration() {
         LineEndLength tailLength = getLineTailLength();
         LineEndWidth tailWidth = getLineTailWidth();
@@ -307,9 +295,10 @@ public class XSLFConnectorShape extends 
         double scaleX = 1;
         switch (getLineHeadDecoration()) {
             case OVAL:
-                scaleY = Math.pow(2, headWidth.ordinal());
-                scaleX = Math.pow(2, headLength.ordinal());
                 shape = new Ellipse2D.Double(0, 0, lineWidth * scaleX, lineWidth * scaleY);
+                bounds = shape.getBounds2D();
+                at.translate(x1 - bounds.getWidth() / 2, y1 - bounds.getHeight() / 2);
+                at.rotate(alpha, bounds.getX() + bounds.getWidth() / 2, bounds.getY() + bounds.getHeight() / 2);
                 break;
             case STEALTH:
             case ARROW:

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java?rev=1189105&r1=1189104&r2=1189105&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java Wed Oct 26 10:10:05 2011
@@ -19,35 +19,22 @@
 
 package org.apache.poi.xslf.usermodel;
 
+import org.apache.poi.xslf.model.geom.*;
 import org.apache.poi.xslf.usermodel.LineCap;
 import org.apache.poi.xslf.usermodel.LineDash;
 import org.apache.poi.xslf.model.PropertyFetcher;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Units;
 import org.apache.xmlbeans.XmlObject;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetLineDashProperties;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeStyle;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrix;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.STLineCap;
-import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal;
-import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTEffectStyleItem;
+import org.openxmlformats.schemas.drawingml.x2006.main.*;
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
 import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
 
 import java.awt.*;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
 import java.awt.geom.Rectangle2D;
+import java.util.ArrayList;
 
 /**
  * @author Yegor Kozlov
@@ -674,4 +661,55 @@ public abstract class XSLFSimpleShape ex
         return ok;
     }
 
+
+    @Override
+    protected java.awt.Shape getOutline(){
+        PresetGeometries dict = PresetGeometries.getInstance();
+        String name = getSpPr().getPrstGeom().getPrst().toString();
+        CustomGeometry geom = dict.get(name);
+        Rectangle2D anchor = getAnchor();
+        if(geom != null) {
+            // the guides in the shape definitions are all defined relative to each other,
+            // so we build the path starting from (0,0).
+            final Rectangle2D anchorEmu = new Rectangle2D.Double(
+                    0,
+                    0,
+                    Units.toEMU(anchor.getWidth()),
+                    Units.toEMU(anchor.getHeight())
+            );
+
+            GeneralPath path = new GeneralPath();
+            Context ctx = new Context(geom, new IAdjustableShape() {
+                public Rectangle2D getAnchor() {
+                    return anchorEmu;
+                }
+
+                public Guide getAdjustValue(String name) {
+                    CTPresetGeometry2D prst = getSpPr().getPrstGeom();
+                    if(prst.isSetAvLst()) {
+                        for(CTGeomGuide g : prst.getAvLst().getGdList()){
+                            if(g.getName().equals(name)) {
+                                return new Guide(g);
+                            }
+                        }
+                    }
+                    return null;
+                }
+            });
+
+            for(Path p : geom){
+                path.append( p.getPath(ctx) , false);
+            }
+
+            // translate the result to the canvas coordinates in points
+            AffineTransform at = new AffineTransform();
+            at.scale(
+                    1.0/Units.EMU_PER_POINT, 1.0/Units.EMU_PER_POINT);
+            at.translate(Units.toEMU(anchor.getX()), Units.toEMU(anchor.getY()));
+            return at.createTransformedShape(path);
+        } else {
+            return anchor;
+        }
+     }
+
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java?rev=1189105&r1=1189104&r2=1189105&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java Wed Oct 26 10:10:05 2011
@@ -23,6 +23,9 @@ import org.apache.poi.util.Beta;
 import org.apache.poi.util.Units;
 import org.apache.poi.xslf.model.PropertyFetcher;
 import org.apache.poi.xslf.model.TextBodyPropertyFetcher;
+import org.apache.poi.xslf.model.geom.Context;
+import org.apache.poi.xslf.model.geom.CustomGeometry;
+import org.apache.poi.xslf.model.geom.Path;
 import org.apache.xmlbeans.XmlObject;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
@@ -33,6 +36,7 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
 
 import java.awt.*;
+import java.awt.geom.GeneralPath;
 import java.awt.image.BufferedImage;
 import java.awt.geom.Rectangle2D;
 import java.util.ArrayList;
@@ -391,15 +395,14 @@ public abstract class XSLFTextShape exte
         Color fillColor = getFillColor();
         Color lineColor = getLineColor();
         if(shadow != null) {
-        	shadow.draw(graphics);
+        	//shadow.draw(graphics);
         }
-
         if (fillColor != null) {
         	graphics.setColor(fillColor);
             applyFill(graphics);
             graphics.fill(outline);
         }
- 
+
         if (lineColor != null){
             graphics.setColor(lineColor);
             applyStroke(graphics);

Added: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java?rev=1189105&view=auto
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java (added)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java Wed Oct 26 10:10:05 2011
@@ -0,0 +1,40 @@
+package org.apache.poi.xslf.geom;
+
+import junit.framework.TestCase;
+import org.apache.poi.xslf.model.geom.*;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D;
+
+/**
+ * Date: 10/24/11
+ *
+ * @author Yegor Kozlov
+ */
+public class TestFormulaParser extends TestCase {
+    public void testParse(){
+
+        Formula[] ops = {
+            new Guide("adj1", "val 100"),
+            new Guide("adj2", "val 200"),
+            new Guide("adj3", "val -1"),
+            new Guide("a1", "*/ adj1 2 adj2"), // a1 = 100*2 / 200
+            new Guide("a2", "+- adj2 a1 adj1"), // a2 = 200 + a1 - 100
+            new Guide("a3", "+/ adj1 adj2 adj2"), // a3 = (100 + 200) / 200
+            new Guide("a4", "?: adj3 adj1 adj2"), // a4 = adj3 > 0 ? adj1 : adj2
+            new Guide("a5", "abs -2"),
+        };
+
+        CustomGeometry geom = new CustomGeometry(CTCustomGeometry2D.Factory.newInstance());
+        Context ctx = new Context(geom, null);
+        for(Formula fmla : ops) {
+            ctx.evaluate(fmla);
+        }
+
+        assertEquals(100.0, ctx.getValue("adj1"));
+        assertEquals(200.0, ctx.getValue("adj2"));
+        assertEquals(1.0, ctx.getValue("a1"));
+        assertEquals(101.0, ctx.getValue("a2"));
+        assertEquals(1.5, ctx.getValue("a3"));
+        assertEquals(200.0, ctx.getValue("a4"));
+        assertEquals(2.0, ctx.getValue("a5"));
+    }
+}

Added: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java?rev=1189105&view=auto
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java (added)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java Wed Oct 26 10:10:05 2011
@@ -0,0 +1,39 @@
+package org.apache.poi.xslf.geom;
+
+import junit.framework.TestCase;
+import org.apache.poi.xslf.model.geom.*;
+
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Rectangle2D;
+import java.util.Map;
+
+/**
+ * Date: 10/24/11
+ *
+ * @author Yegor Kozlov
+ */
+public class TestPresetGeometries extends TestCase {
+    public void testRead(){
+
+        Map<String, CustomGeometry> shapes = PresetGeometries.getInstance();
+        assertEquals(186, shapes.size());
+
+
+        for(String name : shapes.keySet()) {
+            CustomGeometry geom = shapes.get(name);
+            Context ctx = new Context(geom, new IAdjustableShape() {
+                public Rectangle2D getAnchor() {
+                    return new Rectangle2D.Double(0, 0, 100, 100);
+                }
+
+                public Guide getAdjustValue(String name) {
+                    return null;
+                }
+            });
+            for(Path p : geom){
+                GeneralPath path = p.getPath(ctx);
+                assertNotNull(path);
+            }
+        }
+    }
+}

Modified: poi/trunk/src/resources/scratchpad/org/apache/poi/xslf/usermodel/presetShapeDefinitions.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/resources/scratchpad/org/apache/poi/xslf/usermodel/presetShapeDefinitions.xml?rev=1189105&r1=1189104&r2=1189105&view=diff
==============================================================================
--- poi/trunk/src/resources/scratchpad/org/apache/poi/xslf/usermodel/presetShapeDefinitions.xml (original)
+++ poi/trunk/src/resources/scratchpad/org/apache/poi/xslf/usermodel/presetShapeDefinitions.xml Wed Oct 26 10:10:05 2011
@@ -10875,7 +10875,7 @@
       <gd name="dx2" fmla="*/ ss a2 100000" />
       <gd name="x2" fmla="+- l dx2 0" />
       <gd name="dy1" fmla="*/ h a1 200000" />
-      <gd name="y1" fmla="+- vc 0 dy" />
+      <gd name="y1" fmla="+- vc 0 dy1" />
       <gd name="y2" fmla="+- vc dy1 0" />
       <gd name="dx1" fmla="*/ y1 dx2 hd2" />
       <gd name="x1" fmla="+- x2  0 dx1" />
@@ -19912,4 +19912,4 @@
       </path>
     </pathLst>
   </wedgeRoundRectCallout>
-</presetShapeDefinitons>
\ No newline at end of file
+</presetShapeDefinitons>



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org