--- /dev/null
+\r
+/* ====================================================================\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to You under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+==================================================================== */\r
+\r
+package org.apache.poi.hslf.examples;\r
+\r
+import org.apache.poi.hslf.usermodel.*;\r
+import org.apache.poi.hslf.model.*;\r
+import org.apache.poi.hslf.record.TextHeaderAtom;\r
+\r
+import java.io.IOException;\r
+import java.io.FileOutputStream;\r
+import java.io.File;\r
+import java.awt.*;\r
+\r
+/**\r
+ * Presentation for Fast Feather Track on ApacheconEU 2008\r
+ * \r
+ * @author Yegor Kozlov\r
+ */\r
+public class ApacheconEU08 {\r
+\r
+ public static void main(String[] args) throws IOException {\r
+ SlideShow ppt = new SlideShow();\r
+ ppt.setPageSize(new Dimension(720, 540));\r
+\r
+ slide1(ppt);\r
+ slide2(ppt);\r
+ slide3(ppt);\r
+ slide4(ppt);\r
+ slide5(ppt);\r
+ slide6(ppt);\r
+ slide7(ppt);\r
+ slide8(ppt);\r
+ slide9(ppt);\r
+ slide10(ppt);\r
+ slide11(ppt);\r
+ slide12(ppt);\r
+\r
+ FileOutputStream out = new FileOutputStream("apachecon_eu_08.ppt");\r
+ ppt.write(out);\r
+ out.close();\r
+\r
+ }\r
+\r
+ public static void slide1(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE);\r
+ tr1.setText("POI-HSLF");\r
+ box1.setAnchor(new Rectangle(54, 78, 612, 115));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE);\r
+ tr2.setText("Java API To Access Microsoft PowerPoint Format Files");\r
+ box2.setAnchor(new Rectangle(108, 204, 504, 138));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ tr3.getRichTextRuns()[0].setFontSize(32);\r
+ box3.setHorizontalAlignment(TextBox.AlignCenter);\r
+ tr3.setText(\r
+ "Yegor Kozlov\r" +\r
+ "yegor - apache - org");\r
+ box3.setAnchor(new Rectangle(206, 348, 310, 84));\r
+ slide.addShape(box3);\r
+ }\r
+\r
+ public static void slide2(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("What is HSLF?");\r
+ box1.setAnchor(new Rectangle(36, 21, 648, 90));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText("HorribleSLideshowFormat is the POI Project's pure Java implementation " +\r
+ "of the Powerpoint binary file format. \r" +\r
+ "POI sub-project since 2005\r" +\r
+ "Started by Nick Birch, Yegor Kozlov joined soon after");\r
+ box2.setAnchor(new Rectangle(36, 126, 648, 356));\r
+ slide.addShape(box2);\r
+\r
+\r
+ }\r
+\r
+ public static void slide3(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF in a Nutshell");\r
+ box1.setAnchor(new Rectangle(36, 15, 648, 65));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText(\r
+ "HSLF provides a way to read, create and modify MS PowerPoint presentations\r" +\r
+ "Pure Java API - you don't need PowerPoint to read and write *.ppt files\r" +\r
+ "Comprehensive support of PowerPoint objects");\r
+ tr2.getRichTextRuns()[0].setFontSize(28);\r
+ box2.setAnchor(new Rectangle(36, 80, 648, 200));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ tr3.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr3.setText(\r
+ "Rich text\r" +\r
+ "Tables\r" +\r
+ "Shapes\r" +\r
+ "Pictures\r" +\r
+ "Master slides");\r
+ tr3.getRichTextRuns()[0].setFontSize(24);\r
+ tr3.getRichTextRuns()[0].setIndentLevel(1);\r
+ box3.setAnchor(new Rectangle(36, 265, 648, 150));\r
+ slide.addShape(box3);\r
+\r
+ TextBox box4 = new TextBox();\r
+ TextRun tr4 = box4.getTextRun();\r
+ tr4.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr4.setText("Access to low level data structures");\r
+ box4.setAnchor(new Rectangle(36, 430, 648, 50));\r
+ slide.addShape(box4);\r
+ }\r
+\r
+ public static void slide4(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ String[][] txt1 = {\r
+ {"Note"},\r
+ {"This presentation was created programmatically using POI HSLF"}\r
+ };\r
+ Table table1 = new Table(2, 1);\r
+ for (int i = 0; i < txt1.length; i++) {\r
+ for (int j = 0; j < txt1[i].length; j++) {\r
+ TableCell cell = table1.getCell(i, j);\r
+ cell.setText(txt1[i][j]);\r
+ cell.getTextRun().getRichTextRuns()[0].setFontSize(10);\r
+ RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];\r
+ rt.setFontName("Arial");\r
+ rt.setBold(true);\r
+ if(i == 0){\r
+ rt.setFontSize(32);\r
+ rt.setFontColor(Color.white);\r
+ cell.getFill().setForegroundColor(new Color(0, 153, 204));\r
+ } else {\r
+ rt.setFontSize(28);\r
+ cell.getFill().setForegroundColor(new Color(235, 239, 241));\r
+ }\r
+ cell.setVerticalAlignment(TextBox.AnchorMiddle);\r
+ }\r
+ }\r
+\r
+ Line border1 = table1.createBorder();\r
+ border1.setLineColor(Color.black);\r
+ border1.setLineWidth(1.0);\r
+ table1.setAllBorders(border1);\r
+\r
+ Line border2 = table1.createBorder();\r
+ border2.setLineColor(Color.black);\r
+ border2.setLineWidth(2.0);\r
+ table1.setOutsideBorders(border2);\r
+\r
+ table1.setColumnWidth(0, 510);\r
+ table1.setRowHeight(0, 60);\r
+ table1.setRowHeight(1, 100);\r
+ slide.addShape(table1);\r
+\r
+ table1.moveTo(100, 100);\r
+\r
+ TextBox box1 = new TextBox();\r
+ box1.setHorizontalAlignment(TextBox.AlignCenter);\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setText("The source code is available at\r" +\r
+ "http://people.apache.org/~yegor/apachecon_eu08/");\r
+ RichTextRun rt = tr1.getRichTextRuns()[0];\r
+ rt.setFontSize(24);\r
+ box1.setAnchor(new Rectangle(80, 356, 553, 65));\r
+ slide.addShape(box1);\r
+\r
+ }\r
+\r
+ public static void slide5(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF in Action - 1\rData Extraction");\r
+ box1.setAnchor(new Rectangle(36, 21, 648, 100));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText(\r
+ "Text from slides and notes\r" +\r
+ "Images\r" +\r
+ "Shapes and their properties (type, position in the slide, color, font, etc.)");\r
+ box2.setAnchor(new Rectangle(36, 150, 648, 300));\r
+ slide.addShape(box2);\r
+\r
+\r
+ }\r
+\r
+ public static void slide6(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF in Action - 2");\r
+ box1.setAnchor(new Rectangle(36, 20, 648, 90));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.getRichTextRuns()[0].setFontSize(18);\r
+ tr2.setText("Creating a simple presentation from scratch");\r
+ box2.setAnchor(new Rectangle(170, 100, 364, 30));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ RichTextRun rt3 = tr3.getRichTextRuns()[0];\r
+ rt3.setFontName("Courier New");\r
+ rt3.setFontSize(8);\r
+ tr3.setText(\r
+ " SlideShow ppt = new SlideShow();\r" +\r
+ " Slide slide = ppt.createSlide();\r" +\r
+ "\r" +\r
+ " TextBox box2 = new TextBox();\r" +\r
+ " box2.setHorizontalAlignment(TextBox.AlignCenter);\r" +\r
+ " box2.setVerticalAlignment(TextBox.AnchorMiddle);\r" +\r
+ " box2.getTextRun().setText(\"Java Code\");\r" +\r
+ " box2.getFill().setForegroundColor(new Color(187, 224, 227));\r" +\r
+ " box2.setLineColor(Color.black);\r" +\r
+ " box2.setLineWidth(0.75);\r" +\r
+ " box2.setAnchor(new Rectangle(66, 243, 170, 170));\r" +\r
+ " slide.addShape(box2);\r" +\r
+ "\r" +\r
+ " TextBox box3 = new TextBox();\r" +\r
+ " box3.setHorizontalAlignment(TextBox.AlignCenter);\r" +\r
+ " box3.setVerticalAlignment(TextBox.AnchorMiddle);\r" +\r
+ " box3.getTextRun().setText(\"*.ppt file\");\r" +\r
+ " box3.setLineWidth(0.75);\r" +\r
+ " box3.setLineColor(Color.black);\r" +\r
+ " box3.getFill().setForegroundColor(new Color(187, 224, 227));\r" +\r
+ " box3.setAnchor(new Rectangle(473, 243, 170, 170));\r" +\r
+ " slide.addShape(box3);\r" +\r
+ "\r" +\r
+ " AutoShape box4 = new AutoShape(ShapeTypes.Arrow);\r" +\r
+ " box4.getFill().setForegroundColor(new Color(187, 224, 227));\r" +\r
+ " box4.setLineWidth(0.75);\r" +\r
+ " box4.setLineColor(Color.black);\r" +\r
+ " box4.setAnchor(new Rectangle(253, 288, 198, 85));\r" +\r
+ " slide.addShape(box4);\r" +\r
+ "\r" +\r
+ " FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\r" +\r
+ " ppt.write(out);\r" +\r
+ " out.close();");\r
+ box3.setAnchor(new Rectangle(30, 150, 618, 411));\r
+ slide.addShape(box3);\r
+ }\r
+\r
+ public static void slide7(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box2 = new TextBox();\r
+ box2.setHorizontalAlignment(TextBox.AlignCenter);\r
+ box2.setVerticalAlignment(TextBox.AnchorMiddle);\r
+ box2.getTextRun().setText("Java Code");\r
+ box2.getFill().setForegroundColor(new Color(187, 224, 227));\r
+ box2.setLineColor(Color.black);\r
+ box2.setLineWidth(0.75);\r
+ box2.setAnchor(new Rectangle(66, 243, 170, 170));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ box3.setHorizontalAlignment(TextBox.AlignCenter);\r
+ box3.setVerticalAlignment(TextBox.AnchorMiddle);\r
+ box3.getTextRun().setText("*.ppt file");\r
+ box3.setLineWidth(0.75);\r
+ box3.setLineColor(Color.black);\r
+ box3.getFill().setForegroundColor(new Color(187, 224, 227));\r
+ box3.setAnchor(new Rectangle(473, 243, 170, 170));\r
+ slide.addShape(box3);\r
+\r
+ AutoShape box4 = new AutoShape(ShapeTypes.Arrow);\r
+ box4.getFill().setForegroundColor(new Color(187, 224, 227));\r
+ box4.setLineWidth(0.75);\r
+ box4.setLineColor(Color.black);\r
+ box4.setAnchor(new Rectangle(253, 288, 198, 85));\r
+ slide.addShape(box4);\r
+ }\r
+\r
+ public static void slide8(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("Wait, there is more!");\r
+ box1.setAnchor(new Rectangle(36, 21, 648, 90));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText(\r
+ "Rich text\r" +\r
+ "Tables\r" +\r
+ "Pictures (JPEG, PNG, BMP, WMF, PICT)\r" +\r
+ "Comprehensive formatting features");\r
+ box2.setAnchor(new Rectangle(36, 126, 648, 356));\r
+ slide.addShape(box2);\r
+ }\r
+\r
+ public static void slide9(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF in Action - 3");\r
+ box1.setAnchor(new Rectangle(36, 20, 648, 50));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.getRichTextRuns()[0].setFontSize(18);\r
+ tr2.setText("PPGraphics2D: PowerPoint Graphics2D driver");\r
+ box2.setAnchor(new Rectangle(178, 70, 387, 30));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ RichTextRun rt3 = tr3.getRichTextRuns()[0];\r
+ rt3.setFontName("Courier New");\r
+ rt3.setFontSize(8);\r
+ tr3.setText(\r
+ " //bar chart data. The first value is the bar color, the second is the width\r" +\r
+ " Object[] def = new Object[]{\r" +\r
+ " Color.yellow, new Integer(100),\r" +\r
+ " Color.green, new Integer(150),\r" +\r
+ " Color.gray, new Integer(75),\r" +\r
+ " Color.red, new Integer(200),\r" +\r
+ " };\r" +\r
+ "\r" +\r
+ " SlideShow ppt = new SlideShow();\r" +\r
+ " Slide slide = ppt.createSlide();\r" +\r
+ "\r" +\r
+ " ShapeGroup group = new ShapeGroup();\r" +\r
+ " //define position of the drawing in the slide\r" +\r
+ " Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);\r" +\r
+ " group.setAnchor(bounds);\r" +\r
+ " slide.addShape(group);\r" +\r
+ " Graphics2D graphics = new PPGraphics2D(group);\r" +\r
+ "\r" +\r
+ " //draw a simple bar graph\r" +\r
+ " int x = bounds.x + 50, y = bounds.y + 50;\r" +\r
+ " graphics.setFont(new Font(\"Arial\", Font.BOLD, 10));\r" +\r
+ " for (int i = 0, idx = 1; i < def.length; i+=2, idx++) {\r" +\r
+ " graphics.setColor(Color.black);\r" +\r
+ " int width = ((Integer)def[i+1]).intValue();\r" +\r
+ " graphics.drawString(\"Q\" + idx, x-20, y+20);\r" +\r
+ " graphics.drawString(width + \"%\", x + width + 10, y + 20);\r" +\r
+ " graphics.setColor((Color)def[i]);\r" +\r
+ " graphics.fill(new Rectangle(x, y, width, 30));\r" +\r
+ " y += 40;\r" +\r
+ " }\r" +\r
+ " graphics.setColor(Color.black);\r" +\r
+ " graphics.setFont(new Font(\"Arial\", Font.BOLD, 14));\r" +\r
+ " graphics.draw(bounds);\r" +\r
+ " graphics.drawString(\"Performance\", x + 70, y + 40);\r" +\r
+ "\r" +\r
+ " FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\r" +\r
+ " ppt.write(out);\r" +\r
+ " out.close();");\r
+ box3.setAnchor(new Rectangle(96, 110, 499, 378));\r
+ slide.addShape(box3);\r
+ }\r
+\r
+ public static void slide10(SlideShow ppt) throws IOException {\r
+ //bar chart data. The first value is the bar color, the second is the width\r
+ Object[] def = new Object[]{\r
+ Color.yellow, new Integer(100),\r
+ Color.green, new Integer(150),\r
+ Color.gray, new Integer(75),\r
+ Color.red, new Integer(200),\r
+ };\r
+\r
+ Slide slide = ppt.createSlide();\r
+\r
+ ShapeGroup group = new ShapeGroup();\r
+ //define position of the drawing in the slide\r
+ Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);\r
+ group.setAnchor(bounds);\r
+ slide.addShape(group);\r
+ Graphics2D graphics = new PPGraphics2D(group);\r
+\r
+ //draw a simple bar graph\r
+ int x = bounds.x + 50, y = bounds.y + 50;\r
+ graphics.setFont(new Font("Arial", Font.BOLD, 10));\r
+ for (int i = 0, idx = 1; i < def.length; i+=2, idx++) {\r
+ graphics.setColor(Color.black);\r
+ int width = ((Integer)def[i+1]).intValue();\r
+ graphics.drawString("Q" + idx, x-20, y+20);\r
+ graphics.drawString(width + "%", x + width + 10, y + 20);\r
+ graphics.setColor((Color)def[i]);\r
+ graphics.fill(new Rectangle(x, y, width, 30));\r
+ y += 40;\r
+ }\r
+ graphics.setColor(Color.black);\r
+ graphics.setFont(new Font("Arial", Font.BOLD, 14));\r
+ graphics.draw(bounds);\r
+ graphics.drawString("Performance", x + 70, y + 40);\r
+\r
+ }\r
+\r
+ public static void slide11(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF Development Plans");\r
+ box1.setAnchor(new Rectangle(36, 21, 648, 90));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText(\r
+ "Support for more PowerPoint functionality\r" +\r
+ "Rendering slides into java.awt.Graphics2D");\r
+ box2.setAnchor(new Rectangle(36, 126, 648, 100));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ tr3.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr3.getRichTextRuns()[0].setIndentLevel(1);\r
+ tr3.setText(\r
+ "A way to export slides into images or other formats");\r
+ box3.setAnchor(new Rectangle(36, 220, 648, 70));\r
+ slide.addShape(box3);\r
+\r
+ TextBox box4 = new TextBox();\r
+ TextRun tr4 = box4.getTextRun();\r
+ tr4.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr4.setText(\r
+ "Integration with Apache FOP - Formatting Objects Processor");\r
+ box4.setAnchor(new Rectangle(36, 290, 648, 90));\r
+ slide.addShape(box4);\r
+\r
+ TextBox box5 = new TextBox();\r
+ TextRun tr5 = box5.getTextRun();\r
+ tr5.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr5.getRichTextRuns()[0].setIndentLevel(1);\r
+ tr5.setText(\r
+ "Transformation of XSL-FO into PPT\r" +\r
+ "PPT2PDF transcoder");\r
+ box5.setAnchor(new Rectangle(36, 380, 648, 100));\r
+ slide.addShape(box5);\r
+ }\r
+\r
+ public static void slide12(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE);\r
+ tr1.setText("Questions?");\r
+ box1.setAnchor(new Rectangle(54, 167, 612, 115));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE);\r
+ tr2.setText(\r
+ "http://poi.apache.org/hslf/\r" +\r
+ "http://people.apache.org/~yegor");\r
+ box2.setAnchor(new Rectangle(108, 306, 504, 138));\r
+ slide.addShape(box2);\r
+ }\r
+}\r
--- /dev/null
+/* ====================================================================\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to You under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+==================================================================== */\r
+package org.apache.poi.hslf.model;\r
+\r
+import org.apache.poi.ddf.*;\r
+import org.apache.poi.util.LittleEndian;\r
+\r
+import java.awt.geom.*;\r
+import java.util.ArrayList;\r
+\r
+/**\r
+ * A "Freeform" shape.\r
+ *\r
+ * <p>\r
+ * Shapes drawn with the "Freeform" tool have cubic bezier curve segments in the smooth sections\r
+ * and straight-line segments in the straight sections. This object closely corresponds to <code>java.awt.geom.GeneralPath</code>.\r
+ * </p>\r
+ * @author Yegor Kozlov\r
+ */\r
+public class Freeform extends AutoShape {\r
+ /**\r
+ * Create a Freeform object and initialize it from the supplied Record container.\r
+ *\r
+ * @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape\r
+ * @param parent the parent of the shape\r
+ */\r
+ protected Freeform(EscherContainerRecord escherRecord, Shape parent){\r
+ super(escherRecord, parent);\r
+\r
+ }\r
+\r
+ /**\r
+ * Create a new Freeform. This constructor is used when a new shape is created.\r
+ *\r
+ * @param parent the parent of this Shape. For example, if this text box is a cell\r
+ * in a table then the parent is Table.\r
+ */\r
+ public Freeform(Shape parent){\r
+ super(null, parent);\r
+ _escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup);\r
+ }\r
+\r
+ /**\r
+ * Create a new Freeform. This constructor is used when a new shape is created.\r
+ *\r
+ */\r
+ public Freeform(){\r
+ this(null);\r
+ }\r
+\r
+ /**\r
+ * Set the shape path\r
+ *\r
+ * @param path\r
+ */\r
+ public void setPath(GeneralPath path)\r
+ {\r
+ Rectangle2D bounds = path.getBounds2D();\r
+ PathIterator it = path.getPathIterator(new AffineTransform());\r
+\r
+ ArrayList segInfo = new ArrayList();\r
+ ArrayList pntInfo = new ArrayList();\r
+ boolean isClosed = false;\r
+ while (!it.isDone()) {\r
+ double[] vals = new double[6];\r
+ int type = it.currentSegment(vals);\r
+ switch (type) {\r
+ case PathIterator.SEG_MOVETO:\r
+ pntInfo.add(new Point2D.Double(vals[0], vals[1]));\r
+ segInfo.add(new byte[]{0x00, 0x40});\r
+ break;\r
+ case PathIterator.SEG_LINETO:\r
+ pntInfo.add(new Point2D.Double(vals[0], vals[1]));\r
+ segInfo.add(new byte[]{0x00, (byte)0xAC});\r
+ segInfo.add(new byte[]{0x01, 0x00 });\r
+ break;\r
+ case PathIterator.SEG_CUBICTO:\r
+ pntInfo.add(new Point2D.Double(vals[0], vals[1]));\r
+ pntInfo.add(new Point2D.Double(vals[2], vals[3]));\r
+ pntInfo.add(new Point2D.Double(vals[4], vals[5]));\r
+ segInfo.add(new byte[]{0x00, (byte)0xAD});\r
+ segInfo.add(new byte[]{0x01, 0x20 });\r
+ break;\r
+ case PathIterator.SEG_QUADTO:\r
+ System.err.println("SEG_QUADTO is not supported");\r
+ break;\r
+ case PathIterator.SEG_CLOSE:\r
+ pntInfo.add(pntInfo.get(0));\r
+ segInfo.add(new byte[]{0x00, (byte)0xAC});\r
+ segInfo.add(new byte[]{0x01, 0x00 });\r
+ segInfo.add(new byte[]{0x00, (byte)0xAC});\r
+ segInfo.add(new byte[]{0x01, (byte)0x60});\r
+ isClosed = true;\r
+ break;\r
+ }\r
+\r
+ it.next();\r
+ }\r
+ if(!isClosed) segInfo.add(new byte[]{0x00, (byte)0xAC});\r
+ segInfo.add(new byte[]{0x00, (byte)0x80});\r
+\r
+ EscherOptRecord opt = (EscherOptRecord)getEscherChild(_escherContainer, EscherOptRecord.RECORD_ID);\r
+ opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.GEOMETRY__SHAPEPATH, 0x4));\r
+\r
+ EscherArrayProperty verticesProp = new EscherArrayProperty((short)(EscherProperties.GEOMETRY__VERTICES + 0x4000), false, null);\r
+ verticesProp.setNumberOfElementsInArray(pntInfo.size());\r
+ verticesProp.setNumberOfElementsInMemory(pntInfo.size());\r
+ verticesProp.setSizeOfElements(0xFFF0);\r
+ for (int i = 0; i < pntInfo.size(); i++) {\r
+ Point2D.Double pnt = (Point2D.Double)pntInfo.get(i);\r
+ byte[] data = new byte[4];\r
+ LittleEndian.putShort(data, 0, (short)((pnt.getX() - bounds.getX())*MASTER_DPI/POINT_DPI));\r
+ LittleEndian.putShort(data, 2, (short)((pnt.getY() - bounds.getY())*MASTER_DPI/POINT_DPI));\r
+ verticesProp.setElement(i, data);\r
+ }\r
+ opt.addEscherProperty(verticesProp);\r
+\r
+ EscherArrayProperty segmentsProp = new EscherArrayProperty((short)(EscherProperties.GEOMETRY__SEGMENTINFO + 0x4000), false, null);\r
+ segmentsProp.setNumberOfElementsInArray(segInfo.size());\r
+ segmentsProp.setNumberOfElementsInMemory(segInfo.size());\r
+ segmentsProp.setSizeOfElements(0x2);\r
+ for (int i = 0; i < segInfo.size(); i++) {\r
+ byte[] seg = (byte[])segInfo.get(i);\r
+ segmentsProp.setElement(i, seg);\r
+ }\r
+ opt.addEscherProperty(segmentsProp);\r
+\r
+ opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.GEOMETRY__RIGHT, (int)(bounds.getWidth()*MASTER_DPI/POINT_DPI)));\r
+ opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.GEOMETRY__BOTTOM, (int)(bounds.getHeight()*MASTER_DPI/POINT_DPI)));\r
+\r
+ opt.sortProperties();\r
+\r
+ setAnchor(bounds);\r
+ }\r
+}\r
private Color background;
private RenderingHints hints;
- /**
- * the maximum distance that the line segments used to approximate the curved segments
- */
- public static final float FLATNESS = 0.1f;
-
/**
* Construct Java Graphics object which translates graphic calls in ppt drawing layer.
*
* @see #setComposite
*/
public void draw(Shape shape){
-
- PathIterator it = shape.getPathIterator(transform, FLATNESS);
- double[] prev = null;
- double[] coords = new double[6];
- double[] first = new double[6];
- if(!it.isDone()) it.currentSegment(first); //first point
- while(!it.isDone()){
- int type = it.currentSegment(coords);
- if (prev != null ){
- Line line = new Line(group);
- applyPaint(line);
- applyStroke(line);
- if (type == PathIterator.SEG_LINETO) {
- line.setAnchor(new Rectangle2D.Double(prev[0], prev[1], (coords[0] - prev[0]), (coords[1] - prev[1])));
- } else if (type == PathIterator.SEG_CLOSE){
- line.setAnchor(new Rectangle2D.Double(coords[0], coords[1], (first[0] - coords[0]), (first[1] - coords[1])));
- }
- group.addShape(line);
- }
- prev = new double[]{coords[0], coords[1]};
- it.next();
- }
-
+ GeneralPath path = new GeneralPath(transform.createTransformedShape(shape));
+ Freeform p = new Freeform(group);
+ p.setPath(path);
+ p.getFill().setForegroundColor(null);
+ applyStroke(p);
+ group.addShape(p);
}
/**
* Even if top and bottom margins are set to 0 PowerPoint
* always sets extra space between the text and its bounding box.
*
- * Approximation height = ascent*2 works good enough in most cases
+ * The approximation height = ascent*2 works good enough in most cases
*/
float height = ascent * 2;
* @see #setClip
*/
public void fill(Shape shape){
- PathIterator it = shape.getPathIterator(transform, FLATNESS);
- ArrayList pnt = new ArrayList();
- double[] coords = new double[6];
- while(!it.isDone()){
- int type = it.currentSegment(coords);
- if (type != PathIterator.SEG_CLOSE) {
- pnt.add(new Point2D.Double(coords[0], coords[1]));
- }
- it.next();
- }
- if(pnt.size() > 0){
- Point2D[] points = (Point2D[])pnt.toArray(new Point2D[pnt.size()]);
- Polygon p = new Polygon(group);
- p.setPoints(points);
- applyPaint(p);
-
- p.setLineColor(null); //Fills must be "No Line"
-
- Rectangle2D bounds = transform.createTransformedShape(shape).getBounds2D();
- p.setAnchor(bounds);
- group.addShape(p);
- }
+ GeneralPath path = new GeneralPath(transform.createTransformedShape(shape));
+ Freeform p = new Freeform(group);
+ p.setPath(path);
+ applyPaint(p);
+ p.setLineColor(null); //Fills must be "No Line"
+ group.addShape(p);
}
/**
*/
public void drawRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight){
- AutoShape shape = new AutoShape(ShapeTypes.RoundRectangle, group);
- shape.setFillColor(null);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, width, height, arcWidth, arcHeight);
+ draw(rect);
}
/**
* @see java.awt.Graphics#drawOval
*/
public void fillOval(int x, int y, int width, int height){
- AutoShape shape = new AutoShape(ShapeTypes.Ellipse, group);
- applyPaint(shape);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Ellipse2D oval = new Ellipse2D.Float(x, y, width, height);
+ fill(oval);
}
/**
*/
public void fillRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight){
- AutoShape shape = new AutoShape(ShapeTypes.RoundRectangle, group);
- applyPaint(shape);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+
+ RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, width, height, arcWidth, arcHeight);
+ fill(rect);
}
/**
*/
public void fillArc(int x, int y, int width, int height,
int startAngle, int arcAngle){
- AutoShape shape = new AutoShape(ShapeTypes.Arc, group);
- applyPaint(shape);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Arc2D arc = new Arc2D.Float(x, y, width, height, startAngle, arcAngle, Arc2D.PIE);
+ fill(arc);
}
/**
*/
public void drawArc(int x, int y, int width, int height,
int startAngle, int arcAngle) {
- AutoShape shape = new AutoShape(ShapeTypes.Arc, group);
- shape.setFillColor(null);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Arc2D arc = new Arc2D.Float(x, y, width, height, startAngle, arcAngle, Arc2D.OPEN);
+ draw(arc);
}
* @see java.awt.Graphics#fillOval
*/
public void drawOval(int x, int y, int width, int height){
- AutoShape shape = new AutoShape(ShapeTypes.Ellipse, group);
- shape.setFillColor(null);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Ellipse2D oval = new Ellipse2D.Float(x, y, width, height);
+ draw(oval);
}
/**
* @see java.awt.Graphics#drawRect
*/
public void fillRect(int x, int y, int width, int height){
- AutoShape shape = new AutoShape(ShapeTypes.Rectangle, group);
- applyPaint(shape);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Rectangle rect = new Rectangle(x, y, width, height);
+ fill(rect);
}
/**
* @see java.awt.Graphics#clearRect
*/
public void drawRect(int x, int y, int width, int height) {
- AutoShape shape = new AutoShape(ShapeTypes.Rectangle, group);
- shape.setFillColor(null);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
-
+ Rectangle rect = new Rectangle(x, y, width, height);
+ draw(rect);
}
/**